Skip to content

Commit

Permalink
statsd separator
Browse files Browse the repository at this point in the history
  • Loading branch information
mikecutalo committed Dec 14, 2021
1 parent 112837d commit ce5d635
Showing 1 changed file with 42 additions and 10 deletions.
52 changes: 42 additions & 10 deletions common/metrics/tally/statsd/reporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ package statsd
import (
"bytes"
"sort"
"strings"
"time"

"github.com/cactus/go-statsd-client/statsd"
Expand All @@ -37,6 +38,8 @@ import (
type temporalTallyStatsdReporter struct {
//Wrapper on top of "github.com/uber-go/tally/statsd"
tallystatsd tally.StatsReporter

separator string
}

func (r *temporalTallyStatsdReporter) metricNameWithTags(originalName string, tags map[string]string) string {
Expand All @@ -63,22 +66,23 @@ func (r *temporalTallyStatsdReporter) metricNameWithTags(originalName string, ta
func NewReporter(statsd statsd.Statter, opts tallystatsdreporter.Options) tally.StatsReporter {
return &temporalTallyStatsdReporter{
tallystatsd: tallystatsdreporter.NewReporter(statsd, opts),
separator: ".__",
}
}

func (r *temporalTallyStatsdReporter) ReportCounter(name string, tags map[string]string, value int64) {
newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportCounter(newName, map[string]string{}, value)
// newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportCounter(r.taggedName(name, tags), map[string]string{}, value)
}

func (r *temporalTallyStatsdReporter) ReportGauge(name string, tags map[string]string, value float64) {
newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportGauge(newName, map[string]string{}, value)
// newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportGauge(r.taggedName(name, tags), map[string]string{}, value)
}

func (r *temporalTallyStatsdReporter) ReportTimer(name string, tags map[string]string, interval time.Duration) {
newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportTimer(newName, map[string]string{}, interval)
// newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportTimer(r.taggedName(name, tags), map[string]string{}, interval)
}

func (r *temporalTallyStatsdReporter) ReportHistogramValueSamples(
Expand All @@ -89,8 +93,8 @@ func (r *temporalTallyStatsdReporter) ReportHistogramValueSamples(
bucketUpperBound float64,
samples int64,
) {
newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportHistogramValueSamples(newName, map[string]string{}, buckets, bucketLowerBound, bucketUpperBound, samples)
// newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportHistogramValueSamples(r.taggedName(name, tags), map[string]string{}, buckets, bucketLowerBound, bucketUpperBound, samples)
}

func (r *temporalTallyStatsdReporter) ReportHistogramDurationSamples(
Expand All @@ -101,8 +105,8 @@ func (r *temporalTallyStatsdReporter) ReportHistogramDurationSamples(
bucketUpperBound time.Duration,
samples int64,
) {
newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportHistogramDurationSamples(newName, map[string]string{}, buckets, bucketLowerBound, bucketUpperBound, samples)
// newName := r.metricNameWithTags(name, tags)
r.tallystatsd.ReportHistogramDurationSamples(r.taggedName(name, tags), map[string]string{}, buckets, bucketLowerBound, bucketUpperBound, samples)
}

func (r *temporalTallyStatsdReporter) Capabilities() tally.Capabilities {
Expand All @@ -112,3 +116,31 @@ func (r *temporalTallyStatsdReporter) Capabilities() tally.Capabilities {
func (r *temporalTallyStatsdReporter) Flush() {
r.tallystatsd.Flush()
}

// https://github.com/influxdata/telegraf/blob/master/plugins/inputs/statsd/README.md#influx-statsd
func (r *temporalTallyStatsdReporter) taggedName(name string, tags map[string]string) string {
var b strings.Builder
b.WriteString(name)
for k, v := range tags {
b.WriteString(r.separator)
b.WriteString(replaceChars(k))
b.WriteByte('=')
b.WriteString(replaceChars(v))
}
return b.String()
}

// Replace problematic characters in tags.
func replaceChars(s string) string {
var b strings.Builder
b.Grow(len(s))
for i := 0; i < len(s); i++ {
switch s[i] {
case '.', ':', '|', '-', '=':
b.WriteByte('_')
default:
b.WriteByte(s[i])
}
}
return b.String()
}

0 comments on commit ce5d635

Please sign in to comment.