chore(go.d/ddsnmp): better label values sanitization (#20500)
Ilya Mashchenko committed
Jun 17, 2025 at 12:27 UTC
157d90de74553cecac3b746d904ab8b5849db282
5 files changed
+28
-12
src/go/plugin/go.d/agent/discovery/sd/discoverer/snmpsd/sysinfo.go
+1
-1
@@ -39,7 +39,7 @@ func GetSysInfo(client gosnmp.Handler) (*SysInfo, error) {
39
Organization: "Unknown",
40
}
41
42
- r := strings.NewReplacer("\n", " ", "\r", " ")
42
+ r := strings.NewReplacer("'", "", "\n", " ", "\r", " ", "\x00", "")
43
44
for _, pdu := range pdus {
45
oid := strings.TrimPrefix(pdu.Name, ".")
src/go/plugin/go.d/agent/module/job.go
+10
-5
@@ -498,7 +498,7 @@ func (j *Job) sendVnodeHostInfo() {
498
j.vnode.Labels["_hostname"] = j.vnode.Hostname
499
}
500
for k, v := range j.vnode.Labels {
501
- j.vnode.Labels[k] = lblReplacer.Replace(v)
501
+ j.vnode.Labels[k] = lblValueReplacer.Replace(v)
502
}
503
504
j.api.HOSTINFO(netdataapi.HostInfo{
@@ -549,15 +549,15 @@ func (j *Job) createChart(chart *Chart) {
549
if ls == 0 {
550
ls = LabelSourceAuto
551
}
552
- j.api.CLABEL(l.Key, lblReplacer.Replace(l.Value), ls)
552
+ j.api.CLABEL(l.Key, lblValueReplacer.Replace(l.Value), ls)
553
}
554
}
555
for k, v := range j.labels {
556
if !seen[k] {
557
- j.api.CLABEL(k, lblReplacer.Replace(v), LabelSourceConf)
557
+ j.api.CLABEL(k, lblValueReplacer.Replace(v), LabelSourceConf)
558
}
559
}
560
- j.api.CLABEL("_collect_job", lblReplacer.Replace(j.Name()), LabelSourceAuto)
560
+ j.api.CLABEL("_collect_job", lblValueReplacer.Replace(j.Name()), LabelSourceAuto)
561
j.api.CLABELCOMMIT()
562
563
for _, dim := range chart.Dims {
@@ -706,4 +706,9 @@ func cleanPluginName(name string) string {
706
return r.Replace(name)
707
}
708
709
-var lblReplacer = strings.NewReplacer("'", "")
709
+var lblValueReplacer = strings.NewReplacer(
710
+ "'", "",
711
+ "\n", " ",
712
+ "\r", " ",
713
+ "\x00", "",
714
+)
src/go/plugin/go.d/collector/snmp/charts.go
+5
-5
@@ -204,11 +204,6 @@ func (c *Collector) addSysUptimeChart() {
204
}
205
}
206
207
-func cleanIfaceName(name string) string {
208
- r := strings.NewReplacer(".", "_", " ", "_")
209
- return r.Replace(name)
210
-}
211
-
207
func newUserInputCharts(configs []ChartConfig) (*module.Charts, error) {
208
charts := &module.Charts{}
209
for _, cfg := range configs {
@@ -426,3 +421,8 @@ func dimAlgoFromDdSnmpType(m ddsnmpcollector.Metric) module.DimAlgo {
421
}
422
return module.Incremental
423
}
424
+
425
+func cleanIfaceName(name string) string {
426
+ r := strings.NewReplacer(".", "_", " ", "_")
427
+ return r.Replace(name)
428
+}
src/go/plugin/go.d/collector/snmp/collect_if_mib.go
+6
@@ -158,6 +158,8 @@ func (c *Collector) collectNetworkInterfaces(mx map[string]int64) error {
158
iface.updated = true
159
}
160
161
+ var valReplacer = strings.NewReplacer("'", "", "\n", " ", "\r", " ", "\x00", "")
162
+
163
for _, iface := range c.netInterfaces {
164
if iface.ifName == "" {
165
iface.ifName = iface.ifDescr
@@ -171,6 +173,10 @@ func (c *Collector) collectNetworkInterfaces(mx map[string]int64) error {
173
continue
174
}
175
176
+ iface.ifName = valReplacer.Replace(iface.ifName)
177
+ iface.ifDescr = valReplacer.Replace(iface.ifDescr)
178
+ iface.ifAlias = valReplacer.Replace(iface.ifAlias)
179
+
180
if !iface.updated {
181
delete(c.netInterfaces, iface.idx)
182
if iface.hasCharts {
src/go/plugin/go.d/collector/snmp/ddsnmp/ddsnmpcollector/utils.go
+6
-1
@@ -266,4 +266,9 @@ func cleanMetrics(pms []*ProfileMetrics) {
266
}
267
}
268
269
-var metricMetaReplacer = strings.NewReplacer("'", "", "\n", " ", "\r", " ")
269
+var metricMetaReplacer = strings.NewReplacer(
270
+ "'", "",
271
+ "\n", " ",
272
+ "\r", " ",
273
+ "\x00", "",
274
+)