すべてのプロダクト
Search
ドキュメントセンター

Managed Service for OpenTelemetry:OpenTelemetry を使用して Ruby アプリケーションのトレースデータをレポートする

最終更新日:Dec 30, 2024

アプリケーションのトレースデータを表示するには、クライアントを使用してトレースデータを Managed Service for OpenTelemetry にレポートする必要があります。このトピックでは、OpenTelemetry SDK for Ruby を使用して Ruby アプリケーションのトレースデータをレポートする方法について説明します。

前提条件

可観測性 OpenTelemetry 版のエンドポイントを取得するには、次の手順を実行します。

  1. 可観測性 OpenTelemetry 版コンソール にログインします。

  2. 左側のナビゲーションペインで、クラスタ設定 をクリックします。表示されるページで、アクセスポイント情報 タブをクリックします。

  3. 上部のナビゲーションバーでリージョンを選択します。クラスタ情報セクションで、トークンを表示 をオンにします。

  4. クライアントパラメータを OpenTelemetry に設定します。

    下部の表の 関連情報 列に可観測性 OpenTelemetry 版のエンドポイントが表示されます。OT接入点信息

    説明

    アプリケーションが Alibaba Cloud 本番環境にデプロイされている場合は、Virtual Private Cloud (VPC) エンドポイントを使用します。それ以外の場合は、パブリックエンドポイントを使用します。

背景情報

  • OpenTelemetry は、MRI Ruby 3.0 以降、JRuby 9.3.2.0 以降、TruffleRuby 22.1 以降の Ruby バージョンをサポートしています。

  • OpenTelemetry SDK for Ruby は、手動および半自動インストルメンテーションをサポートしています。半自動インストルメンテーションとは、スパンを手動で作成する必要はありませんが、設定ファイルを追加する必要があることを意味します。半自動インストルメンテーションでサポートされているフレームワークの詳細については、OpenTelemetry 公式ドキュメント を参照してください。

サポートされている Ruby フレームワーク

  • action_pack

  • action_view

  • active_job

  • active_model_serializers

  • active_record

  • active_support

  • aws_sdk

  • bunny

  • concurrent_ruby

  • dalli

  • delayed_job

  • ethon

  • excon

  • faraday

  • grape

  • graphql

  • gruf

  • http

  • http_client

  • httpx

  • koala

  • lmdb

  • mongo

  • mysql2

  • net_http

  • pg

  • que

  • racecar

  • rack

  • rails

  • rake

  • rdkafka

  • redis

  • resque

  • restclient

  • rspec

  • ruby_kafka

  • sidekiq

  • sinatra

  • trilogy

サンプルコード

ruby-opentelemetry-demo からサンプルコードをダウンロードします。

方法 1: HTTP プロトコルを使用してデータをレポートする

  1. 手動インストルメンテーションに必要な以下の OpenTelemetry 依存関係をインストールします。

    gem install opentelemetry-api
    gem install opentelemetry-sdk
    gem install opentelemetry-exporter-otlp
  2. OpenTelemetry を初期化します。

    監視データをエクスポートするために使用するコンポーネントを追加し、<endpoint> を取得したエンドポイントに置き換えます。

    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>' # HTTP 経由でアクセスできる OpenTelemetry のエンドポイント。
          )
        )
      )
      c.resource = OpenTelemetry::SDK::Resources::Resource.create({
        OpenTelemetry::SemanticConventions::Resource::SERVICE_NAMESPACE => 'tracing',
        OpenTelemetry::SemanticConventions::Resource::SERVICE_NAME => 'ruby_demo', # OpenTelemetry を使用してデータをレポートする Ruby アプリケーションの名前。
        OpenTelemetry::SemanticConventions::Resource::SERVICE_VERSION => '0.0.1',
      })
    end
  3. トレーサーを取得し、スパンを作成します。

    tracer = OpenTelemetry.tracer_provider.tracer('<your_tracer_name>', '0.1.0')
    
    tracer.in_span('parent_span') do |parent_span|
      # ...
    end
  4. 現在のスパンを取得し、現在のスパンに情報を追加してから、トレース ID とスパン ID を取得します。

    # ...
    tracer.in_span('parent_span') do |parent_span|
      # 現在のスパンは、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. ネストされたスパンを作成します。

    # ...
    tracer.in_span('parent_span') do |parent_span|
      # ...
      tracer.in_span('child_span') do |child_span|
        # この場合、現在のスパンは 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>' # HTTP 経由でアクセスできる OpenTelemetry のエンドポイント。
          )
        )
      )
      c.resource = OpenTelemetry::SDK::Resources::Resource.create({
        OpenTelemetry::SemanticConventions::Resource::SERVICE_NAMESPACE => 'tracing',
        OpenTelemetry::SemanticConventions::Resource::SERVICE_NAME => 'ruby_demo', # OpenTelemetry を使用してデータをレポートする Ruby アプリケーションの名前。
        OpenTelemetry::SemanticConventions::Resource::SERVICE_VERSION => '0.0.1',
      })
    
      # OpenTelemetry 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 の状態をエラーに設定します。
          child_span.status = OpenTelemetry::Trace::Status.error("error in child span")
        end
    
        pp child_span
    
      end
    end
    
    sleep 10
  6. アプリケーションを実行します。

    ruby manual.rb

方法 2: データを自動的にレポートする

OpenTelemetry SDK for Ruby を使用すると、アプリケーションの自動インストルメンテーションと観測を実装することもできます。このセクションでは、OpenTelemetry を使用して Rails アプリケーションで自動トレース分析を実装し、アプリケーションのトレースデータをレポートする方法について説明します。

  1. オープンソース Web アプリケーションフレームワーク Rails をダウンロードします。

    gem install rails
  2. Rails を使用して Web プロジェクトを作成します。

    rails new <your-project-name>
    • <your-project-name> をアプリケーションの名前に置き換えます。例: rails new auto-demo

    • 上記のコマンドを実行した後に Rails is not currently installed on this system というエラーメッセージが返された場合は、CLI を閉じて再度開き、コマンドを再入力して実行します。

  3. アプリケーションのディレクトリにある Gemfile に次のコンテンツを追加します。

    gem 'opentelemetry-sdk'
    gem 'opentelemetry-exporter-otlp'
    gem 'opentelemetry-instrumentation-all'
  4. アプリケーションに必要なサードパーティの依存関係をダウンロードします。

    1. プロジェクトのルートディレクトリに移動します。

      cd <your-project-name>
    2. Ruby 依存関係管理ツール Bundler をダウンロードします。

      gem install bundler
    3. Gemfile 内の依存関係をダウンロードします。

      bundle install
  5. <your-project-name>/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>' # HTTP 経由でアクセスできる OpenTelemetry のエンドポイント。
          )
        )
      )
      c.resource = OpenTelemetry::SDK::Resources::Resource.create({
        OpenTelemetry::SemanticConventions::Resource::HOST_NAME => '<your-host-name>', # ホスト名。
      })
      c.service_name = '<your-service-name>'    # アプリケーションの名前。
      c.use_all()    # OpenTelemetry 自動観測でサポートされているライブラリ。
    end
    • <endpoint> を取得したエンドポイントに置き換えます。

    • <your-host-name><your-service-name> を実際のホスト名とアプリケーション名に置き換えます。

  6. プロジェクトを実行します。

    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
  7. ブラウザで http://127.0.0.1:3000 にアクセスします。CLI に次のコンテンツが表示された場合、データは Managed Service for 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)

監視データの表示

可観測性 OpenTelemetry 版コンソールアプリケーションページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。