为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中提取 Prometheus 指标

在 Go 中提取 Prometheus 指标

Go
米脂 2022-06-27 09:05:32
我是 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 上的正确值和时间戳。如何将这些时间戳和值插入地图对象(或我可以在代码中使用的其他类型的对象)?
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

来自的结果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)


查看完整回答
反对 回复 2022-06-27
?
郎朗坤

TA贡献1921条经验 获得超9个赞

也许你可以在这个问题中找到你的答案


https://github.com/prometheus/client_golang/issues/194


switch {

        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


查看完整回答
反对 回复 2022-06-27
?
开满天机

TA贡献1786条经验 获得超12个赞

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



查看完整回答
反对 回复 2022-06-27
  • 3 回答
  • 0 关注
  • 447 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信