在 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 上的正确值和时间戳。如何将这些时间戳和值插入地图对象(或我可以在代码中使用的其他类型的对象)?


米脂
浏览 621回答 3
3回答

呼唤远方

来自的结果QueryRange有类型model.Matrix。这将包含一个类型的指针*SampleStream。由于您的示例仅包含一个 SampleStream,因此我们可以直接访问第一个。SampleStream 然后有一个MetricandValues类型[]SamplePair。您的目标是样本对的切片。在此之上,我们可以迭代并构建例如地图。mapData := make(map[model.Time]model.SampleValue)for _, val := range result.(model.Matrix)[0].Values {    mapData[val.Timestamp] = val.Value}fmt.Println(mapData)

郎朗坤

也许你可以在这个问题中找到你的答案https://github.com/prometheus/client_golang/issues/194switch {        case val.Type() == model.ValScalar:            scalarVal := val.(*model.Scalar)            // handle scalar stuff        case val.Type() == model.ValVector:            vectorVal := val.(model.Vector)            for _, elem := range vectorVal {                // do something with each element in the vector        // etc

开满天机

您必须知道要返回的结果类型。例如,model.Value 可以是 Scalar、Vector、Matrix 或 String 类型。这些类型中的每一种都有自己获取数据和时间戳的方式。例如,一个 Vector 有一个 Sample 类型的数组,其中包含您要查找的数据。如果您想更深入地研究,godocs 和 prom/go 客户端的 github repo 有非常好的文档。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go