mirror of
https://github.com/unpoller/unpoller.git
synced 2026-04-05 00:44:06 -04:00
Fix multi-WAN speed test reporting (issue #841)
Speed tests were not being reported correctly for multi-WAN setups
because the device-level speedtest-status field was returning zeros.
The data has moved to a new aggregated dashboard API endpoint.
Changes:
- Add GetSpeedTests() and GetSiteSpeedTests() methods to fetch from
/v2/api/site/{site}/aggregated-dashboard endpoint
- Create SpeedTestResult data structures to capture per-WAN metrics
- Update Prometheus exporter with new speedtest_* metrics per interface
- Update InfluxDB exporter to write speedtest measurements per WAN
- Update Datadog exporter with unifi.speedtest.* metrics per WAN
- Update metrics collection to include speed test data for all sites
Metrics now include labels/tags for:
- wan_interface: Physical interface (eth8, eth9, etc.)
- wan_group: Logical WAN name (WAN, WAN2, etc.)
- site_name: Site identifier
- source: Controller URL
Gracefully handles older controllers without the new API endpoint.
Fixes #841
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -302,6 +302,10 @@ func (u *DatadogUnifi) loopPoints(r report) {
|
||||
u.switchExport(r, s)
|
||||
}
|
||||
|
||||
for _, st := range m.SpeedTests {
|
||||
u.switchExport(r, st)
|
||||
}
|
||||
|
||||
for _, s := range r.events().Logs {
|
||||
u.switchExport(r, s)
|
||||
}
|
||||
@@ -348,6 +352,8 @@ func (u *DatadogUnifi) switchExport(r report, v any) { //nolint:cyclop
|
||||
u.batchAlarms(r, v)
|
||||
case *unifi.Anomaly:
|
||||
u.batchAnomaly(r, v)
|
||||
case *unifi.SpeedTestResult:
|
||||
u.batchSpeedTest(r, v)
|
||||
default:
|
||||
u.LogErrorf("invalid export, type=%+v", reflect.TypeOf(v))
|
||||
}
|
||||
|
||||
39
pkg/datadogunifi/speedtest.go
Normal file
39
pkg/datadogunifi/speedtest.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package datadogunifi
|
||||
|
||||
import (
|
||||
"github.com/unpoller/unifi/v5"
|
||||
)
|
||||
|
||||
// batchSpeedTest generates Unifi Speed Test datapoints for Datadog.
|
||||
// These points can be passed directly to Datadog.
|
||||
func (u *DatadogUnifi) batchSpeedTest(r report, st *unifi.SpeedTestResult) {
|
||||
if st == nil {
|
||||
return
|
||||
}
|
||||
|
||||
metricName := metricNamespace("speedtest")
|
||||
|
||||
tags := []string{
|
||||
tag("site_name", st.SiteName),
|
||||
tag("source", st.SourceName),
|
||||
tag("wan_interface", st.InterfaceName),
|
||||
tag("wan_group", st.WANNetworkGroup),
|
||||
tag("network_conf_id", st.NetworkConfID),
|
||||
}
|
||||
|
||||
data := map[string]float64{
|
||||
"download_mbps": st.DownloadMbps.Val,
|
||||
"upload_mbps": st.UploadMbps.Val,
|
||||
"latency_ms": st.LatencyMs.Val,
|
||||
"timestamp": st.Time.Val,
|
||||
}
|
||||
|
||||
if st.WANProviderCapabilities != nil {
|
||||
data["provider_download_kbps"] = st.WANProviderCapabilities.DownloadKbps.Val
|
||||
data["provider_upload_kbps"] = st.WANProviderCapabilities.UploadKbps.Val
|
||||
}
|
||||
|
||||
for name, value := range data {
|
||||
_ = r.reportGauge(metricName(name), value, tags)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user