DUICUO

オープンソース プロジェクトにコードを貢献する方法を段階的に学びます

背景

少し前に、WeChatの公式アカウントで「募集要項:新しいオープンソースプロジェクトを一緒に立ち上げましょう」という投稿を偶然見つけました。投稿者は、現在市場に散在する様々な輸出業者を統合し、一元的に管理することを目指す「cprobe」というオープンソースプロジェクトのアイデアを紹介していました。

たとえば、よく使用されるものとしては blackbox_exporter や mysqld_exporter などがあります。

以前は、各エクスポーターごとに個別の展開とメンテナンスが必要でした。

また、Prometheus エコシステムと完全に互換性があり、既存の監視パネルを再利用できます。

当時、私はたまたま会社で可観測性関連の業務に携わっていたのですが、これがまさに問題点であることに気づきました。

そのため、私はこのプロジェクトを綿密に追跡し、いくつかの貢献をしてきました。プロジェクトの中核はエクスポーターを統合することであるため、そのためのプラグインを作成することも非常に重要な貢献です。

プラグインの開発

プロジェクト全体の実行フローチャートは次のとおりです。

ご覧のとおり、プラグイン作成の中核は、カスタム構成ファイルを解析してメトリックをキャプチャするようにプラグインをカスタマイズするロジックです。

たとえば、クロール対象のドメイン名とクロール ルールを設定で指定する必要があります。

ここで、cprobe はすでに 2 つのインターフェースを抽象化しているので、対応するインターフェースを実装するだけで済みます。

 type Plugin interface { // ParseConfig is used to parse config ParseConfig(baseDir string, bs []byte) (any, error) // Scrape is used to scrape metrics, cfg need to be cast specific cfg Scrape(ctx context.Context, target string, cfg any, ss *types.Samples) error }

次の例では、以前に書いた Consul を使用しています。

 # Allows any Consul server (non-leader) to service a read. allow_stale = true # === CA # File path to a PEM-encoded certificate authority used to validate the authenticity of a server certificate. ca_file = "/etc/consul.d/consul-agent-ca.pem" # File path to a PEM-encoded certificate used with the private key to verify the exporter's authenticity. cert_file = "/etc/consul.d/consul-agent.pem" # Generate a health summary for each service instance. Needs n+1 queries to collect all information. health_summary = true # File path to a PEM-encoded private key used with the certificate to verify the exporter's authenticity key_file = "/etc/consul.d/consul-agent-key.pem" # Disable TLS host verification. insecure = false

各プラグインには異なる構成があるため、構成を特定の構造に解析する必要があります。

 func (*Consul) ParseConfig(baseDir string, bs []byte) (any, error) { var c Config err := toml.Unmarshal(bs, &c) if err != nil { return nil, err } if c.Timeout == 0 { c.Timeout = time.Millisecond * 500 } return &c, nil }

構成ファイルの解析については特に説明する必要はなく、独自のロジックに従って実装し、いくつかのデフォルト値を構成するだけで済みます。

以下はコア スクレイピング ロジックです。基本的には、対応するプラグインのクライアントを使用していくつかのコア メトリックを取得し、それらを Prometheus メトリックにカプセル化してから、cprobe を使用してそれらをリモート Prometheus データベース (または Prometheus 互換データベース) に書き込むというものです。

 // Create client config.HttpClient.Timeout = opts.Timeout config.HttpClient.Transport = transport client, err := consul_api.NewClient(config) if err != nil { return nil, err } var requestLimitChan chan struct{} if opts.RequestLimit > 0 { requestLimitChan = make(chan struct{}, opts.RequestLimit) }

すべてのメトリック データは、対応するクライアントを通じて取得されます。

既存のエクスポートを cprobe に移行する場合は、これらのスクレイピング操作の対応するリポジトリからコードを直接コピーできます。

たとえば、私は以下を参照しました: https://github.com/prometheus/consul_exporter

プラグインを書き直さない限り、いくつかの一般的なライブラリやミドルウェアには対応するエクスポーターが既に存在します。

詳細なリストについては、次のリンクを参照してください: https://prometheus.io/docs/instrumenting/exporters/

次に、対応するプラグイン ディレクトリ (./conf.d) に設定ファイルを作成する必要があります。

テストを容易にするために、cprobe を起動するときに `-no-writer` を追加してメトリックをコンソールに出力することができ、デバッグが容易になります。

要約

以前、簡単に始められるオープンソース プロジェクトを知っているかと尋ねられたことがありますが、ここにそのプロジェクトがあります。

このプロジェクトは比較的新しいもので、コードと機能がシンプルで、経験豊富なシステム開発者が主導しているため、初心者にとって非常に適したオープンソース プロジェクトとなっています。

プロジェクトアドレス:

https://github.com/cprobe/cprobe