在Go中提取Prometheus指标

问题描述

我是Golang的新手,我想做的是查询Prometheus,并将查询结果保存在具有所有时间戳及其度量值的对象(例如地图)中。 我从此示例代码开始,仅进行了一些更改(https://github.com/prometheus/client_golang/blob/master/api/prometheus/v1/example_test.go

func getFromPromrange(start time.Time,end time.Time,metric string) model.Value {
    client,err := api.NewClient(api.Config{
        Address: "http://localhost:9090",})
    if err != nil {
        fmt.Printf("Error creating client: %v\n",err)
        os.Exit(1)
    }
    v1api := v1.NewAPI(client)
    ctx,cancel := context.WithTimeout(context.Background(),10*time.Second)
    defer cancel()
    r := v1.Range{
        Start: start,End:   end,Step:  time.Second,}
    result,warnings,err := v1api.QueryRange(ctx,metric,r) 
    if err != nil {
        fmt.Printf("Error querying Prometheus: %v\n",err)
        os.Exit(1)
    }
    if len(warnings) > 0 {
        fmt.Printf("Warnings: %v\n",warnings)
    }
    fmt.Printf("Result:\n%v\n",result)

    return result
}

例如,打印的结果是: “ TEST {instance =” localhost:4321“,job =” realtime“} => \ n21 @ [1597758502.337] \ n22 @ [1597758503.337] ...

这些实际上是Prometheus上的正确值和时间戳。如何将这些时间戳和值插入到地图对象(或可以在代码中使用的另一种对象)中?

解决方法

来自QueryRange的结果的类型为model.Matrix

然后它将包含类型*SampleStream的指针。由于您的示例仅包含一个SampleStream,因此我们可以直接访问第一个。

然后SampleStream具有类型Metric的{​​{1}}和Values。您的目标是切片样品对。然后,我们可以在此之上迭代并构建地图。

[]SamplePair
,

您必须知道要返回的结果的类型。例如,model.Value可以是Scalar,Vector,Matrix或String类型。这些类型中的每一种都有自己的获取数据和时间戳的方式。例如,向量具有一系列包含您要查找的数据的样本类型。如果您想更深入地研究,则gopro和github for the prom / go客户端的GitHub存储库确实有很棒的文档。