Update Go-Metrics 0.3.4 (#8478)

This commit is contained in:
s-christoff 2020-08-11 11:17:43 -05:00 committed by GitHub
parent 095eb22dd0
commit efcda70b85
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 91 additions and 46 deletions

2
go.mod
View File

@ -13,7 +13,7 @@ require (
github.com/NYTimes/gziphandler v1.0.1 github.com/NYTimes/gziphandler v1.0.1
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e
github.com/armon/go-metrics v0.3.3 github.com/armon/go-metrics v0.3.4
github.com/armon/go-radix v1.0.0 github.com/armon/go-radix v1.0.0
github.com/aws/aws-sdk-go v1.25.41 github.com/aws/aws-sdk-go v1.25.41
github.com/coredns/coredns v1.1.2 github.com/coredns/coredns v1.1.2

4
go.sum
View File

@ -60,8 +60,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM=
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
github.com/armon/go-metrics v0.3.3 h1:a9F4rlj7EWWrbj7BYw8J8+x+ZZkJeqzNyRk8hdPF+ro= github.com/armon/go-metrics v0.3.4 h1:Xqf+7f2Vhl9tsqDYmXhnXInUdcrtgpRNpIA15/uldSc=
github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.3.4/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=

View File

@ -22,3 +22,5 @@ _testmain.go
*.exe *.exe
/metrics.out /metrics.out
.idea

View File

@ -5,12 +5,11 @@ package prometheus
import ( import (
"fmt" "fmt"
"log" "log"
"regexp"
"strings" "strings"
"sync" "sync"
"time" "time"
"regexp"
"github.com/armon/go-metrics" "github.com/armon/go-metrics"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/push" "github.com/prometheus/client_golang/prometheus/push"
@ -36,10 +35,24 @@ type PrometheusSink struct {
gauges sync.Map gauges sync.Map
summaries sync.Map summaries sync.Map
counters sync.Map counters sync.Map
updates sync.Map
expiration time.Duration expiration time.Duration
} }
type PrometheusGauge struct {
prometheus.Gauge
updatedAt time.Time
}
type PrometheusSummary struct {
prometheus.Summary
updatedAt time.Time
}
type PrometheusCounter struct {
prometheus.Counter
updatedAt time.Time
}
// NewPrometheusSink creates a new PrometheusSink using the default options. // NewPrometheusSink creates a new PrometheusSink using the default options.
func NewPrometheusSink() (*PrometheusSink, error) { func NewPrometheusSink() (*PrometheusSink, error) {
return NewPrometheusSinkFrom(DefaultPrometheusOpts) return NewPrometheusSinkFrom(DefaultPrometheusOpts)
@ -51,7 +64,6 @@ func NewPrometheusSinkFrom(opts PrometheusOpts) (*PrometheusSink, error) {
gauges: sync.Map{}, gauges: sync.Map{},
summaries: sync.Map{}, summaries: sync.Map{},
counters: sync.Map{}, counters: sync.Map{},
updates: sync.Map{},
expiration: opts.Expiration, expiration: opts.Expiration,
} }
@ -72,32 +84,35 @@ func (p *PrometheusSink) Collect(c chan<- prometheus.Metric) {
expire := p.expiration != 0 expire := p.expiration != 0
now := time.Now() now := time.Now()
p.gauges.Range(func(k, v interface{}) bool { p.gauges.Range(func(k, v interface{}) bool {
last, _ := p.updates.Load(k) if v != nil {
if expire && last.(time.Time).Add(p.expiration).Before(now) { lastUpdate := v.(*PrometheusGauge).updatedAt
p.updates.Delete(k) if expire && lastUpdate.Add(p.expiration).Before(now) {
p.gauges.Delete(k) p.gauges.Delete(k)
} else { } else {
v.(prometheus.Gauge).Collect(c) v.(*PrometheusGauge).Collect(c)
}
} }
return true return true
}) })
p.summaries.Range(func(k, v interface{}) bool { p.summaries.Range(func(k, v interface{}) bool {
last, _ := p.updates.Load(k) if v != nil {
if expire && last.(time.Time).Add(p.expiration).Before(now) { lastUpdate := v.(*PrometheusSummary).updatedAt
p.updates.Delete(k) if expire && lastUpdate.Add(p.expiration).Before(now) {
p.summaries.Delete(k) p.summaries.Delete(k)
} else { } else {
v.(prometheus.Summary).Collect(c) v.(*PrometheusSummary).Collect(c)
}
} }
return true return true
}) })
p.counters.Range(func(k, v interface{}) bool { p.counters.Range(func(k, v interface{}) bool {
last, _ := p.updates.Load(k) if v != nil {
if expire && last.(time.Time).Add(p.expiration).Before(now) { lastUpdate := v.(*PrometheusCounter).updatedAt
p.updates.Delete(k) if expire && lastUpdate.Add(p.expiration).Before(now) {
p.counters.Delete(k) p.counters.Delete(k)
} else { } else {
v.(prometheus.Counter).Collect(c) v.(*PrometheusCounter).Collect(c)
}
} }
return true return true
}) })
@ -131,17 +146,31 @@ func (p *PrometheusSink) SetGauge(parts []string, val float32) {
func (p *PrometheusSink) SetGaugeWithLabels(parts []string, val float32, labels []metrics.Label) { func (p *PrometheusSink) SetGaugeWithLabels(parts []string, val float32, labels []metrics.Label) {
key, hash := p.flattenKey(parts, labels) key, hash := p.flattenKey(parts, labels)
g, ok := p.gauges.Load(hash) pg, ok := p.gauges.Load(hash)
if !ok {
g = prometheus.NewGauge(prometheus.GaugeOpts{ // The sync.Map underlying gauges stores pointers to our structs. If we need to make updates,
// rather than modifying the underlying value directly, which would be racy, we make a local
// copy by dereferencing the pointer we get back, making the appropriate changes, and then
// storing a pointer to our local copy. The underlying Prometheus types are threadsafe,
// so there's no issues there. It's possible for racy updates to occur to the updatedAt
// value, but since we're always setting it to time.Now(), it doesn't really matter.
if ok {
localGauge := *pg.(*PrometheusGauge)
localGauge.Set(float64(val))
localGauge.updatedAt = time.Now()
p.gauges.Store(hash, &localGauge)
} else {
g := prometheus.NewGauge(prometheus.GaugeOpts{
Name: key, Name: key,
Help: key, Help: key,
ConstLabels: prometheusLabels(labels), ConstLabels: prometheusLabels(labels),
}) })
p.gauges.Store(hash, g) g.Set(float64(val))
pg = &PrometheusGauge{
g, time.Now(),
}
p.gauges.Store(hash, pg)
} }
g.(prometheus.Gauge).Set(float64(val))
p.updates.Store(hash, time.Now())
} }
func (p *PrometheusSink) AddSample(parts []string, val float32) { func (p *PrometheusSink) AddSample(parts []string, val float32) {
@ -150,19 +179,27 @@ func (p *PrometheusSink) AddSample(parts []string, val float32) {
func (p *PrometheusSink) AddSampleWithLabels(parts []string, val float32, labels []metrics.Label) { func (p *PrometheusSink) AddSampleWithLabels(parts []string, val float32, labels []metrics.Label) {
key, hash := p.flattenKey(parts, labels) key, hash := p.flattenKey(parts, labels)
g, ok := p.summaries.Load(hash) ps, ok := p.summaries.Load(hash)
if !ok {
g = prometheus.NewSummary(prometheus.SummaryOpts{ if ok {
localSummary := *ps.(*PrometheusSummary)
localSummary.Observe(float64(val))
localSummary.updatedAt = time.Now()
p.summaries.Store(hash, &localSummary)
} else {
s := prometheus.NewSummary(prometheus.SummaryOpts{
Name: key, Name: key,
Help: key, Help: key,
MaxAge: 10 * time.Second, MaxAge: 10 * time.Second,
ConstLabels: prometheusLabels(labels), ConstLabels: prometheusLabels(labels),
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
}) })
p.summaries.Store(hash, g) s.Observe(float64(val))
ps = &PrometheusSummary{
s, time.Now(),
}
p.summaries.Store(hash, ps)
} }
g.(prometheus.Summary).Observe(float64(val))
p.updates.Store(hash, time.Now())
} }
// EmitKey is not implemented. Prometheus doesnt offer a type for which an // EmitKey is not implemented. Prometheus doesnt offer a type for which an
@ -177,17 +214,25 @@ func (p *PrometheusSink) IncrCounter(parts []string, val float32) {
func (p *PrometheusSink) IncrCounterWithLabels(parts []string, val float32, labels []metrics.Label) { func (p *PrometheusSink) IncrCounterWithLabels(parts []string, val float32, labels []metrics.Label) {
key, hash := p.flattenKey(parts, labels) key, hash := p.flattenKey(parts, labels)
g, ok := p.counters.Load(hash) pc, ok := p.counters.Load(hash)
if !ok {
g = prometheus.NewCounter(prometheus.CounterOpts{ if ok {
localCounter := *pc.(*PrometheusCounter)
localCounter.Add(float64(val))
localCounter.updatedAt = time.Now()
p.counters.Store(hash, &localCounter)
} else {
c := prometheus.NewCounter(prometheus.CounterOpts{
Name: key, Name: key,
Help: key, Help: key,
ConstLabels: prometheusLabels(labels), ConstLabels: prometheusLabels(labels),
}) })
p.counters.Store(hash, g) c.Add(float64(val))
pc = &PrometheusCounter{
c, time.Now(),
}
p.counters.Store(hash, pc)
} }
g.(prometheus.Counter).Add(float64(val))
p.updates.Store(hash, time.Now())
} }
type PrometheusPushSink struct { type PrometheusPushSink struct {
@ -199,12 +244,10 @@ type PrometheusPushSink struct {
} }
func NewPrometheusPushSink(address string, pushIterval time.Duration, name string) (*PrometheusPushSink, error) { func NewPrometheusPushSink(address string, pushIterval time.Duration, name string) (*PrometheusPushSink, error) {
promSink := &PrometheusSink{ promSink := &PrometheusSink{
gauges: sync.Map{}, gauges: sync.Map{},
summaries: sync.Map{}, summaries: sync.Map{},
counters: sync.Map{}, counters: sync.Map{},
updates: sync.Map{},
expiration: 60 * time.Second, expiration: 60 * time.Second,
} }

2
vendor/modules.txt vendored
View File

@ -32,7 +32,7 @@ github.com/NYTimes/gziphandler
github.com/StackExchange/wmi github.com/StackExchange/wmi
# github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e # github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e
github.com/armon/circbuf github.com/armon/circbuf
# github.com/armon/go-metrics v0.3.3 # github.com/armon/go-metrics v0.3.4
github.com/armon/go-metrics github.com/armon/go-metrics
github.com/armon/go-metrics/circonus github.com/armon/go-metrics/circonus
github.com/armon/go-metrics/datadog github.com/armon/go-metrics/datadog