MastodonのOpenTelemetry対応を試してみた

はじめに

10月8日にリリースされたMastodon v4.3.0から、OpenTelemetryでアプリケーションのトレース情報を記録できるようになりました。
早速使ってみたので、トレース情報を可視化するまでの流れを紹介します。

環境

設定

OTEL_EXPORTER_OTLP_ENDPOINT という環境変数に、Tempoの tempo-otlp-http (4318/TCP) に接続するためのURLを設定すればOKです。
私の環境では、observabilityというnamespaceにTempoをデプロイしていたので、ConfigMapで以下のように設定しました。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mastodon-config
data:
  # 省略
  OTEL_EXPORTER_OTLP_ENDPOINT: http://tempo.observability.svc.cluster.local:4318
  OTEL_SERVICE_NAME_PREFIX: mastodon-test

複数の環境で同時にMastodonを実行している場合などは、 OTEL_SERVICE_NAME_PREFIX でprefixを設定することでトレース情報を区別できるようになります。

Grafanaのデータソース設定でTempoを追加しておけば、以下の画像のようにMastodonのトレース情報を可視化できます。

トレースが記録される対象のアプリケーションは、mastodon-webとmastodon-sidekiqです。

依存ライブラリのバージョンアップ

v4.3.0のソースコードを実行したところ、以下のエラーが出力されました。

OpenTelemetry error: Instrumentation: OpenTelemetry::Instrumentation::ActiveRecord unhandled exception during install: [
    "/usr/local/bundle/gems/opentelemetry-instrumentation-active_record-0.7.3/lib/opentelemetry/instrumentation/active_record/instrumentation.rb:45:in `patch_activerecord'", 
    ...
    "/usr/local/bundle/bin/bundle:25:in `load'",
     "/usr/local/bundle/bin/bundle:25:in `<main>'"
]
- undefined method `on_load' for module OpenTelemetry::Instrumentation::ActiveSupport
- /usr/local/bundle/gems/opentelemetry-instrumentation-active_record-0.7.3/lib/opentelemetry/instrumentation/active_record/instrumentation.rb:45:in `patch_activerecord'

このエラーはopentelemetry-instrumentation-active_recordというgemのもので、以下のPRで修正されています。
github.com

このエラーを修正するために、今回はopentelemetry-instrumentation-active_recordのバージョンを0.7.3から0.7.4にアップデートしています。
アップデートは以下のコマンドを実行するだけです。

$ bundle update opentelemetry-instrumentation-active_record     

おわりに

これまでMastodonデバッグをする際は、事前に適切なログ出力のコードを入れておかないと十分な情報が得られないケースがありました。
MastodonがOpenTelemetryに対応したことで、ログ出力などのコードの変更をせずに実行中の詳細な情報が取得できるようになり、かなり運用がやりやすくなるのではないかなと感じました。
OpenTelemetryはその名の通りベンダーロックインされない標準仕様なので、今回利用したGrafana Tempo以外のOSSバックエンドや、各クラウドベンダーやDatadog・NewRelicなどのObservabilityのためのSaaSに対してもトレースのデータを送ることができます。
また、アプリケーションから直接バックエンドにトレースのデータを送るのではなく、OpenTelemetry Collectorを介して送るようにすることで、送信先のバックエンドや送信するデータの内容を柔軟に設定できるようになります。
ある程度の規模で運用しているMastodonを対象として、OpenTelemetryの知見を貯めていきたいと思います。