2012-05-24 22:02:44 +04:00
|
|
|
/*
|
|
|
|
Copyright (c) 2012, Matt T. Proud
|
|
|
|
All rights reserved.
|
2012-05-20 01:59:25 +04:00
|
|
|
|
2012-05-24 22:02:44 +04:00
|
|
|
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 metrics
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2013-01-25 20:50:41 +04:00
|
|
|
"github.com/prometheus/client_golang/utility"
|
2012-05-20 01:59:25 +04:00
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
2012-05-24 22:02:44 +04:00
|
|
|
/*
|
|
|
|
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.
|
|
|
|
*/
|
2013-01-19 17:48:30 +04:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2013-01-19 17:48:30 +04:00
|
|
|
type gaugeValue struct {
|
|
|
|
labels map[string]string
|
|
|
|
value float64
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewGauge() Gauge {
|
|
|
|
return &gauge{
|
|
|
|
values: map[string]*gaugeValue{},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type gauge struct {
|
|
|
|
mutex sync.RWMutex
|
|
|
|
values map[string]*gaugeValue
|
|
|
|
}
|
|
|
|
|
|
|
|
func (metric *gauge) String() string {
|
|
|
|
formatString := "[Gauge %s]"
|
2012-05-20 01:59:25 +04:00
|
|
|
|
|
|
|
metric.mutex.RLock()
|
|
|
|
defer metric.mutex.RUnlock()
|
|
|
|
|
2013-01-19 17:48:30 +04:00
|
|
|
return fmt.Sprintf(formatString, metric.values)
|
2012-05-20 01:59:25 +04:00
|
|
|
}
|
|
|
|
|
2013-01-19 17:48:30 +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()
|
|
|
|
|
2013-01-19 17:48:30 +04:00
|
|
|
if labels == nil {
|
|
|
|
labels = map[string]string{}
|
|
|
|
}
|
|
|
|
|
|
|
|
signature := utility.LabelsToSignature(labels)
|
2012-05-20 01:59:25 +04:00
|
|
|
|
2013-01-19 17:48:30 +04:00
|
|
|
if original, ok := metric.values[signature]; ok {
|
|
|
|
original.value = value
|
|
|
|
} else {
|
|
|
|
metric.values[signature] = &gaugeValue{
|
|
|
|
labels: labels,
|
|
|
|
value: value,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return value
|
2012-05-20 01:59:25 +04:00
|
|
|
}
|
|
|
|
|
2013-01-19 17:48:30 +04:00
|
|
|
func (metric *gauge) ResetAll() {
|
|
|
|
metric.mutex.Lock()
|
|
|
|
defer metric.mutex.Unlock()
|
2012-05-20 01:59:25 +04:00
|
|
|
|
2013-01-19 17:48:30 +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
|
|
|
}
|
|
|
|
|
2013-01-19 17:48:30 +04:00
|
|
|
func (metric *gauge) AsMarshallable() map[string]interface{} {
|
2012-05-20 01:59:25 +04:00
|
|
|
metric.mutex.RLock()
|
|
|
|
defer metric.mutex.RUnlock()
|
|
|
|
|
2013-01-19 17:48:30 +04:00
|
|
|
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
|
|
|
}
|