Extract metrics reporter from Server

This commit is contained in:
Daniel Oliveira
2021-01-18 22:10:12 +01:00
parent 1e88d904fe
commit cc3073ed05
2 changed files with 73 additions and 32 deletions

View File

@ -2,6 +2,7 @@ package server
import ( import (
"context" "context"
"github.com/criticalstack/quake-kube/pkg/reporters/metrics"
"io/ioutil" "io/ioutil"
"log" "log"
"net" "net"
@ -9,36 +10,12 @@ import (
"path/filepath" "path/filepath"
"time" "time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"sigs.k8s.io/yaml" "sigs.k8s.io/yaml"
quakenet "github.com/criticalstack/quake-kube/internal/quake/net" quakenet "github.com/criticalstack/quake-kube/internal/quake/net"
"github.com/criticalstack/quake-kube/internal/util/exec" "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 { type Server struct {
Dir string Dir string
WatchInterval time.Duration WatchInterval time.Duration
@ -112,13 +89,7 @@ func (s *Server) Start(ctx context.Context) error {
log.Printf("metrics: get status failed %v", err) log.Printf("metrics: get status failed %v", err)
continue continue
} }
actrvePlayers.Set(float64(len(status.Players))) s.reportStatusMetrics(status)
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))
}
case <-ctx.Done(): case <-ctx.Done():
return return
} }
@ -136,7 +107,7 @@ func (s *Server) Start(ctx context.Context) error {
if err := s.reload(); err != nil { if err := s.reload(); err != nil {
return err return err
} }
configReloads.Inc() metrics.ConfigReloads().Inc()
if err := cmd.Restart(ctx); err != nil { if err := cmd.Restart(ctx); err != nil {
return err 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 { func (s *Server) reload() error {
data, err := ioutil.ReadFile(s.ConfigFile) data, err := ioutil.ReadFile(s.ConfigFile)
if err != nil { if err != nil {

View File

@ -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))
}
}