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

17 просмотров

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта