mirror of
https://github.com/unpoller/unpoller.git
synced 2026-03-31 06:33:57 -04:00
Ports providing PoE power are no longer considered "dead" even when disabled or down. This allows users to collect PoE metrics from ports that are disabled for security reasons but still providing power. Fixes #910 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
139 lines
4.1 KiB
Go
139 lines
4.1 KiB
Go
package influxunifi
|
|
|
|
import (
|
|
"github.com/unpoller/unifi/v5"
|
|
)
|
|
|
|
// uswT is used as a name for printed/logged counters.
|
|
const uswT = item("USW")
|
|
|
|
// batchUSW generates Unifi Switch datapoints for InfluxDB.
|
|
// These points can be passed directly to influx.
|
|
func (u *InfluxUnifi) batchUSW(r report, s *unifi.USW) {
|
|
if !s.Adopted.Val || s.Locating.Val {
|
|
return
|
|
}
|
|
|
|
tags := 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,
|
|
}
|
|
fields := Combine(
|
|
u.batchUSWstat(s.Stat.Sw),
|
|
u.batchSysStats(s.SysStats, s.SystemStats),
|
|
map[string]any{
|
|
"guest-num_sta": s.GuestNumSta.Val,
|
|
"ip": s.IP,
|
|
"bytes": s.Bytes.Val,
|
|
"fan_level": s.FanLevel.Val,
|
|
"general_temperature": s.GeneralTemperature.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": s.Upgradable.Val,
|
|
"uplink_speed": s.Uplink.Speed.Val,
|
|
"uplink_max_speed": s.Uplink.MaxSpeed.Val,
|
|
"uplink_latency": s.Uplink.Latency.Val,
|
|
"uplink_uptime": s.Uplink.Uptime.Val,
|
|
})
|
|
|
|
r.addCount(uswT)
|
|
r.send(&metric{Table: "usw", Tags: tags, Fields: fields})
|
|
u.batchPortTable(r, tags, s.PortTable)
|
|
}
|
|
|
|
func (u *InfluxUnifi) batchUSWstat(sw *unifi.Sw) map[string]any {
|
|
if sw == nil {
|
|
return map[string]any{}
|
|
}
|
|
|
|
return map[string]any{
|
|
"stat_bytes": sw.Bytes.Val,
|
|
"stat_rx_bytes": sw.RxBytes.Val,
|
|
"stat_rx_crypts": sw.RxCrypts.Val,
|
|
"stat_rx_dropped": sw.RxDropped.Val,
|
|
"stat_rx_errors": sw.RxErrors.Val,
|
|
"stat_rx_frags": sw.RxFrags.Val,
|
|
"stat_rx_packets": sw.TxPackets.Val,
|
|
"stat_tx_bytes": sw.TxBytes.Val,
|
|
"stat_tx_dropped": sw.TxDropped.Val,
|
|
"stat_tx_errors": sw.TxErrors.Val,
|
|
"stat_tx_packets": sw.TxPackets.Val,
|
|
"stat_tx_retries": sw.TxRetries.Val,
|
|
}
|
|
}
|
|
|
|
//nolint:funlen
|
|
func (u *InfluxUnifi) batchPortTable(r report, t map[string]string, pt []unifi.Port) {
|
|
for _, p := range pt {
|
|
if !u.DeadPorts && (!p.Up.Val || !p.Enable.Val) && p.PoePower.Val == 0 {
|
|
continue // only record UP ports, or ports providing PoE power.
|
|
}
|
|
|
|
tags := map[string]string{
|
|
"site_name": t["site_name"],
|
|
"device_name": t["name"],
|
|
"source": t["source"],
|
|
"type": t["type"],
|
|
"name": p.Name,
|
|
"poe_mode": p.PoeMode,
|
|
"port_poe": p.PortPoe.Txt,
|
|
"port_idx": p.PortIdx.Txt,
|
|
"port_id": t["name"] + " Port " + p.PortIdx.Txt,
|
|
"poe_enable": p.PoeEnable.Txt,
|
|
"flowctrl_rx": p.FlowctrlRx.Txt,
|
|
"flowctrl_tx": p.FlowctrlTx.Txt,
|
|
"media": p.Media,
|
|
"has_sfp": p.SFPFound.Txt,
|
|
"sfp_compliance": p.SFPCompliance,
|
|
"sfp_serial": p.SFPSerial,
|
|
"sfp_vendor": p.SFPVendor,
|
|
"sfp_part": p.SFPPart,
|
|
}
|
|
fields := map[string]any{
|
|
"dbytes_r": p.BytesR.Val,
|
|
"rx_broadcast": p.RxBroadcast.Val,
|
|
"rx_bytes": p.RxBytes.Val,
|
|
"rx_bytes-r": p.RxBytesR.Val,
|
|
"rx_dropped": p.RxDropped.Val,
|
|
"rx_errors": p.RxErrors.Val,
|
|
"rx_multicast": p.RxMulticast.Val,
|
|
"rx_packets": p.RxPackets.Val,
|
|
"speed": p.Speed.Val,
|
|
"stp_pathcost": p.StpPathcost.Val,
|
|
"tx_broadcast": p.TxBroadcast.Val,
|
|
"tx_bytes": p.TxBytes.Val,
|
|
"tx_bytes-r": p.TxBytesR.Val,
|
|
"tx_dropped": p.TxDropped.Val,
|
|
"tx_errors": p.TxErrors.Val,
|
|
"tx_multicast": p.TxMulticast.Val,
|
|
"tx_packets": p.TxPackets.Val,
|
|
}
|
|
|
|
if p.PoeEnable.Val && p.PortPoe.Val {
|
|
fields["poe_current"] = p.PoeCurrent.Val
|
|
fields["poe_power"] = p.PoePower.Val
|
|
fields["poe_voltage"] = p.PoeVoltage.Val
|
|
}
|
|
|
|
if p.SFPFound.Val {
|
|
fields["sfp_current"] = p.SFPCurrent.Val
|
|
fields["sfp_voltage"] = p.SFPVoltage.Val
|
|
fields["sfp_temperature"] = p.SFPTemperature.Val
|
|
fields["sfp_txpower"] = p.SFPTxpower.Val
|
|
fields["sfp_rxpower"] = p.SFPRxpower.Val
|
|
}
|
|
|
|
r.send(&metric{Table: "usw_ports", Tags: tags, Fields: fields})
|
|
}
|
|
}
|