コンテンツにスキップ

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 環境をサポートしていません。
  • datadog gem を使用すること。~> 2.30 を推奨します。2.30 より前のバージョンでは、ネイティブ拡張のコンパイル時に pkg-config または pkgconf も必要です。

詳細な互換性の範囲は SDK の更新に伴って変わる場合があります。Ruby Profiler のサポート対象バージョンも併せて参照してください。

DataKit Profile コレクターを有効にする

DataKit のインストールディレクトリにある conf.d/profile ディレクトリに移動し、profile.conf.sample をコピーして profile.conf に名前を変更します。デフォルト設定には、Ruby SDK が使用する受信エンドポイントがすでに含まれています。

[[inputs.profile]]
  endpoints = ["/profiling/v1/input"]
  body_size_limit_mb = 32

DataKit を再起動すると、受信アドレスは次のようになります。

http://<DataKit アドレス>:9529/profiling/v1/input

Ruby SDK では Agent のベースアドレスを http://<DataKit アドレス>:9529 に設定します。アドレスの末尾に /profiling/v1/input を追加する必要はありません。

Ruby SDK をインストールする

アプリケーションの Gemfile に次の行を追加します。

gem "datadog", "~> 2.30"

続いて、依存関係をインストールします。

bundle install

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_HOSTDD_TRACE_AGENT_PORT を使用して、アドレスとポートを個別に設定することもできます。

DD_AGENT_HOST=127.0.0.1
DD_TRACE_AGENT_PORT=9529

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 をロードします。

require "datadog/profiling/preload"

その後、元のコマンドでアプリケーションを起動します。

主な設定

環境変数 デフォルト値 説明
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 なし productionstaging などのアプリケーションのデプロイ環境。
DD_SERVICE SDK が推測 サービス名。本番環境では明示的に設定することを推奨します。
DD_VERSION なし アプリケーションのバージョン。
DD_TAGS なし key:value 形式で指定し、カンマで区切る追加タグ。

試験的機能のサポート範囲とパフォーマンスオーバーヘッドは、SDK のバージョンによって変わる場合があります。有効にする前に Ruby Profiler の設定を参照してください。

Profile を表示する

アプリケーションの起動後、Ruby Profiler は定期的に DataKit へデータを送信します。1〜2 分待ってから、Guanceワークスペースのアプリケーションパフォーマンス監視 -> Profileページで、serviceenvversion ごとに該当データを確認できます。

アプリケーションで DDTrace Ruby のトレーシングも使用している場合、互換性のある SDK バージョンでは Trace と Profile の関連情報が自動的に付加されます。トレーシングの導入方法については、DDTrace Ruby を参照してください。

DataKit のメトリクス生成について

DataKit は Ruby SDK から送信されたデータ内の language: ruby を識別し、元の Profile ファイルとそのメタデータを保持してアップロードします。現在、generate_metricsprofiling_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_URLDD_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 のトラブルシューティングを参照してください。

フィードバック

このページは役に立ちましたか?