From 8a9046356e02fb0e955025d0260394c0cd165ea3 Mon Sep 17 00:00:00 2001 From: Virgil Date: Sun, 5 Apr 2026 03:30:40 +0000 Subject: [PATCH] refactor(proxy): centralise monitoring API contract values Co-Authored-By: Virgil --- api/router.go | 6 +++--- api_rows.go | 31 +++++++++++++++++++++++++++++++ state_impl.go | 24 ++++++++++++++---------- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/api/router.go b/api/router.go index a29ac49..8520984 100644 --- a/api/router.go +++ b/api/router.go @@ -28,9 +28,9 @@ func RegisterRoutes(router RouteRegistrar, p *proxy.Proxy) { if router == nil || p == nil { return } - registerJSONGetRoute(router, p, "/1/summary", func() any { return p.SummaryDocument() }) - registerJSONGetRoute(router, p, "/1/workers", func() any { return p.WorkersDocument() }) - registerJSONGetRoute(router, p, "/1/miners", func() any { return p.MinersDocument() }) + registerJSONGetRoute(router, p, proxy.MonitoringRouteSummary, func() any { return p.SummaryDocument() }) + registerJSONGetRoute(router, p, proxy.MonitoringRouteWorkers, func() any { return p.WorkersDocument() }) + registerJSONGetRoute(router, p, proxy.MonitoringRouteMiners, func() any { return p.MinersDocument() }) } func registerJSONGetRoute(router RouteRegistrar, proxyInstance *proxy.Proxy, pattern string, renderDocument func() any) { diff --git a/api_rows.go b/api_rows.go index 2bf1307..99ca49a 100644 --- a/api_rows.go +++ b/api_rows.go @@ -1,5 +1,36 @@ package proxy +const ( + // MonitoringRouteSummary documents the summary endpoint path. + // + // http.Get("http://127.0.0.1:8080" + proxy.MonitoringRouteSummary) + MonitoringRouteSummary = "/1/summary" + + // MonitoringRouteWorkers documents the workers endpoint path. + // + // http.Get("http://127.0.0.1:8080" + proxy.MonitoringRouteWorkers) + MonitoringRouteWorkers = "/1/workers" + + // MonitoringRouteMiners documents the miners endpoint path. + // + // http.Get("http://127.0.0.1:8080" + proxy.MonitoringRouteMiners) + MonitoringRouteMiners = "/1/miners" + + // SummaryDocumentVersion is the monitoring API version. + // + // doc := proxy.SummaryDocument{Version: proxy.SummaryDocumentVersion} + SummaryDocumentVersion = "1.0.0" +) + +var ( + // MinersDocumentFormat defines the fixed /1/miners column order. + // + // doc := proxy.MinersDocument{Format: append([]string(nil), proxy.MinersDocumentFormat...)} + MinersDocumentFormat = []string{"id", "ip", "tx", "rx", "state", "diff", "user", "password", "rig_id", "agent"} + + workerHashrateWindows = [5]int{60, 600, 3600, 43200, 86400} +) + // WorkerRow{"rig-alpha", "10.0.0.1", 1, 10, 0, 0, 10000, 1712232000, 1.0, 1.0, 1.0, 1.0, 1.0} type WorkerRow [13]any diff --git a/state_impl.go b/state_impl.go index d978d06..a672eac 100644 --- a/state_impl.go +++ b/state_impl.go @@ -636,9 +636,9 @@ func (p *Proxy) startMonitoringServer() bool { return false } mux := http.NewServeMux() - p.registerMonitoringRoute(mux, "/1/summary", func() any { return p.SummaryDocument() }) - p.registerMonitoringRoute(mux, "/1/workers", func() any { return p.WorkersDocument() }) - p.registerMonitoringRoute(mux, "/1/miners", func() any { return p.MinersDocument() }) + p.registerMonitoringRoute(mux, MonitoringRouteSummary, func() any { return p.SummaryDocument() }) + p.registerMonitoringRoute(mux, MonitoringRouteWorkers, func() any { return p.WorkersDocument() }) + p.registerMonitoringRoute(mux, MonitoringRouteMiners, func() any { return p.MinersDocument() }) addr := net.JoinHostPort(p.config.HTTP.Host, strconv.Itoa(int(p.config.HTTP.Port))) listener, err := net.Listen("tcp", addr) if err != nil { @@ -710,7 +710,7 @@ func (p *Proxy) SummaryDocument() SummaryDocument { now, max := p.MinerCount() upstreams := p.Upstreams() return SummaryDocument{ - Version: "1.0.0", + Version: SummaryDocumentVersion, Mode: p.Mode(), Hashrate: HashrateDocument{ Total: summary.Hashrate, @@ -743,6 +743,10 @@ func (p *Proxy) WorkersDocument() WorkersDocument { records := p.WorkerRecords() rows := make([]WorkerRow, 0, len(records)) for _, record := range records { + hashrates := make([]float64, len(workerHashrateWindows)) + for index, seconds := range workerHashrateWindows { + hashrates[index] = record.Hashrate(seconds) + } rows = append(rows, WorkerRow{ record.Name, record.LastIP, @@ -752,11 +756,11 @@ func (p *Proxy) WorkersDocument() WorkersDocument { record.Invalid, record.Hashes, unixOrZero(record.LastHashAt), - record.Hashrate(60), - record.Hashrate(600), - record.Hashrate(3600), - record.Hashrate(43200), - record.Hashrate(86400), + hashrates[0], + hashrates[1], + hashrates[2], + hashrates[3], + hashrates[4], }) } return WorkersDocument{ @@ -787,7 +791,7 @@ func (p *Proxy) MinersDocument() MinersDocument { }) } return MinersDocument{ - Format: []string{"id", "ip", "tx", "rx", "state", "diff", "user", "password", "rig_id", "agent"}, + Format: append([]string(nil), MinersDocumentFormat...), Miners: rows, } }