このドキュメントでは、サードパーティ製のgemをRubyエージェントで計測する方法と、エージェントとのやりとりに関するベストプラクティスを詳しく説明します。このドキュメントは、Rubyエージェントがデフォルトでは計測しないgemを使用している場合や、gemの作者が自分のライブラリに計測機能を追加したい場合に役立ちます。
サードパーティ製エクステンションの検索 誰でも、Ruby エージェントの上に構築する gem を書くことができます。New Relic では extends_newrelic_rpm というリポジトリを管理し、これらの拡張機能を追跡したり、Ruby エージェントを構築する他の gem へのリンクを提供したりしています。
これらの拡張機能はNewRelicではサポートされていません 。 New Relicは、これらのリンクをお客様へのサービスとして収集します。これらのgemに関する問題は、GitHubのそれぞれのプロジェクトに報告する必要があります。
珠玉のエクステンション New Relic では、サードパーティの拡張機能を gem として維持することを推奨しています。たとえば、 newrelic-redis
はredis
gem のインストルメンテーションを提供します。
トランザクションの開始 ライブラリが New Relic で完全なトランザクションとして表現されるべきコードを提供している場合 (たとえば、Ruby エージェントが計測していないウェブリクエストやバックグラウンドジョブなど)、トランザクションを開始するためにこれらのメカニズムのいずれかを使用してください。
add_transaction_tracer トランザクションを開始する最も簡単な方法は、メソッドで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 では、これを実現するためにメソッドトレーサーを追加することを推奨します。
add_method_tracer 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 に 表示されます。
NewRelic::Agent::Datastores.trace trace
メソッドのデータストアを記録する最も簡単な方法です。
NewRelic :: Agent :: Datastores . trace self , :find , "FauxDB"
最初のパラメータはインストゥルメントするクラス、2番目は検索するメソッド、3番目はデータストアの製品名です。最後のパラメータには、オプションで操作名を指定することができますが、そうでない場合は、メトリクスで操作を表現するためにメソッド名が使用されます。
このインターフェースで記録されたデータストア メトリックでは、コレクション/テーブル名を追加できないことに注意してください。そのためには、以下のwrap
メソッドを参照してください。
NewRelic::Agent::Datastores.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
NewRelic::Agent::Datastores.notice_sql このヘルパー・メソッドは、トランザクション・トレースやスロー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 このヘルパーメソッドは、トランザクショントレースへの遅いデータストア呼び出しのステートメントを記録します。これらは難読化されていません 。
NewRelic :: Agent :: Datastores . notice_statement ( statement , elapsed )
notice_statement
を介して SQL クエリを送信しないでください。代わりにnotice_sql
を使用してください。
注意 このメソッドは、ユーザーがクエリのキャプチャをオフにした場合のステートメントを適切に無視しますが、任意のデータを難読化することはできません!キャプチャされたクエリに埋め込まれたユーザー情報の漏洩を防ぐために、このメソッドに渡されるすべてのデータが、New Relic に送信しても安全であることを確認してください。
エクステンションのテスト New Relic を拡張する gem をオーサリングすると、自動テストを書くことができます。エージェント自体が使用するテストヘルパーは、いくつかの一般的なテスト作業を簡略化するために利用できます。
NewRelic::Agent.require_test_helper このセクションに記載されているテスト メソッドには、テスト コード (通常はtest_helper.rb
ファイル) からこれを呼び出すことでアクセスできます。
NewRelic :: Agent . require_test_helper
assert_metrics_recorded この方法は、予想されるメトリクスが Ruby エージェントによって確実に記録されるようにするための主要な方法です。refute_metrics_recorded
も利用できます。
最も単純な形式では、 assert_metrics_recorded
は次のように呼び出すことができます。
assert_metrics_recorded ( [ "MetricA" , "MetricB" ] )
特定の値を持つメトリクスは、この構文でアサートできます。
assert_metrics_recorded ( 'MetricA' => {
:total_call_time => 1.0 } )
in_web_transaction/in_background_transaction これらの方法は、ウェブやバックグラウンドでのトランザクションの実行をシミュレートするものです。
with_config エージェントの構成は、 with_config
を介してテスト用に変更できます。エージェントの他の構成値に適用されるハッシュを取得します。
with_config ( :enabled => false ) do
ヒント 通常、これらの構成値はrequire
でインストルメンテーションが発生したときにチェックされ、テストでの設定変更の影響を受けないため、この方法はインストルメンテーションのインストールのテストには役立ちません。
マルチバース。複数のGemバージョンでのテスト 複数のgemバージョンに対して拡張機能をテストする必要がある場合は、Rubyエージェント自身のテストコードの一部であるMultiverseを使うことができます。Multiverse のテスト例は、エージェントファイルの suites ディレクトリを参照してください 。
自分のgemにMultiverseを設定するには
Rakefile でtasks/multiverse
が必要 です。rake test:multiverse
コマンドを有効にするには、Rakefile に次を追加します。
require "tasks/multiverse"
Multiverse テスト ディレクトリを作成します 。マルチバース テストには、特定のファイル レイアウトが必要です。次のファイルの場所に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
Envfileの設定 . Envfile を使って、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
行を含めます。
依存関係の検出 .必要に応じて、Multiverseテストから追加の依存性検出を実行して、拡張機能のインスツルメンテーションがロードされていることを確認してください。
require 'newrelic/your-project'
DependencyDetection . detect !
class YourProjectTest > Minitest :: Test
Envfile にあるgemの依存関係に対してMultiverseのテストを実行するためです。
Gem の Multiverse を設定したら、 rake test:multiverse
を実行してディレクトリでテストを実行します。