diff --git a/integrations/promunifi/collector.go b/integrations/promunifi/collector.go index f51219ef..290ab223 100644 --- a/integrations/promunifi/collector.go +++ b/integrations/promunifi/collector.go @@ -39,6 +39,7 @@ type promUnifi struct { USG *usg USW *usw Site *site + RogueAP *rogueap // This interface is passed to the Collect() method. The Collect method uses // this interface to retrieve the latest UniFi measurements and export them. Collector poller.Collect @@ -137,6 +138,8 @@ func (u *promUnifi) Run(c poller.Collect) error { u.USG = descUSG(u.Namespace + "_device_") u.USW = descUSW(u.Namespace + "_device_") u.Site = descSite(u.Namespace + "_site_") + u.RogueAP = descRogueAP(u.Namespace + "_rogueap_") + mux := http.NewServeMux() webserver.UpdateOutput(&webserver.Output{Name: PluginName, Config: u.Config}) @@ -295,6 +298,10 @@ func (u *promUnifi) exportMetrics(r report, ch chan<- prometheus.Metric, ourChan func (u *promUnifi) loopExports(r report) { m := r.metrics() + for _, s := range m.RogueAPs { + u.switchExport(r, s) + } + for _, s := range m.Sites { u.switchExport(r, s) } @@ -323,6 +330,9 @@ func (u *promUnifi) loopExports(r report) { func (u *promUnifi) switchExport(r report, v interface{}) { switch v := v.(type) { + case *unifi.RogueAP: + // r.addRogueAP() + u.exportRogueAP(r, v) case *unifi.UAP: r.addUAP() u.exportUAP(r, v) diff --git a/integrations/promunifi/go.mod b/integrations/promunifi/go.mod index 0d873cc5..dc93d971 100644 --- a/integrations/promunifi/go.mod +++ b/integrations/promunifi/go.mod @@ -5,7 +5,7 @@ go 1.15 require ( github.com/prometheus/client_golang v1.9.0 github.com/prometheus/common v0.18.0 - github.com/unifi-poller/poller v0.0.8 + github.com/unifi-poller/poller v0.0.0-20210315011940-c43dc3c221b4 github.com/unifi-poller/unifi v0.0.7-0.20210315051727-4c317f9a2b95 - github.com/unifi-poller/webserver v0.0.0-20200628212441-340749c94743 + github.com/unifi-poller/webserver v0.0.0-20210315055414-fa42b37295b7 ) diff --git a/integrations/promunifi/uap.go b/integrations/promunifi/uap.go index 68bc052c..dcbfdb40 100644 --- a/integrations/promunifi/uap.go +++ b/integrations/promunifi/uap.go @@ -80,6 +80,34 @@ type uap struct { RadioTxRetries *prometheus.Desc } +type rogueap struct { + Age *prometheus.Desc + BW *prometheus.Desc + CenterFreq *prometheus.Desc + Channel *prometheus.Desc + Freq *prometheus.Desc + Noise *prometheus.Desc + RSSI *prometheus.Desc + RSSIAge *prometheus.Desc + Signal *prometheus.Desc +} + +func descRogueAP(ns string) *rogueap { + label := []string{"security", "oui", "band", "mac", "site_name", "essid", "source"} + + return &rogueap{ + Age: prometheus.NewDesc(ns+"age", "RogueAP Age", label, nil), + BW: prometheus.NewDesc(ns+"bw", "RogueAP BW", label, nil), + CenterFreq: prometheus.NewDesc(ns+"center_freq", "RogueAP Center Frequency", label, nil), + Channel: prometheus.NewDesc(ns+"channel", "RogueAP Channel", label, nil), + Freq: prometheus.NewDesc(ns+"frequency", "RogueAP Frequency", label, nil), + Noise: prometheus.NewDesc(ns+"noise", "RogueAP Noise", label, nil), + RSSI: prometheus.NewDesc(ns+"rssi", "RogueAP RSSI", label, nil), + RSSIAge: prometheus.NewDesc(ns+"rssi_age", "RogueAP RSSI Age", label, nil), + Signal: prometheus.NewDesc(ns+"signal", "RogueAP Signal", label, nil), + } +} + func descUAP(ns string) *uap { // nolint: funlen labelA := []string{"stat", "site_name", "name", "source"} // stat + labels[1:] labelV := []string{"vap_name", "bssid", "radio", "radio_name", "essid", "usage", "site_name", "name", "source"} @@ -162,6 +190,22 @@ func descUAP(ns string) *uap { // nolint: funlen } } +func (u *promUnifi) exportRogueAP(r report, d *unifi.RogueAP) { + labels := []string{d.Security, d.Oui, d.Band, d.ApMac, d.SiteName, d.Essid, d.SourceName} + + r.send([]*metric{ + {u.RogueAP.Age, gauge, d.Age.Val, labels}, + {u.RogueAP.BW, gauge, d.Bw.Val, labels}, + {u.RogueAP.CenterFreq, gauge, d.CenterFreq.Val, labels}, + {u.RogueAP.Channel, gauge, d.Channel, labels}, + {u.RogueAP.Freq, gauge, d.Freq.Val, labels}, + {u.RogueAP.Noise, gauge, d.Noise.Val, labels}, + {u.RogueAP.RSSI, gauge, d.Rssi.Val, labels}, + {u.RogueAP.RSSIAge, gauge, d.RssiAge.Val, labels}, + {u.RogueAP.Signal, gauge, d.Signal.Val, labels}, + }) +} + func (u *promUnifi) exportUAP(r report, d *unifi.UAP) { if !d.Adopted.Val || d.Locating.Val { return