OpenTelemetry で PostgreSQL のメトリックを収集する


Mackerel チームで Web アプリケーションエンジニアをやっている inommm です。
この記事は Mackerel Advent Calendar 2023 12/13 の記事になります。



Mackerel では現在 OpenTelemetry の対応を進めており、 OpenTelemetry Protocol をサポートした「ラベル付きメトリック機能」はオープンベータテスト中です。 この記事では OpenTelemetry Collector で PostgreSQL のメトリックを収集し、Mackerel で閲覧できるようにする手順を紹介します。

docs.google.com

Collector の準備をする

OpenTelemetry Collector を使って、メトリックの収集と送信を行えるようにしていきます。 今回は PostgreSQL のメトリックを収集するための PostgreSQL Receiver と、収集したメトリックを Mackerel に送信するための OTLP gRPC Exporter を使用するための設定をしていきます。

Collector の設定

Collector の設定を記述する YAML ファイルを作成します。

vim config.yaml
receivers:
  postgresql:
    endpoint: 192.0.2.254:5432
    transport: tcp
    username: example
    password: ****
    databases:
      - example
    collection_interval: 10s
    tls:
      insecure: true

processors:
  batch:
    timeout: 1m

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

service:
  pipelines:
    metrics:
      receivers: [postgresql]
      processors: [batch]
      exporters: [otlp]

receivers の部分で PostgreSQL に接続するための設定を書いていきます。
PostgreSQL Receiver は DB 接続時もTLS がデフォルトで有効になっているようでした。手元で動かしている PostgreSQL では TLS が無効になっているので、insecure: true を設定する必要がありました。

exporters の部分では Mackerel のエンドポイントと API キーの設定をしておきました。

Collector の起動

作成した設定ファイルを指定しつつ、Docker で collector を起動します。 イメージには PostgreSQL Receiver も含まれている otel/opentelemetry-collector-contrib を使用しました。

docker run -v $(pwd)/config.yaml:/etc/otelcol-contrib/config.yaml otel/opentelemetry-collector-contrib:latest

こちらが起動している様子です。しばらく動かしてみて、エラーがないか確認します。

2023-12-12T23:08:16.825Z        info    service/telemetry.go:90 Setting up own telemetry...
2023-12-12T23:08:16.826Z        info    service/telemetry.go:116        Serving Prometheus metrics      {"address": ":8888", "level": "Basic"}
2023-12-12T23:08:16.826Z        info    service/service.go:140  Starting otelcol-contrib...     {"Version": "0.72.0", "NumCPU": 2}
2023-12-12T23:08:16.827Z        info    extensions/extensions.go:41     Starting extensions...
2023-12-12T23:08:16.827Z        info    service/service.go:157  Everything is ready. Begin running and processing data.

問題がなければ mackerel 側で送信されたメトリックを確認してみましょう。

Mackerel で収集したメトリックの確認をする

ダッシュボードのウィジェットでクエリグラフを選択します。

検索ボックスに postgresql と入力すると、メトリックの候補がでてきます。

メトリックを選択し、保存します。

グラフが作成され、指定したデータベースのテーブル毎の行数が確認できるようになりました。

最後に

思ったよりもサクッと動かすことができてしまいました。
ひとまず「手元で試しに動かしてみた。」という感じですが、自宅で稼働している様々なミドルウェア等にも仕込んでいこうかなと思っています。