forked from dcos/telegraf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lowercase.go
73 lines (59 loc) · 1.59 KB
/
lowercase.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package lowercase
import (
"strings"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/processors"
)
type Lowercase struct {
SendOriginal bool `toml:"send_original"`
}
const capitals = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var sampleConfig = `
## Sends both Some_Metric and some_metric if true.
## If false, sends only some_metric.
# send_original = false
`
func (l *Lowercase) SampleConfig() string {
return sampleConfig
}
func (l *Lowercase) Description() string {
return "Coerce all metrics that pass through this filter to lowercase."
}
func (l *Lowercase) Apply(in ...telegraf.Metric) []telegraf.Metric {
out := make([]telegraf.Metric, 0, len(in))
for _, metric := range in {
// Optimisation: only test for uppercase metrics if we wish to
// preserve the original metric.
if l.SendOriginal && isUpper(metric) {
out = append(out, metric.Copy())
}
out = append(out, toLower(metric))
}
return out
}
func isUpper(metric telegraf.Metric) bool {
if strings.ContainsAny(metric.Name(), capitals) {
return true
}
for key := range metric.Fields() {
if strings.ContainsAny(key, capitals) {
return true
}
}
return false
}
func toLower(metric telegraf.Metric) telegraf.Metric {
metric.SetName(strings.ToLower(metric.Name()))
for key, value := range metric.Fields() {
// The metric interface does not expose fields; we
// therefore remove and re-add the affected key.
metric.RemoveField(key)
metric.AddField(strings.ToLower(key), value)
}
return metric
}
func init() {
processors.Add("lowercase", func() telegraf.Processor {
return &Lowercase{}
})
}