Merge pull request #264 from amitsaha/issue-250

Support sampling factor for all statsd metric types
This commit is contained in:
Matthias Rampke 2019-09-13 09:30:55 +02:00 committed by GitHub
commit 1865ea1be3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 7 deletions

View file

@ -46,6 +46,16 @@ func TestHandlePacket(t *testing.T) {
labels: map[string]string{}, labels: map[string]string{},
}, },
}, },
}, {
name: "gauge with sampling",
in: "foo:3|g|@0.2",
out: Events{
&GaugeEvent{
metricName: "foo",
value: 3,
labels: map[string]string{},
},
},
}, { }, {
name: "gauge decrement", name: "gauge decrement",
in: "foo:-10|g", in: "foo:-10|g",
@ -87,6 +97,36 @@ func TestHandlePacket(t *testing.T) {
labels: map[string]string{}, labels: map[string]string{},
}, },
}, },
}, {
name: "distribution with sampling",
in: "foo:0.01|d|@0.2|#tag1:bar,#tag2:baz",
out: Events{
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
},
}, { }, {
name: "datadog tag extension", name: "datadog tag extension",
in: "foo:100|c|#tag1:bar,tag2:baz", in: "foo:100|c|#tag1:bar,tag2:baz",
@ -157,6 +197,36 @@ func TestHandlePacket(t *testing.T) {
labels: map[string]string{"tag1": "bar", "tag2": "baz"}, labels: map[string]string{"tag1": "bar", "tag2": "baz"},
}, },
}, },
}, {
name: "histogram with sampling",
in: "foo:0.01|h|@0.2|#tag1:bar,#tag2:baz",
out: Events{
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
&TimerEvent{
metricName: "foo",
value: 0.01,
labels: map[string]string{"tag1": "bar", "tag2": "baz"},
},
},
}, { }, {
name: "datadog tag extension with multiple colons", name: "datadog tag extension with multiple colons",
in: "foo:100|c|@0.1|#tag1:foo:bar", in: "foo:100|c|@0.1|#tag1:foo:bar",

View file

@ -389,11 +389,7 @@ samples:
for _, component := range components[2:] { for _, component := range components[2:] {
switch component[0] { switch component[0] {
case '@': case '@':
if statType != "c" && statType != "ms" {
log.Debugln("Illegal sampling factor for non-counter metric on line", line)
sampleErrors.WithLabelValues("illegal_sample_factor").Inc()
continue
}
samplingFactor, err = strconv.ParseFloat(component[1:], 64) samplingFactor, err = strconv.ParseFloat(component[1:], 64)
if err != nil { if err != nil {
log.Debugf("Invalid sampling factor %s on line %s", component[1:], line) log.Debugf("Invalid sampling factor %s on line %s", component[1:], line)
@ -403,9 +399,11 @@ samples:
samplingFactor = 1 samplingFactor = 1
} }
if statType == "c" { if statType == "g" {
continue
} else if statType == "c" {
value /= samplingFactor value /= samplingFactor
} else if statType == "ms" { } else if statType == "ms" || statType == "h" || statType == "d" {
multiplyEvents = int(1 / samplingFactor) multiplyEvents = int(1 / samplingFactor)
} }
case '#': case '#':