Prometheus-Daten analysieren
Das Abrufen von Metriken von Prometheus mithilfe einer HTTP-GET-Anfrage ist nur der erste Schritt. Die nächste Herausforderung besteht darin, die Daten zu analysieren und ihre Komponenten zu extrahieren. In diesem Artikel wird untersucht, wie Prometheus-Daten analysiert werden, wobei der Schwerpunkt auf dem EBNF-Paket und alternativen Lösungen liegt.
Parsing mit EBNF
Das EBNF-Paket (Extended Backus-Naur Form) in Go bietet eine Möglichkeit, Grammatiken zu definieren und zu analysieren. Obwohl es zum Parsen von Prometheus-Daten verwendet werden könnte, erfordert es erheblichen Aufwand und manuelle Arbeit. Vertreter dieser Methode müssen die Grammatik sorgfältig erstellen und alle möglichen Datenvariationen antizipieren, um eine genaue Analyse sicherzustellen.
Prometheus' expfmt nutzen
Anstatt sich auf komplexe Grammatikdefinitionen zu verlassen, können Sie können ein von den Prometheus-Autoren selbst entwickeltes Paket nutzen – expfmt. Diese Go-Bibliothek ist auf die Kodierung und Dekodierung des Prometheus Exposition Formats (EBNF-basiert) spezialisiert. Seine Benutzerfreundlichkeit und sofort einsatzbereite Funktionalität machen es zur idealen Wahl für das Parsen von Prometheus-Daten.
Ein Beispiel mit expfmt
Betrachten Sie das folgende Prometheus-Beispiel Daten:
# 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
Der folgende Go-Code zeigt, wie diese Daten analysiert werden 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) } }
Das Ausführen dieses Programms erzeugt die folgende Ausgabe:
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 >
Fehlerbehebung bei Formatierungsproblemen
Stellen Sie sicher, dass die Prometheus-Daten eingehalten werden die richtigen Formatierungsanforderungen. Jede Zeile muss mit einem Zeilenvorschubzeichen „n“ abgeschlossen werden. Abweichungen von diesem Format, einschließlich „r“ oder „rn“, führen zu Protokollfehlern.
Das obige ist der detaillierte Inhalt vonWie kann ich Prometheus-Daten in Go effizient analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!