OpenTelemetryでRubyを使う時の無難な設定
OpenTelemetryの公式のSDKにはバッチの設定やHTTPの接続など色々な設定項目があります。
この記事ではRubyOnRailsでTraceを送信するときに使う無難な設定を紹介します。
具体例
最初に、このページで使用する具体的な設定を紹介します。
この設定を config/initializers/opentelemetry.rb
に設定するとOpenTelemetryのデータをサーバーに送信できます。
require 'opentelemetry/sdk'
require 'opentelemetry/exporter/otlp'
require 'opentelemetry/instrumentation/all'
OpenTelemetry::SDK.configure do |c|
c.service_name = 'サービス名'
c.service_version = 'バージョン名'
c.resource = OpenTelemetry::SDK::Resources::Resource.create(
OpenTelemetry::SemanticConventions::Resource::DEPLOYMENT_ENVIRONMENT => Rails.env.to_s,
OpenTelemetry::SemanticConventions::Resource::HOST_NAME => Socket.gethostname,
)
exporter = OpenTelemetry::Exporter::OTLP::Exporter.new(
endpoint: 'https://xxx.example.com/v1/traces',
headers: {
'ヘッダー名' => 'ヘッダーの値',
}
)
c.add_span_processor(
OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(exporter)
)
c.use_all
end
設定しているのは大まかに次の3箇所です。
- サービス名やバージョン、Resourceの設定
- SpanProcessorの設定
- 自動計装
設定内容の説明
具体例で使った設定について詳しくみていきましょう。
1. Gemのインストール
まず最初にOpenTelemetryに必要なGemをGemfile
に追加します。
gem 'opentelemetry-sdk'
gem 'opentelemetry-exporter-otlp'
gem 'opentelemetry-instrumentation-all'
それぞれ、OpenTelemtryのコア実装とデータ送信、計装用のGemです。
2. サービス名やバージョン、Resourceの設定
OpenTelemetryではサービス名やバージョンを指定することでデータの発生元の情報を付与することができます。
Resourceに用意されている項目は色々ありますが、サービスを運用する上では最小限「サービス名」と「バージョン」、「環境の名前」は欲しいところです。
また、プロセスIDやホスト名を付与すると、特定のサーバーでだけ起きている問題が把握できたりと便利です。
ただし、RubyのOpenTelemetryではプロセスIDは自動で設定されるので設定する必要はありません。
各項目は具体例のようにすると設定できます。
c.service_name = 'サービス名'
c.service_version = 'バージョン名'
c.resource = OpenTelemetry::SDK::Resources::Resource.create(
OpenTelemetry::SemanticConventions::Resource::DEPLOYMENT_ENVIRONMENT => Rails.env.to_s,
OpenTelemetry::SemanticConventions::Resource::HOST_NAME => Socket.gethostname,
)
2. SpanProcessorの設定
SpanProcessorではデータを収集した後に実行する作業を設定します。
具体例では以下を設定しています。
- データを外部に送信する
- データを一括で送信するためにバッファリングする
exporter = OpenTelemetry::Exporter::OTLP::Exporter.new(
endpoint: 'https://xxx.example.com/v1/traces',
headers: {
'ヘッダー名' => 'ヘッダーの値',
}
)
c.add_span_processor(
OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(exporter)
)
この例は次のことをしています。
-
endpoint
でデータの送信先を指定する。 -
headers
で送信時のヘッダーを指定する。認証が必要な時にトークンを渡すために使うことが多いです。 -
BatchSpanProcessor
をSpanProcessorとして使用する。BatchSpanProcessor
は作成したデータをまとめて送信する機能です。SimpleSpanProcessor
を使うことで逐次送信することもできますが、本番で使う場合にはBatchSpanProcessor
を使う選択肢以外無いでしょう。
3. 自動計装
最後に、Railsアプリケーションに対する計装(instrumentation)を行います。
計装といっても大変なことはなく、以下の1行で十分です。
c.use_all
これだけでActiveRecord
やRails
、Net::HTTP
など、アプリケーションで使用しているものを自動で判別して計装してくれます。
これで、OpenTelemetryのトレースが使えるようになりました。
終わりに
以上、OpenTelemetryでRubyOnRailsを使う時の無難な設定を紹介しました。
Discussion