From 315c1c9f57eb5f6c9b69ed068e1093b25555361b Mon Sep 17 00:00:00 2001 From: SuperQ Date: Tue, 25 Feb 2025 16:58:28 +0100 Subject: [PATCH] Add more metrics * Configuration load success/timestamp. * Wake-on-Lan packets/errors. Signed-off-by: SuperQ --- config.go | 23 +++++++++++++++++++++++ wol.go | 22 ++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/config.go b/config.go index 04f2a4e..4be03a5 100644 --- a/config.go +++ b/config.go @@ -9,6 +9,8 @@ import ( "github.com/jetkvm/kvm/internal/logging" "github.com/jetkvm/kvm/internal/network" "github.com/jetkvm/kvm/internal/usbgadget" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" ) type WakeOnLanDevice struct { @@ -138,6 +140,21 @@ var ( configLock = &sync.Mutex{} ) +var ( + configSuccess = promauto.NewGauge( + prometheus.GaugeOpts{ + Name: "jetkvm_config_last_reload_successful", + Help: "The last configuration load succeeded", + }, + ) + configSuccessTime = promauto.NewGauge( + prometheus.GaugeOpts{ + Name: "jetkvm_config_last_reload_success_timestamp_seconds", + Help: "Timestamp of last successful config load", + }, + ) +) + func LoadConfig() { configLock.Lock() defer configLock.Unlock() @@ -153,6 +170,8 @@ func LoadConfig() { file, err := os.Open(configPath) if err != nil { logger.Debug().Msg("default config file doesn't exist, using default") + configSuccess.Set(1.0) + configSuccessTime.SetToCurrentTime() return } defer file.Close() @@ -161,6 +180,7 @@ func LoadConfig() { loadedConfig := *defaultConfig if err := json.NewDecoder(file).Decode(&loadedConfig); err != nil { logger.Warn().Err(err).Msg("config file JSON parsing failed") + configSuccess.Set(0.0) return } @@ -181,6 +201,9 @@ func LoadConfig() { logging.GetRootLogger().UpdateLogLevel(config.DefaultLogLevel) + configSuccess.Set(1.0) + configSuccessTime.SetToCurrentTime() + logger.Info().Str("path", configPath).Msg("config loaded") } diff --git a/wol.go b/wol.go index 47f921a..02b5c96 100644 --- a/wol.go +++ b/wol.go @@ -4,6 +4,24 @@ import ( "bytes" "encoding/binary" "net" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ( + wolPackets = promauto.NewCounter( + prometheus.CounterOpts{ + Name: "jetkvm_wol_sent_packets_total", + Help: "Total number of Wake-on-LAN magic packets sent.", + }, + ) + wolErrors = promauto.NewCounter( + prometheus.CounterOpts{ + Name: "jetkvm_wol_sent_packet_errors_total", + Help: "Total number of Wake-on-LAN magic packets errors.", + }, + ) ) // SendWOLMagicPacket sends a Wake-on-LAN magic packet to the specified MAC address @@ -11,6 +29,7 @@ func rpcSendWOLMagicPacket(macAddress string) error { // Parse the MAC address mac, err := net.ParseMAC(macAddress) if err != nil { + wolErrors.Inc() return ErrorfL(wolLogger, "invalid MAC address", err) } @@ -20,6 +39,7 @@ func rpcSendWOLMagicPacket(macAddress string) error { // Set up UDP connection conn, err := net.Dial("udp", "255.255.255.255:9") if err != nil { + wolErrors.Inc() return ErrorfL(wolLogger, "failed to establish UDP connection", err) } defer conn.Close() @@ -27,10 +47,12 @@ func rpcSendWOLMagicPacket(macAddress string) error { // Send the packet _, err = conn.Write(packet) if err != nil { + wolErrors.Inc() return ErrorfL(wolLogger, "failed to send WOL packet", err) } wolLogger.Info().Str("mac", macAddress).Msg("WOL packet sent") + wolPackets.Inc() return nil }