はじめに
10月8日にリリースされたMastodon v4.3.0から、OpenTelemetryでアプリケーションのトレース情報を記録できるようになりました。
早速使ってみたので、トレース情報を可視化するまでの流れを紹介します。
環境
- Mastodon v4.3.0
- 一部機能追加や変更を行なったバージョンを利用しています
- Comparing mastodon:v4.3.0...kadoshita:asteroidon-custom-stable-4.3.0 · mastodon/mastodon · GitHub
- Grafana v9.3.8
- Grafana Tempo v2.0.0
- Kubernetes v1.29.9(Microk8s)
設定
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のトレース情報を可視化できます。
依存ライブラリのバージョンアップ
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の知見を貯めていきたいと思います。