Move Prom metrics to a dedicated port + improve Helm chart (#599)
This commit is contained in:
@@ -1,16 +1,12 @@
|
||||
package metrics
|
||||
|
||||
import (
|
||||
"github.com/labstack/echo-contrib/echoprometheus"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||
"github.com/thomiceli/opengist/internal/config"
|
||||
"github.com/thomiceli/opengist/internal/db"
|
||||
"github.com/thomiceli/opengist/internal/web/context"
|
||||
)
|
||||
|
||||
var (
|
||||
// Using promauto to automatically register metrics with the default registry
|
||||
countUsersGauge prometheus.Gauge
|
||||
countGistsGauge prometheus.Gauge
|
||||
countSSHKeysGauge prometheus.Gauge
|
||||
@@ -18,84 +14,52 @@ var (
|
||||
metricsInitialized bool = false
|
||||
)
|
||||
|
||||
// initMetrics initializes metrics if they're not already initialized
|
||||
func initMetrics() {
|
||||
if metricsInitialized {
|
||||
return
|
||||
}
|
||||
|
||||
// Only initialize metrics if they're enabled
|
||||
if config.C.MetricsEnabled {
|
||||
countUsersGauge = promauto.NewGauge(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "opengist_users_total",
|
||||
Help: "Total number of users",
|
||||
},
|
||||
)
|
||||
countUsersGauge = promauto.NewGauge(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "opengist_users_total",
|
||||
Help: "Total number of users",
|
||||
},
|
||||
)
|
||||
|
||||
countGistsGauge = promauto.NewGauge(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "opengist_gists_total",
|
||||
Help: "Total number of gists",
|
||||
},
|
||||
)
|
||||
countGistsGauge = promauto.NewGauge(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "opengist_gists_total",
|
||||
Help: "Total number of gists",
|
||||
},
|
||||
)
|
||||
|
||||
countSSHKeysGauge = promauto.NewGauge(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "opengist_ssh_keys_total",
|
||||
Help: "Total number of SSH keys",
|
||||
},
|
||||
)
|
||||
countSSHKeysGauge = promauto.NewGauge(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "opengist_ssh_keys_total",
|
||||
Help: "Total number of SSH keys",
|
||||
},
|
||||
)
|
||||
|
||||
metricsInitialized = true
|
||||
}
|
||||
metricsInitialized = true
|
||||
}
|
||||
|
||||
// updateMetrics refreshes all metric values from the database
|
||||
func updateMetrics() {
|
||||
// Only update metrics if they're enabled
|
||||
if !config.C.MetricsEnabled || !metricsInitialized {
|
||||
if !metricsInitialized {
|
||||
return
|
||||
}
|
||||
|
||||
// Update users count
|
||||
countUsers, err := db.CountAll(&db.User{})
|
||||
if err == nil {
|
||||
countUsersGauge.Set(float64(countUsers))
|
||||
}
|
||||
|
||||
// Update gists count
|
||||
countGists, err := db.CountAll(&db.Gist{})
|
||||
if err == nil {
|
||||
countGistsGauge.Set(float64(countGists))
|
||||
}
|
||||
|
||||
// Update SSH keys count
|
||||
countKeys, err := db.CountAll(&db.SSHKey{})
|
||||
if err == nil {
|
||||
countSSHKeysGauge.Set(float64(countKeys))
|
||||
}
|
||||
}
|
||||
|
||||
// Metrics handles prometheus metrics endpoint requests.
|
||||
func Metrics(ctx *context.Context) error {
|
||||
// If metrics are disabled, return 404
|
||||
if !config.C.MetricsEnabled {
|
||||
return ctx.NotFound("Metrics endpoint is disabled")
|
||||
}
|
||||
|
||||
// Initialize metrics if not already done
|
||||
initMetrics()
|
||||
|
||||
// Update metrics
|
||||
updateMetrics()
|
||||
|
||||
// Get the Echo context
|
||||
echoCtx := ctx.Context
|
||||
|
||||
// Use the Prometheus metrics handler
|
||||
handler := echoprometheus.NewHandler()
|
||||
|
||||
// Call the handler
|
||||
return handler(echoCtx)
|
||||
}
|
||||
|
||||
50
internal/web/handlers/metrics/server.go
Normal file
50
internal/web/handlers/metrics/server.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package metrics
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/labstack/echo-contrib/echoprometheus"
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/thomiceli/opengist/internal/config"
|
||||
)
|
||||
|
||||
type Server struct {
|
||||
echo *echo.Echo
|
||||
}
|
||||
|
||||
func NewServer() *Server {
|
||||
e := echo.New()
|
||||
e.HideBanner = true
|
||||
e.HidePort = true
|
||||
|
||||
s := &Server{echo: e}
|
||||
|
||||
initMetrics()
|
||||
|
||||
e.GET("/metrics", func(ctx echo.Context) error {
|
||||
updateMetrics()
|
||||
return echoprometheus.NewHandler()(ctx)
|
||||
})
|
||||
|
||||
return s
|
||||
}
|
||||
|
||||
func (s *Server) Start() {
|
||||
addr := config.C.MetricsHost + ":" + config.C.MetricsPort
|
||||
log.Info().Msg("Starting metrics server on http://" + addr)
|
||||
if err := s.echo.Start(addr); err != nil && err != http.ErrServerClosed {
|
||||
log.Error().Err(err).Msg("Failed to start metrics server")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) Stop() {
|
||||
log.Info().Msg("Stopping metrics server...")
|
||||
if err := s.echo.Close(); err != nil {
|
||||
log.Error().Err(err).Msg("Failed to stop metrics server")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
s.echo.ServeHTTP(w, r)
|
||||
}
|
||||
Reference in New Issue
Block a user