Skip to content
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cfg/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ func NewConfigFromFile(paths []string) *Config {
}

config := parseConfig(object)
var apps []funcApplier
apps := make([]funcApplier, 0, 2)

// add applicator for env variables
apps = append(apps, &envs{})
Expand Down
4 changes: 2 additions & 2 deletions fd/file.d.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ type FileD struct {

// file_d metrics

versionMetric *prometheus.GaugeVec
versionMetric *metric.GaugeVec
}

func New(config *cfg.Config, httpAddr string) *FileD {
Expand All @@ -63,7 +63,7 @@ func (f *FileD) Start() {
}

func (f *FileD) initMetrics() {
f.metricCtl = metric.NewCtl("file_d", f.registry)
f.metricCtl = metric.NewCtl("file_d", f.registry, 0)
f.versionMetric = f.metricCtl.RegisterGaugeVec("version", "", "version")
f.versionMetric.WithLabelValues(buildinfo.Version).Inc()
}
Expand Down
49 changes: 36 additions & 13 deletions metric/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package metric

import (
"sync"
"time"

"github.com/prometheus/client_golang/prometheus"
)
Expand All @@ -20,64 +21,86 @@ type Ctl struct {
subsystem string
register *prometheus.Registry

holder *Holder
metrics map[string]prometheus.Collector
mu sync.RWMutex
}

func NewCtl(subsystem string, registry *prometheus.Registry) *Ctl {
func NewCtl(subsystem string, registry *prometheus.Registry, metricHoldDuration time.Duration) *Ctl {
ctl := &Ctl{
subsystem: subsystem,
register: registry,
metrics: make(map[string]prometheus.Collector),
}

if metricHoldDuration != 0 {
ctl.holder = NewHolder(metricHoldDuration)
}

return ctl
}

func (mc *Ctl) RegisterCounter(name, help string) prometheus.Counter {
func (mc *Ctl) Maintenance() {
if mc.holder == nil {
return
}

mc.holder.maintenance()
}

func (mc *Ctl) AddToHolder(mv heldMetricVec) {
if mc.holder == nil {
return
}

mc.holder.addMetricVec(mv)
}

func (mc *Ctl) RegisterCounter(name, help string) *Counter {
counter := prometheus.NewCounter(prometheus.CounterOpts{
Namespace: PromNamespace,
Subsystem: mc.subsystem,
Name: name,
Help: help,
})

return mc.registerMetric(name, counter).(prometheus.Counter)
return newCounter(mc.registerMetric(name, counter).(prometheus.Counter))
}

func (mc *Ctl) RegisterCounterVec(name, help string, labels ...string) *prometheus.CounterVec {
func (mc *Ctl) RegisterCounterVec(name, help string, labels ...string) *CounterVec {
counterVec := prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: PromNamespace,
Subsystem: mc.subsystem,
Name: name,
Help: help,
}, labels)

return mc.registerMetric(name, counterVec).(*prometheus.CounterVec)
return newCounterVec(mc.registerMetric(name, counterVec).(*prometheus.CounterVec))
}

func (mc *Ctl) RegisterGauge(name, help string) prometheus.Gauge {
func (mc *Ctl) RegisterGauge(name, help string) *Gauge {
gauge := prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: PromNamespace,
Subsystem: mc.subsystem,
Name: name,
Help: help,
})

return mc.registerMetric(name, gauge).(prometheus.Gauge)
return newGauge(mc.registerMetric(name, gauge).(prometheus.Gauge))
}

func (mc *Ctl) RegisterGaugeVec(name, help string, labels ...string) *prometheus.GaugeVec {
func (mc *Ctl) RegisterGaugeVec(name, help string, labels ...string) *GaugeVec {
gaugeVec := prometheus.NewGaugeVec(prometheus.GaugeOpts{
Namespace: PromNamespace,
Subsystem: mc.subsystem,
Name: name,
Help: help,
}, labels)

return mc.registerMetric(name, gaugeVec).(*prometheus.GaugeVec)
return newGaugeVec(mc.registerMetric(name, gaugeVec).(*prometheus.GaugeVec))
}

func (mc *Ctl) RegisterHistogram(name, help string, buckets []float64) prometheus.Histogram {
func (mc *Ctl) RegisterHistogram(name, help string, buckets []float64) *Histogram {
histogram := prometheus.NewHistogram(prometheus.HistogramOpts{
Namespace: PromNamespace,
Subsystem: mc.subsystem,
Expand All @@ -86,10 +109,10 @@ func (mc *Ctl) RegisterHistogram(name, help string, buckets []float64) prometheu
Buckets: buckets,
})

return mc.registerMetric(name, histogram).(prometheus.Histogram)
return newHistogram(mc.registerMetric(name, histogram).(prometheus.Histogram))
}

func (mc *Ctl) RegisterHistogramVec(name, help string, buckets []float64, labels ...string) *prometheus.HistogramVec {
func (mc *Ctl) RegisterHistogramVec(name, help string, buckets []float64, labels ...string) *HistogramVec {
histogramVec := prometheus.NewHistogramVec(prometheus.HistogramOpts{
Namespace: PromNamespace,
Subsystem: mc.subsystem,
Expand All @@ -98,7 +121,7 @@ func (mc *Ctl) RegisterHistogramVec(name, help string, buckets []float64, labels
Buckets: buckets,
}, labels)

return mc.registerMetric(name, histogramVec).(*prometheus.HistogramVec)
return newHistogramVec(mc.registerMetric(name, histogramVec).(*prometheus.HistogramVec))
}

func (mc *Ctl) registerMetric(name string, newMetric prometheus.Collector) prometheus.Collector {
Expand Down
59 changes: 59 additions & 0 deletions metric/counter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package metric

import (
"time"

"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil"
)

type Counter struct {
*heldMetric[prometheus.Counter]
}

func newCounter(c prometheus.Counter) *Counter {
return &Counter{
heldMetric: newHeldMetric(nil, c),
}
}

func (c *Counter) Inc() {
c.metric.Inc()
c.updateUsage()
}

func (c *Counter) Add(v float64) {
c.metric.Add(v)
c.updateUsage()
}

// should only be used in tests
func (c *Counter) ToFloat64() float64 {
return testutil.ToFloat64(c.metric)
}

type CounterVec struct {
store *heldMetricsStore[prometheus.Counter]
vec *prometheus.CounterVec
}

func newCounterVec(cv *prometheus.CounterVec) *CounterVec {
return &CounterVec{
vec: cv,
store: newHeldMetricsStore[prometheus.Counter](),
}
}

func (cv *CounterVec) WithLabelValues(lvs ...string) *Counter {
return &Counter{
heldMetric: cv.store.GetOrCreate(lvs, cv.vec.WithLabelValues),
}
}

func (cv *CounterVec) DeleteLabelValues(lvs ...string) bool {
return cv.store.Delete(lvs, cv.vec)
}

func (cv *CounterVec) DeleteOldMetrics(holdDuration time.Duration) {
cv.store.DeleteOldMetrics(holdDuration, cv.vec)
}
74 changes: 74 additions & 0 deletions metric/gauge.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package metric

import (
"time"

"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil"
)

type Gauge struct {
*heldMetric[prometheus.Gauge]
}

func newGauge(c prometheus.Gauge) *Gauge {
return &Gauge{
heldMetric: newHeldMetric(nil, c),
}
}

func (g *Gauge) Set(v float64) {
g.metric.Set(v)
g.updateUsage()
}

func (g *Gauge) Inc() {
g.metric.Inc()
g.updateUsage()
}

func (g *Gauge) Dec() {
g.metric.Dec()
g.updateUsage()
}

func (g *Gauge) Add(v float64) {
g.metric.Add(v)
g.updateUsage()
}

func (g *Gauge) Sub(v float64) {
g.metric.Sub(v)
g.updateUsage()
}

// should only be used in tests
func (c *Gauge) ToFloat64() float64 {
return testutil.ToFloat64(c.metric)
}

type GaugeVec struct {
store *heldMetricsStore[prometheus.Gauge]
vec *prometheus.GaugeVec
}

func newGaugeVec(gv *prometheus.GaugeVec) *GaugeVec {
return &GaugeVec{
vec: gv,
store: newHeldMetricsStore[prometheus.Gauge](),
}
}

func (gv *GaugeVec) WithLabelValues(lvs ...string) *Gauge {
return &Gauge{
heldMetric: gv.store.GetOrCreate(lvs, gv.vec.WithLabelValues),
}
}

func (cv *GaugeVec) DeleteLabelValues(lvs ...string) bool {
return cv.store.Delete(lvs, cv.vec)
}

func (gv *GaugeVec) DeleteOldMetrics(holdDuration time.Duration) {
gv.store.DeleteOldMetrics(holdDuration, gv.vec)
}
43 changes: 0 additions & 43 deletions metric/held_counter.go

This file was deleted.

58 changes: 0 additions & 58 deletions metric/held_gauge.go

This file was deleted.

Loading
Loading