нарушают принцип DRY, и есть 3-я функция, которая с помощью параметров-типов пытается эту проблему решить. В общем, 3-я - не компилируется, go говорит, что у типа T нет метода WithLabelValues() .
Этого я совсем не понимаю, потому что у обоих типов в union'е есть этот метод!
Может, здесь лучше как-то заюзать интерфейс с методом WithLabelValues? Я новичок в Go и что-то уже натурально мозг горит от всего этого
func GetCounterFromSet(metricSetName string, metricLabels prometheus.Labels) prometheus.Counter {
ms, dflts, err := GetMetricSet[*prometheus.CounterVec](metricSetName)
if err != nil {
logrus.Fatalf("failed to get metric from set: %v", err)
}
return ms.WithLabelValues(getValsForLabels(metricLabels, dflts)...).(prometheus.Counter)
}
func GetGaugeFromSet(metricSetName string, metricLabels prometheus.Labels) prometheus.Gauge {
ms, dflts, err := GetMetricSet[*prometheus.GaugeVec](metricSetName)
if err != nil {
logrus.Fatalf("failed to get metric from set: %v", err)
}
return ms.WithLabelValues(getValsForLabels(metricLabels, dflts)...).(prometheus.Gauge)
}
func GetMetricFromSetT[T *prometheus.CounterVec | *prometheus.GaugeVec](metricSetName string, metricLabels prometheus.Labels) prometheus.Metric {
ms, dflts, err := GetMetricSet[T](metricSetName)
if err != nil {
logrus.Fatalf("failed to get metric from set: %v", err)
}
return ms.WithLabelValues(getValsForLabels(metricLabels, dflts)...).(prometheus.Metric)
}
В общем, так работает: type hasWithLabels interface { WithLabelValues(vals ...string) prometheus.Metric } func GetMetricFromSetT[T *prometheus.CounterVec | *prometheus.GaugeVec](metricSetName string, metricLabels prometheus.Labels) prometheus.Metric { var ms hasWithLabels ms, dflts, err := GetMetricSet[T](metricSetName) if err != nil { logrus.Fatalf("failed to get metric from set: %v", err) } return ms.WithLabelValues(getValsForLabels(metricLabels, dflts)...).(prometheus.Metric) }
Обсуждают сегодня