Maison >développement back-end >Golang >Comment puis-je analyser efficacement les données Prometheus dans 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!