Я новичок в Golang, и, возможно, мой вопрос прост, но я пробовал много способов сделать это. Я пытаюсь написать простой экспортер для прометея. Мой код берет метрику из API gitlab, и я хочу, чтобы он добавлял только ConstLabels. Мой код:
func enqueueJob() {
for {
dat, err := getJobData()
if err != nil {
fmt.Println(err)
}
time.Sleep(10 * time.Second)
jobsInQueues.Set(dat[0].QueuedDuration)
}
}
var jobsInQueues = promauto.NewGauge(
prometheus.GaugeOpts{
Name: "A_jobs_panding",
Help: "A_Jobs Pending",
ConstLabels: prometheus.Labels{"name": dat[0].Name},
},
)
func main() {
enqueueJob()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":2112", nil)
}
Вопрос в том, как я могу перейти к jobsInQueues, dat[0].Name из функции getJobData() getJobData возвращает структуру задания?
type Job struct {
ID int `json:"id"`
Status string `json:"status"`
Stage string `json:"stage"`
Name string `json:"name"`
QueuedDuration float64 `json:"queued_duration"`
TagList []string `json:"tag_list"`
}
Если вы определяете var dat, err = getJobData() вне функции, она не обновляет значение Name вне for, и я понимаю, что

Как следует из названия, ConstLabels — это набор меток (=пары «ключ-значение»), которые присутствуют в метрике и не могут быть изменены. Кажется, вы хотели бы иметь метку, в которой значение различается в зависимости от выполнения.
Если да, то ConstLabels это не то, что вы ищете. Вместо этого вы должны использовать GaugeVec (вектор датчика) с меткой name.
Определите свою метрику как таковую:
var jobsInQueues = promauto.NewGaugeVec(
prometheus.GaugeOpts{
Name: "A_jobs_panding",
Help: "A_Jobs Pending",
},
[]string{"name"},
)
а затем установите датчик, указав имя значение из getJobData:
func enqueueJob() {
for {
dat, err := getJobData()
if err != nil {
fmt.Println(err)
}
time.Sleep(10 * time.Second)
jobsInQueues.With(prometheus.Labels{
"name": dat[0].Name,
}).Set(dat[0].QueuedDuration)
}
}
Обратите внимание, что enqueueJob — это блокирующая операция в вашем коде, поэтому он никогда не успеет запустить HTTP-сервер. Вы захотите запустить вызовы enqueueJob или http.ListenAndServe в их собственной горутине. Кроме того, стоит рассмотреть потенциальные разные имена, возвращаемые API Gitlab, и то, как они влияют на кардинальность вашей метрики.
Спасибо большое, NewGaugeVex видел, но видимо не понял как он правильно работает. А так же спасибо, приму к сведению ваше замечание по поводу функции блокировки