From cc3073ed0548f45f21d524ce52cc52df66698b16 Mon Sep 17 00:00:00 2001 From: Daniel Oliveira Date: Mon, 18 Jan 2021 22:10:12 +0100 Subject: [PATCH] Extract metrics reporter from Server --- internal/quake/server/server.go | 45 +++++------------ pkg/reporters/metrics/metrics_reporter.go | 60 +++++++++++++++++++++++ 2 files changed, 73 insertions(+), 32 deletions(-) create mode 100644 pkg/reporters/metrics/metrics_reporter.go diff --git a/internal/quake/server/server.go b/internal/quake/server/server.go index cf4cc58..a790cda 100644 --- a/internal/quake/server/server.go +++ b/internal/quake/server/server.go @@ -2,6 +2,7 @@ package server import ( "context" + "github.com/criticalstack/quake-kube/pkg/reporters/metrics" "io/ioutil" "log" "net" @@ -9,36 +10,12 @@ import ( "path/filepath" "time" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" "sigs.k8s.io/yaml" quakenet "github.com/criticalstack/quake-kube/internal/quake/net" "github.com/criticalstack/quake-kube/internal/util/exec" ) -var ( - actrvePlayers = promauto.NewGauge(prometheus.GaugeOpts{ - Name: "quake_active_players", - Help: "The current number of active players", - }) - - scores = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Name: "quake_player_scores", - Help: "Current scores by player, by map", - }, []string{"player", "map"}) - - pings = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Name: "quake_player_pings", - Help: "Current ping by player", - }, []string{"player"}) - - configReloads = promauto.NewCounter(prometheus.CounterOpts{ - Name: "quake_config_reloads", - Help: "Config file reload count", - }) -) - type Server struct { Dir string WatchInterval time.Duration @@ -112,13 +89,7 @@ func (s *Server) Start(ctx context.Context) error { log.Printf("metrics: get status failed %v", err) continue } - actrvePlayers.Set(float64(len(status.Players))) - for _, p := range status.Players { - if mapname, ok := status.Configuration["mapname"]; ok { - scores.WithLabelValues(p.Name, mapname).Set(float64(p.Score)) - } - pings.WithLabelValues(p.Name).Set(float64(p.Ping)) - } + s.reportStatusMetrics(status) case <-ctx.Done(): return } @@ -136,7 +107,7 @@ func (s *Server) Start(ctx context.Context) error { if err := s.reload(); err != nil { return err } - configReloads.Inc() + metrics.ConfigReloads().Inc() if err := cmd.Restart(ctx); err != nil { return err } @@ -151,6 +122,16 @@ func (s *Server) Start(ctx context.Context) error { } } +func (s *Server) reportStatusMetrics(status *quakenet.StatusResponse) { + statusMetrics := &metrics.StatusMetrics{ + Players: status.Players, + } + if mapName, ok := status.Configuration["mapname"]; ok { + statusMetrics.MapName = mapName + } + metrics.Report(statusMetrics) +} + func (s *Server) reload() error { data, err := ioutil.ReadFile(s.ConfigFile) if err != nil { diff --git a/pkg/reporters/metrics/metrics_reporter.go b/pkg/reporters/metrics/metrics_reporter.go new file mode 100644 index 0000000..784e430 --- /dev/null +++ b/pkg/reporters/metrics/metrics_reporter.go @@ -0,0 +1,60 @@ +package metrics + +import ( + "github.com/criticalstack/quake-kube/internal/quake/net" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ( + activePlayers = promauto.NewGauge(prometheus.GaugeOpts{ + Name: "quake_active_players", + Help: "The current number of active players", + }) + + scores = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "quake_player_scores", + Help: "Current scores by player, by map", + }, []string{"player", "map"}) + + pings = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "quake_player_pings", + Help: "Current ping by player", + }, []string{"player"}) + + configReloads = promauto.NewCounter(prometheus.CounterOpts{ + Name: "quake_config_reloads", + Help: "Config file reload count", + }) +) + +type StatusMetrics struct { + MapName string + Players []net.Player +} + +func ConfigReloads() prometheus.Counter { + return configReloads +} + +func Pings() *prometheus.GaugeVec { + return pings +} + +func Scores() *prometheus.GaugeVec { + return scores +} + +func ActivePlayers() prometheus.Gauge { + return activePlayers +} + +func Report(metrics *StatusMetrics) { + ActivePlayers().Set(float64(len(metrics.Players))) + for _, p := range metrics.Players { + if len(metrics.MapName) > 0 { + Scores().WithLabelValues(p.Name, metrics.MapName).Set(float64(p.Score)) + } + Pings().WithLabelValues(p.Name).Set(float64(p.Ping)) + } +}