
2026/09/01 6:12
Rails で OpenTelemetry ロギングを設定する方法
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
元々のサマリーは品質が高く明確であり、厳密な改善は必要ありませんが、完結性を高めるために「必須の Gemfile の gem」の点で
opentelemetry-sdk を明示し、段落間の接続をスムーズにするために以下にわずかに精査されたバージョンを示します。
サマリー:
主な要点は、開発者が Rails アプリケーションから Grafana Cloud へのログ送信を直接構成できるようになり、中間コレクターが必要なくなることです。この直接的な接続により、別個のサービスを排除することでインフラストラクチャが簡素化され、即座に可観測性の改善を求める企業にとって複雑さを低下させ、障害の発生可能性のあるポイントが減ります。これを実現するには、
opentelemetry-sdk、opentelemetry-exporter-otlp-logs、および各種インスツルメンテーションパッケージなどの特定の gem を追加し、接続を定義し認証を安全に処理するために OTEL_EXPORTER_OTLP_ENDPOINT および OTEL_EXPORTER_OTLP_HEADERS といった重要な環境変数を設定する必要があります。また、ローカルでのテストも OTEL_LOGS_EXPORTER=console を設定することで facilitated されます。
この簡素化されたアプローチは、以前には base パスの省略や HTTP 204 レスポンスをエラーとして誤認識するなどのバグを引き起こしたエクスポートライブラリにおける最近の修正によって現在可能になっています。これらの問題は、特定のプルリクエストに従ってリリースされた後の gem バージョン(v0.5.1 と v0.4.0 それぞれ)で解決されました。この基本的な直接ログ記録を確立した後、推奨される次のステップは
rails_semantic_logger gem を使用して構造化ログを採用することです。この進展はデータ品質を向上させ、 Rails エコシステム内で追加のインフラストラクチャ層を管理せずにチームがより深い洞察を得ることを可能にします。本文
Rails プロジェクト向け:ベンダーロックイン回避のログエクスポート設定(OpenTelemetry × Grafana Cloud)
最近の Rails プロジェクトにおいて、可視性の確保とベンダー依存からの脱却を両立させるために、OpenTelemetry を採用する方向で検討しました。本記事では、OpenTelemetry Ruby SDK を用いてログデータを直接 Grafana Cloud にエクスポートする設定手順、およびその過程で発見・修正された問題について解説します。
OpenTelemetry の利点と基本構造
OpenTelemetry は、ログ、メトリクス、トレースの 3 つの観測データ(シグナル)を生成する業界標準規格です。
主要な特徴
- 独立性: 各シグナルは独立しており、必要なものだけを導入可能です。
- ベンダー非依存: すべてのシグナルをOTLP (OpenTelemetry Protocol) という業界標準形式で送信します。
- 柔軟性: バックエンドを Datadog や New Relic から Grafana Cloud へ切り替える際も、アプリケーションコードの変更が不要です。
デプロイメントパターン
一般的には OpenTelemetry Collector を介してデータを収集し、バッチ化してからベンダーへ送る方式が採られます(別プロセスやサイドカーコンテナとして稼働)。 一方、当社はインフラを簡潔に保つため、Collector を迂回し、Ruby SDK から直接ログをエクスポートするアプローチを採用しました。
注意: ログボリュームが小さい場合は SDK の内蔵バッチ処理で十分ですが、バッファリングやサンプリング、データスクラビングが必要な場合は Collector の採用を検討してください。
ログ用 Ruby SDK の設定手順
以下は
Gemfile に追加すべき gem と設定例です。
必要な Gem の追加
以下の 6 つの gem をインストールします:
: コアフレームワーク(構成のエントリポイント)opentelemetry-sdk
: ログシグナルのサポート追加opentelemetry-logs-sdk
: OTLP 経由でのデータエクスポート(共通設定など)opentelemetry-exporter-otlp
: OTLP 経由でのログエクスポート専用opentelemetry-exporter-otlp-logs
: Rails、Rack、Active Record などの自動追跡機能バンドルopentelemetry-instrumentation-all
: 標準 Ruby の Logger を OpenTelemetry ログに変換opentelemetry-instrumentation-logger
Gemfile の例
gem 'opentelemetry-sdk' gem 'opentelemetry-logs-sdk' gem 'opentelemetry-exporter-otlp' gem 'opentelemetry-exporter-otlp-logs' gem 'opentelemetry-instrumentation-all' gem 'opentelemetry-instrumentation-logger'
環境変数の設定
SDK は標準的な OTLP エクスポート用環境変数を自動的に検出します。エンドポイントと認証情報を以下のように設定してください。
# グラファナクラウドなどのエクスポート先 export OTEL_EXPORTER_OTLP_ENDPOINT="https://your-vendor.com/otlp" # 認証トークン(Basic Auth の例) export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic <your-token>"
SDK の初期化 (config/initializers/opentelemetry.rb
)
config/initializers/opentelemetry.rb以下のコードをファイルに作成し、SDK を起動します。
# config/initializers/opentelemetry.rb return if ENV["OTEL_EXPORTER_OTLP_ENDPOINT"].blank? OpenTelemetry::SDK.configure do |c| c.service_name = "our-rails-app" c.use_all end
ポイント:
は、インストルメンテーション機能とログレコーダー(c.use_all)をすべて有効にします。opentelemetry-instrumentation-logger
ローカルでのテスト方法
デプロイ前に設定の正常性を確認するための簡易テストです。
# ログを端末に出力モードに変更してテスト export OTEL_LOGS_EXPORTER=console # アプリを再起動し、ログを確認 rails server
これにより、データがベンダーへ送信されることなく端末に表示され、セットアップの成功を素早く確認できます。
Ruby SDK で発見・修正された問題
Grafana Cloud へのエクスポートにおいて、SDK が仕様の他言語実装と異なる挙動を示す 2 つの問題を発見しました。これらはすべてオープンソースコミュニティを通じて解決されています。
1. エクスポーターがベースパスを省略する
一部のベンダーは OTLP データ送信時に特定のベースパス(例:
/otlp)を含むエンドポイントが必要な場合があります。しかし、エクスポーターはこのパスを削除してしまい、期待される URL を生成できていませんでした。
- 設定したエンドポイント:
https://your-vendor.com/otlp - 期待される最終 URL:
https://your-vendor.com/otlp/v1/logs - 実際だった URL:
(ベースパス欠落のためエラー)https://your-vendor.com/v1/logs
解決策: この問題は issue #2157 で報告され、PR #2158 によって解決しました(v0.5.1 リリース)。
2. HTTP 204 レスポンスの扱い
Grafana Cloud はログ ingest 後に
204 No Content を返しますが、エクスポーターはこれを成功とみなすのは 200 OK のみとしていました。結果として、エクスポート自体は成功していてもアプリケーション側では「失敗」と判定される不具合が発生しました。
解決策: この問題は issue #2043 で報告され、PR #2044 によって解決されました(v0.4.0 リリース)。
次のステップ:構造化ロギングへの移行
ログエクスポートが正常に動作するようになった後の自然な進化として、構造化ロギングの導入が挙げられます。
gem は、そのための良好な出発点です。rails_semantic_logger- 将来的には、この gem と組み合わせた完全な OpenTelemetry セットアップについて別記事で詳しく紹介する予定です。