Profiling Ruby
DataKit は、Datadog Ruby Continuous Profiler から送信されたパフォーマンスデータを受信し、Guanceに転送できます。Ruby Profiler では、CPU 時間、Wall Time、オブジェクト割り当てなどのデータを収集できます。
前提条件¶
- DataKit がインストールされ、Profile コレクターが有効になっていること。
- CRuby 2.5 以降を使用すること。CRuby 3.2.3 以降を推奨します。JRuby と TruffleRuby は現在サポートされていません。
- glibc または musl ベースのディストリビューションを含む、サポート対象の Linux x86-64 または arm64 環境でアプリケーションが動作していること。Ruby Profiler は Serverless 環境をサポートしていません。
datadoggem を使用すること。~> 2.30を推奨します。2.30 より前のバージョンでは、ネイティブ拡張のコンパイル時にpkg-configまたはpkgconfも必要です。
詳細な互換性の範囲は SDK の更新に伴って変わる場合があります。Ruby Profiler のサポート対象バージョンも併せて参照してください。
DataKit Profile コレクターを有効にする¶
DataKit のインストールディレクトリにある conf.d/profile ディレクトリに移動し、profile.conf.sample をコピーして profile.conf に名前を変更します。デフォルト設定には、Ruby SDK が使用する受信エンドポイントがすでに含まれています。
DataKit を再起動すると、受信アドレスは次のようになります。
Ruby SDK では Agent のベースアドレスを http://<DataKit アドレス>:9529 に設定します。アドレスの末尾に /profiling/v1/input を追加する必要はありません。
Ruby SDK をインストールする¶
アプリケーションの Gemfile に次の行を追加します。
続いて、依存関係をインストールします。
Ruby APM の自動インストルメンテーションも有効にする場合は、DDTrace Ruby を参照して gem のロードエントリーポイントを設定してください。
Profiler を設定して起動する¶
環境変数を使用する¶
次の例では、Profile データをローカルの DataKit に送信します。
DD_PROFILING_ENABLED=true \
DD_TRACE_AGENT_URL=http://127.0.0.1:9529 \
DD_ENV=production \
DD_SERVICE=my-ruby-service \
DD_VERSION=1.0.0 \
DD_TAGS=team:apm,region:cn \
bundle exec ddprofrb exec ruby app.rb
Rails アプリケーションも同じ環境変数を使用して起動できます。
DD_PROFILING_ENABLED=true \
DD_TRACE_AGENT_URL=http://127.0.0.1:9529 \
DD_ENV=production \
DD_SERVICE=my-rails-service \
DD_VERSION=1.0.0 \
bundle exec ddprofrb exec bin/rails server
DD_AGENT_HOST と DD_TRACE_AGENT_PORT を使用して、アドレスとポートを個別に設定することもできます。
DD_TRACE_AGENT_URL は host/port 設定より優先されます。競合する接続先アドレスを同時に設定しないでください。コンテナまたは Kubernetes 環境で DataKit とアプリケーションが同じコンテナ内にない場合は、127.0.0.1 をアプリケーションからアクセス可能な DataKit アドレスに置き換えてください。
コードで設定する¶
Profiler はアプリケーションの起動時にコードで設定することもできます。たとえば、Rails アプリケーションでは initializer に次のコードを追加します。
require "datadog"
Datadog.configure do |c|
c.agent.host = "127.0.0.1"
c.agent.port = 9529
c.profiling.enabled = true
c.env = "production"
c.service = "my-rails-service"
c.version = "1.0.0"
c.tags = { "team" => "apm", "region" => "cn" }
end
コードを設定した後も、Profiler をできるだけ早くロードするため、ddprofrb exec でアプリケーションを起動することを推奨します。ランチャーを使用できない場合は、アプリケーションのエントリーポイントの先頭で Profiler をロードします。
その後、元のコマンドでアプリケーションを起動します。
主な設定¶
| 環境変数 | デフォルト値 | 説明 |
|---|---|---|
DD_PROFILING_ENABLED |
false |
Continuous Profiler を有効にするかどうか。インテグレーションでは true に設定する必要があります。 |
DD_PROFILING_ALLOCATION_ENABLED |
false |
オブジェクト割り当てデータを収集するかどうか。有効にするとランタイムのオーバーヘッドが増えるため、まず本番前環境で評価することを推奨します。 |
DD_PROFILING_MAX_FRAMES |
400 |
各コールスタックで収集するフレームの最大数。 |
DD_PROFILING_EXPERIMENTAL_HEAP_ENABLED |
false |
試験的なヒープ分析を有効にするかどうか。オブジェクト割り当ての収集も有効にする必要があります。 |
DD_ENV |
なし | production、staging などのアプリケーションのデプロイ環境。 |
DD_SERVICE |
SDK が推測 | サービス名。本番環境では明示的に設定することを推奨します。 |
DD_VERSION |
なし | アプリケーションのバージョン。 |
DD_TAGS |
なし | key:value 形式で指定し、カンマで区切る追加タグ。 |
試験的機能のサポート範囲とパフォーマンスオーバーヘッドは、SDK のバージョンによって変わる場合があります。有効にする前に Ruby Profiler の設定を参照してください。
Profile を表示する¶
アプリケーションの起動後、Ruby Profiler は定期的に DataKit へデータを送信します。1〜2 分待ってから、Guanceワークスペースのアプリケーションパフォーマンス監視 -> Profileページで、service、env、version ごとに該当データを確認できます。
アプリケーションで DDTrace Ruby のトレーシングも使用している場合、互換性のある SDK バージョンでは Trace と Profile の関連情報が自動的に付加されます。トレーシングの導入方法については、DDTrace Ruby を参照してください。
DataKit のメトリクス生成について¶
DataKit は Ruby SDK から送信されたデータ内の language: ruby を識別し、元の Profile ファイルとそのメタデータを保持してアップロードします。現在、generate_metrics が profiling_metrics メトリクスを抽出するのは、Java、Go、Python の Profile のみです。そのため、この設定が true でも、Ruby Profile から追加の profiling_metrics メトリクスは生成されません。これはフレームグラフや Profile の詳細表示には影響しません。
トラブルシューティング¶
- Profile データがない:
profile.confが有効で、DD_PROFILING_ENABLED=trueが設定されていることを確認し、少なくとも 1 回の送信間隔を待ってください。 - 接続が拒否される:アプリケーションから
<DataKit アドレス>:9529にアクセスできることを確認してください。コンテナ内の127.0.0.1は、そのコンテナ自体のみを指します。 - アドレス設定が反映されない:
DD_TRACE_AGENT_URLとDD_AGENT_HOST/DD_TRACE_AGENT_PORTが同時に設定されていないか確認し、接続先の設定を 1 種類だけ残してください。 - ネイティブ拡張をロードできない:サポート対象の Linux アーキテクチャで CRuby を使用していることを確認してください。古いバージョンの gem では、
pkg-configまたはpkgconfがインストールされていることも確認し、gem のインストール出力とmkmf.logを確認してください。 - リクエストボディが大きすぎる:DataKit のログにリクエストが上限を超えたと表示された場合は、必要に応じて
body_size_limit_mbを増やして DataKit を再起動してください。 - サンプリングシグナルが競合する:Ruby Profiler は
SIGPROFを使用します。アプリケーションや別のライブラリも同じシグナルを使用している場合は、Ruby Profiler のトラブルシューティングを参照してください。