170 похожих чатов

Народ, нужна помощь, я уже начинаю агрессивно копипастить функции, меняя

там имена типов, но не верю, что даже современный Go заставляет это делать!

Есть 2 типа CounterVec и GaugeVec, оба типа умеют WithLabelValues:
func (v *CounterVec) WithLabelValues (lvs ...string) Counter
func (v *GaugeVec) WithLabelValues (lvs ...string) Gauge
Counter и Gauge - интерфейсы, оба включают в себя интерфейс Metric.

Но при этом переменные этих типов не соответствуют такому интерфейсу:
type hasWithLabelValues interface {
WithLabelValues (lvs ...string) Metric
}

Вопрос: почему?
Я не понимаю такой логики от слова совсем :(

15 ответов

7 просмотров

Я б попробовал определить Metric через дженерики как gauge|counter

сигнатура в интерфейсе и реализации должны полностью совпадать

Вы мыслите терминами наследования Включает != наследует Привыкайте к го)

потому что Counter и Metric это разные интерфейсы

Андрей-Коновалов Автор вопроса

Потому что го не приводит внутренние типы сам, зато может приводить тип дженерика, в ограниченом виде можно реализовать так, но не для всех случаев подойдет, в слайс несколько таких интерфейсов не положишь: type hasWithLabelValues[M Metric] interface { WithLabelValues (lvs ...string) M }

Андрей-Коновалов Автор вопроса

Хм... хорошо бы, но так оно не работает: «cannot use prometheus.NewCounterVec(prometheus.CounterOpts{…}, []string{…}) (value of type *prometheus.CounterVec) as hasWithLabelValues[M] value in assignment: *prometheus.CounterVec does not implement hasWithLabelValues[M] (wrong type for method WithLabelValues)» import ( "fmt" "github.com/prometheus/client_golang/prometheus" ) type hasWithLabelValues[M prometheus.Metric] interface { WithLabelValues(lvs ...string) M } func monitoringHasSpoken[M prometheus.Metric]() { var cv hasWithLabelValues[M] cv = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "total_reqs"}, []string{"name"}) // ???? .(hasWithLabelValues[prometheus.Counter]) fmt.Println(cv.WithLabelValues("Adyn")) }

Андрей Коновалов
Хм... хорошо бы, но так оно не работает: «cannot u...

hasWithLabelValues[prometheus.Metric] и hasWithLabelValues[prometheus.Counter] - разные типы, которые друг к другу не приводятся, можно конечно что то подобное изобрести но непонятно зачем, это уже натуральный оверинжениринг func withLabels[M prometheus.Metric, ML hasWithLabelValues[M]](metric ML, lvs []string) M { return metric.WithLabelValues(lvs...) }

Андрей-Коновалов Автор вопроса
Royal Cat
hasWithLabelValues[prometheus.Metric] и hasWithLab...

Я попытался сделать алиасы для типов в client_golang prometheus'а: type CounterVec prometheus.CounterVec type GaugeVec prometheus.GaugeVec func (v *CounterVec) WithLabelValues(lvs ...string) prometheus.Metric { return v.WithLabelValues(lvs...).(prometheus.Metric) } func (v *GaugeVec) WithLabelValues(lvs ...string) prometheus.Metric { return v.WithLabelValues(lvs...).(prometheus.Metric) } type canWithLabelValues interface { WithLabelValues(lvs ...string) prometheus.Metric } но желаемый результат так не достигается: var cv canWithLabelValues cv = prometheus.NewCounterVec( ) В итоге функции теперь отличаются примерно ничем, но сделать их одной функцией не удаётся: func (ms *MetricSet) GetCounter(metricLabels RawLabels) (metric *MetricRecord) { metricVec := ms.mvec.(*prometheus.CounterVec) .... return } func (ms *MetricSet) GetGauge(metricLabels RawLabels) (metric *MetricRecord) { metricVec := ms.mvec.(*prometheus.GaugeVec) .... return }

Андрей-Коновалов Автор вопроса
Андрей Коновалов
Я попытался сделать алиасы для типов в client_gola...

Таки сделал это! Но для этого пришлось рубить странноватую обвязку вокруг чужих структур: type CounterSet struct { v *prometheus.CounterVec } type GaugeSet struct { v *prometheus.GaugeVec } func (cs *CounterSet) WithLabelValues(lvs ...string) prometheus.Metric { return cs.v.WithLabelValues(lvs...).(prometheus.Metric) } func (gs *GaugeSet) WithLabelValues(lvs ...string) prometheus.Metric { return gs.v.WithLabelValues(lvs...).(prometheus.Metric) } type canWithLabelValues interface { WithLabelValues(lvs ...string) prometheus.Metric } type MetricSet struct { DefaultLabels MetricLabels mvec canWithLabelValues MetricsType MetricType Name string Metrics map[string]*MetricRecord }

Так Counter и Gauge - это разные сущности, у которых случайно наполовину совпала сигнатура одного метода

Андрей-Коновалов Автор вопроса
Андрей-Коновалов Автор вопроса
Михаил Макарычев
Так Counter и Gauge - это разные сущности, у котор...

То, что их реализовали копипастой в client_golang - как раз довольно странно: по сути это метрики, числа, и логика их для просто изменения представления наружу очень близка. Это уже в promql разница будет

Андрей Коновалов
То, что их реализовали копипастой в client_golang ...

А такой вариант не устроит? type Metrics[T any] interface { WithLabelValues(lvs ...string) T }

Похожие вопросы

Обсуждают сегодня

Я тут за тем, чтобы задать вопрос, так как не знаю ассемблер, учу с/с++. Короче, насколько дорога операция перехода в функцию при ее вызове? Дело в том, что в с++ есть макросы...
Максим Рябцев
12
Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
А какие чаты вообще в ходу? Auto aim? И что еше
do you think you're better off alone? А
13
hello friends. Do you know how can I learn getx? I have a software project that I should deliver it up to 5 weeks later and I need to learn firebase too. I will be thankfull
AmirHossein Razavi
15
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
Доброе время суток! у меня тут иноды закончились. и понял почему по сути кстит, я периодически очищаю постгрес и сентри контайнер: postgres=# DELETE FROM nodestore_node WHER...
Юсиф Насиров
9
Какой дос блять?
007
9
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
lazarus-3.2.0/gtk, linux патч "имя проекта по умолчанию project1 -> prj" день добрый не нравится "именя проекта по умолчанию" (project1), к.раз приходится переименовывать (н...
livontiy
5
Коллеги, а в чём сейчас хорошо писать на перле, в смысле ide? Пробовал в идее с плагином, подсветка есть, даже какие-то предупреждения есть, но рефакторинга считай нет. Перене...
Дмитрий Петров
9
Карта сайта