このドキュメントでは、 Rubyエージェントを使用してサードパーティの gem を計量する方法と、エージェントと対話するためのいくつかのベストプラクティスについて詳しく説明します。 これは、 Rubyエージェントがデフォルトで計装しない gem を使用している場合、または gem の作成者がライブラリにインストゥルメンテーションを追加したい場合に便利です。
サードパーティ製エクステンションの検索
誰でもRubyエージェント上に構築される gem を作成できます。 New Relic は、これらの拡張機能を追跡し、 Rubyエージェントを構築する他の gem へのリンクを提供するために、 extends_newrelic_rpmというリポジトリを維持しています。
これらの拡張機能はNewRelicではサポートされていません。 New Relicは、これらのリンクをお客様へのサービスとして収集します。これらのgemに関する問題は、GitHubのそれぞれのプロジェクトに報告する必要があります。
珠玉のエクステンション
New Relic では、サードパーティの拡張機能を gem として維持することを推奨しています。たとえば、 newrelic-redis
はredis
gem のインストルメンテーションを提供します。
トランザクションの開始
ライブラリが New Relic で完全なトランザクションとして表現されるべきコードを提供している場合 (たとえば、Ruby エージェントが計測していないウェブリクエストやバックグラウンドジョブなど)、トランザクションを開始するためにこれらのメカニズムのいずれかを使用してください。
トランザクションを開始する最も簡単な方法は、メソッドでadd_transaction_tracer
を呼び出すことです。これは、 NewRelic::Agent::Instrumentation::ControllerInstrumentation
がクラスに含まれていることを前提としています。
class CustomBackgroundJob
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
add_transaction_tracer :transaction
場合によっては、New Relic が生成するトランザクションをもう少し制御する必要があります。その場合は、 perform_action_with_newrelic_trace
を使用できます。オーバーライドできるパラメーターには、トランザクション名とカテゴリ (Web トランザクションかバックグラウンド トランザクションか) が含まれます。
class CustomBackgroundJob
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
perform_action_with_newrelic_trace(:name => "custom_name",
パラメータと使用法の詳細については 、perform_action_with_newrelic_trace の完全なドキュメントを 参照してください。
トランザクショントレース内のノード
メソッドへの呼び出しに関するタイミング情報をNew Relicに追加したい場合がありますが、これは完全なトランザクションを表すものではありません。New Relic では、これを実現するためにメソッドトレーサーを追加することを推奨します。
require 'new_relic/agent/method_tracer'
include ::NewRelic::Agent::MethodTracer
add_method_tracer :generate_image, 'Custom/generate_image'
上記の例では、名前'Custom/generate_image'
のメトリクスが記録され、メソッド呼び出しを含むトランザクション トレースのエントリが記録されます。
カスタムデータストア
Rubyエージェントは、Datastoresへのコールを記録するための特別な機能を提供します。Datastoresは、SQLとNoSQLの両方のデータベースをサポートし、サードパーティのgemが使用できるように一貫したインターフェースを提供することを目的としています。
NewRelic::Agent::Datastores
モジュール関数を介して記録されたメトリクスは、New Relic のデータベース UI に表示されます。
trace
メソッドのデータストアを記録する最も簡単な方法です。
NewRelic::Agent::Datastores.trace self, :find, "FauxDB"
最初のパラメータはインストゥルメントするクラス、2番目は検索するメソッド、3番目はデータストアの製品名です。最後のパラメータには、オプションで操作名を指定することができますが、そうでない場合は、メトリクスで操作を表現するためにメソッド名が使用されます。
このインターフェースで記録されたデータストア メトリックでは、コレクション/テーブル名を追加できないことに注意してください。そのためには、以下のwrap
メソッドを参照してください。
wrap
メトリック名に追加のコレクション/テーブル情報を使用してデータストア メトリックを記録できます。また、遅いステートメントに気付くなどの操作のためのコールバックも提供します。
NewRelic::Agent::Datastores.wrap("FauxDB", "find", table) do
データストア呼び出しに関する追加情報を記録する場合は、 wrap
でオプションのコールバック パラメータを使用できます。
callback = Proc.new do |result, scoped_metric, elapsed|
NewRelic::Agent::Datastores.notice_sql(query, scoped_metric, elapsed)
NewRelic::Agent::Datastores.wrap("FauxDB", "find", "items", callback) do
このヘルパー・メソッドは、トランザクション・トレースやスローSQLページで表示するために、遅いSQLクエリを記録します。SQLはユーザーの設定に基づいてフィルタリングされ、難読化されます。
NewRelic::Agent::Datastores.notice_sql(query, scoped_metric, elapsed)
非 SQL クエリはnotice_sql
を介して送信しないでください。代わりにnotice_statement
を使用してください。
注意
New Relic のTransaction Tracing と Slow SQL 機能は、渡されたクエリに難読化を適用しようとしますが、クエリのフォーマットがサポートされておらず、キャプチャされたクエリに埋め込まれたユーザー情報が公開されてしまう可能性があります。
このヘルパーメソッドは、トランザクショントレースへの遅いデータストア呼び出しのステートメントを記録します。これらは難読化されていません。
NewRelic::Agent::Datastores.notice_statement(statement, elapsed)
notice_statement
を介して SQL クエリを送信しないでください。代わりにnotice_sql
を使用してください。
注意
このメソッドは、ユーザーがクエリのキャプチャをオフにした場合のステートメントを適切に無視しますが、任意のデータを難読化することはできません!キャプチャされたクエリに埋め込まれたユーザー情報の漏洩を防ぐために、このメソッドに渡されるすべてのデータが、New Relic に送信しても安全であることを確認してください。
エクステンションのテスト
New Relic を拡張する gem をオーサリングすると、自動テストを書くことができます。エージェント自体が使用するテストヘルパーは、いくつかの一般的なテスト作業を簡略化するために利用できます。
このセクションに記載されているテスト メソッドには、テスト コード (通常はtest_helper.rb
ファイル) からこれを呼び出すことでアクセスできます。
NewRelic::Agent.require_test_helper
この方法は、予想されるメトリクスが Ruby エージェントによって確実に記録されるようにするための主要な方法です。refute_metrics_recorded
も利用できます。
最も単純な形式では、 assert_metrics_recorded
は次のように呼び出すことができます。
assert_metrics_recorded(["MetricA", "MetricB"])
特定の値を持つメトリクスは、この構文でアサートできます。
assert_metrics_recorded('MetricA' => {
:total_call_time => 1.0 })
これらの方法は、ウェブやバックグラウンドでのトランザクションの実行をシミュレートするものです。
エージェントの構成は、 with_config
を介してテスト用に変更できます。エージェントの他の構成値に適用されるハッシュを取得します。
with_config(:enabled => false) do
ヒント
通常、これらの構成値はrequire
でインストルメンテーションが発生したときにチェックされ、テストでの設定変更の影響を受けないため、この方法はインストルメンテーションのインストールのテストには役立ちません。
複数のgemバージョンに対して拡張機能をテストする必要がある場合は、Rubyエージェント自身のテストコードの一部であるMultiverseを使うことができます。Multiverse のテスト例は、エージェントファイルの suites ディレクトリを参照してください 。
自分のgemにMultiverseを設定するには
Require tasks/multiverse
in Rakefilerake test:multiverse
コマンドを有効にするには、Rakefile に次のコードを追加します。
require "tasks/multiverse"
Create the Multiverse test directoryマルチバース テストには特定のファイル レイアウトが必要です。 次のファイルの場所を含むtest/multiverse/YOUR_PROJECT
という名前のディレクトリを作成します。
test/multiverse/YOUR_PROJECT
test/multiverse/YOUR_PROJECT/Envfile
test/multiverse/YOUR_PROJECT/config/newrelic.yml
test/multiverse/YOUR_PROJECT/FILE_WITH_A_TEST.rb
Configure your EnvfileEnvfileを使用して、Multiverse テストの gem 依存関係のセットを宣言します。 たとえば、 Envfileは次のようになります。
gem 'your-project', '~> 1.0.0'
gem 'newrelic_your-project', path: '../../..'
gem 'your-project', '~> 2.1.0'
gem 'newrelic_your-project', path: '../../..'
ヒント
マルチバース テストが確実に機能するように、 newrelic_rpm
とrack
のgem
行を含めます。
Detect dependencies。必要に応じて、Multiverse テストから追加の依存関係検出を実行して、拡張機能の インストゥルメンテーションが読み込まれていることを確認します。
require 'newrelic/your-project'
DependencyDetection.detect!
class YourProjectTest > Minitest::Test
Envfile内の gem 依存関係に対して Multiverse テストを実行するには:
- Gem の Multiverse を設定したら、
rake test:multiverse
を実行してディレクトリでテストを実行します。