client_golang/prometheus/gauge.go

101 lines
2.0 KiB
Go
Raw Normal View History

// Copyright (c) 2013, Prometheus Team
// All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
2012-05-20 01:59:25 +04:00
package prometheus
2012-05-20 01:59:25 +04:00
import (
"fmt"
"sync"
)
// A gauge metric merely provides an instantaneous representation of a scalar
// value or an accumulation. For instance, if one wants to expose the current
// temperature or the hitherto bandwidth used, this would be the metric for such
// circumstances.
type Gauge interface {
AsMarshallable() map[string]interface{}
ResetAll()
Set(labels map[string]string, value float64) float64
String() string
2012-05-20 01:59:25 +04:00
}
type gaugeVector struct {
labels map[string]string
value float64
}
func NewGauge() Gauge {
return &gauge{
values: map[string]*gaugeVector{},
}
}
type gauge struct {
mutex sync.RWMutex
values map[string]*gaugeVector
}
func (metric gauge) String() string {
formatString := "[Gauge %s]"
2012-05-20 01:59:25 +04:00
metric.mutex.RLock()
defer metric.mutex.RUnlock()
return fmt.Sprintf(formatString, metric.values)
2012-05-20 01:59:25 +04:00
}
func (metric *gauge) Set(labels map[string]string, value float64) float64 {
2012-05-20 01:59:25 +04:00
metric.mutex.Lock()
defer metric.mutex.Unlock()
if labels == nil {
labels = map[string]string{}
}
signature := labelsToSignature(labels)
2012-05-20 01:59:25 +04:00
if original, ok := metric.values[signature]; ok {
original.value = value
} else {
metric.values[signature] = &gaugeVector{
labels: labels,
value: value,
}
}
return value
2012-05-20 01:59:25 +04:00
}
func (metric *gauge) ResetAll() {
metric.mutex.Lock()
defer metric.mutex.Unlock()
2012-05-20 01:59:25 +04:00
for key, value := range metric.values {
for label := range value.labels {
delete(value.labels, label)
}
delete(metric.values, key)
}
2012-05-20 01:59:25 +04:00
}
func (metric gauge) AsMarshallable() map[string]interface{} {
2012-05-20 01:59:25 +04:00
metric.mutex.RLock()
defer metric.mutex.RUnlock()
values := make([]map[string]interface{}, 0, len(metric.values))
for _, value := range metric.values {
values = append(values, map[string]interface{}{
labelsKey: value.labels,
valueKey: value.value,
})
}
return map[string]interface{}{
typeKey: gaugeTypeValue,
valueKey: values,
}
2012-05-20 01:59:25 +04:00
}