prometheus ConstLabels取值

我是 Golang 的新手,也许我的问题很简单,但我已经尝试了很多方法来做到这一点。我正在尝试为普罗米修斯编写一个简单的导出器。我的代码从 gitlab API 获取一个指标,我希望它只添加 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)

}

问题是如何将 getJobData() 函数中的 dat[0].Name 传递给 jobsInQueues getJobData 返回一个 Job 结构?


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() ,它不会在 for 之外更新 Name 的值,我理解


慕桂英546537
浏览 176回答 1
1回答

一只萌萌小番薯

顾名思义,ConstLabels是一组标签(=键值对),它们出现在指标上并且无法更改。您似乎希望有一个标签,其中每次执行的值都不同。如果是这样,ConstLabels那不是您要找的东西。相反,您应该考虑使用GaugeVec带有 label 的 (gauge vector) 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 服务器。你会想要在他们自己的 goroutine 上运行enqueueJob或http.ListenAndServe调用。此外,值得考虑从 Gitlab API 返回的潜在不同名称以及它们如何影响您的指标的基数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go