From eb666af39feed4be9c8c1354cf52d0ea38ab5d36 Mon Sep 17 00:00:00 2001 From: bndw Date: Sat, 14 Feb 2026 12:19:29 -0800 Subject: refactor: serve metrics on main HTTP port instead of separate port Move metrics dashboard and Prometheus endpoint to the main HTTP server for simplified deployment and single ingress configuration. Changes: - Add PrometheusHandler() and DashboardHandler() methods to Metrics - Serve /dashboard on main HTTP port (was root on separate port) - Serve /metrics on main HTTP port (was /metrics on separate port) - Remove separate metrics server goroutine - Update logging to show metrics paths on main HTTP port Benefits: - Single port/ingress needed for all HTTP traffic - Simpler reverse proxy configuration - Dashboard accessible alongside main relay endpoints Endpoints on port 8080: - / - WebSocket/index - /nostr.v1.NostrRelay/* - Connect (gRPC-Web) - /dashboard - Metrics dashboard (HTML) - /metrics - Prometheus metrics (text) --- cmd/relay/main.go | 12 ++++++------ internal/metrics/metrics.go | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/cmd/relay/main.go b/cmd/relay/main.go index 209d758..bd50e63 100644 --- a/cmd/relay/main.go +++ b/cmd/relay/main.go @@ -85,12 +85,8 @@ func main() { grpc.ChainStreamInterceptor(metrics.StreamServerInterceptor(m)), ) - go func() { - log.Printf("Metrics server listening on %s%s", cfg.Metrics.Addr, cfg.Metrics.Path) - if err := m.Serve(cfg.Metrics.Addr, cfg.Metrics.Path); err != nil { - log.Printf("Metrics server failed: %v", err) - } - }() + mux.Handle("/metrics", m.PrometheusHandler()) + mux.Handle("/dashboard", m.DashboardHandler()) } wsHandler := wshandler.NewHandler(store, subManager) @@ -127,6 +123,10 @@ func main() { log.Printf("HTTP server listening on %s", cfg.Server.HttpAddr) log.Printf(" - Connect (gRPC-Web) at %s/nostr.v1.NostrRelay/*", cfg.Server.HttpAddr) log.Printf(" - WebSocket (Nostr) at %s/", cfg.Server.HttpAddr) + if cfg.Metrics.Enabled { + log.Printf(" - Metrics dashboard at %s/dashboard", cfg.Server.HttpAddr) + log.Printf(" - Prometheus metrics at %s/metrics", cfg.Server.HttpAddr) + } log.Printf("Database: %s", cfg.Database.Path) if cfg.Auth.Read.Enabled || cfg.Auth.Write.Enabled { log.Printf("Auth: enabled (read=%v write=%v)", cfg.Auth.Read.Enabled, cfg.Auth.Write.Enabled) diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 9030775..74f9ffb 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -288,12 +288,20 @@ const ( //go:embed dashboard.html var dashboardHTML []byte -func (m *Metrics) Serve(addr, path string) error { - mux := http.NewServeMux() - mux.Handle(path, promhttp.Handler()) - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { +func (m *Metrics) PrometheusHandler() http.Handler { + return promhttp.Handler() +} + +func (m *Metrics) DashboardHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Write(dashboardHTML) }) +} + +func (m *Metrics) Serve(addr, path string) error { + mux := http.NewServeMux() + mux.Handle(path, m.PrometheusHandler()) + mux.Handle("/", m.DashboardHandler()) return http.ListenAndServe(addr, mux) } -- cgit v1.2.3