问题描述
我是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存储库确实有很棒的文档。