🤽

OpenTelemetryでRubyを使う時の無難な設定

2023/09/19に公開

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箇所です。

  1. サービス名やバージョン、Resourceの設定
  2. SpanProcessorの設定
  3. 自動計装

設定内容の説明

具体例で使った設定について詳しくみていきましょう。

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

これだけでActiveRecordRailsNet::HTTPなど、アプリケーションで使用しているものを自動で判別して計装してくれます。

これで、OpenTelemetryのトレースが使えるようになりました。

終わりに

以上、OpenTelemetryでRubyOnRailsを使う時の無難な設定を紹介しました。

Vaxila

Discussion