Adds _RollingCounter and _StatsCollector to the tracker: three rolling windows (hour=60×1min, day=24×1hr, month=30×1day) track request RPMs per model. GET /v1/stats returns combined local + peer stats. POST /v1/stats/gossip lets trackers push their local slice for additive merge in hive mode. SQLite persistence via --stats-db flag; stats survive tracker restarts. Records a stat for each proxied /v1/chat/completions request. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
"""meshnet-tracker CLI entry point."""
|
|
|
|
import argparse
|
|
import sys
|
|
import time
|
|
|
|
from .server import TrackerServer
|
|
|
|
|
|
def main() -> None:
|
|
parser = argparse.ArgumentParser(
|
|
prog="meshnet-tracker",
|
|
description="Distributed Inference Network node registry and route selection",
|
|
)
|
|
subparsers = parser.add_subparsers(dest="command")
|
|
|
|
start_cmd = subparsers.add_parser("start", help="Start the tracker server")
|
|
start_cmd.add_argument("--host", default="127.0.0.1", help="Host interface to listen on")
|
|
start_cmd.add_argument("--port", type=int, default=8080, help="Port to listen on")
|
|
start_cmd.add_argument(
|
|
"--heartbeat-timeout",
|
|
type=float,
|
|
default=30.0,
|
|
help="Seconds before a node is removed from the registry after missed heartbeat",
|
|
)
|
|
start_cmd.add_argument(
|
|
"--cluster-peers",
|
|
default="",
|
|
help="Comma-separated URLs of peer tracker nodes (enables Raft cluster mode)",
|
|
)
|
|
start_cmd.add_argument(
|
|
"--self-url",
|
|
default=None,
|
|
help="This tracker's own URL as seen by peers (auto-derived from --host/--port if omitted)",
|
|
)
|
|
start_cmd.add_argument(
|
|
"--stats-db",
|
|
default=None,
|
|
metavar="PATH",
|
|
help="SQLite database path for persistent model usage statistics",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
if args.command == "start":
|
|
cluster_peers = [u.strip() for u in args.cluster_peers.split(",") if u.strip()]
|
|
server = TrackerServer(
|
|
host=args.host,
|
|
port=args.port,
|
|
heartbeat_timeout=args.heartbeat_timeout,
|
|
cluster_peers=cluster_peers or None,
|
|
cluster_self_url=args.self_url,
|
|
stats_db=getattr(args, "stats_db", None),
|
|
)
|
|
port = server.start()
|
|
print(f"meshnet-tracker listening on http://{args.host}:{port}", flush=True)
|
|
try:
|
|
while True:
|
|
time.sleep(1)
|
|
except KeyboardInterrupt:
|
|
server.stop()
|
|
sys.exit(0)
|
|
else:
|
|
parser.print_help()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|