refactor(proxy): centralise monitoring API contract values

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-05 03:30:40 +00:00
parent d1a899805e
commit 8a9046356e
3 changed files with 48 additions and 13 deletions

View file

@ -28,9 +28,9 @@ func RegisterRoutes(router RouteRegistrar, p *proxy.Proxy) {
if router == nil || p == nil { if router == nil || p == nil {
return return
} }
registerJSONGetRoute(router, p, "/1/summary", func() any { return p.SummaryDocument() }) registerJSONGetRoute(router, p, proxy.MonitoringRouteSummary, func() any { return p.SummaryDocument() })
registerJSONGetRoute(router, p, "/1/workers", func() any { return p.WorkersDocument() }) registerJSONGetRoute(router, p, proxy.MonitoringRouteWorkers, func() any { return p.WorkersDocument() })
registerJSONGetRoute(router, p, "/1/miners", func() any { return p.MinersDocument() }) registerJSONGetRoute(router, p, proxy.MonitoringRouteMiners, func() any { return p.MinersDocument() })
} }
func registerJSONGetRoute(router RouteRegistrar, proxyInstance *proxy.Proxy, pattern string, renderDocument func() any) { func registerJSONGetRoute(router RouteRegistrar, proxyInstance *proxy.Proxy, pattern string, renderDocument func() any) {

View file

@ -1,5 +1,36 @@
package proxy 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} // 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 type WorkerRow [13]any

View file

@ -636,9 +636,9 @@ func (p *Proxy) startMonitoringServer() bool {
return false return false
} }
mux := http.NewServeMux() mux := http.NewServeMux()
p.registerMonitoringRoute(mux, "/1/summary", func() any { return p.SummaryDocument() }) p.registerMonitoringRoute(mux, MonitoringRouteSummary, func() any { return p.SummaryDocument() })
p.registerMonitoringRoute(mux, "/1/workers", func() any { return p.WorkersDocument() }) p.registerMonitoringRoute(mux, MonitoringRouteWorkers, func() any { return p.WorkersDocument() })
p.registerMonitoringRoute(mux, "/1/miners", func() any { return p.MinersDocument() }) p.registerMonitoringRoute(mux, MonitoringRouteMiners, func() any { return p.MinersDocument() })
addr := net.JoinHostPort(p.config.HTTP.Host, strconv.Itoa(int(p.config.HTTP.Port))) addr := net.JoinHostPort(p.config.HTTP.Host, strconv.Itoa(int(p.config.HTTP.Port)))
listener, err := net.Listen("tcp", addr) listener, err := net.Listen("tcp", addr)
if err != nil { if err != nil {
@ -710,7 +710,7 @@ func (p *Proxy) SummaryDocument() SummaryDocument {
now, max := p.MinerCount() now, max := p.MinerCount()
upstreams := p.Upstreams() upstreams := p.Upstreams()
return SummaryDocument{ return SummaryDocument{
Version: "1.0.0", Version: SummaryDocumentVersion,
Mode: p.Mode(), Mode: p.Mode(),
Hashrate: HashrateDocument{ Hashrate: HashrateDocument{
Total: summary.Hashrate, Total: summary.Hashrate,
@ -743,6 +743,10 @@ func (p *Proxy) WorkersDocument() WorkersDocument {
records := p.WorkerRecords() records := p.WorkerRecords()
rows := make([]WorkerRow, 0, len(records)) rows := make([]WorkerRow, 0, len(records))
for _, record := range records { for _, record := range records {
hashrates := make([]float64, len(workerHashrateWindows))
for index, seconds := range workerHashrateWindows {
hashrates[index] = record.Hashrate(seconds)
}
rows = append(rows, WorkerRow{ rows = append(rows, WorkerRow{
record.Name, record.Name,
record.LastIP, record.LastIP,
@ -752,11 +756,11 @@ func (p *Proxy) WorkersDocument() WorkersDocument {
record.Invalid, record.Invalid,
record.Hashes, record.Hashes,
unixOrZero(record.LastHashAt), unixOrZero(record.LastHashAt),
record.Hashrate(60), hashrates[0],
record.Hashrate(600), hashrates[1],
record.Hashrate(3600), hashrates[2],
record.Hashrate(43200), hashrates[3],
record.Hashrate(86400), hashrates[4],
}) })
} }
return WorkersDocument{ return WorkersDocument{
@ -787,7 +791,7 @@ func (p *Proxy) MinersDocument() MinersDocument {
}) })
} }
return MinersDocument{ return MinersDocument{
Format: []string{"id", "ip", "tx", "rx", "state", "diff", "user", "password", "rig_id", "agent"}, Format: append([]string(nil), MinersDocumentFormat...),
Miners: rows, Miners: rows,
} }
} }