From 4f14ba2aa607d9962b715d9dda0cbbc5ff942162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20B=C3=B6gershausen?= Date: Mon, 14 Mar 2022 16:50:25 +0100 Subject: [PATCH] apcupsd_exporter: add OutputVolts and InternalTemp (#15) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Malte Bögershausen --- upscollector.go | 32 ++++++++++++++++++++++++++++++++ upscollector_test.go | 4 ++++ 2 files changed, 36 insertions(+) diff --git a/upscollector.go b/upscollector.go index dfdab3a..d2289eb 100644 --- a/upscollector.go +++ b/upscollector.go @@ -24,6 +24,7 @@ type UPSCollector struct { BatteryChargePercent *prometheus.Desc LineVolts *prometheus.Desc LineNominalVolts *prometheus.Desc + OutputVolts *prometheus.Desc BatteryVolts *prometheus.Desc BatteryNominalVolts *prometheus.Desc BatteryNumberTransfersTotal *prometheus.Desc @@ -34,6 +35,7 @@ type UPSCollector struct { LastTransferOffBatteryTimeSeconds *prometheus.Desc LastSelftestTimeSeconds *prometheus.Desc NominalPowerWatts *prometheus.Desc + InternalTemp *prometheus.Desc ss StatusSource } @@ -80,6 +82,13 @@ func NewUPSCollector(ss StatusSource) *UPSCollector { nil, ), + OutputVolts: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "output_volts"), + "Current AC output voltage.", + labels, + nil, + ), + BatteryVolts: prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "battery_volts"), "Current UPS battery voltage.", @@ -150,6 +159,13 @@ func NewUPSCollector(ss StatusSource) *UPSCollector { nil, ), + InternalTemp: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "internal_temp"), + "Internal temperature in °C.", + labels, + nil, + ), + ss: ss, } } @@ -163,6 +179,7 @@ func (c *UPSCollector) Describe(ch chan<- *prometheus.Desc) { c.BatteryChargePercent, c.LineVolts, c.LineNominalVolts, + c.OutputVolts, c.BatteryVolts, c.BatteryNominalVolts, c.BatteryNumberTransfersTotal, @@ -173,6 +190,7 @@ func (c *UPSCollector) Describe(ch chan<- *prometheus.Desc) { c.LastTransferOffBatteryTimeSeconds, c.LastSelftestTimeSeconds, c.NominalPowerWatts, + c.InternalTemp, } for _, d := range ds { @@ -225,6 +243,13 @@ func (c *UPSCollector) Collect(ch chan<- prometheus.Metric) { s.UPSName, ) + ch <- prometheus.MustNewConstMetric( + c.OutputVolts, + prometheus.GaugeValue, + s.OutputVoltage, + s.UPSName, + ) + ch <- prometheus.MustNewConstMetric( c.BatteryVolts, prometheus.GaugeValue, @@ -294,6 +319,13 @@ func (c *UPSCollector) Collect(ch chan<- prometheus.Metric) { float64(s.NominalPower), s.UPSName, ) + + ch <- prometheus.MustNewConstMetric( + c.InternalTemp, + prometheus.GaugeValue, + s.InternalTemp, + s.UPSName, + ) } func timestamp(t time.Time) float64 { diff --git a/upscollector_test.go b/upscollector_test.go index aa968f4..0048897 100644 --- a/upscollector_test.go +++ b/upscollector_test.go @@ -36,12 +36,14 @@ func TestUPSCollector(t *testing.T) { BatteryVoltage: 13.2, NominalInputVoltage: 120.0, LineVoltage: 121.1, + OutputVoltage: 120.9, LoadPercent: 16.0, NumberTransfers: 1, XOnBattery: time.Unix(100001, 0), XOffBattery: time.Unix(100002, 0), LastSelftest: time.Unix(100003, 0), NominalPower: 50.0, + InternalTemp: 26.4, }, }, matches: []*regexp.Regexp{ @@ -55,11 +57,13 @@ func TestUPSCollector(t *testing.T) { regexp.MustCompile(`apcupsd_info{hostname="foo",model="APC UPS",ups="bar"} 1`), regexp.MustCompile(`apcupsd_line_nominal_volts{ups="bar"} 120`), regexp.MustCompile(`apcupsd_line_volts{ups="bar"} 121.1`), + regexp.MustCompile(`apcupsd_output_volts{ups="bar"} 120.9`), regexp.MustCompile(`apcupsd_ups_load_percent{ups="bar"} 16`), regexp.MustCompile(`apcupsd_last_transfer_on_battery_time_seconds{ups="bar"} 100001`), regexp.MustCompile(`apcupsd_last_transfer_off_battery_time_seconds{ups="bar"} 100002`), regexp.MustCompile(`apcupsd_last_selftest_time_seconds{ups="bar"} 100003`), regexp.MustCompile(`apcupsd_nominal_power_watts{ups="bar"} 50`), + regexp.MustCompile(`apcupsd_internal_temp{ups="bar"} 26.4`), }, }, }