From 5c0b206f6eb23121fad0c41ea399dd518d27536a Mon Sep 17 00:00:00 2001 From: glightfoot Date: Thu, 11 Jun 2020 10:17:09 -0400 Subject: [PATCH] add support for histograms and distributions without unit conversion Signed-off-by: glightfoot --- bridge_test.go | 60 ++++++++++++++++++++++++++--------- pkg/event/event.go | 1 + pkg/exporter/exporter.go | 4 +-- pkg/exporter/exporter_test.go | 8 ++--- pkg/line/line.go | 8 ++++- 5 files changed, 58 insertions(+), 23 deletions(-) diff --git a/bridge_test.go b/bridge_test.go index f45cefa..58b8c31 100644 --- a/bridge_test.go +++ b/bridge_test.go @@ -85,7 +85,7 @@ func TestHandlePacket(t *testing.T) { out: event.Events{ &event.TimerEvent{ TMetricName: "foo", - TValue: 200, + TValue: 0.2, // convert statsd ms to seconds in parsing TLabels: map[string]string{}, }, }, @@ -323,12 +323,12 @@ func TestHandlePacket(t *testing.T) { out: event.Events{ &event.TimerEvent{ TMetricName: "foo", - TValue: 200, + TValue: .200, TLabels: map[string]string{}, }, &event.TimerEvent{ TMetricName: "foo", - TValue: 300, + TValue: .300, TLabels: map[string]string{}, }, &event.CounterEvent{ @@ -348,7 +348,7 @@ func TestHandlePacket(t *testing.T) { }, &event.TimerEvent{ TMetricName: "bar", - TValue: 5, + TValue: .005, TLabels: map[string]string{}, }, }, @@ -356,16 +356,16 @@ func TestHandlePacket(t *testing.T) { name: "timings with sampling factor", in: "foo.timing:0.5|ms|@0.1", out: event.Events{ - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, - &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.5, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, + &event.TimerEvent{TMetricName: "foo.timing", TValue: 0.0005, TLabels: map[string]string{}}, }, }, { name: "bad line", @@ -422,6 +422,36 @@ func TestHandlePacket(t *testing.T) { CLabels: map[string]string{}, }, }, + }, { + name: "ms timer with conversion to seconds", + in: "foo:200|ms", + out: event.Events{ + &event.TimerEvent{ + TMetricName: "foo", + TValue: 0.2, + TLabels: map[string]string{}, + }, + }, + }, { + name: "histogram with no unit conversion", + in: "foo:200|h", + out: event.Events{ + &event.TimerEvent{ + TMetricName: "foo", + TValue: 200, + TLabels: map[string]string{}, + }, + }, + }, { + name: "distribution with no unit conversion", + in: "foo:200|d", + out: event.Events{ + &event.TimerEvent{ + TMetricName: "foo", + TValue: 200, // convert statsd ms to seconds in parsing + TLabels: map[string]string{}, + }, + }, }, } @@ -556,7 +586,7 @@ mappings: // event with ttl = 2s from a mapping &event.TimerEvent{ TMetricName: "bazqux.main", - TValue: 42000, + TValue: 42, }, } diff --git a/pkg/event/event.go b/pkg/event/event.go index 54139be..108d1fb 100644 --- a/pkg/event/event.go +++ b/pkg/event/event.go @@ -52,6 +52,7 @@ func (g *GaugeEvent) Value() float64 { return g.GValue } func (c *GaugeEvent) Labels() map[string]string { return c.GLabels } func (c *GaugeEvent) MetricType() mapper.MetricType { return mapper.MetricTypeGauge } +// TimerEvent now defaults to seconds units type TimerEvent struct { TMetricName string TValue float64 diff --git a/pkg/exporter/exporter.go b/pkg/exporter/exporter.go index 66876cc..558949e 100644 --- a/pkg/exporter/exporter.go +++ b/pkg/exporter/exporter.go @@ -153,7 +153,7 @@ func (b *Exporter) handleEvent(thisEvent event.Event) { case mapper.TimerTypeHistogram: histogram, err := b.Registry.GetHistogram(metricName, prometheusLabels, help, mapping, b.MetricsCount) if err == nil { - histogram.Observe(thisEvent.Value() / 1000) // prometheus presumes seconds, statsd millisecond + histogram.Observe(thisEvent.Value()) b.EventStats.WithLabelValues("timer").Inc() } else { level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) @@ -163,7 +163,7 @@ func (b *Exporter) handleEvent(thisEvent event.Event) { case mapper.TimerTypeDefault, mapper.TimerTypeSummary: summary, err := b.Registry.GetSummary(metricName, prometheusLabels, help, mapping, b.MetricsCount) if err == nil { - summary.Observe(thisEvent.Value() / 1000) // prometheus presumes seconds, statsd millisecond + summary.Observe(thisEvent.Value()) b.EventStats.WithLabelValues("timer").Inc() } else { level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) diff --git a/pkg/exporter/exporter_test.go b/pkg/exporter/exporter_test.go index 86cb040..ec4ae01 100644 --- a/pkg/exporter/exporter_test.go +++ b/pkg/exporter/exporter_test.go @@ -721,7 +721,7 @@ func TestHistogramUnits(t *testing.T) { c := event.Events{ &event.TimerEvent{ TMetricName: name, - TValue: 300, + TValue: .300, }, } events <- c @@ -737,9 +737,7 @@ func TestHistogramUnits(t *testing.T) { if value == nil { t.Fatal("Histogram value should not be nil") } - if *value == 300 { - t.Fatalf("Histogram observations not scaled into Seconds") - } else if *value != .300 { + if *value != .300 { t.Fatalf("Received unexpected value for histogram observation %f != .300", *value) } } @@ -871,7 +869,7 @@ mappings: // event with ttl = 2s from a mapping &event.TimerEvent{ TMetricName: "bazqux.main", - TValue: 42000, + TValue: 42, }, } diff --git a/pkg/line/line.go b/pkg/line/line.go index 730dbcf..50dd7aa 100644 --- a/pkg/line/line.go +++ b/pkg/line/line.go @@ -42,7 +42,13 @@ func buildEvent(statType, metric string, value float64, relative bool, labels ma GRelative: relative, GLabels: labels, }, nil - case "ms", "h", "d": + case "ms": + return &event.TimerEvent{ + TMetricName: metric, + TValue: float64(value) / 1000, // prometheus presumes seconds, statsd millisecond + TLabels: labels, + }, nil + case "h", "d": return &event.TimerEvent{ TMetricName: metric, TValue: float64(value),