feat(inputs.statsd): Allow counters to report as float (#15371)
This commit is contained in:
parent
5239c97ce0
commit
1e6eed54c2
|
|
@ -117,6 +117,11 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
|
||||||
## Replace dots (.) with underscore (_) and dashes (-) with
|
## Replace dots (.) with underscore (_) and dashes (-) with
|
||||||
## double underscore (__) in metric names.
|
## double underscore (__) in metric names.
|
||||||
# convert_names = false
|
# convert_names = false
|
||||||
|
|
||||||
|
## Convert all numeric counters to float
|
||||||
|
## Enabling this would ensure that both counters and guages are both emitted
|
||||||
|
## as floats.
|
||||||
|
# float_counters = false
|
||||||
```
|
```
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
|
||||||
|
|
@ -90,3 +90,8 @@
|
||||||
## Replace dots (.) with underscore (_) and dashes (-) with
|
## Replace dots (.) with underscore (_) and dashes (-) with
|
||||||
## double underscore (__) in metric names.
|
## double underscore (__) in metric names.
|
||||||
# convert_names = false
|
# convert_names = false
|
||||||
|
|
||||||
|
## Convert all numeric counters to float
|
||||||
|
## Enabling this would ensure that both counters and guages are both emitted
|
||||||
|
## as floats.
|
||||||
|
# float_counters = false
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,7 @@ type Statsd struct {
|
||||||
DeleteSets bool `toml:"delete_sets"`
|
DeleteSets bool `toml:"delete_sets"`
|
||||||
DeleteTimings bool `toml:"delete_timings"`
|
DeleteTimings bool `toml:"delete_timings"`
|
||||||
ConvertNames bool `toml:"convert_names"`
|
ConvertNames bool `toml:"convert_names"`
|
||||||
|
FloatCounters bool `toml:"float_counters"`
|
||||||
|
|
||||||
EnableAggregationTemporality bool `toml:"enable_aggregation_temporality"`
|
EnableAggregationTemporality bool `toml:"enable_aggregation_temporality"`
|
||||||
|
|
||||||
|
|
@ -285,6 +286,11 @@ func (s *Statsd) Gather(acc telegraf.Accumulator) error {
|
||||||
m.fields["start_time"] = s.lastGatherTime.Format(time.RFC3339)
|
m.fields["start_time"] = s.lastGatherTime.Format(time.RFC3339)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if s.FloatCounters {
|
||||||
|
for key := range m.fields {
|
||||||
|
m.fields[key] = float64(m.fields[key].(int64))
|
||||||
|
}
|
||||||
|
}
|
||||||
acc.AddCounter(m.name, m.fields, m.tags, now)
|
acc.AddCounter(m.name, m.fields, m.tags, now)
|
||||||
}
|
}
|
||||||
if s.DeleteCounters {
|
if s.DeleteCounters {
|
||||||
|
|
|
||||||
|
|
@ -532,6 +532,115 @@ func TestParse_Counters(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParse_CountersAsFloat(t *testing.T) {
|
||||||
|
s := NewTestStatsd()
|
||||||
|
s.FloatCounters = true
|
||||||
|
|
||||||
|
// Test that counters work
|
||||||
|
validLines := []string{
|
||||||
|
"small.inc:1|c",
|
||||||
|
"big.inc:100|c",
|
||||||
|
"big.inc:1|c",
|
||||||
|
"big.inc:100000|c",
|
||||||
|
"big.inc:1000000|c",
|
||||||
|
"small.inc:1|c",
|
||||||
|
"zero.init:0|c",
|
||||||
|
"sample.rate:1|c|@0.1",
|
||||||
|
"sample.rate:1|c",
|
||||||
|
"scientific.notation:4.696E+5|c",
|
||||||
|
"negative.test:100|c",
|
||||||
|
"negative.test:-5|c",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, line := range validLines {
|
||||||
|
require.NoErrorf(t, s.parseStatsdLine(line), "Parsing line %s should not have resulted in an error", line)
|
||||||
|
}
|
||||||
|
|
||||||
|
validations := []struct {
|
||||||
|
name string
|
||||||
|
value int64
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"scientific_notation",
|
||||||
|
469600,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"small_inc",
|
||||||
|
2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"big_inc",
|
||||||
|
1100101,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"zero_init",
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"sample_rate",
|
||||||
|
11,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"negative_test",
|
||||||
|
95,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, test := range validations {
|
||||||
|
require.NoError(t, testValidateCounter(test.name, test.value, s.counters))
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := []telegraf.Metric{
|
||||||
|
testutil.MustMetric(
|
||||||
|
"small_inc",
|
||||||
|
map[string]string{"metric_type": "counter"},
|
||||||
|
map[string]interface{}{"value": 2.0},
|
||||||
|
time.Now(),
|
||||||
|
telegraf.Counter,
|
||||||
|
),
|
||||||
|
testutil.MustMetric(
|
||||||
|
"big_inc",
|
||||||
|
map[string]string{"metric_type": "counter"},
|
||||||
|
map[string]interface{}{"value": 1100101.0},
|
||||||
|
time.Now(),
|
||||||
|
telegraf.Counter,
|
||||||
|
),
|
||||||
|
testutil.MustMetric(
|
||||||
|
"zero_init",
|
||||||
|
map[string]string{"metric_type": "counter"},
|
||||||
|
map[string]interface{}{"value": 0.0},
|
||||||
|
time.Now(),
|
||||||
|
telegraf.Counter,
|
||||||
|
),
|
||||||
|
testutil.MustMetric(
|
||||||
|
"sample_rate",
|
||||||
|
map[string]string{"metric_type": "counter"},
|
||||||
|
map[string]interface{}{"value": 11.0},
|
||||||
|
time.Now(),
|
||||||
|
telegraf.Counter,
|
||||||
|
),
|
||||||
|
testutil.MustMetric(
|
||||||
|
"scientific_notation",
|
||||||
|
map[string]string{"metric_type": "counter"},
|
||||||
|
map[string]interface{}{"value": 469600.0},
|
||||||
|
time.Now(),
|
||||||
|
telegraf.Counter,
|
||||||
|
),
|
||||||
|
testutil.MustMetric(
|
||||||
|
"negative_test",
|
||||||
|
map[string]string{"metric_type": "counter"},
|
||||||
|
map[string]interface{}{"value": 95.0},
|
||||||
|
time.Now(),
|
||||||
|
telegraf.Counter,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
acc := &testutil.Accumulator{}
|
||||||
|
require.NoError(t, s.Gather(acc))
|
||||||
|
metrics := acc.GetTelegrafMetrics()
|
||||||
|
testutil.PrintMetrics(metrics)
|
||||||
|
testutil.RequireMetricsEqual(t, expected, metrics, testutil.IgnoreTime(), testutil.SortMetrics())
|
||||||
|
}
|
||||||
|
|
||||||
// Tests low-level functionality of timings
|
// Tests low-level functionality of timings
|
||||||
func TestParse_Timings(t *testing.T) {
|
func TestParse_Timings(t *testing.T) {
|
||||||
s := NewTestStatsd()
|
s := NewTestStatsd()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue