OpenTelemetry コレクターでホストメトリックを Mackerel に送信する

OpenTelemetry コレクターのレシーバーとして Host Metrics Receiver を使用することで、Collector 自身をエージェントとしてホストのメトリックを収集できます。これは、Mackerel で従来の mackerel-agent を使用してホストメトリックを収集する方法に相当します。

この記事では、Host Metrics Receiver を使用してホストメトリックを収集し、Mackerel に送信する方法をご紹介します。

Host Metrics Receiver を使用する

OpenTelemetry コレクターで Host Metrics Receiver を使用するには、以下のような設定ファイルを用意します。otel-collector-config.yaml という名前で保存してください。

receivers:
  hostmetrics:
    scrapers:
      cpu:
      disk:
      filesystem:
      load:
      memory:
      network:
      paging:

processors:
  batch:
    timeout: 1m

exporters:
  otlp/mackerel:
    endpoint: otlp.mackerelio.com:4317
    compression: gzip
    headers:
      Mackerel-Api-Key: ${env:MACKEREL_APIKEY}

service:
  pipelines:
    metrics:
      receivers: [hostmetrics]
      processors: [batch]
      exporters: [otlp/mackerel]

receivers として hostmetrics を設定しています。Host Metrics Receiver は、 scrapers オプションとして以下の値を設定できます。

  • cpu:CPU の使用率
  • disk:ディスク I/O
  • load:CPU ロードアベレージ
  • filesystem:ファイルシステムの使用量
  • memory:メモリの使用量
  • network:ネットワーク I/O と TCP コネクション
  • paging:ページング/スワップの使用量
  • processes:プロセスカウント
  • process:プロセスの CPU 使用率とメモリ使用量

scrapers の配下のオプションで指定したキーが収集されるメトリックの種類になります。この例では、cpudiskfilesystemloadmemorynetworkpaging のメトリックが収集されます。

なお、Host Metrics Receiver を使用する場合には Resource の項目を OpenTelemetry コレクターからは設定できません。Resource とは、アプリケーションが実行される環境の属性の集合のことです。サービスの名前や ID を Resource と指定することで、メトリックの属性にサービス名やサービス ID が含まれるようになります。これにより、どのアプリケーションから送信されたメトリックなのかを識別できます。

Host Metrics Receiver を使用して Resource を設定する場合には、環境変数を利用する必要があります。OpenTelemetry では Semantic Conversions として、どの環境変数をどのように解釈するかがあらかじめ定義されています。Resource の属性を定義する場合には、OTEL_RESOURCE_ATTRIBUTES という環境変数を使用します。

export OTEL_RESOURCE_ATTRIBUTES=service.name=example-service,service.id=example-service-id

exporters として otel/mackerel を設定して、メトリックが Mackerel に送信されるための設定を行っています。エンドポイントは otlp.mackerelio.com:4317 で固定となります。headers/Mackerel-Api-Key にはメトリックを送信したい Mackerel のオーガニゼーションの API キーを設定してください。この API キーには書き込み権限が必要です。

最後に、servicepipelines でホストメトリックを Mackerel に送信するパイプラインを構築します。これで OpenTelemetry コレクターの設定は完了です。

OpenTelemetry コレクターをカスタムビルドする

今回構築した OpenTelemetry コレクターの設定では、以下のコンポーネントを使用しています。

  • Host Metrics Receiver
  • Batch Processor
  • OTLP Exporter

OpenTelemetry コレクターを起動する際には、これらのコンポーネントを含めたバイナリを用意する必要があります。opentelemetry-collector-contrib という公式のディストリビューションにはあらかじめ多くのコンポーネントが含まれています。そのため簡単な動作確認などの目的には便利なのですが、不要なコンポーネントが含まれるため本番環境で使用することは推奨されておりません。ここでは、必要なコンポーネントのみを含めたバイナリを作成する方法をご紹介します。

ビルダーをインストールする

まずは ocb(OpenTelemetry コレクターBuilder)というツールをインストールします。

go install go.opentelemetry.io/collector/cmd/builder@latest

インストールが正常に完了したか、以下のコマンドで確認してみましょう。

builder version
ocb version dev

マニフェストファイルを作成する

マニフェストファイルはビルダーに対して、どのコンポーネントを含めるかを指定するためのファイルです。manifest.yaml という名前で以下の内容を保存してください。

dist:
  name: otelcol-dev
  description: Basic OTel Collector distribution for Developers
  output_path: ./otelcol-dev
  otelcol_version: 0.84.0

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

processors:
  - gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.84.0

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

exporters, processors, receivers には、それぞれビルダーに含めるコンポーネントを指定します。dist には、ビルダーが生成するバイナリの名前やバージョンを指定します。ここでは、以下の 3 つのコンポーネントを指定しています。

  • Host Metrics Receiver
  • Batch Processor
  • OTLP Exporter

ビルド

マニフェストファイルを作成したら、以下のコマンドでビルドを実行します。

builder --config=manifest.yaml 

ビルドが成功した場合、otelcol-dev というディレクトリが生成されます。

OpenTelemetry コレクターを起動する

ビルドが完了したら、OpenTelemetry コレクターを起動してみましょう。まずは先程設定した OpenTelemetry コレクターの設定ファイルを otelcol-dev ディレクトリにコピーします。

cp otel-collector-config.yaml otelcol-dev

以下のコマンドで OpenTelemetry コレクターを起動します。

cd otelcol-dev
go build
./otelcol-dev --config otel-collector-config.yaml

Mackerel のカスタムダッシュボードでメトリックを確認する

起動が完了したら、Mackerel のダッシュボードでホストメトリックが収集されていることを確認してみましょう。以下の URL からカスタムダッシュボードの作成画面に移動します。

https://mackerel.io/my/dashboards/-/new#period=30m

グラフウィジェットを選択して、「グラフのタイプ」で「クエリグラフ」を選択します。PromQL を記述するエディタが表示されるので、右上のメニューをクリックしてオーガニゼーションに投稿されているメトリックの一覧を表示します。

Mackerel グラフウィジェット作成画面のスクリーンショット。Metrics Search のメニュがー開かれていて、次の項目が表示されている。system.paging.usage, system.paging.operations, system.paging.faults, system.cpu.load_average.5m, system.cpu.load_average.15m, system.cpu.load_average.1m, system.memory.usage, system.cpu.time, system.disk.pending_operations, system.disk.operations

ここでは system.cpu.load_average.1m を選択してみましょう。すると、以下のようにグラフが表示されます。

Mackerel のグラフウィジェット作成画面のスクリーンショット。エディタには system.cpu.load_average.1m と表示されていて、その隣にはグラフが表示されている。グラフでは 16:55:00、3.49 の点にマウスがホバーされていてラベルが表示されている。

たしかに、ホストの CPU ロードアベレージが表示されていますね。

まとめ

今回の内容をまとめます。

  • Host Metrics Receiver を使用してホストメトリックを収集することができる
  • OpenTelemetry コレクターをカスタムビルドすることで、必要なコンポーネントのみを含めたバイナリを生成できる

「ラベル付きメトリック機能」ベータ版テストの参加者募集中

現在、「ラベル付きメトリック機能」ベータ版テストの参加者を募集しています。下記のフォームよりベータ版テストへの参加お申し込みをいただけます。

forms.gle