From dd52c89918be7ae6f344229a024d38f844607ab4 Mon Sep 17 00:00:00 2001 From: Dan Fuhry Date: Tue, 16 Jan 2024 23:21:55 -0500 Subject: [PATCH] apcups_exporter: handle apcupsd restarts/downtime; add systemd unit --- go.mod | 1 + go.sum | 2 ++ metrics/apcups_exporter/main.go | 36 +++++++++++++++---- .../systemd/apcupsd-exporter.service | 11 ++++++ 4 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 metrics/apcups_exporter/systemd/apcupsd-exporter.service diff --git a/go.mod b/go.mod index ad4233c..13a3f50 100644 --- a/go.mod +++ b/go.mod @@ -43,6 +43,7 @@ require ( github.com/BurntSushi/toml v1.2.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba // indirect github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect diff --git a/go.sum b/go.sum index c156bf5..434c6da 100644 --- a/go.sum +++ b/go.sum @@ -98,6 +98,8 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.4.0 h1:y9YHcjnjynCd/DVbg5j9L/33jQM3MxJlbj/zWskzfGU= github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= diff --git a/metrics/apcups_exporter/main.go b/metrics/apcups_exporter/main.go index 0fa6b6e..d4ccbd9 100644 --- a/metrics/apcups_exporter/main.go +++ b/metrics/apcups_exporter/main.go @@ -4,10 +4,13 @@ import ( "context" "flag" "os/signal" + "sync" "syscall" "time" + "github.com/coreos/go-systemd/daemon" "github.com/mdlayher/apcupsd" + "go.fuhry.dev/runtime/metrics/metricbus/mbclient" "go.fuhry.dev/runtime/utils/log" ) @@ -19,16 +22,20 @@ type apcMetrics struct { } func main() { + var apcConn *apcupsd.Client + var err error + var sdNotifyOnce sync.Once + ctx, _ := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) flag.Parse() svc := mbclient.NewService(ctx) - apcupsd, err := apcupsd.Dial("tcp", "127.0.0.1:3551") - if err != nil { - log.Panic(err) - } - defer apcupsd.Close() + defer (func() { + if apcConn != nil { + apcConn.Close() + } + })() metrics := apcMetrics{ lineVoltage: svc.DefineGauge("apcups_line_voltage", "AC mains line voltage"), @@ -48,13 +55,30 @@ func main() { for { select { case <-ticker.C: - status, err := apcupsd.Status() + if apcConn == nil { + apcConn, err = apcupsd.Dial("tcp", "127.0.0.1:3551") + if err != nil { + log.Default().Errorf("error getting status from apcupsd: %v", err) + continue + } + } + status, err := apcConn.Status() if err != nil { log.Default().Errorf("error getting status from apcupsd: %v", err) + apcConn.Close() + + apcConn = nil continue } log.Default().V(1).Infof("UPS status: state=%s, line voltage: %.1f, load %% %.1f, seconds left %.0f, charge pct %.1f", status.Status, status.LineVoltage, status.LoadPercent, status.TimeLeft.Seconds(), status.BatteryChargePercent) + if status.LoadPercent == 0.0 && status.BatteryChargePercent == 0.0 { + log.Default().V(1).Error("refusing to log impossible apcups state") + continue + } + sdNotifyOnce.Do(func() { + daemon.SdNotify(false, daemon.SdNotifyReady) + }) metrics.lineVoltage.Set(status.LineVoltage) metrics.loadPercentage.Set(status.LoadPercent) metrics.secondsLeft.Set(status.TimeLeft.Seconds()) diff --git a/metrics/apcups_exporter/systemd/apcupsd-exporter.service b/metrics/apcups_exporter/systemd/apcupsd-exporter.service new file mode 100644 index 0000000..b815ead --- /dev/null +++ b/metrics/apcups_exporter/systemd/apcupsd-exporter.service @@ -0,0 +1,11 @@ +[Unit] +Description=Export stats from apcupsd via metric-collector +Requires=apcupsd.service + +[Service] +Type=notify +User=daemon +ExecStart=/usr/bin/apcupsd-exporter + +[Install] +WantedBy=default.target -- 2.50.1