Getting Started

5分以内にあなたのアプリからテレメトリを取得します!

このページでは、RubyでOpenTelemetryを始める方法を説明します。

コンソールにトレースを出力するように、シンプルなアプリケーションを計装する方法を学びましょう。

前提条件

以下がローカルにインストールされていることを確認してください。

  • CRuby >= 3.1, JRuby >= 9.3.2.0, または TruffleRuby >= 22.1
  • Bundler

アプリケーションの例

以下の例では、基本的なRails アプリケーションを使用します。 Railsを使用しない場合でも問題ありません。 SinatraやRackなどの他のWebフレームワークでもOpenTelemetry Rubyを使用できます。 サポートされているフレームワークの完全なリストは、レジストリを参照してください。

より詳細な例については、examplesを参照してください。

依存関係

はじめに、Railsをインストールします。

gem install rails

アプリケーションの作成

dice-ruby という名前のAPI専用アプリケーションを作成し、新しく作成された dice-ruby フォルダに移動します。

rails new --api dice-ruby
cd dice-ruby

サイコロを振るためのコントローラーを作成します。

rails generate controller dice

このコマンドは、app/controllers/dice_controller.rb というファイルを作成します。 任意のエディタでそのファイルを開き、以下のコードに更新します。

class DiceController < ApplicationController
  def roll
    render json: rand(1..6).to_s
  end
end

次に、config/routes.rb ファイルを開き、以下のコードを追加します。

Rails.application.routes.draw do
  get 'rolldice', to: 'dice#roll'
end

次のコマンドでアプリケーションを起動し、Webブラウザで http://localhost:8080/rolldice を開いて動作確認を行います。

rails server -p 8080

すべてが正常に動作していれば、1から6のいずれかの数字が返されるはずです。 これで、アプリケーションを停止し、OpenTelemetryを使用して計装することができます。

計装

opentelemetry-sdkopentelemetry-instrumentation-all パッケージをインストールします。

bundle add opentelemetry-sdk opentelemetry-instrumentation-all

opentelemetry-instrumentation-all を含めると、Rails、Sinatra、いくつかのHTTPライブラリなどの計装が提供されます。

Railsアプリケーションでは、OpenTelemetryの初期化は通常Railsのイニシャライザで行います。 他のRubyサービスでは、起動プロセスの可能な限り早い段階で初期化を行います。

次のコードを含む config/initializers/opentelemetry.rb という名前のファイルを作成します。

# config/initializers/opentelemetry.rb
require 'opentelemetry/sdk'
require 'opentelemetry/instrumentation/all'
OpenTelemetry::SDK.configure do |c|
  c.service_name = 'dice-ruby'
  c.use_all() # すべての計装を有効化します!
end

c.use_all() を呼び出すことで、instrumentation/all パッケージ内のすべての計装が有効化されます。 より高度な設定が必要な場合は、特定の計装ライブラリの設定を参照してください。

計装されたアプリを実行する

これで、計装されたアプリを実行し、コンソールに出力することができます。

env OTEL_TRACES_EXPORTER=console rails server -p 8080

Webブラウザで http://localhost:8080/rolldice を開き、ページを数回リロードしてください。 コンソールに以下のようなスパンが表示されるはずです。

#<struct OpenTelemetry::SDK::Trace::SpanData
 name="DiceController#roll",
 kind=:server,
 status=#<OpenTelemetry::Trace::Status:0x000000010587fc48 @code=1, @description="">,
 parent_span_id="\x00\x00\x00\x00\x00\x00\x00\x00",
 total_recorded_attributes=8,
 total_recorded_events=0,
 total_recorded_links=0,
 start_timestamp=1683555544407294000,
 end_timestamp=1683555544464308000,
 attributes=
  {"http.method"=>"GET",
   "http.host"=>"localhost:8080",
   "http.scheme"=>"http",
   "http.target"=>"/rolldice",
   "http.user_agent"=>"curl/7.87.0",
   "code.namespace"=>"DiceController",
   "code.function"=>"roll",
   "http.status_code"=>200},
 links=nil,
 events=nil,
 resource=
  #<OpenTelemetry::SDK::Resources::Resource:0x000000010511d1f8
   @attributes=
    {"service.name"=>"<YOUR_SERVICE_NAME>",
     "process.pid"=>83900,
     "process.command"=>"bin/rails",
     "process.runtime.name"=>"ruby",
     "process.runtime.version"=>"3.2.2",
     "process.runtime.description"=>"ruby 3.2.2 (2023-03-30 revision e51014f9c0) [arm64-darwin22]",
     "telemetry.sdk.name"=>"opentelemetry",
     "telemetry.sdk.language"=>"ruby",
     "telemetry.sdk.version"=>"1.2.0"}>,
 instrumentation_scope=#<struct OpenTelemetry::SDK::InstrumentationScope name="OpenTelemetry::Instrumentation::Rack", version="0.23.0">,
 span_id="\xA7\xF0\x9B#\b[\xE4I",
 trace_id="\xF3\xDC\b8\x91h\xB0\xDF\xDEn*CH\x9Blf",
 trace_flags=#<OpenTelemetry::Trace::TraceFlags:0x00000001057b7b08 @flags=1>,
 tracestate=#<OpenTelemetry::Trace::Tracestate:0x00000001057b67f8 @hash={}>>

次は何をしますか?

単一のサービスにトレースを追加することは、すばらしい第一歩です。 OpenTelemetryにはさらにいくつかの機能があり、より深い洞察を得ることができます!

  • エクスポーターを使用して、データを任意のバックエンドにエクスポートできます。
  • コンテキスト伝搬は、単一サービスのトレースを分散トレースにアップグレードし、OpenTelemetryベンダーがプロセスやネットワークの境界を超えてリクエストを可視化できるようにするための、おそらくOpenTelemetryの最も強力な概念のひとつです。
  • スパンイベントを使用して、スパンのライフタイム内に"何かが起こった"ことを表す人間が読みやすいメッセージを追加できます。
  • 計装を使用して、ドメイン固有のデータを追加してトレースを強化できます。
  • OpenTelemetryデモには、Rubyベースのメールサービスが含まれています。