From fb690543fa7d38a5040d7a19196a0cf2c1eb888b 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 | 22 ++++++++++++++++++++++ wol.go | 19 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/config.go b/config.go index cf096a7..5af1281 100644 --- a/config.go +++ b/config.go @@ -7,6 +7,8 @@ import ( "sync" "github.com/jetkvm/kvm/internal/usbgadget" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" ) type WakeOnLanDevice struct { @@ -129,6 +131,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() @@ -144,6 +161,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() @@ -152,6 +171,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 } @@ -164,6 +184,8 @@ func LoadConfig() { loadedConfig.UsbDevices = defaultConfig.UsbDevices } + configSuccess.Set(1.0) + configSuccessTime.SetToCurrentTime() config = &loadedConfig rootLogger.UpdateLogLevel() diff --git a/wol.go b/wol.go index 47f921a..e90d740 100644 --- a/wol.go +++ b/wol.go @@ -6,11 +6,27 @@ import ( "net" ) +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 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 +36,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 +44,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 }