From 0ab3de2ec43f799a7ed748c8ecc4720d791672b6 Mon Sep 17 00:00:00 2001 From: Cody Lee Date: Wed, 21 Dec 2022 21:47:33 -0600 Subject: [PATCH] add dd support --- pkg/datadogunifi/datadog.go | 2 + pkg/datadogunifi/pdu.go | 100 ++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 pkg/datadogunifi/pdu.go diff --git a/pkg/datadogunifi/datadog.go b/pkg/datadogunifi/datadog.go index 4432cb18..e9811f7e 100644 --- a/pkg/datadogunifi/datadog.go +++ b/pkg/datadogunifi/datadog.go @@ -323,6 +323,8 @@ func (u *DatadogUnifi) switchExport(r report, v any) { //nolint:cyclop u.batchUAP(r, v) case *unifi.USW: u.batchUSW(r, v) + case *unifi.PDU: + u.batchPDU(r, v) case *unifi.USG: u.batchUSG(r, v) case *unifi.UXG: diff --git a/pkg/datadogunifi/pdu.go b/pkg/datadogunifi/pdu.go new file mode 100644 index 00000000..7c713afc --- /dev/null +++ b/pkg/datadogunifi/pdu.go @@ -0,0 +1,100 @@ +package datadogunifi + +import ( + "github.com/unpoller/unifi" +) + +// pduT is used as a name for printed/logged counters. +const pduT = item("PDU") + +// batchPDU generates Unifi PDU datapoints for Datadog. +// These points can be passed directly to datadog. +func (u *DatadogUnifi) batchPDU(r report, s *unifi.PDU) { + if !s.Adopted.Val || s.Locating.Val { + return + } + + tags := cleanTags(map[string]string{ + "mac": s.Mac, + "site_name": s.SiteName, + "source": s.SourceName, + "name": s.Name, + "version": s.Version, + "model": s.Model, + "serial": s.Serial, + "type": s.Type, + "ip": s.IP, + }) + data := CombineFloat64( + u.batchUSWstat(s.Stat.Sw), + u.batchSysStats(s.SysStats, s.SystemStats), + map[string]float64{ + "guest_num_sta": s.GuestNumSta.Val, + "bytes": s.Bytes.Val, + "outlet_ac_power_budget": s.OutletACPowerBudget.Val, + "outlet_ac_power_consumption": s.OutletACPowerConsumption.Val, + "outlet_enabled": boolToFloat64(s.OutletEnabled.Val), + "overheating": boolToFloat64(s.Overheating.Val), + "power_source": s.PowerSource.Val, + "total_max_power": s.TotalMaxPower.Val, + "last_seen": s.LastSeen.Val, + "rx_bytes": s.RxBytes.Val, + "tx_bytes": s.TxBytes.Val, + "uptime": s.Uptime.Val, + "state": s.State.Val, + "user_num_sta": s.UserNumSta.Val, + "upgradeable": boolToFloat64(s.Upgradeable.Val), + }) + r.addCount(pduT) + metricName := metricNamespace("pdu") + reportGaugeForFloat64Map(r, metricName, data, tags) + + u.batchPortTable(r, tags, s.PortTable) + + for _, oo := range s.OutletOverrides { + oot := cleanTags(map[string]string{ + "mac": s.Mac, + "site_name": s.SiteName, + "source": s.SourceName, + "name": s.Name, + "version": s.Version, + "model": s.Model, + "serial": s.Serial, + "type": s.Type, + "ip": s.IP, + "outlet_index": oo.Index.Txt, + "outlet_name": oo.Name, + }) + ood := map[string]float64{ + "cycle_enabled": boolToFloat64(oo.CycleEnabled.Val), + "relay_state": boolToFloat64(oo.RelayState.Val), + } + reportGaugeForFloat64Map(r, metricNamespace("pdu.outlet_overrides"), ood, oot) + } + + for _, ot := range s.OutletTable { + ott := cleanTags(map[string]string{ + "mac": s.Mac, + "site_name": s.SiteName, + "source": s.SourceName, + "name": s.Name, + "version": s.Version, + "model": s.Model, + "serial": s.Serial, + "type": s.Type, + "ip": s.IP, + "outlet_index": ot.Index.Txt, + "outlet_name": ot.Name, + }) + otd := map[string]float64{ + "cycle_enabled": boolToFloat64(ot.CycleEnabled.Val), + "relay_state": boolToFloat64(ot.RelayState.Val), + "outlet_caps": ot.OutletCaps.Val, + "outlet_power_factor": ot.OutletPowerFactor.Val, + "outlet_current": ot.OutletCurrent.Val, + "outlet_power": ot.OutletPower.Val, + "outlet_voltage": ot.OutletVoltage.Val, + } + reportGaugeForFloat64Map(r, metricNamespace("pdu.outlet_table"), otd, ott) + } +}