Prometheus ConstLabels принимает значение

Я новичок в 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, и я понимаю, что

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как следует из названия, 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 видел, но видимо не понял как он правильно работает. А так же спасибо, приму к сведению ваше замечание по поводу функции блокировки

Sergei Chechevs 12.11.2022 13:42

Другие вопросы по теме