forked from mirrors/statsd_exporter
Merge pull request #65 from GentlemanJ/master
Added increment/decrement support to Gauges
This commit is contained in:
commit
03335d91cf
2 changed files with 28 additions and 4 deletions
|
@ -46,6 +46,17 @@ func TestHandlePacket(t *testing.T) {
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
}, {
|
||||||
|
name: "gauge decrement",
|
||||||
|
in: "foo:-10|g",
|
||||||
|
out: Events{
|
||||||
|
&GaugeEvent{
|
||||||
|
metricName: "foo",
|
||||||
|
value: -10,
|
||||||
|
relative: true,
|
||||||
|
labels: map[string]string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
name: "simple timer",
|
name: "simple timer",
|
||||||
in: "foo:200|ms",
|
in: "foo:200|ms",
|
||||||
|
|
21
exporter.go
21
exporter.go
|
@ -160,6 +160,7 @@ func (c *CounterEvent) Labels() map[string]string { return c.labels }
|
||||||
type GaugeEvent struct {
|
type GaugeEvent struct {
|
||||||
metricName string
|
metricName string
|
||||||
value float64
|
value float64
|
||||||
|
relative bool
|
||||||
labels map[string]string
|
labels map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,7 +231,7 @@ func (b *Exporter) Listen(e <-chan Events) {
|
||||||
metricName = escapeMetricName(event.MetricName())
|
metricName = escapeMetricName(event.MetricName())
|
||||||
}
|
}
|
||||||
|
|
||||||
switch event.(type) {
|
switch ev := event.(type) {
|
||||||
case *CounterEvent:
|
case *CounterEvent:
|
||||||
counter := b.Counters.Get(
|
counter := b.Counters.Get(
|
||||||
b.suffix(metricName, "counter"),
|
b.suffix(metricName, "counter"),
|
||||||
|
@ -252,7 +253,12 @@ func (b *Exporter) Listen(e <-chan Events) {
|
||||||
b.suffix(metricName, "gauge"),
|
b.suffix(metricName, "gauge"),
|
||||||
prometheusLabels,
|
prometheusLabels,
|
||||||
)
|
)
|
||||||
gauge.Set(event.Value())
|
|
||||||
|
if ev.relative {
|
||||||
|
gauge.Add(event.Value())
|
||||||
|
} else {
|
||||||
|
gauge.Set(event.Value())
|
||||||
|
}
|
||||||
|
|
||||||
eventStats.WithLabelValues("gauge").Inc()
|
eventStats.WithLabelValues("gauge").Inc()
|
||||||
|
|
||||||
|
@ -287,7 +293,7 @@ type StatsDListener struct {
|
||||||
conn *net.UDPConn
|
conn *net.UDPConn
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildEvent(statType, metric string, value float64, labels map[string]string) (Event, error) {
|
func buildEvent(statType, metric string, value float64, relative bool, labels map[string]string) (Event, error) {
|
||||||
switch statType {
|
switch statType {
|
||||||
case "c":
|
case "c":
|
||||||
return &CounterEvent{
|
return &CounterEvent{
|
||||||
|
@ -299,6 +305,7 @@ func buildEvent(statType, metric string, value float64, labels map[string]string
|
||||||
return &GaugeEvent{
|
return &GaugeEvent{
|
||||||
metricName: metric,
|
metricName: metric,
|
||||||
value: float64(value),
|
value: float64(value),
|
||||||
|
relative: relative,
|
||||||
labels: labels,
|
labels: labels,
|
||||||
}, nil
|
}, nil
|
||||||
case "ms", "h":
|
case "ms", "h":
|
||||||
|
@ -375,6 +382,12 @@ func (l *StatsDListener) handlePacket(packet []byte, e chan<- Events) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
valueStr, statType := components[0], components[1]
|
valueStr, statType := components[0], components[1]
|
||||||
|
|
||||||
|
var relative = false
|
||||||
|
if strings.Index(valueStr, "+") == 0 || strings.Index(valueStr, "-") == 0 {
|
||||||
|
relative = true
|
||||||
|
}
|
||||||
|
|
||||||
value, err := strconv.ParseFloat(valueStr, 64)
|
value, err := strconv.ParseFloat(valueStr, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Bad value %s on line: %s", valueStr, line)
|
log.Errorf("Bad value %s on line: %s", valueStr, line)
|
||||||
|
@ -418,7 +431,7 @@ func (l *StatsDListener) handlePacket(packet []byte, e chan<- Events) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
event, err := buildEvent(statType, metric, value, labels)
|
event, err := buildEvent(statType, metric, value, relative, labels)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Error building event on line %s: %s", line, err)
|
log.Errorf("Error building event on line %s: %s", line, err)
|
||||||
networkStats.WithLabelValues("illegal_event").Inc()
|
networkStats.WithLabelValues("illegal_event").Inc()
|
||||||
|
|
Loading…
Reference in a new issue