add site code

This commit is contained in:
davidnewhall2 2019-11-17 03:02:25 -08:00
parent f5b67ffb7f
commit ab86d34cf2
8 changed files with 203 additions and 38 deletions

View File

@ -104,7 +104,7 @@ is provided so the application can be easily adapted to any environment.
* Value: prometheus
In this mode the application opens an http interface and exports the
measurements at /metrics for collection by prometheus. Enabling this
mode disables InfluxDB usage entirely.
mode disables InfluxDB usage entirely. This is BETA.
http_listen default: 0.0.0.0:61317
This option controls the IP and port the http listener uses when the

View File

@ -32,6 +32,7 @@ quiet = false
#
# Prometheus mode opens an HTTP server on port 61317 and exports the metrics at
# /metrics for polling collection by a prometheus server. This disables influxdb.
# IMPORTANT: The prometheus mode is still beta and doesn't work very well.
mode = "influx"
# This controls on which ip and port /metrics is exported when mode is "prometheus".

View File

@ -48,6 +48,7 @@
#
# Prometheus mode opens an HTTP server on port 61317 and exports the metrics at
# /metrics for polling collection by a prometheus server. This disables influxdb.
# IMPORTANT: The prometheus mode is still beta and doesn't work very well.
-->
<mode>influx</mode>

View File

@ -33,6 +33,7 @@ quiet: false
#
# Prometheus mode opens an HTTP server on port 61317 and exports the metrics at
# /metrics for polling collection by a prometheus server. This disables influxdb.
# IMPORTANT: The prometheus mode is still beta and doesn't work very well.
mode: "influx"
# This controls on which ip and port /metrics is exported when mode is "prometheus".

View File

@ -1,4 +1,4 @@
# prometheus
This package provides the methods to turn UniFi measurements into prometheus
exported metrics.
This package provides the interface to turn UniFi measurements into prometheus
exported metrics. Requires the poller package for actual UniFi data collection.

View File

@ -47,123 +47,123 @@ func descClient(ns string) *client {
return &client{
Anomalies: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "anomalies"),
prometheus.BuildFQName(ns, ns2, "Anomalies"),
"Client Anomalies", labels, nil,
),
BytesR: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "bytesr"),
prometheus.BuildFQName(ns, ns2, "BytesR"),
"Client Data Rate", labels, nil,
),
CCQ: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "ccq"),
prometheus.BuildFQName(ns, ns2, "CCQ"),
"Client Connection Quality", labels, nil,
),
Noise: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "noise"),
prometheus.BuildFQName(ns, ns2, "Noise"),
"Client AP Noise", labels, nil,
),
RoamCount: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "roamcount"),
prometheus.BuildFQName(ns, ns2, "RoamCount"),
"Client Roam Counter", labels, nil,
),
RSSI: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "rssi"),
prometheus.BuildFQName(ns, ns2, "RSSI"),
"Client RSSI", labels, nil,
),
RxBytes: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "rxbytes"),
prometheus.BuildFQName(ns, ns2, "RxBytes"),
"Client Receive Bytes", labels, nil,
),
RxBytesR: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "rxbytesr"),
prometheus.BuildFQName(ns, ns2, "RxBytesR"),
"Client Receive Data Rate", labels, nil,
),
RxPackets: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "rxpackets"),
prometheus.BuildFQName(ns, ns2, "RxPackets"),
"Client Receive Packets", labels, nil,
),
RxRate: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "rxrate"),
prometheus.BuildFQName(ns, ns2, "RxRate"),
"Client Receive Rate", labels, nil,
),
Signal: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "signal"),
prometheus.BuildFQName(ns, ns2, "Signal"),
"Client Signal Strength", labels, nil,
),
TxBytes: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "txbytes"),
prometheus.BuildFQName(ns, ns2, "TxBytes"),
"Client Transmit Bytes", labels, nil,
),
TxBytesR: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "txbytesr"),
prometheus.BuildFQName(ns, ns2, "TxBytesR"),
"Client Transmit Data Rate", labels, nil,
),
TxPackets: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "txpackets"),
prometheus.BuildFQName(ns, ns2, "TxPackets"),
"Client Transmit Packets", labels, nil,
),
TxPower: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "txpower"),
prometheus.BuildFQName(ns, ns2, "TxPower"),
"Client Transmit Power", labels, nil,
),
TxRate: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "txrate"),
prometheus.BuildFQName(ns, ns2, "TxRate"),
"Client Transmit Rate", labels, nil,
),
Uptime: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "uptime"),
prometheus.BuildFQName(ns, ns2, "Uptime"),
"Client Uptime", labels, nil,
),
WifiTxAttempts: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "wifitxattempts"),
prometheus.BuildFQName(ns, ns2, "WifiTxAttempts"),
"Client Wifi Transmit Attempts", labels, nil,
),
WiredRxBytes: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "wiredrxbytes"),
prometheus.BuildFQName(ns, ns2, "WiredRxBytes"),
"Client Wired Receive Bytes", labels, nil,
),
WiredRxBytesR: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "wiredrxbytesr"),
prometheus.BuildFQName(ns, ns2, "WiredRxBytesR"),
"Client Wired Receive Data Rate", labels, nil,
),
WiredRxPackets: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "wiredrxpackets"),
prometheus.BuildFQName(ns, ns2, "WiredRxPackets"),
"Client Wired Receive Packets", labels, nil,
),
WiredTxBytes: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "wiredtxbytes"),
prometheus.BuildFQName(ns, ns2, "WiredTxBytes"),
"Client Wired Transmit Bytes", labels, nil,
),
WiredTxBytesR: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "wiredtxbytesr"),
prometheus.BuildFQName(ns, ns2, "WiredTxBytesR"),
"Client Wired Data Rate", labels, nil,
),
WiredTxPackets: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "wiredtxpackets"),
prometheus.BuildFQName(ns, ns2, "WiredTxPackets"),
"Client Wired Transmit Packets", labels, nil,
),
DpiStatsApp: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "dpistatsapp"),
prometheus.BuildFQName(ns, ns2, "DpiStatsApp"),
"Client DPI Stats App", labels, nil,
),
DpiStatsCat: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "dpistatscat"),
prometheus.BuildFQName(ns, ns2, "DpiStatsCat"),
"Client DPI Stats Cat", labels, nil,
),
DpiStatsRxBytes: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "dpistatsrxbytes"),
prometheus.BuildFQName(ns, ns2, "DpiStatsRxBytes"),
"Client DPI Stats Receive Bytes", labels, nil,
),
DpiStatsRxPackets: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "dpistatsrxpackets"),
prometheus.BuildFQName(ns, ns2, "DpiStatsRxPackets"),
"Client DPI Stats Receive Packets", labels, nil,
),
DpiStatsTxBytes: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "dpistatstxbytes"),
prometheus.BuildFQName(ns, ns2, "DpiStatsTxBytes"),
"Client DPI Stats Transmit Bytes", labels, nil,
),
DpiStatsTxPackets: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "dpistatstxpackets"),
prometheus.BuildFQName(ns, ns2, "DpiStatsTxPackets"),
"Client DPI Stats Transmit Packets", labels, nil,
),
}

View File

@ -131,10 +131,15 @@ func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricEx
for _, e := range exports {
v, ok := e.Value.(float64)
if !ok {
if u.Config.ReportErrors {
ch <- prometheus.NewInvalidMetric(e.Desc, fmt.Errorf("not a number"))
j, ok := e.Value.(int64)
v = float64(j)
if !ok {
// log.Printf("not a number: %v %v", e.Value, e.Desc.String())
if u.Config.ReportErrors {
ch <- prometheus.NewInvalidMetric(e.Desc, fmt.Errorf("not a number: %v", e.Value))
}
continue
}
return
}
ch <- prometheus.NewMetricWithTimestamp(ts, prometheus.MustNewConstMetric(e.Desc, e.ValueType, v, e.Labels...))
}

View File

@ -1,17 +1,174 @@
package promunifi
import (
"github.com/prometheus/client_golang/prometheus"
"golift.io/unifi"
)
type site struct {
NumUser *prometheus.Desc
NumGuest *prometheus.Desc
NumIot *prometheus.Desc
TxBytesR *prometheus.Desc
RxBytesR *prometheus.Desc
NumAp *prometheus.Desc
NumAdopted *prometheus.Desc
NumDisabled *prometheus.Desc
NumDisconnected *prometheus.Desc
NumPending *prometheus.Desc
NumGw *prometheus.Desc
NumSw *prometheus.Desc
NumSta *prometheus.Desc
Latency *prometheus.Desc
Drops *prometheus.Desc
XputUp *prometheus.Desc
XputDown *prometheus.Desc
SpeedtestPing *prometheus.Desc
RemoteUserNumActive *prometheus.Desc
RemoteUserNumInactive *prometheus.Desc
RemoteUserRxBytes *prometheus.Desc
RemoteUserTxBytes *prometheus.Desc
RemoteUserRxPackets *prometheus.Desc
RemoteUserTxPackets *prometheus.Desc
}
// XXX: The help values can be more verbose.
func descSite(ns string) *site {
return &site{}
labels := []string{"name", "desc", "site_name", "subsystem", "status", "gwversion"}
ns2 := "site"
return &site{
NumUser: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumUser"),
"NumUser", labels, nil,
),
NumGuest: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumGuest"),
"NumGuest", labels, nil,
),
NumIot: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumIot"),
"NumIot", labels, nil,
),
TxBytesR: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "TxBytesR"),
"TxBytesR", labels, nil,
),
RxBytesR: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "RxBytesR"),
"RxBytesR", labels, nil,
),
NumAp: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumAp"),
"NumAp", labels, nil,
),
NumAdopted: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumAdopted"),
"NumAdopted", labels, nil,
),
NumDisabled: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumDisabled"),
"NumDisabled", labels, nil,
),
NumDisconnected: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumDisconnected"),
"NumDisconnected", labels, nil,
),
NumPending: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumPending"),
"NumPending", labels, nil,
),
NumGw: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumGw"),
"NumGw", labels, nil,
),
NumSw: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumSw"),
"NumSw", labels, nil,
),
NumSta: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "NumSta"),
"NumSta", labels, nil,
),
Latency: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "Latency"),
"Latency", labels, nil,
),
Drops: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "Drops"),
"Drops", labels, nil,
),
XputUp: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "XputUp"),
"XputUp", labels, nil,
),
XputDown: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "XputDown"),
"XputDown", labels, nil,
),
SpeedtestPing: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "SpeedtestPing"),
"SpeedtestPing", labels, nil,
),
RemoteUserNumActive: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "RemoteUserNumActive"),
"RemoteUserNumActive", labels, nil,
),
RemoteUserNumInactive: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "RemoteUserNumInactive"),
"RemoteUserNumInactive", labels, nil,
),
RemoteUserRxBytes: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "RemoteUserRxBytes"),
"RemoteUserRxBytes", labels, nil,
),
RemoteUserTxBytes: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "RemoteUserTxBytes"),
"RemoteUserTxBytes", labels, nil,
),
RemoteUserRxPackets: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "RemoteUserRxPackets"),
"RemoteUserRxPackets", labels, nil,
),
RemoteUserTxPackets: prometheus.NewDesc(
prometheus.BuildFQName(ns, ns2, "RemoteUserTxPackets"),
"RemoteUserTxPackets", labels, nil,
),
}
}
// exportSite exports Network Site Data
func (u *unifiCollector) exportSite(s *unifi.Site) []*metricExports {
return nil
labels := []string{s.Name, s.Desc, s.SiteName}
var m []*metricExports
for _, h := range s.Health {
l := append(labels, h.Subsystem, h.Status, h.GwVersion)
m = append(m, &metricExports{u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l})
m = append(m, &metricExports{u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l})
m = append(m, &metricExports{u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l})
m = append(m, &metricExports{u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR.Val, l})
m = append(m, &metricExports{u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR.Val, l})
m = append(m, &metricExports{u.Site.NumAp, prometheus.CounterValue, h.NumAp.Val, l})
m = append(m, &metricExports{u.Site.NumAdopted, prometheus.CounterValue, h.NumAdopted.Val, l})
m = append(m, &metricExports{u.Site.NumDisabled, prometheus.CounterValue, h.NumDisabled.Val, l})
m = append(m, &metricExports{u.Site.NumDisconnected, prometheus.CounterValue, h.NumDisconnected.Val, l})
m = append(m, &metricExports{u.Site.NumPending, prometheus.CounterValue, h.NumPending.Val, l})
m = append(m, &metricExports{u.Site.NumGw, prometheus.CounterValue, h.NumGw.Val, l})
m = append(m, &metricExports{u.Site.NumSw, prometheus.CounterValue, h.NumSw.Val, l})
m = append(m, &metricExports{u.Site.NumSta, prometheus.CounterValue, h.NumSta.Val, l})
m = append(m, &metricExports{u.Site.Latency, prometheus.GaugeValue, h.Latency.Val, l})
m = append(m, &metricExports{u.Site.Drops, prometheus.CounterValue, h.Drops.Val, l})
m = append(m, &metricExports{u.Site.XputUp, prometheus.GaugeValue, h.XputUp.Val, l})
m = append(m, &metricExports{u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l})
m = append(m, &metricExports{u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l})
if h.Subsystem == "vpn" {
m = append(m, &metricExports{u.Site.RemoteUserNumActive, prometheus.CounterValue, h.RemoteUserNumActive.Val, l})
m = append(m, &metricExports{u.Site.RemoteUserNumInactive, prometheus.CounterValue, h.RemoteUserNumInactive.Val, l})
m = append(m, &metricExports{u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes.Val, l})
m = append(m, &metricExports{u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes.Val, l})
m = append(m, &metricExports{u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets.Val, l})
m = append(m, &metricExports{u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets.Val, l})
}
}
return m
}