このドキュメントでは、 Rubyエージェントを使用してサードパーティの gem を計量する方法と、エージェントと対話するためのいくつかのベストプラクティスについて詳しく説明します。 これは、 Rubyエージェントがデフォルトで計装しない gem を使用している場合、または gem の作成者がライブラリにインストゥルメンテーションを追加したい場合に便利です。
ヒント New Relicは、Rubyエージェントへのコミュニティからの貢献を受け付けています。インストゥルメントされた状態にしたいgemや提案したい機能がある場合は、GitHubのnewrelic/newrelic-ruby-agentリポジトリでissue を開くか、プルリクエスト を送信してアイデアを共有してください。
サードパーティ製エクステンションの検索 誰でもRubyエージェント上に構築するgemを作成できます。これらの拡張機能を追跡し、Rubyエージェントを構築する他のgemへのリンクを提供するための古い例は、extends_newrelic_rpm と呼ばれるアーカイブされたリポジトリで利用できます。
これらの拡張機能は、New Relicではサポートされていません 。New Relicは、顧客へのサービスとしてこれらのリンクを収集しました。これらのgemに関する問題は、GitHubの各プロジェクトに報告してください。
珠玉のエクステンション サードパーティの拡張機能を作成する場合は、インストゥルメントされたライブラリごとに1つのgemを作成することをお勧めします。たとえば、newrelic-redisはredisgem(当社のエージェント内にも自動的に存在します)の計装を提供します。
トランザクションの開始 ライブラリが 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を設定するには
Require tasks/multiverse in Rakefile rake 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 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行を含めます。
Detect dependencies 。必要に応じて、Multiverse テストから追加の依存関係検出を実行して、拡張機能の インストゥルメンテーションが読み込まれていることを確認します。
require 'newrelic/your-project'
DependencyDetection . detect !
class YourProjectTest > Minitest :: Test
Envfile 内の gem 依存関係に対して Multiverse テストを実行するには:
Gem の Multiverse を設定したら、 rake test:multiverseを実行してディレクトリでテストを実行します。