129 lines
2.8 KiB
Go
129 lines
2.8 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package statsd
|
|
|
|
import (
|
|
"github.com/go-kit/kit/metrics/statsd"
|
|
"github.com/hyperledger/fabric/common/metrics"
|
|
"github.com/hyperledger/fabric/common/metrics/internal/namer"
|
|
)
|
|
|
|
const defaultFormat = "%{#fqname}"
|
|
|
|
type Provider struct {
|
|
Statsd *statsd.Statsd
|
|
}
|
|
|
|
func (p *Provider) NewCounter(o metrics.CounterOpts) metrics.Counter {
|
|
if o.StatsdFormat == "" {
|
|
o.StatsdFormat = defaultFormat
|
|
}
|
|
counter := &Counter{
|
|
statsdProvider: p.Statsd,
|
|
namer: namer.NewCounterNamer(o),
|
|
}
|
|
|
|
if len(o.LabelNames) == 0 {
|
|
counter.Counter = p.Statsd.NewCounter(counter.namer.Format(), 1)
|
|
}
|
|
|
|
return counter
|
|
}
|
|
|
|
func (p *Provider) NewGauge(o metrics.GaugeOpts) metrics.Gauge {
|
|
if o.StatsdFormat == "" {
|
|
o.StatsdFormat = defaultFormat
|
|
}
|
|
gauge := &Gauge{
|
|
statsdProvider: p.Statsd,
|
|
namer: namer.NewGaugeNamer(o),
|
|
}
|
|
|
|
if len(o.LabelNames) == 0 {
|
|
gauge.Gauge = p.Statsd.NewGauge(gauge.namer.Format())
|
|
}
|
|
|
|
return gauge
|
|
}
|
|
|
|
func (p *Provider) NewHistogram(o metrics.HistogramOpts) metrics.Histogram {
|
|
if o.StatsdFormat == "" {
|
|
o.StatsdFormat = defaultFormat
|
|
}
|
|
histogram := &Histogram{
|
|
statsdProvider: p.Statsd,
|
|
namer: namer.NewHistogramNamer(o),
|
|
}
|
|
|
|
if len(o.LabelNames) == 0 {
|
|
histogram.Timing = p.Statsd.NewTiming(histogram.namer.Format(), 1.0)
|
|
}
|
|
|
|
return histogram
|
|
}
|
|
|
|
type Counter struct {
|
|
Counter *statsd.Counter
|
|
namer *namer.Namer
|
|
statsdProvider *statsd.Statsd
|
|
}
|
|
|
|
func (c *Counter) Add(delta float64) {
|
|
if c.Counter == nil {
|
|
panic("label values must be provided by calling With")
|
|
}
|
|
c.Counter.Add(delta)
|
|
}
|
|
|
|
func (c *Counter) With(labelValues ...string) metrics.Counter {
|
|
name := c.namer.Format(labelValues...)
|
|
return &Counter{Counter: c.statsdProvider.NewCounter(name, 1)}
|
|
}
|
|
|
|
type Gauge struct {
|
|
Gauge *statsd.Gauge
|
|
namer *namer.Namer
|
|
statsdProvider *statsd.Statsd
|
|
}
|
|
|
|
func (g *Gauge) Add(delta float64) {
|
|
if g.Gauge == nil {
|
|
panic("label values must be provided by calling With")
|
|
}
|
|
g.Gauge.Add(delta)
|
|
}
|
|
|
|
func (g *Gauge) Set(value float64) {
|
|
if g.Gauge == nil {
|
|
panic("label values must be provided by calling With")
|
|
}
|
|
g.Gauge.Set(value)
|
|
}
|
|
|
|
func (g *Gauge) With(labelValues ...string) metrics.Gauge {
|
|
name := g.namer.Format(labelValues...)
|
|
return &Gauge{Gauge: g.statsdProvider.NewGauge(name)}
|
|
}
|
|
|
|
type Histogram struct {
|
|
Timing *statsd.Timing
|
|
namer *namer.Namer
|
|
statsdProvider *statsd.Statsd
|
|
}
|
|
|
|
func (h *Histogram) With(labelValues ...string) metrics.Histogram {
|
|
name := h.namer.Format(labelValues...)
|
|
return &Histogram{Timing: h.statsdProvider.NewTiming(name, 1)}
|
|
}
|
|
|
|
func (h *Histogram) Observe(value float64) {
|
|
if h.Timing == nil {
|
|
panic("label values must be provided by calling With")
|
|
}
|
|
h.Timing.Observe(value)
|
|
}
|