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 ответов

19 просмотров

Я б попробовал определить 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 }

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта