master
go 149 lines 3.7 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 //go:build linux
4
5 package ap
6
7 import (
8 "fmt"
9 "strings"
10
11 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
12 )
13
14 const (
15 prioClients = collectorapi.Priority + iota
16 prioBandwidth
17 prioPackets
18 prioIssues
19 prioSignal
20 prioBitrate
21 )
22
23 var apChartsTmpl = collectorapi.Charts{
24 apClientsChartTmpl.Copy(),
25 apBandwidthChartTmpl.Copy(),
26 apPacketsChartTmpl.Copy(),
27 apIssuesChartTmpl.Copy(),
28 apSignalChartTmpl.Copy(),
29 apBitrateChartTmpl.Copy(),
30 }
31
32 var (
33 apClientsChartTmpl = collectorapi.Chart{
34 ID: "ap_%s_%s_clients",
35 Title: "Connected clients",
36 Fam: "clients",
37 Units: "clients",
38 Ctx: "ap.clients",
39 Type: collectorapi.Line,
40 Priority: prioClients,
41 Dims: collectorapi.Dims{
42 {ID: "ap_%s_%s_clients", Name: "clients"},
43 },
44 }
45
46 apBandwidthChartTmpl = collectorapi.Chart{
47 ID: "ap_%s_%s_bandwidth",
48 Title: "Bandwidth",
49 Units: "kilobits/s",
50 Fam: "traffic",
51 Ctx: "ap.net",
52 Type: collectorapi.Area,
53 Priority: prioBandwidth,
54 Dims: collectorapi.Dims{
55 {ID: "ap_%s_%s_bw_received", Name: "received", Algo: collectorapi.Incremental, Mul: 8, Div: 1000},
56 {ID: "ap_%s_%s_bw_sent", Name: "sent", Algo: collectorapi.Incremental, Mul: -8, Div: 1000},
57 },
58 }
59
60 apPacketsChartTmpl = collectorapi.Chart{
61 ID: "ap_%s_%s_packets",
62 Title: "Packets",
63 Fam: "packets",
64 Units: "packets/s",
65 Ctx: "ap.packets",
66 Type: collectorapi.Line,
67 Priority: prioPackets,
68 Dims: collectorapi.Dims{
69 {ID: "ap_%s_%s_packets_received", Name: "received", Algo: collectorapi.Incremental},
70 {ID: "ap_%s_%s_packets_sent", Name: "sent", Algo: collectorapi.Incremental, Mul: -1},
71 },
72 }
73
74 apIssuesChartTmpl = collectorapi.Chart{
75 ID: "ap_%s_%s_issues",
76 Title: "Transmit issues",
77 Fam: "issues",
78 Units: "issues/s",
79 Ctx: "ap.issues",
80 Type: collectorapi.Line,
81 Priority: prioIssues,
82 Dims: collectorapi.Dims{
83 {ID: "ap_%s_%s_issues_retries", Name: "tx retries", Algo: collectorapi.Incremental},
84 {ID: "ap_%s_%s_issues_failures", Name: "tx failures", Algo: collectorapi.Incremental, Mul: -1},
85 },
86 }
87
88 apSignalChartTmpl = collectorapi.Chart{
89 ID: "ap_%s_%s_signal",
90 Title: "Average Signal",
91 Units: "dBm",
92 Fam: "signal",
93 Ctx: "ap.signal",
94 Type: collectorapi.Line,
95 Priority: prioSignal,
96 Dims: collectorapi.Dims{
97 {ID: "ap_%s_%s_average_signal", Name: "average signal", Div: precision},
98 },
99 }
100
101 apBitrateChartTmpl = collectorapi.Chart{
102 ID: "ap_%s_%s_bitrate",
103 Title: "Bitrate",
104 Units: "Mbps",
105 Fam: "bitrate",
106 Ctx: "ap.bitrate",
107 Type: collectorapi.Line,
108 Priority: prioBitrate,
109 Dims: collectorapi.Dims{
110 {ID: "ap_%s_%s_bitrate_receive", Name: "receive", Div: precision},
111 {ID: "ap_%s_%s_bitrate_transmit", Name: "transmit", Mul: -1, Div: precision},
112 },
113 }
114 )
115
116 func (c *Collector) addInterfaceCharts(dev *iwInterface) {
117 charts := apChartsTmpl.Copy()
118
119 for _, chart := range *charts {
120 chart.ID = fmt.Sprintf(chart.ID, dev.name, cleanSSID(dev.ssid))
121 chart.Labels = []collectorapi.Label{
122 {Key: "device", Value: dev.name},
123 {Key: "ssid", Value: dev.ssid},
124 }
125 for _, dim := range chart.Dims {
126 dim.ID = fmt.Sprintf(dim.ID, dev.name, cleanSSID(dev.ssid))
127 }
128 }
129
130 if err := c.Charts().Add(*charts...); err != nil {
131 c.Warning(err)
132 }
133
134 }
135
136 func (c *Collector) removeInterfaceCharts(dev *iwInterface) {
137 px := fmt.Sprintf("ap_%s_%s_", dev.name, cleanSSID(dev.ssid))
138 for _, chart := range *c.Charts() {
139 if strings.HasPrefix(chart.ID, px) {
140 chart.MarkRemove()
141 chart.MarkNotCreated()
142 }
143 }
144 }
145
146 func cleanSSID(ssid string) string {
147 r := strings.NewReplacer(" ", "_", ".", "_")
148 return r.Replace(ssid)
149 }