OpenTelemetry SDK を使用して Ruby アプリケーションを計測し、トレースデータを OpenTelemetry 向けマネージドサービスにエクスポートします。このガイドでは、2つのアプローチについて説明します。
自動計測 (推奨) -- Rails、Sinatra、一般的なライブラリなど、サポートされているフレームワークのスパンを自動的に生成します。最速のセットアップにはここから始めます。
手動計測 -- スパン作成を詳細に制御できます。自動計測ではカバーされないカスタムビジネスロジックをトレースするために使用します。
前提条件
Ruby ランタイム:MRI Ruby 3.0 以降、JRuby 9.3.2.0 以降、または TruffleRuby 22.1 以降
Application Real-Time Monitoring Service (ARMS) が有効化された Alibaba Cloud アカウント (root ユーザー)
OpenTelemetry エンドポイントの取得
OpenTelemetry 向けマネージドサービスコンソールにログインします。
左側のナビゲーションウィンドウで、[クラスター設定] をクリックします。次に、[アクセスポイント情報] タブをクリックします。
トップナビゲーションバーでリージョンを選択します。[クラスター情報] セクションで、[トークンを表示] をオンにします。
[クライアント] セクションで、[OpenTelemetry] をクリックします。
[Related Information] 列からエンドポイントをコピーします。

ご利用のアプリケーションが Alibaba Cloud 本番環境で実行されている場合は、Virtual Private Cloud (VPC) エンドポイントを使用します。それ以外の場合は、パブリックエンドポイントを使用します。
サンプルコード
完全な動作例は、ruby-opentelemetry-demo で入手できます。
自動計測 (Rails)
自動計測は、サポートされているライブラリやフレームワークのスパンを自動的に作成するため、手動でのスパン作成は不要です。
サポートされているフレームワーク
自動計測は、以下を含む広範囲の Ruby ライブラリをカバーしています。
| カテゴリ | ライブラリ |
|---|---|
| Web フレームワーク | rails, rack, sinatra, grape |
| データベース | active_record, mysql2, pg, mongo, trilogy, redis, dalli, lmdb |
| HTTP クライアント | net_http, faraday, excon, http, http_client, httpx, ethon, restclient |
| ジョブキュー | sidekiq, delayed_job, resque, active_job, que, rake |
| メッセージング | bunny, rdkafka, ruby_kafka, racecar |
| その他 | aws_sdk, graphql, koala, concurrent_ruby, active_support, action_pack, action_view, active_model_serializers, gruf, rspec |
完全なリストについては、「OpenTelemetry Ruby contrib リポジトリ」をご参照ください。
ステップ 1:Rails プロジェクトの作成
すでに Rails アプリケーションをお持ちの場合は、このステップをスキップします。
gem install rails
rails new <your-project-name>
cd <your-project-name><your-project-name> をご利用のアプリケーション名に置き換えます (例:rails new otel-demo)。
Rails is not currently installed on this system というエラーが表示された場合は、ターミナルを閉じて再度開き、コマンドを再度実行してください。ステップ 2:OpenTelemetry gem の追加
これらの行をプロジェクトの Gemfile に追加します。
gem 'opentelemetry-sdk'
gem 'opentelemetry-exporter-otlp'
gem 'opentelemetry-instrumentation-all'次に、依存関係をインストールします。
gem install bundler # Bundler がすでにインストールされている場合はスキップします
bundle installステップ 3:OpenTelemetry SDK の設定
config/initializers/opentelemetry.rb を作成します。
# config/initializers/opentelemetry.rb
require 'opentelemetry/sdk'
require 'opentelemetry/exporter/otlp'
require 'opentelemetry/instrumentation/all'
OpenTelemetry::SDK.configure do |c|
c.add_span_processor(
OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
OpenTelemetry::Exporter::OTLP::Exporter.new(
endpoint: '<endpoint>' # ご利用の OpenTelemetry HTTP エンドポイントに置き換えます。
)
)
)
c.resource = OpenTelemetry::SDK::Resources::Resource.create({
OpenTelemetry::SemanticConventions::Resource::HOST_NAME => '<your-host-name>',
})
c.service_name = '<your-service-name>'
c.use_all() # Enable auto-instrumentation for all supported libraries.
endプレースホルダーを実際の値に置き換えます。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<endpoint> | 前提条件で取得した OpenTelemetry HTTP エンドポイント | http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxx |
<your-host-name> | ご利用のサーバーのホスト名 | my-rails-server |
<your-service-name> | ARMS コンソールに表示されるアプリケーション名 | my-rails-app |
ステップ 4:アプリケーションの開始
rails server期待される出力:
* Puma version: 5.6.5 (ruby 2.7.2-p137) ("Birdie's Version")
* Min threads: 5
* Max threads: 5
* Environment: development
* PID: 79842
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stopステップ 5:データレポートの検証
ブラウザで http://127.0.0.1:3000 を開きます。ターミナルに次のログ出力が表示された場合、トレースデータは OpenTelemetry 向けマネージドサービスにエクスポートされています。
Started GET "/" for 127.0.0.1 at 2023-01-01 10:00:00 +0800
Processing by Rails::WelcomeController#index as HTML
Rendering /Users/username/.rvm/gems/ruby-2.7.2/gems/railties-7.0.4.3/lib/rails/templates/rails/welcome/index.html.erb
Rendered /Users/username/.rvm/gems/ruby-2.7.2/gems/railties-7.0.4.3/lib/rails/templates/rails/welcome/index.html.erb (Duration: 0.8ms | Allocations: 665)
Completed 200 OK in 6ms (Views: 2.1ms | ActiveRecord: 0.0ms | Allocations: 5440)手動計測
手動計測は、どの操作がスパンを生成するかを完全に制御できます。Rails だけでなく、あらゆる Ruby アプリケーションで動作します。
ステップ 1:依存関係のインストール
次の OpenTelemetry 依存関係をインストールします。
gem install opentelemetry-api
gem install opentelemetry-sdk
gem install opentelemetry-exporter-otlpステップ 2:SDK の初期化
ファイル (例:manual.rb) を作成し、OTLP エクスポーターを設定します。BatchSpanProcessor はスパンをバッファーし、バッチで送信してパフォーマンスを向上させます。
require 'opentelemetry/sdk'
require 'opentelemetry-exporter-otlp'
OpenTelemetry::SDK.configure do |c|
c.add_span_processor(
OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
OpenTelemetry::Exporter::OTLP::Exporter.new(
endpoint: '<endpoint>' # ご利用の OpenTelemetry HTTP エンドポイントに置き換えます。
)
)
)
c.resource = OpenTelemetry::SDK::Resources::Resource.create({
OpenTelemetry::SemanticConventions::Resource::SERVICE_NAMESPACE => 'tracing',
OpenTelemetry::SemanticConventions::Resource::SERVICE_NAME => '<your-service-name>',
OpenTelemetry::SemanticConventions::Resource::SERVICE_VERSION => '0.0.1',
})
endプレースホルダーを置き換えます。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<endpoint> | 前提条件で取得した OpenTelemetry HTTP エンドポイント | http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxx |
<your-service-name> | ARMS コンソールに表示されるアプリケーション名 | ruby_demo |
ステップ 3:スパンの作成
トレーサーを取得し、スパンを作成します。
tracer = OpenTelemetry.tracer_provider.tracer('<your-tracer-name>', '0.1.0')
tracer.in_span('parent_span') do |parent_span|
# ここにアプリケーションロジックを記述します。
endトレーサー名は、ARMS コンソールで計測ライブラリを識別します。トレースされるコンポーネントを説明する名前を選択します (例:'order-service' または 'payment-processor')。
ステップ 4:属性の追加とスパンコンテキストの読み取り
スパンブロック内で、属性を追加し、トレース ID とスパン ID を取得します。
tracer.in_span('parent_span') do |parent_span|
current_span = OpenTelemetry::Trace::current_span
current_span.set_attribute('key', 'value')
pp current_span.context.trace_id
pp current_span.context.span_id
endステップ 5:ネストされたスパンの作成
操作間の親子関係を表すために、in_span 呼び出しをネストします。
tracer.in_span('parent_span') do |parent_span|
# 親スパンロジック。
tracer.in_span('child_span') do |child_span|
current_span = OpenTelemetry::Trace::current_span
pp current_span # これは子スパンです。
end
end完全な例
この例は、スパン作成、属性、イベント、ネストされたスパン、およびエラー処理を単一のスクリプトでカバーしています。
require 'opentelemetry/sdk'
require 'opentelemetry-exporter-otlp'
OpenTelemetry::SDK.configure do |c|
c.add_span_processor(
OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
OpenTelemetry::Exporter::OTLP::Exporter.new(
endpoint: '<endpoint>' # ご利用の OpenTelemetry HTTP エンドポイントに置き換えます。
)
)
)
c.resource = OpenTelemetry::SDK::Resources::Resource.create({
OpenTelemetry::SemanticConventions::Resource::SERVICE_NAMESPACE => 'tracing',
OpenTelemetry::SemanticConventions::Resource::SERVICE_NAME => 'ruby_demo',
OpenTelemetry::SemanticConventions::Resource::SERVICE_VERSION => '0.0.1',
})
# または、Resources API を使用せずにサービス名を設定します。
# c.service_name = 'ruby_demo'
end
tracer = OpenTelemetry.tracer_provider.tracer('instrumentation_library_name', '0.1.0')
tracer.in_span('parent_span') do |parent_span|
# スパン属性を設定します。
parent_span.set_attribute('language', 'ruby')
parent_span.set_attribute("attribute_key", ["attribute_value1", "attribute_value1", "attribute_value1"])
# スパンイベントを追加します。
parent_span.add_event("event", attributes: {
"pid" => 1234,
"signal" => "SIGHUP"
})
# トレース ID とスパン ID を読み取ります。
current_span = OpenTelemetry::Trace::current_span
pp current_span.context.trace_id
pp current_span.context.span_id
tracer.in_span('child_span') do |child_span|
child_span.add_attributes({
"key1" => "value1",
"key2" => "value2"
})
child_span.add_event("mock exception here")
begin
raise 'An error has occurred'
rescue
# スパンをエラーとしてマークします。
child_span.status = OpenTelemetry::Trace::Status.error("error in child span")
end
pp child_span
end
end
sleep 10アプリケーションを実行します。
ruby manual.rbARMS コンソールでのトレースデータの表示
ARMS コンソールにログインします。
左側のナビゲーションウィンドウで、アプリケーションモニタリング > アプリケーション を選択します。
[アプリケーション] ページで、アプリケーション名をクリックして、そのトレースデータを表示できます。
「言語」列にアイコンが表示されている場合、アプリケーションはアプリケーションモニタリングを介して接続されています。[−] が表示されている場合、アプリケーションはOpenTelemetry 向けマネージドサービスを介して接続されています。
アイコンが表示されている場合、アプリケーションはアプリケーションモニタリングを介して接続されています。[−] が表示されている場合、アプリケーションはOpenTelemetry 向けマネージドサービスを介して接続されています。