da4159513e
* Metrics interface * Prometheus implementation * NoOp implementation Co-authored-by: chris <chris@Profanity.local>
69 lines
1.8 KiB
Go
69 lines
1.8 KiB
Go
package prometheus
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/micro/go-micro/v3/metrics"
|
|
)
|
|
|
|
// ErrPrometheusPanic is a catch-all for the panics which can be thrown by the Prometheus client:
|
|
var ErrPrometheusPanic = errors.New("The Prometheus client panicked. Did you do something like change the tag cardinality or the type of a metric?")
|
|
|
|
// Count is a counter with key/value tags:
|
|
// New values are added to any previous one (eg "number of hits")
|
|
func (r *Reporter) Count(name string, value int64, tags metrics.Tags) (err error) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
err = ErrPrometheusPanic
|
|
}
|
|
}()
|
|
|
|
counter := r.metrics.getCounter(r.stripUnsupportedCharacters(name), r.listTagKeys(tags))
|
|
metric, err := counter.GetMetricWith(r.convertTags(tags))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
metric.Add(float64(value))
|
|
return err
|
|
}
|
|
|
|
// Gauge is a register with key/value tags:
|
|
// New values simply override any previous one (eg "current connections")
|
|
func (r *Reporter) Gauge(name string, value float64, tags metrics.Tags) (err error) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
err = ErrPrometheusPanic
|
|
}
|
|
}()
|
|
|
|
gauge := r.metrics.getGauge(r.stripUnsupportedCharacters(name), r.listTagKeys(tags))
|
|
metric, err := gauge.GetMetricWith(r.convertTags(tags))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
metric.Set(value)
|
|
return err
|
|
}
|
|
|
|
// Timing is a histogram with key/valye tags:
|
|
// New values are added into a series of aggregations
|
|
func (r *Reporter) Timing(name string, value time.Duration, tags metrics.Tags) (err error) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
err = ErrPrometheusPanic
|
|
}
|
|
}()
|
|
|
|
timing := r.metrics.getTiming(r.stripUnsupportedCharacters(name), r.listTagKeys(tags))
|
|
metric, err := timing.GetMetricWith(r.convertTags(tags))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
metric.Observe(value.Seconds())
|
|
return err
|
|
}
|