106 lines
2.7 KiB
Go
106 lines
2.7 KiB
Go
|
package gorelic
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
metrics "github.com/yvasiyarov/go-metrics"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
histogramMin = iota
|
||
|
histogramMax
|
||
|
histogramMean
|
||
|
histogramPercentile
|
||
|
histogramStdDev
|
||
|
histogramVariance
|
||
|
noHistogramFunctions
|
||
|
)
|
||
|
|
||
|
type goMetricaDataSource struct {
|
||
|
metrics.Registry
|
||
|
}
|
||
|
|
||
|
func (ds goMetricaDataSource) GetGaugeValue(key string) (float64, error) {
|
||
|
if valueContainer := ds.Get(key); valueContainer == nil {
|
||
|
return 0, fmt.Errorf("metrica with name %s is not registered\n", key)
|
||
|
} else if gauge, ok := valueContainer.(metrics.Gauge); ok {
|
||
|
return float64(gauge.Value()), nil
|
||
|
} else {
|
||
|
return 0, fmt.Errorf("metrica container has unexpected type: %T\n", valueContainer)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (ds goMetricaDataSource) GetHistogramValue(key string, statFunction int, percentile float64) (float64, error) {
|
||
|
if valueContainer := ds.Get(key); valueContainer == nil {
|
||
|
return 0, fmt.Errorf("metrica with name %s is not registered\n", key)
|
||
|
} else if histogram, ok := valueContainer.(metrics.Histogram); ok {
|
||
|
switch statFunction {
|
||
|
default:
|
||
|
return 0, fmt.Errorf("unsupported stat function for histogram: %s\n", statFunction)
|
||
|
case histogramMax:
|
||
|
return float64(histogram.Max()), nil
|
||
|
case histogramMin:
|
||
|
return float64(histogram.Min()), nil
|
||
|
case histogramMean:
|
||
|
return float64(histogram.Mean()), nil
|
||
|
case histogramStdDev:
|
||
|
return float64(histogram.StdDev()), nil
|
||
|
case histogramVariance:
|
||
|
return float64(histogram.Variance()), nil
|
||
|
case histogramPercentile:
|
||
|
return float64(histogram.Percentile(percentile)), nil
|
||
|
}
|
||
|
} else {
|
||
|
return 0, fmt.Errorf("metrica container has unexpected type: %T\n", valueContainer)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type baseGoMetrica struct {
|
||
|
dataSource goMetricaDataSource
|
||
|
basePath string
|
||
|
name string
|
||
|
units string
|
||
|
dataSourceKey string
|
||
|
}
|
||
|
|
||
|
func (metrica *baseGoMetrica) GetName() string {
|
||
|
return metrica.basePath + metrica.name
|
||
|
}
|
||
|
|
||
|
func (metrica *baseGoMetrica) GetUnits() string {
|
||
|
return metrica.units
|
||
|
}
|
||
|
|
||
|
type gaugeMetrica struct {
|
||
|
*baseGoMetrica
|
||
|
}
|
||
|
|
||
|
func (metrica *gaugeMetrica) GetValue() (float64, error) {
|
||
|
return metrica.dataSource.GetGaugeValue(metrica.dataSourceKey)
|
||
|
}
|
||
|
|
||
|
type gaugeIncMetrica struct {
|
||
|
*baseGoMetrica
|
||
|
previousValue float64
|
||
|
}
|
||
|
|
||
|
func (metrica *gaugeIncMetrica) GetValue() (float64, error) {
|
||
|
var value float64
|
||
|
var currentValue float64
|
||
|
var err error
|
||
|
if currentValue, err = metrica.dataSource.GetGaugeValue(metrica.dataSourceKey); err == nil {
|
||
|
value = currentValue - metrica.previousValue
|
||
|
metrica.previousValue = currentValue
|
||
|
}
|
||
|
return value, err
|
||
|
}
|
||
|
|
||
|
type histogramMetrica struct {
|
||
|
*baseGoMetrica
|
||
|
statFunction int
|
||
|
percentileValue float64
|
||
|
}
|
||
|
|
||
|
func (metrica *histogramMetrica) GetValue() (float64, error) {
|
||
|
return metrica.dataSource.GetHistogramValue(metrica.dataSourceKey, metrica.statFunction, metrica.percentileValue)
|
||
|
}
|