Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

OpenTelemetryのテレメトリとMackerelのホストをResource Attributesで紐づけるためのOTelcol Processorを作りました

OpenTelemetryを使い始めるにあたって、既存の監視ツールからいきなり切り替えることは難しく、基本的には一時的に並行稼働させて様子を見ることになると思います。

これまでmackerel-agentをインストールし、Mackerelにホストとして登録してシステムメトリックを監視していたマシンに、新たにOpenTelemetry Collector+Host Metrics Receiverを導入するケースを考えてみましょう*1

Resource Detection Processorなどを併用することで、メトリックにホスト名などをResource Attributesとして付与することができます。しかし、比較のためにMackerel上のホストと対応させて眺めるには今一歩情報が足りません。

そこで、ホストにインストールされたmackerel-agentの設定ファイルを読み、Mackerel上のホストIDやURL、オーガニゼーション名といった情報をResource Attributesとして付与するMackerel Attributes Processorを開発しました。

github.com

以下のグラフは、実際にこのProcessorを利用してHost Metrics Receiver由来のメトリックにResource Attributesを付与したものになります。

属性名 属性値
mackerelio.host.id 4yWDxQP4GA5
mackerelio.host.url https://mackerel.io/orgs/arthur-1/hosts/4yWDxQP4GA5
mackerelio.org.name arthur-1

というような属性が付与されていることがわかります。

特定のattributeがあったらMackerelのホスト画面から対応するOpenTelemetryメトリックが見られる機能ができたらより捗りそうですね。

使い方

OpenTelemetry Collectorを自前でビルドするocbの設定ファイルで以下のように追記し、Mackerel Attributes Processorを含んだCollectorのバイナリを生成しましょう。

 receivers:
   - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.103.0

 processors:
+  - gomod: github.com/Arthur1/opentelemetry-collector-arthur1/processor/mackerelattributesprocessor v0.4.0

 exporters:
   - gomod: go.opentelemetry.io/collector/exporter/otlpexporter v0.103.0

あとは以下のように設定ファイルを用意してOpenTelemetry Collectorを起動させればOKです。

 receivers:
   hostmetrics:
     collection_interval: 60s
     scrapers:
       memory:

+processors:
+  mackerelattributes:

 exporters:
   otlp/mackerel:
     endpoint: otlp.mackerelio.com:4317
     compression: gzip
     headers:
       Mackerel-Api-Key: ***censored****

 service:
   pipelines:
     metrics:
       receivers:
         - hostmetrics
+      processors:
+       - mackerelattributes
       exporters:
         - otlp/mackerel

実装

https://github.com/Arthur1/opentelemetry-collector-arthur1/blob/ff90509af4ac1c9861910e260b8149aa2262a96b/processor/mackerelattributesprocessor/processor.go ファイルがメインの実装部分になります。

起動時にmackerel-agent.confからAPIキーとホストIDファイルの設置場所を読み取っています。APIキーを読んでいる理由は、オーガニゼーション名は設定ファイルに載っておらずMackerel APIを叩いて取得する必要があるからです。ホストIDファイルがわかったらあとはそのファイルを読み取り、これら属性付与に必要な情報を変数に保存します。

以降はこの操作を1分に1回行います。ただし、mackerel-agent.confやホストIDファイルの更新日時を見て、変更されていなければスキップするようにしています。

processorとしてはリソースに紐づく様々なテレメトリがやってきたら、変数の値を読んでその通りにResource Attributesを付与しているだけのシンプルな実装です。このあたりはKubernetes Attributes Processorの実装を参考にしています。

最後に

https://github.com/Arthur1/opentelemetry-collector-arthur1リポジトリではOpenTelemetry Collectorの自作Component群と、それらを同梱した動作検証用のCollectorを公開しています。将来MackerelのOpenTelemetry Collectorディストリビューションが作れたら良いなと思い個人研究をしています。よかったらぜひ使ってみて感想を教えてください。

*1:mackerel-agentが収集するシステムメトリックはOpenTelemetry CollectorのHost Metrics Receiverで同等に取得可能であることはmackerel-agentが作るシステムメトリックグラフをOpenTelemetryで可能な限り再現する - Diary of a Perpetual Studentにてご紹介しました。