From 08bbb1537e11be92a7477450b94c75bc18708062 Mon Sep 17 00:00:00 2001 From: Dan Sosedoff Date: Thu, 30 Mar 2023 12:51:49 -0500 Subject: [PATCH] Implement process uptime metric (#666) * Implement process uptime metric * Add clarification comment * Add another clarification comment --- pkg/api/routes.go | 3 ++- pkg/cli/cli.go | 2 ++ pkg/metrics/handler.go | 25 +++++++++++++++++++++++++ pkg/metrics/metrics.go | 5 +++++ pkg/metrics/server.go | 7 +------ 5 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 pkg/metrics/handler.go diff --git a/pkg/api/routes.go b/pkg/api/routes.go index 5b22695..01aaae9 100644 --- a/pkg/api/routes.go +++ b/pkg/api/routes.go @@ -61,6 +61,7 @@ func SetupRoutes(router *gin.Engine) { func SetupMetrics(engine *gin.Engine) { if command.Opts.MetricsEnabled && command.Opts.MetricsAddr == "" { - engine.GET("/metrics", gin.WrapH(metrics.Handler())) + // NOTE: We're not supporting the MetricsPath CLI option here to avoid the route conflicts. + engine.GET("/metrics", gin.WrapH(metrics.NewHandler())) } } diff --git a/pkg/cli/cli.go b/pkg/cli/cli.go index 70493a2..0073f79 100644 --- a/pkg/cli/cli.go +++ b/pkg/cli/cli.go @@ -307,6 +307,8 @@ func Run() { } } + // Start a separate metrics http server. If metrics addr is not provided, we + // add the metrics endpoint in the existing application server (see api.go). if options.MetricsEnabled && options.MetricsAddr != "" { go startMetricsServer() } diff --git a/pkg/metrics/handler.go b/pkg/metrics/handler.go new file mode 100644 index 0000000..0c2b61c --- /dev/null +++ b/pkg/metrics/handler.go @@ -0,0 +1,25 @@ +package metrics + +import ( + "net/http" + "time" + + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +type Handler struct { + startTime time.Time + promHandler http.Handler +} + +func (h Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { + uptimeGauge.Set(time.Since(h.startTime).Seconds()) + h.promHandler.ServeHTTP(rw, req) +} + +func NewHandler() http.Handler { + return Handler{ + startTime: time.Now(), + promHandler: promhttp.Handler(), + } +} diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 7b8b112..7e0c6d2 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -20,6 +20,11 @@ var ( Name: "pgweb_healthy", Help: "Server health status", }) + + uptimeGauge = promauto.NewGauge(prometheus.GaugeOpts{ + Name: "pgweb_uptime", + Help: "Server application uptime in seconds", + }) ) func IncrementQueriesCount() { diff --git a/pkg/metrics/server.go b/pkg/metrics/server.go index 7291d61..4041e7d 100644 --- a/pkg/metrics/server.go +++ b/pkg/metrics/server.go @@ -3,17 +3,12 @@ package metrics import ( "net/http" - "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/sirupsen/logrus" ) -func Handler() http.Handler { - return promhttp.Handler() -} - func StartServer(logger *logrus.Logger, path string, addr string) error { logger.WithField("addr", addr).WithField("path", path).Info("starting prometheus metrics server") - http.Handle(path, Handler()) + http.Handle(path, NewHandler()) return http.ListenAndServe(addr, nil) }