簡體   English   中英

提取 Go 中的 Prometheus Metrics

[英]Extract Prometheus Metrics in Go

我是 Golang 的新手,我想做的是查詢 Prometheus 並將查詢結果保存在 object(例如地圖)中,其中包含所有時間戳及其指標值。 我從這個示例代碼開始,只做了一些改動( 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 上的正確值和時間戳。 如何將這些時間戳和值插入 map object(或我可以在代碼中使用的另一種類型的 object)?

來自QueryRange的結果類型為model.Matrix

這將包含一個*SampleStream類型的指針。 由於您的示例僅包含一個 SampleStream,因此我們可以直接訪問第一個。

SampleStream 然后具有[]SamplePair類型的MetricValues 您的目標是樣本對的切片。 在此之上,我們可以迭代並構建例如 map。

mapData := make(map[model.Time]model.SampleValue)

for _, val := range result.(model.Matrix)[0].Values {
    mapData[val.Timestamp] = val.Value
}

fmt.Println(mapData)

您必須知道要返回的結果類型。 例如,model.Value 可以是標量、向量、矩陣或字符串類型。 這些類型中的每一種都有自己獲取數據和時間戳的方式。 例如,一個 Vector 有一個 Sample 類型的數組,其中包含您要查找的數據。 如果您想深入了解,godocs 和 prom/go 客戶端的 github repo 有非常好的文檔。

也許你能在這個問題中找到你的答案

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM