in metrics/internal/metrics/gauge.go [28:79]
func NewGaugeVec(opts ...MetricOption) (Gauge, error) {
descOpts := applyMetricOptions(opts)
prom := promauto.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: descOpts.Namespace(),
Subsystem: descOpts.Subsystem(),
Name: descOpts.Name(),
Help: descOpts.help,
}, descOpts.labelsNames())
for _, labels := range descOpts.labelsToInitialize {
_, e := prom.GetMetricWithLabelValues(labels...)
if e != nil {
return nil, e
}
}
gauge := &gaugeVec{
description: descOpts.description,
metric: prom,
}
if descOpts.consulMetricClient == nil {
return gauge, nil
}
gauge.consulClient = descOpts.consulMetricClient
values, err := gauge.consulClient.GetAllMetricValues(descOpts.FullName())
if err != nil {
descOpts.logger.
WithError(err).
WithField("metric", descOpts.FullName()).
Errorf("Could not restore metric data from Consul")
// Ignore error so that we don't prevent metrics from operating.
return gauge, nil
}
for labels, value := range values {
labelsSlice := strings.Split(labels, ",")
gauge.metric.WithLabelValues(labelsSlice...).Set(value)
}
descOpts.logger.
WithField("metric", descOpts.FullName()).
WithField("data", values).
Info("Successfully loaded metric data from Consul")
return gauge, nil
}