This commit is contained in:
davidnewhall2 2019-11-28 20:17:37 -08:00
parent 61b43f2696
commit 70aae28723
6 changed files with 196 additions and 280 deletions

View File

@ -38,6 +38,7 @@ type UnifiCollectorCnfg struct {
type unifiCollector struct {
Config UnifiCollectorCnfg
Client *uclient
Device *unifiDevice
UAP *uap
USG *usg
USW *usw
@ -70,14 +71,17 @@ func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector {
if opts.CollectFn == nil {
panic("nil collector function")
}
if opts.Namespace += "_"; opts.Namespace == "_" {
opts.Namespace = ""
}
return &unifiCollector{
Config: opts,
Client: descClient(opts.Namespace),
UAP: descUAP(opts.Namespace),
USG: descUSG(opts.Namespace),
USW: descUSW(opts.Namespace),
Site: descSite(opts.Namespace),
Client: descClient(opts.Namespace + "client_"),
Device: descDevice(opts.Namespace + "device_"), // stats for all device types.
UAP: descUAP(opts.Namespace + "device_"),
USG: descUSG(opts.Namespace + "device_"),
USW: descUSW(opts.Namespace + "device_"),
Site: descSite(opts.Namespace + "site_"),
}
}
@ -97,6 +101,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) {
}
describe(u.Client)
describe(u.Device)
describe(u.UAP)
describe(u.USG)
describe(u.USW)

View File

@ -5,16 +5,6 @@ import (
"golift.io/unifi"
)
// Each site has five subsystems.
// Some of them share data, but generally each one has its own data set.
const (
subsystemLAN = "lan"
subsystemVPN = "vpn"
subsystemWWW = "www"
subsystemWLAN = "wlan"
subsystemWAN = "wan"
)
type site struct {
NumUser *prometheus.Desc
NumGuest *prometheus.Desc
@ -44,11 +34,7 @@ type site struct {
}
func descSite(ns string) *site {
if ns += "_site_"; ns == "_site_" {
ns = "site_"
}
labels := []string{"subsystem", "status", "name", "desc", "site_name"}
return &site{
NumUser: prometheus.NewDesc(ns+"users", "Number of Users", labels, nil),
NumGuest: prometheus.NewDesc(ns+"guests", "Number of Guests", labels, nil),
@ -95,13 +81,58 @@ func (u *unifiCollector) exportSite(r *Report, s *unifi.Site) {
labels := []string{s.Name, s.Desc, s.SiteName}
for _, h := range s.Health {
l := append([]string{h.Subsystem, h.Status}, labels...)
if h.Subsystem != subsystemVPN {
switch h.Subsystem {
case "www":
r.send([]*metricExports{
{u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l},
{u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l},
{u.Site.Uptime, prometheus.GaugeValue, h.Latency, l},
{u.Site.Latency, prometheus.GaugeValue, h.Latency.Val / 1000, l},
{u.Site.XputUp, prometheus.GaugeValue, h.XputUp, l},
{u.Site.XputDown, prometheus.GaugeValue, h.XputDown, l},
{u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing, l},
{u.Site.Drops, prometheus.CounterValue, h.Drops, l},
})
} else {
case "wlan":
r.send([]*metricExports{
{u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l},
{u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l},
{u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l},
{u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l},
{u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l},
{u.Site.NumUser, prometheus.GaugeValue, h.NumUser, l},
{u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, l},
{u.Site.NumIot, prometheus.GaugeValue, h.NumIot, l},
{u.Site.NumAp, prometheus.GaugeValue, h.NumAp, l},
{u.Site.NumDisabled, prometheus.GaugeValue, h.NumDisabled, l},
})
case "wan":
r.send([]*metricExports{
{u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l},
{u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l},
{u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l},
{u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l},
{u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l},
{u.Site.NumGw, prometheus.GaugeValue, h.NumGw, l},
{u.Site.NumSta, prometheus.GaugeValue, h.NumSta, l},
})
case "lan":
r.send([]*metricExports{
{u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l},
{u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l},
{u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l},
{u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l},
{u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l},
{u.Site.NumUser, prometheus.GaugeValue, h.NumUser, l},
{u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, l},
{u.Site.NumIot, prometheus.GaugeValue, h.NumIot, l},
{u.Site.NumSw, prometheus.GaugeValue, h.NumSw, l},
})
case "vpn":
r.send([]*metricExports{
{u.Site.RemoteUserNumActive, prometheus.GaugeValue, h.RemoteUserNumActive, l},
{u.Site.RemoteUserNumInactive, prometheus.GaugeValue, h.RemoteUserNumInactive, l},
@ -111,52 +142,5 @@ func (u *unifiCollector) exportSite(r *Report, s *unifi.Site) {
{u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets, l},
})
}
if h.Subsystem == subsystemWWW {
r.send([]*metricExports{
{u.Site.Uptime, prometheus.GaugeValue, h.Latency, l},
{u.Site.Latency, prometheus.GaugeValue, h.Latency.Val / 1000, l},
{u.Site.XputUp, prometheus.GaugeValue, h.XputUp, l},
{u.Site.XputDown, prometheus.GaugeValue, h.XputDown, l},
{u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing, l},
{u.Site.Drops, prometheus.CounterValue, h.Drops, l},
})
}
if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN || h.Subsystem == subsystemWAN {
r.send([]*metricExports{
{u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l},
{u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l},
{u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l},
})
if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN {
r.send([]*metricExports{
{u.Site.NumUser, prometheus.GaugeValue, h.NumUser, l},
{u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, l},
{u.Site.NumIot, prometheus.GaugeValue, h.NumIot, l},
})
}
if h.Subsystem == subsystemWLAN {
r.send([]*metricExports{
{u.Site.NumAp, prometheus.GaugeValue, h.NumAp, l},
{u.Site.NumDisabled, prometheus.GaugeValue, h.NumDisabled, l},
})
}
if h.Subsystem == subsystemWAN {
r.send([]*metricExports{
{u.Site.NumGw, prometheus.GaugeValue, h.NumGw, l},
{u.Site.NumSta, prometheus.GaugeValue, h.NumSta, l},
})
}
if h.Subsystem == subsystemLAN {
r.send([]*metricExports{
{u.Site.NumSw, prometheus.GaugeValue, h.NumSw, l},
})
}
}
}
}

View File

@ -6,27 +6,6 @@ import (
)
type uap struct {
Uptime *prometheus.Desc
TotalTxBytes *prometheus.Desc
TotalRxBytes *prometheus.Desc
TotalBytes *prometheus.Desc
BytesD *prometheus.Desc
TxBytesD *prometheus.Desc
RxBytesD *prometheus.Desc
BytesR *prometheus.Desc
NumSta *prometheus.Desc
UserNumSta *prometheus.Desc
GuestNumSta *prometheus.Desc
// System Stats
Loadavg1 *prometheus.Desc
Loadavg5 *prometheus.Desc
Loadavg15 *prometheus.Desc
MemBuffer *prometheus.Desc
MemTotal *prometheus.Desc
MemUsed *prometheus.Desc
CPU *prometheus.Desc
Mem *prometheus.Desc
ApBytes *prometheus.Desc
// Ap Traffic Stats
ApWifiTxDropped *prometheus.Desc
ApRxErrors *prometheus.Desc
@ -104,36 +83,11 @@ type uap struct {
}
func descUAP(ns string) *uap {
if ns += "_uap_"; ns == "_uap_" {
ns = "uap_"
}
labels := []string{"ip", "site_name", "mac", "model", "name", "serial", "type", "version"}
labelA := append([]string{"stat"}, labels[2:]...)
labelV := append([]string{"vap_name", "bssid", "radio_name", "essid", "usage"}, labels[2:]...)
labelR := append([]string{"radio_name", "radio"}, labels[2:]...)
return &uap{
Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil),
TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil),
TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil),
TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil),
BytesD: prometheus.NewDesc(ns+"d_bytes", "Total Bytes D???", labels, nil),
TxBytesD: prometheus.NewDesc(ns+"d_tranmsit_bytes", "Transmit Bytes D???", labels, nil),
RxBytesD: prometheus.NewDesc(ns+"d_receive_bytes", "Receive Bytes D???", labels, nil),
BytesR: prometheus.NewDesc(ns+"rate_bytes", "Transfer Rate", labels, nil),
NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil),
UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil),
GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil),
Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil),
Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil),
Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil),
MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil),
MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil),
MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil),
CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil),
Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil),
ApBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Moved", labels, nil),
// 3x each - stat table: total, guest, user
ApWifiTxDropped: prometheus.NewDesc(ns+"stat_wifi_transmt_dropped_total", "Wifi Transmissions Dropped", labelA, nil),
ApRxErrors: prometheus.NewDesc(ns+"stat_receive_errors_total", "Receive Errors", labelA, nil),
@ -149,7 +103,6 @@ func descUAP(ns string) *uap {
ApRxBytes: prometheus.NewDesc(ns+"stat_receive_bytes_total", "Receive Bytes", labelA, nil),
WifiTxAttempts: prometheus.NewDesc(ns+"stat_wifi_transmit_attempts_total", "Wifi Transmission Attempts", labelA, nil),
MacFilterRejections: prometheus.NewDesc(ns+"stat_mac_filter_rejects_total", "MAC Filter Rejections", labelA, nil),
// N each - 1 per Virtual AP (VAP)
VAPCcq: prometheus.NewDesc(ns+"vap_ccq", "VAP Client Connection Quality", labelV, nil),
VAPMacFilterRejections: prometheus.NewDesc(ns+"vap_mac_filter_rejects_total", "VAP MAC Filter Rejections", labelV, nil),
@ -189,7 +142,6 @@ func descUAP(ns string) *uap {
VAPWifiTxLatencyMovMin: prometheus.NewDesc(ns+"vap_transmit_latency_moving_min_seconds", "VAP Latency Moving Minimum Tramsit", labelV, nil),
VAPWifiTxLatencyMovTotal: prometheus.NewDesc(ns+"vap_transmit_latency_moving_total", "VAP Latency Moving Total Tramsit", labelV, nil),
VAPWifiTxLatencyMovCount: prometheus.NewDesc(ns+"vap_transmit_latency_moving_count", "VAP Latency Moving Count Tramsit", labelV, nil),
// N each - 1 per Radio. 1-4 radios per AP usually
RadioCurrentAntennaGain: prometheus.NewDesc(ns+"radio_current_antenna_gain", "Radio Current Antenna Gain", labelR, nil),
RadioHt: prometheus.NewDesc(ns+"radio_ht", "Radio HT", labelR, nil),
@ -228,28 +180,27 @@ func (u *unifiCollector) exportUAPs(r *Report) {
func (u *unifiCollector) exportUAP(r *Report, d *unifi.UAP) {
labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial}
// AP data.
r.send([]*metricExports{
{u.UAP.Uptime, prometheus.GaugeValue, d.Uptime, labels},
{u.UAP.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels},
{u.UAP.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels},
{u.UAP.TotalBytes, prometheus.CounterValue, d.Bytes, labels},
{u.UAP.BytesD, prometheus.CounterValue, d.BytesD, labels}, // not sure if these 3 Ds are counters or gauges.
{u.UAP.TxBytesD, prometheus.CounterValue, d.TxBytesD, labels}, // not sure if these 3 Ds are counters or gauges.
{u.UAP.RxBytesD, prometheus.CounterValue, d.RxBytesD, labels}, // not sure if these 3 Ds are counters or gauges.
{u.UAP.BytesR, prometheus.GaugeValue, d.BytesR, labels},
{u.UAP.NumSta, prometheus.GaugeValue, d.NumSta, labels},
{u.UAP.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels},
{u.UAP.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels},
{u.UAP.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels},
{u.UAP.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels},
{u.UAP.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels},
{u.UAP.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels},
{u.UAP.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels},
{u.UAP.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels},
{u.UAP.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels},
{u.UAP.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels},
{u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels},
{u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels},
{u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels},
{u.Device.TotalBytes, prometheus.CounterValue, d.Bytes, labels},
{u.Device.BytesD, prometheus.CounterValue, d.BytesD, labels}, // not sure if these 3 Ds are counters or gauges.
{u.Device.TxBytesD, prometheus.CounterValue, d.TxBytesD, labels}, // not sure if these 3 Ds are counters or gauges.
{u.Device.RxBytesD, prometheus.CounterValue, d.RxBytesD, labels}, // not sure if these 3 Ds are counters or gauges.
{u.Device.BytesR, prometheus.GaugeValue, d.BytesR, labels},
{u.Device.NumSta, prometheus.GaugeValue, d.NumSta, labels},
{u.Device.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels},
{u.Device.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels},
{u.Device.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels},
{u.Device.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels},
{u.Device.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels},
{u.Device.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels},
{u.Device.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels},
{u.Device.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels},
{u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels},
{u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels},
})
u.exportUAPstats(r, labels[2:], d.Stat.Ap)
u.exportVAPtable(r, labels[2:], d.VapTable)
@ -260,7 +211,6 @@ func (u *unifiCollector) exportUAPstats(r *Report, labels []string, ap *unifi.Ap
labelA := append([]string{"all"}, labels...)
labelU := append([]string{"user"}, labels...)
labelG := append([]string{"guest"}, labels...)
r.send([]*metricExports{
// all
{u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.WifiTxDropped, labelA},

View File

@ -5,6 +5,68 @@ import (
"golift.io/unifi"
)
// These are shared by all four device types: UDM, UAP, USG, USW
type unifiDevice struct {
Uptime *prometheus.Desc
Temperature *prometheus.Desc // sw only
TotalMaxPower *prometheus.Desc // sw only
FanLevel *prometheus.Desc // sw only
TotalTxBytes *prometheus.Desc
TotalRxBytes *prometheus.Desc
TotalBytes *prometheus.Desc
BytesR *prometheus.Desc // ap only
BytesD *prometheus.Desc // ap only
Bytes *prometheus.Desc // ap only
TxBytesD *prometheus.Desc // ap only
RxBytesD *prometheus.Desc // ap only
NumSta *prometheus.Desc
UserNumSta *prometheus.Desc
GuestNumSta *prometheus.Desc
NumDesktop *prometheus.Desc // gw only
NumMobile *prometheus.Desc // gw only
NumHandheld *prometheus.Desc // gw only
Loadavg1 *prometheus.Desc
Loadavg5 *prometheus.Desc
Loadavg15 *prometheus.Desc
MemBuffer *prometheus.Desc
MemTotal *prometheus.Desc
MemUsed *prometheus.Desc
CPU *prometheus.Desc
Mem *prometheus.Desc
}
func descDevice(ns string) *unifiDevice {
labels := []string{"ip", "site_name", "mac", "model", "name", "serial", "type", "version"}
return &unifiDevice{
Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil),
Temperature: prometheus.NewDesc(ns+"temperature_celsius", "Temperature", labels, nil),
TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "Total Max Power", labels, nil),
FanLevel: prometheus.NewDesc(ns+"fan_level", "Fan Level", labels, nil),
TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil),
TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil),
TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil),
BytesR: prometheus.NewDesc(ns+"rate_bytes", "Transfer Rate", labels, nil),
BytesD: prometheus.NewDesc(ns+"d_bytes", "Total Bytes D???", labels, nil),
Bytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Bytes Transferred", labels, nil),
TxBytesD: prometheus.NewDesc(ns+"d_tranmsit_bytes", "Transmit Bytes D???", labels, nil),
RxBytesD: prometheus.NewDesc(ns+"d_receive_bytes", "Receive Bytes D???", labels, nil),
NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil),
UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil),
GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil),
NumDesktop: prometheus.NewDesc(ns+"desktops", "Number of Desktops", labels, nil),
NumMobile: prometheus.NewDesc(ns+"mobile", "Number of Mobiles", labels, nil),
NumHandheld: prometheus.NewDesc(ns+"handheld", "Number of Handhelds", labels, nil),
Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil),
Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil),
Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil),
MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil),
MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil),
MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil),
CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil),
Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil),
}
}
func (u *unifiCollector) exportUDMs(r *Report) {
if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.UDMs) < 1 {
return
@ -23,30 +85,31 @@ func (u *unifiCollector) exportUDM(r *Report, d *unifi.UDM) {
labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial}
// Gateway System Data.
r.send([]*metricExports{
{u.USG.Uptime, prometheus.GaugeValue, d.Uptime, labels},
{u.USG.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels},
{u.USG.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels},
{u.USG.TotalBytes, prometheus.CounterValue, d.Bytes, labels},
{u.USG.NumSta, prometheus.GaugeValue, d.NumSta, labels},
{u.USG.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels},
{u.USG.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels},
{u.USG.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels},
{u.USG.NumMobile, prometheus.GaugeValue, d.NumMobile, labels},
{u.USG.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels},
{u.USG.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels},
{u.USG.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels},
{u.USG.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels},
{u.USG.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels},
{u.USG.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels},
{u.USG.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels},
{u.USG.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels},
{u.USG.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels},
{u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels},
{u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels},
{u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels},
{u.Device.TotalBytes, prometheus.CounterValue, d.Bytes, labels},
{u.Device.NumSta, prometheus.GaugeValue, d.NumSta, labels},
{u.Device.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels},
{u.Device.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels},
{u.Device.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels},
{u.Device.NumMobile, prometheus.GaugeValue, d.NumMobile, labels},
{u.Device.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels},
{u.Device.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels},
{u.Device.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels},
{u.Device.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels},
{u.Device.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels},
{u.Device.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels},
{u.Device.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels},
{u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels},
{u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels},
})
u.exportUSWstats(r, d.Stat.Sw, labels)
u.exportUSGstats(r, d.Stat.Gw, d.SpeedtestStatus, labels)
u.exportWANPorts(r, labels, d.Wan1, d.Wan2)
u.exportPortTable(r, d.PortTable, labels[4:])
if d.Stat.Ap != nil && d.VapTable != nil {
// UDM Pro does not have these. UDM non-Pro does.
u.exportUAPstats(r, labels[2:], d.Stat.Ap)
u.exportVAPtable(r, labels[2:], *d.VapTable)
u.exportRadtable(r, labels[2:], *d.RadioTable, *d.RadioTableStats)

View File

@ -6,26 +6,6 @@ import (
)
type usg struct {
Uptime *prometheus.Desc
TotalMaxPower *prometheus.Desc
FanLevel *prometheus.Desc
TotalTxBytes *prometheus.Desc
TotalRxBytes *prometheus.Desc
TotalBytes *prometheus.Desc
NumSta *prometheus.Desc
UserNumSta *prometheus.Desc
GuestNumSta *prometheus.Desc
NumDesktop *prometheus.Desc
NumMobile *prometheus.Desc
NumHandheld *prometheus.Desc
Loadavg1 *prometheus.Desc
Loadavg5 *prometheus.Desc
Loadavg15 *prometheus.Desc
MemBuffer *prometheus.Desc
MemTotal *prometheus.Desc
MemUsed *prometheus.Desc
CPU *prometheus.Desc
Mem *prometheus.Desc
WanRxPackets *prometheus.Desc
WanRxBytes *prometheus.Desc
WanRxDropped *prometheus.Desc
@ -54,31 +34,9 @@ type usg struct {
}
func descUSG(ns string) *usg {
if ns += "_usg_"; ns == "_usg_" {
ns = "usg_"
}
labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"}
labelWan := append([]string{"port"}, labels...)
return &usg{
Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Uptime", labels, nil),
TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil),
TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil),
TotalBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Transferred", labels, nil),
NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil),
UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil),
GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil),
NumDesktop: prometheus.NewDesc(ns+"desktops", "Number of Desktops", labels, nil),
NumMobile: prometheus.NewDesc(ns+"mobile", "Number of Mobiles", labels, nil),
NumHandheld: prometheus.NewDesc(ns+"handheld", "Number of Handhelds", labels, nil),
Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil),
Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil),
Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil),
MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil),
MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil),
MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil),
CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil),
Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil),
WanRxPackets: prometheus.NewDesc(ns+"wan_receive_packets_total", "WAN Receive Packets Total", labelWan, nil),
WanRxBytes: prometheus.NewDesc(ns+"wan_receive_bytes_total", "WAN Receive Bytes Total", labelWan, nil),
WanRxDropped: prometheus.NewDesc(ns+"wan_receive_dropped_total", "WAN Receive Dropped Total", labelWan, nil),
@ -124,24 +82,24 @@ func (u *unifiCollector) exportUSG(r *Report, d *unifi.USG) {
labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial}
// Gateway System Data.
r.send([]*metricExports{
{u.USG.Uptime, prometheus.GaugeValue, d.Uptime, labels},
{u.USG.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels},
{u.USG.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels},
{u.USG.TotalBytes, prometheus.CounterValue, d.Bytes, labels},
{u.USG.NumSta, prometheus.GaugeValue, d.NumSta, labels},
{u.USG.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels},
{u.USG.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels},
{u.USG.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels},
{u.USG.NumMobile, prometheus.GaugeValue, d.NumMobile, labels},
{u.USG.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels},
{u.USG.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels},
{u.USG.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels},
{u.USG.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels},
{u.USG.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels},
{u.USG.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels},
{u.USG.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels},
{u.USG.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels},
{u.USG.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels},
{u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels},
{u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels},
{u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels},
{u.Device.TotalBytes, prometheus.CounterValue, d.Bytes, labels},
{u.Device.NumSta, prometheus.GaugeValue, d.NumSta, labels},
{u.Device.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels},
{u.Device.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels},
{u.Device.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels},
{u.Device.NumMobile, prometheus.GaugeValue, d.NumMobile, labels},
{u.Device.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels},
{u.Device.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels},
{u.Device.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels},
{u.Device.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels},
{u.Device.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels},
{u.Device.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels},
{u.Device.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels},
{u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels},
{u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels},
})
u.exportWANPorts(r, labels, d.Wan1, d.Wan2)
u.exportUSGstats(r, d.Stat.Gw, d.SpeedtestStatus, labels)

View File

@ -6,25 +6,6 @@ import (
)
type usw struct {
Uptime *prometheus.Desc
Temperature *prometheus.Desc
TotalMaxPower *prometheus.Desc
FanLevel *prometheus.Desc
TotalTxBytes *prometheus.Desc
TotalRxBytes *prometheus.Desc
TotalBytes *prometheus.Desc
NumSta *prometheus.Desc
UserNumSta *prometheus.Desc
GuestNumSta *prometheus.Desc
// System Stats
Loadavg1 *prometheus.Desc
Loadavg5 *prometheus.Desc
Loadavg15 *prometheus.Desc
MemBuffer *prometheus.Desc
MemTotal *prometheus.Desc
MemUsed *prometheus.Desc
CPU *prometheus.Desc
Mem *prometheus.Desc
// Switch "total" traffic stats
SwRxPackets *prometheus.Desc
SwRxBytes *prometheus.Desc
@ -65,36 +46,12 @@ type usw struct {
}
func descUSW(ns string) *usw {
if ns += "_usw_"; ns == "_usw_" {
ns = "usw_"
}
pns := ns + "port_"
// The first five labels for switch are shared with (the same as) switch ports.
labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"}
// Copy labels, and replace first four with different names.
labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labels[4:]...)
return &usw{
// switch data
Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Uptime", labels, nil),
Temperature: prometheus.NewDesc(ns+"temperature_celsius", "Temperature", labels, nil),
TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "Total Max Power", labels, nil),
FanLevel: prometheus.NewDesc(ns+"fan_level", "Fan Level", labels, nil),
TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil),
TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil),
TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil),
NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil),
UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil),
GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil),
Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil),
Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil),
Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil),
MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil),
MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil),
MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil),
CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil),
Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil),
SwRxPackets: prometheus.NewDesc(ns+"switch_receive_packets_total", "Switch Packets Received Total", labels, nil),
SwRxBytes: prometheus.NewDesc(ns+"switch_receive_bytes_total", "Switch Bytes Received Total", labels, nil),
SwRxErrors: prometheus.NewDesc(ns+"switch_receive_errors_total", "Switch Errors Received Total", labels, nil),
@ -111,7 +68,6 @@ func descUSW(ns string) *usw {
SwTxMulticast: prometheus.NewDesc(ns+"switch_transmit_multicast_total", "Switch Multicast Transmit Total", labels, nil),
SwTxBroadcast: prometheus.NewDesc(ns+"switch_transmit_broadcast_total", "Switch Broadcast Transmit Total", labels, nil),
SwBytes: prometheus.NewDesc(ns+"switch_bytes_total", "Switch Bytes Transferred Total", labels, nil),
// per-port data
PoeCurrent: prometheus.NewDesc(pns+"poe_amperes", "POE Current", labelP, nil),
PoePower: prometheus.NewDesc(pns+"poe_watts", "POE Power", labelP, nil),
@ -150,32 +106,31 @@ func (u *unifiCollector) exportUSWs(r *Report) {
func (u *unifiCollector) exportUSW(r *Report, d *unifi.USW) {
labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial}
if d.HasTemperature.Val {
r.send([]*metricExports{{u.USW.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}})
r.send([]*metricExports{{u.Device.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}})
}
if d.HasFan.Val {
r.send([]*metricExports{{u.USW.FanLevel, prometheus.GaugeValue, d.FanLevel, labels}})
r.send([]*metricExports{{u.Device.FanLevel, prometheus.GaugeValue, d.FanLevel, labels}})
}
// Switch data.
r.send([]*metricExports{
{u.USW.Uptime, prometheus.GaugeValue, d.Uptime, labels},
{u.USW.TotalMaxPower, prometheus.GaugeValue, d.TotalMaxPower, labels},
{u.USW.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels},
{u.USW.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels},
{u.USW.TotalBytes, prometheus.CounterValue, d.Bytes, labels},
{u.USW.NumSta, prometheus.GaugeValue, d.NumSta, labels},
{u.USW.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels},
{u.USW.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels},
{u.USW.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels},
{u.USW.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels},
{u.USW.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels},
{u.USW.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels},
{u.USW.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels},
{u.USW.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels},
{u.USW.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels},
{u.USW.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels},
{u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels},
{u.Device.TotalMaxPower, prometheus.GaugeValue, d.TotalMaxPower, labels},
{u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels},
{u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels},
{u.Device.TotalBytes, prometheus.CounterValue, d.Bytes, labels},
{u.Device.NumSta, prometheus.GaugeValue, d.NumSta, labels},
{u.Device.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels},
{u.Device.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels},
{u.Device.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels},
{u.Device.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels},
{u.Device.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels},
{u.Device.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels},
{u.Device.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels},
{u.Device.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels},
{u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels},
{u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels},
})
u.exportPortTable(r, d.PortTable, labels[4:])
u.exportUSWstats(r, d.Stat.Sw, labels)
@ -217,6 +172,7 @@ func (u *unifiCollector) exportPortTable(r *Report, pt []unifi.Port, labels []st
{u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l},
})
}
r.send([]*metricExports{
{u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, l},
{u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, l},