func NewGaugeVec()

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
}