解析 Prometheus 資料
使用 HTTP GET 請求從 Prometheus 取得指標只是第一步。下一個挑戰在於解析資料並提取其組成部分。本文探討如何解析 Prometheus 數據,重點介紹 EBNF 套件和替代解決方案。
使用 EBNF 解析
中的 EBNF(擴展巴科斯-諾爾範式)套件Go 提供了一種定義和解析語法的方法。雖然它可以用來解析 Prometheus 數據,但它需要大量的努力和體力。此方法的指數必須精心創建語法,預測所有可能的資料變化以確保準確解析。
利用 Prometheus 的 expfmt
您不必依賴複雜的語法定義,而是可以利用Prometheus作者自己開發的一個套件——expfmt。該 Go 庫專門用於編碼和解碼 Prometheus Exposition Format(基於 EBNF)。它的易用性和開箱即用的功能使其成為解析 Prometheus 資料的理想選擇。
expfmt 的範例
考慮以下 Prometheus 範例data:
# HELP net_conntrack_dialer_conn_attempted_total # TYPE net_conntrack_dialer_conn_attempted_total untyped net_conntrack_dialer_conn_attempted_total{dialer_name="federate",instance="localhost:9090",job="prometheus"} 1 1608520832877
下面的 Go程式碼示範如何使用expfmt:
package main import ( "flag" "fmt" "log" "os" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" ) func main() { f := flag.String("f", "", "set filepath") flag.Parse() mf, err := parseMF(*f) fatal(err) for k, v := range mf { fmt.Println("KEY: ", k) fmt.Println("VAL: ", v) } } func parseMF(path string) (map[string]*dto.MetricFamily, error) { reader, err := os.Open(path) if err != nil { return nil, err } var parser expfmt.TextParser mf, err := parser.TextToMetricFamilies(reader) if err != nil { return nil, err } return mf, nil } func fatal(err error) { if err != nil { log.Fatalln(err) } }
執行此程式會產生以下輸出:
KEY: net_conntrack_dialer_conn_attempted_total VAL: name:"net_conntrack_dialer_conn_attempted_total" type:UNTYPED metric:<label:<name:"dialer_name" value:"federate" > label:<name:"instance" value:"localhost:9090" > label:<name:"job" value:"prometheus" > untyped:<value:1 > timestamp_ms:1608520832877 >
排查格式問題
確保ProProeus數據遵循正確的格式要求。每行必須以換行符號“n”結束。與此格式的偏差,包括“r”或“rn”,將觸發協定錯誤。
以上是如何在Go中高效解析Prometheus資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!