146 lines
4.4 KiB
Go
146 lines
4.4 KiB
Go
package datadogunifi
|
|
|
|
import (
|
|
"github.com/unifi-poller/unifi"
|
|
)
|
|
|
|
// reportUSG generates Unifi Gateway datapoints for Datadog.
|
|
// These points can be passed directly to datadog.
|
|
func (u *DatadogUnifi) reportUSG(r report, s *unifi.USG) {
|
|
if !s.Adopted.Val || s.Locating.Val {
|
|
return
|
|
}
|
|
|
|
tags := []string{
|
|
tag("mac", s.Mac),
|
|
tag("site_name", s.SiteName),
|
|
tag("source", s.SourceName),
|
|
tag("name", s.Name),
|
|
tag("version", s.Version),
|
|
tag("model", s.Model),
|
|
tag("serial", s.Serial),
|
|
tag("type", s.Type),
|
|
tag("ip", s.IP),
|
|
tag("license_state", s.LicenseState),
|
|
}
|
|
metricName := metricNamespace("usg")
|
|
u.reportSysStats(r, metricName, s.SysStats, s.SystemStats, tags)
|
|
u.reportUSGstats(r, metricName, tags, s.SpeedtestStatus, s.Stat.Gw, s.Uplink)
|
|
|
|
data := map[string]float64{
|
|
"bytes": s.Bytes.Val,
|
|
"last_seen": s.LastSeen.Val,
|
|
"guest-num_sta": s.GuestNumSta.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,
|
|
"num_desktop": s.NumDesktop.Val,
|
|
"num_handheld": s.NumHandheld.Val,
|
|
"num_mobile": s.NumMobile.Val,
|
|
}
|
|
reportGaugeForMap(r, metricName, data, tags)
|
|
|
|
u.reportNetTable(r, s.Name, s.SiteName, s.SourceName, s.NetworkTable)
|
|
u.reportUSGwans(r, s.Name, s.SiteName, s.SourceName, s.Wan1, s.Wan2)
|
|
}
|
|
|
|
func (u *DatadogUnifi) reportUSGstats(r report, metricName func(string) string, tags []string, ss unifi.SpeedtestStatus, gw *unifi.Gw, ul unifi.Uplink) {
|
|
if gw == nil {
|
|
return
|
|
}
|
|
data := map[string]float64{
|
|
"uplink_latency": ul.Latency.Val,
|
|
"uplink_speed": ul.Speed.Val,
|
|
"speedtest-status_latency": ss.Latency.Val,
|
|
"speedtest-status_runtime": ss.Runtime.Val,
|
|
"speedtest-status_rundate": ss.Rundate.Val,
|
|
"speedtest-status_ping": ss.StatusPing.Val,
|
|
"speedtest-status_xput_download": ss.XputDownload.Val,
|
|
"speedtest-status_xput_upload": ss.XputUpload.Val,
|
|
"lan-rx_bytes": gw.LanRxBytes.Val,
|
|
"lan-rx_packets": gw.LanRxPackets.Val,
|
|
"lan-tx_bytes": gw.LanTxBytes.Val,
|
|
"lan-tx_packets": gw.LanTxPackets.Val,
|
|
"lan-rx_dropped": gw.LanRxDropped.Val,
|
|
}
|
|
reportGaugeForMap(r, metricName, data, tags)
|
|
}
|
|
|
|
func (u *DatadogUnifi) reportUSGwans(r report, deviceName string, siteName string, source string, wans ...unifi.Wan) {
|
|
for _, wan := range wans {
|
|
if !wan.Up.Val {
|
|
continue
|
|
}
|
|
|
|
tags := []string{
|
|
tag("device_name", deviceName),
|
|
tag("site_name", siteName),
|
|
tag("source", source),
|
|
tag("ip", wan.IP),
|
|
tag("purpose", wan.Name),
|
|
tag("mac", wan.Mac),
|
|
tag("ifname", wan.Ifname),
|
|
tag("type", wan.Type),
|
|
tag("up", wan.Up.Txt),
|
|
tag("enabled", wan.Enable.Txt),
|
|
tag("gateway", wan.Gateway),
|
|
}
|
|
fullDuplex := float64(0)
|
|
if wan.FullDuplex.Val {
|
|
fullDuplex = 1
|
|
}
|
|
|
|
data := map[string]float64{
|
|
"bytes-r": wan.BytesR.Val,
|
|
"full_duplex": fullDuplex,
|
|
"max_speed": wan.MaxSpeed.Val,
|
|
"rx_bytes": wan.RxBytes.Val,
|
|
"rx_bytes-r": wan.RxBytesR.Val,
|
|
"rx_dropped": wan.RxDropped.Val,
|
|
"rx_errors": wan.RxErrors.Val,
|
|
"rx_broadcast": wan.RxBroadcast.Val,
|
|
"rx_multicast": wan.RxMulticast.Val,
|
|
"rx_packets": wan.RxPackets.Val,
|
|
"speed": wan.Speed.Val,
|
|
"tx_bytes": wan.TxBytes.Val,
|
|
"tx_bytes-r": wan.TxBytesR.Val,
|
|
"tx_dropped": wan.TxDropped.Val,
|
|
"tx_errors": wan.TxErrors.Val,
|
|
"tx_packets": wan.TxPackets.Val,
|
|
"tx_broadcast": wan.TxBroadcast.Val,
|
|
"tx_multicast": wan.TxMulticast.Val,
|
|
}
|
|
metricName := metricNamespace("usg_wan_ports")
|
|
reportGaugeForMap(r, metricName, data, tags)
|
|
}
|
|
}
|
|
|
|
func (u *DatadogUnifi) reportNetTable(r report, deviceName string, siteName string, source string, nt unifi.NetworkTable) {
|
|
for _, p := range nt {
|
|
tags := []string{
|
|
tag("device_name", deviceName),
|
|
tag("site_name", siteName),
|
|
tag("source", source),
|
|
tag("up", p.Up.Txt),
|
|
tag("enabled", p.Enabled.Txt),
|
|
tag("ip", p.IP),
|
|
tag("mac", p.Mac),
|
|
tag("name", p.Name),
|
|
tag("domain_name", p.DomainName),
|
|
tag("purpose", p.Purpose),
|
|
tag("is_guest", p.IsGuest.Txt),
|
|
}
|
|
data := map[string]float64{
|
|
"num_sta": p.NumSta.Val,
|
|
"rx_bytes": p.RxBytes.Val,
|
|
"rx_packets": p.RxPackets.Val,
|
|
"tx_bytes": p.TxBytes.Val,
|
|
"tx_packets": p.TxPackets.Val,
|
|
}
|
|
metricName := metricNamespace("usg_networks")
|
|
reportGaugeForMap(r, metricName, data, tags)
|
|
}
|
|
}
|