Maison >développement back-end >Golang >Comment puis-je analyser efficacement les données Prometheus dans Go ?

Comment puis-je analyser efficacement les données Prometheus dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-27 09:20:11266parcourir

How Can I Efficiently Parse Prometheus Data in Go?

Analyse des données Prometheus

Obtenir des métriques de Prometheus à l'aide d'une requête HTTP GET n'est que la première étape. Le prochain défi consiste à analyser les données et à extraire leurs composants. Cet article explore comment analyser les données Prometheus, en se concentrant sur le package EBNF et les solutions alternatives.

Analyse avec EBNF

Le package EBNF (Extended Backus-Naur Form) dans Go offre un moyen de définir et d'analyser les grammaires. Bien qu’il puisse être utilisé pour analyser les données de Prometheus, cela nécessite des efforts et un travail manuel importants. Les exposants de cette méthode doivent créer méticuleusement la grammaire, en anticipant toutes les variations possibles des données pour garantir une analyse précise.

Tirer parti de l'expfmt de Prometheus

Au lieu de vous fier à des définitions grammaticales complexes, vous peut profiter d'un package développé par les auteurs de Prometheus eux-mêmes - expfmt. Cette bibliothèque Go est spécialisée dans l'encodage et le décodage du format Prometheus Exposition (basé sur EBNF). Sa facilité d'utilisation et ses fonctionnalités prêtes à l'emploi en font un choix idéal pour analyser les données Prometheus.

Un exemple avec expfmt

Considérez l'exemple Prometheus suivant 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

Le code Go suivant montre comment analyser ces données en utilisant 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)
    }
}

L'exécution de ce programme produit le résultat suivant :

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 >

Dépannage des problèmes de formatage

Assurez-vous que les données Prometheus respectent les exigences de formatage appropriées. Chaque ligne doit se terminer par un caractère de saut de ligne « n ». Les écarts par rapport à ce format, y compris « r » ou « rn », déclencheront des erreurs de protocole.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn