Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menghuraikan Data Prometheus dengan Cekap dalam Go?

Bagaimanakah Saya Boleh Menghuraikan Data Prometheus dengan Cekap dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-27 09:20:11266semak imbas

How Can I Efficiently Parse Prometheus Data in Go?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn