Menghuraikan Data Prometheus
Mendapatkan metrik daripada Prometheus menggunakan permintaan HTTP GET hanyalah langkah pertama. Cabaran seterusnya terletak pada menghuraikan data dan mengekstrak komponennya. Artikel ini meneroka cara menghuraikan data Prometheus, memfokuskan pada pakej EBNF dan penyelesaian alternatif.
Menghuraikan dengan EBNF
Pakej EBNF (Extended Backus-Naur Form) dalam Go menawarkan cara untuk mentakrif dan menghuraikan tatabahasa. Walaupun ia boleh digunakan untuk menghuraikan data Prometheus, ia memerlukan usaha yang ketara dan kerja manual. Eksponen kaedah ini mesti membuat tatabahasa dengan teliti, menjangkakan semua kemungkinan variasi data untuk memastikan penghuraian yang tepat.
Memanfaatkan expfmt Prometheus
Daripada bergantung pada definisi tatabahasa yang kompleks, anda boleh mengambil kesempatan daripada pakej yang dibangunkan oleh pengarang Prometheus sendiri - expfmt. Pustaka Go ini mengkhusus dalam pengekodan dan penyahkodan Format Eksposisi Prometheus (berasaskan EBNF). Kemudahan penggunaannya dan fungsi luar biasa menjadikannya pilihan ideal untuk menghuraikan data Prometheus.
Contoh dengan expfmt
Pertimbangkan contoh Prometheus berikut 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
Kod Go berikut menunjukkan cara menghuraikan data ini menggunakan 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) } }
Menjalankan program ini menghasilkan output berikut:
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 >
Menyelesaikan Masalah Pemformatan
Pastikan data Prometheus mematuhi keperluan pemformatan yang betul. Setiap baris mesti diakhiri dengan aksara suapan baris 'n'. Penyimpangan daripada format ini, termasuk 'r' atau 'rn', akan mencetuskan ralat protokol.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghuraikan Data Prometheus dengan Cekap dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!