分散トレース用のRubyアプリケーションマニュアルインストルメンテーション

分散トレース用のRubyアプリケーションマニュアルインストルメンテーション

このブログシリーズでは、複数の言語にまたがるOpenTelemetry標準を使用した分散トレースのアプリケーションインストルメンテーション手順を共有します。 以前にカバーしました 分散トレース用のJavaアプリケーションマニュアルインスツルメンテーション, 分散トレース用のGolangアプリケーションインストルメンテーション, 分散トレース用のFlaskアプリケーションマニュアルインストルメンテーション, 分散トレース用のDotNetアプリケーションインストルメンテーション

このブログ投稿では、以下について説明します。

OpenTelemetryとトレースの価値

OpenTelemetryは、Cloud Native Computing Foundationによるプロジェクトであり、アプリケーションのテレメトリデータがダウンストリームのプラットフォームで記録および利用される方法を標準化することを目的としています。 このアプリケーショントレースデータは、アプリケーションの所有者がコード内のコンポーネントとサービスの関係、各ステップで導入されるリクエストの量と遅延、そして最終的にはユーザーエクスペリエンスの低下につながるボトルネックを理解するのに役立ちます。

このガイドを使用して、OpenTelemetry Protocol(OTLP)仕様を使用してトレースを発行するRubyアプリケーションを作成します。 必要なのは、Rubyでのアプリケーション開発の基本的な理解だけです。 OpenTelemetryは初めてですか? それについてもっと読む。

Ruby用のOpenTelemetry アプリケーションに自動および手動のインストルメンテーションを追加するために使用できます。 自動計装は、追加することで有効になります 計装パッケージ。 手動計装は、を使用して追加できます OpenTelemetry API.

インストール

前提条件

これらの手順では、Rubyサービスの自動および手動のインストルメンテーションをセットアップする方法について説明します。 開始するには、必要なものはすべて次のとおりです。

  • Rubyがインストールされています(2.5以降)

このガイドでは、を使用して簡単な「HelloWorld」アプリケーションを自動計測します。 シナトラ、最小限の労力でWebアプリを作成するためのRubyドメイン固有言語(DSL)。 独自の既存のRubyプロジェクトに従ってください。 

新しいプロジェクトを初期化する

mkdir sintara-hello-world
cd sintara-hello-world
vi Gemfile

ジェムファイル

source "https://rubygems.org"
gem "sinatra"

こんにちは。

require 'rubygems'
require 'bundle/setup'
    get '/frank-says' do
      'Put this in your pipe & smoke it!'
    end
    get '/hello' do
      'sintara says hello!'
    end
    get '/' do
      'exisitng paths: /hello, /frank-says, /logicmonitor!'
    end
    get '/logicmonitor' do
      'Hello from Logicmonitor!'
    end

Sinatraサーバーを実行する

bundler install
ruby hello.rb
> == Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from Thin
> 2021-11-16 11:44:02 +0530 Thin web server (v1.8.1 codename Infinite Smoothie)
> 2021-11-16 11:44:02 +0530 Maximum connections set to 1024
> 2021-11-16 11:44:02 +0530 Listening on localhost:4567, CTRL+C to stop

Sinatraサーバーが稼働している必要があります。 トレースをLogicMonitorのAPMポータルにエクスポートするようにインストルメントしてみましょう。 

Open Telemetry ClientGemsをインストールします

最初のステップは、次のgemをGemfileに追加することです。

Gemfile

gem 'opentelemetry-sdk'
gem 'opentelemetry-exporter-otlp'
gem 'opentelemetry-instrumentation-all'

opentelemetry-instrumentation-allを含めると、Rails、Sinatra、データベースドライバー、HTTPなどのいくつかのフレームワークにインストルメンテーションが提供されます。 ライブラリ

初期化

アプリケーションのライフサイクルのできるだけ早い段階でOpenTelemetryを初期化することをお勧めします。 これをhello.rbに追加します

OpenTelemetryの初期化:

こんにちは。

require 'opentelemetry/sdk'
require 'opentelemetry/exporter/otlp'
require 'opentelemetry/instrumentation/all'
 
OpenTelemetry::SDK.configure do |c|
  c.service_name = 'sintara-hello-world'
  c.use_all() # enables all instrumentation!
end

トレースを実行するようにアプリケーションを設定したので、トレースをLogicMonitorAPMポータルにエクスポートするようにSDKを構成する必要があります。 SDKがデフォルトで使用しようとするOTLPエクスポーターを使用します。 次に、LogicMonitorのOpenTelemetry Collectorを使用して、これらのトレースを受信し、LMAPMポータルで視覚化します。

それをまとめる

Gemfile

source "http://rubygems.org"
 
gem 'sinatra'
gem "opentelemetry-api"
gem "opentelemetry-sdk"
gem "opentelemetry-exporter-otlp"
gem 'opentelemetry-instrumentation-all'

こんにちは。

require 'rubygems'
require 'bundler/setup'
require 'opentelemetry/sdk'
require 'opentelemetry/exporter/otlp'
Bundler.require
OpenTelemetry::SDK.configure do |c|
    c.service_name = 'ruby-otlp'
    c.use_all
   end
get '/frank-says' do
      'Put this in your pipe & smoke it!'
    end
    get '/hello' do
      'sintara says hello!'
    end
    get '/' do
      'exisitng paths: /hello, /frank-says, /logicmonitor!'
    end
    get '/logicmonitor' do
      'Hello from Logicmonitor!'
    end
cd sinatra-hello-world
gem install opentelemetry-instrumentation-all
gem install opentelemetry-sdk
gem install opentelemetry-exporter-otlp
bundler install

アプリケーションを実行する

ruby hello.rb
[2021-11-16 16:11:32] INFO  WEBrick 1.6.0
[2021-11-16 16:11:32] INFO  ruby 2.7.1 (2020-03-31) [x86_64-darwin19]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2021-11-16 16:11:32] INFO  WEBrick::HTTPServer#start: pid=3794 port=4567

トレースのエクスポート

注:これらの手順では、LogicmonitorのAPMライセンスにアクセスできる必要があります。

Dockerを使用してLMOtelコレクターをインストールします。

docker run -d -e LOGICMONITOR_ACCOUNT=<account> -e  LOGICMONITOR_BEARER_TOKEN= <bearer token> e LOGICMONITOR_OTEL_NAME="<collector name>" -p 4317:4317 -p 4318:4318 logicmonitor/lmotel:latest

次に、コレクターエンドポイントがトレースを受信する場所をSDKに通知する必要があります。 をセットする OTEL_EXPORTER_OTLP_ENDPOINT 環境変数 http://0.0.0.0:4318:

export OTEL_EXPORTER_OTLP_ENDPOINT=http://0.0.0.0:4318

それでは、テストしてみましょう。 アプリケーションを起動し、いくつかの操作を実行してトレースデータを生成します。たとえば、Webアプリをナビゲートしたり、バックグラウンドタスクを開始したりします。 

LogicMonitorポータルのトレースに移動し、サービスに関連するトレースを検索します。 これらはOpenTelemy自動計測を介して生成されました!

成功! LogicMonitorトレースの表示

LogicMonitorでのRubyトレースの表示

トレースをクリックすると、追加情報を表示できます。

LogicMonitorプラットフォーム内の追加のトレース情報を表示します。

構築されたトレースは次のようになります。

Resource labels:
-> service.name: STRING(ruby-otlp)
-> process.pid: INT(7614)
-> process.command: STRING(helloworld.rb)
-> process.runtime.name: STRING(ruby)
-> process.runtime.version: STRING(2.7.1)
-> process.runtime.description: STRING(ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19])
-> telemetry.sdk.name: STRING(opentelemetry)
-> telemetry.sdk.language: STRING(ruby)
-> telemetry.sdk.version: STRING(1.0.1)
InstrumentationLibrarySpans #0
InstrumentationLibrary OpenTelemetry::Instrumentation::Sinatra 0.19.2
Span #0
Trace ID : e4e6e6c683f2cbb8ab5404a6604b7c01
Parent ID :
ID : cadc573256df7294
Name : /frank-says
Kind : SPAN_KIND_SERVER
Start time : 2021-11-16 07:32:30.577101 +0000 UTC
End time : 2021-11-16 07:32:30.579635 +0000 UTC
Status code : STATUS_CODE_ERROR
Status message :
Attributes:
-> http.method: STRING(GET)
-> http.url: STRING(/frank-says)
-> http.status_code: INT(404)

手動計装については、を参照してください。 公式のOpenTelemetryドキュメント

次のステップ

おめでとうございます。OpenTelemetryProtocol(OTLP)仕様を使用してトレースを発行するRubyアプリケーションを作成しました。 OTLP仕様を使用してビジネスアプリケーションのインスツルメンテーションを開始するときに、このコードを参照として使用できます。 

これで、アプリケーションコードに存在する潜在的なボトルネックに対処するために、アプリケーションを可視化できます。 すでにLogicMonitorを使用してインフラストラクチャを監視したり、ログを収集している場合は、これらのトレースを関連付けて、トラブルシューティングを高速化できます。 

他のアプリケーション言語間でOpenTelemetry標準を使用して分散トレースを設定している他のブログをチェックしてください。

外部リソース

OpenTelemetryとCNCFの詳細については、次のリソースをお勧めします。

詳細を読むか、OTelRubyリポジトリにフィードバックを残してください