ホームページ >バックエンド開発 >Golang >Go で Prometheus データを効率的に解析するにはどうすればよいですか?

Go で Prometheus データを効率的に解析するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-27 09:20:11264ブラウズ

How Can I Efficiently Parse Prometheus Data in Go?

Prometheus データの解析

HTTP GET リクエストを使用して Prometheus からメトリクスを取得することは、最初のステップにすぎません。次の課題は、データを解析してそのコンポーネントを抽出することです。この記事では、EBNF パッケージと代替ソリューションに焦点を当てて、Prometheus データを解析する方法について説明します。

EBNF を使用した解析

の EBNF (Extended Backus-Naur Form) パッケージGo は文法を定義して解析する方法を提供します。 Prometheus データの解析に使用することもできますが、多大な労力と手作業が必要です。このメソッドの利用者は、正確な解析を保証するために、考えられるすべてのデータの変化を予測して、細心の注意を払って文法を作成する必要があります。

Prometheus の expfmt を活用する

複雑な文法定義に依存する代わりに、 Prometheus の作者自身が開発したパッケージ expfmt を利用できます。この Go ライブラリは、Prometheus Exposition Format (EBNF ベース) のエンコードとデコードに特化しています。使いやすさとすぐに使える機能により、Prometheus データの解析に理想的な選択肢となっています。

expfmt を使用した例

次のサンプル Prometheus について考えてみましょう。 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

次の Go コードは、次の Go コードを使用してこのデータを解析する方法を示しています。 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)
    }
}

このプログラムを実行すると、次の出力が生成されます:

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 >

フォーマットの問題のトラブルシューティング

Prometheus データが次に従っていることを確認してください適切なフォーマット要件。各行は改行文字「n」で終わる必要があります。 「r」や「rn」など、この形式から逸脱すると、プロトコル エラーが発生します。

以上がGo で Prometheus データを効率的に解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。