New Relic は、Node.js アプリケーションに関する有用なメトリクスを提供するために必要な情報を取得するためのツールをいくつか提供しています。これらには次のようなものがあります。
- ExpressとRestifyのルーターからルート名(使用されている場合)を読み込む
- APIを使用して、現在のリクエストに名前を付ける。単純な名前や、アクションを持つコントローラのグループを使用する。
- リクエストの生のURLに対してマッチした正規表現に基づいて、リクエストをリネームまたは無視するようマークすることができる、エージェントの設定に保存されたルールをサポート(APIコールとしても利用可能)
New Relic が追跡する名前の数は、ユーザー・エクスペリエンスが堅牢であるように十分小さくする必要があります。また、アプリケーションの問題点をより簡単に特定できるように、(データに圧倒されることなく)適切な量の情報を提供するのに十分な規模である必要があります。
詳細については、 Node.js エージェント設定ドキュメント、 Github の Node.js エージェントAPIドキュメント、およびNode.js エージェント サンプル アプリケーションを参照してください。
リクエスト名
Node.js エージェントは、潜在的にパラメーター化されたパス ( /user/:id
など) または正規表現 ( /^/user/([-0-9a-f]+)$/
など) とともに HTTP メソッドをキャプチャします。これらの情報は、リクエスト名の一部になります。
低速トランザクション トレースをサポートしていて、構成ファイルのattributes.include
に'request.parameters.*'
を追加している場合、トランザクション トレースにもリクエストのパラメータとその値が添付されます。Node.js エージェントが使用する要求名が気に入らない場合は、API 呼び出しを使用して、よりわかりやすい名前を作成できます。
ヒント
汎用名でリクエストをグループ化する場合は、 /*
で十分であり、構成ファイルや API 呼び出しをカスタマイズする必要はありません。
要件
New Relic では、多くのチャートやテーブルでリクエストをグループ化するためにリクエスト名を使用しています。異なるリクエスト名の数が増えると、これらのビジュアライゼーションの価値は下がります。
例えば、作成するリクエスト名にGUID、数値ID、タイムスタンプのような潜在的に動的なデータを含まないようにします。リクエストがトランザクショントレースを生成するほど遅い場合、そのトレースにはオリジナルのURLが含まれます。パラメータキャプチャを有効にした場合、パラメータもトレースに添付されます。
ヒント
50種類以上のトランザクション名を持たないようにしてください。例えば、リクエスト名が数百種類以上ある場合は、ネーミング戦略を見直してください。
メトリクスのグループ化問題を回避する
"" New Relic では、このような問題に対処するためにいくつかの方法を用意しています。最も厳しい方法は、問題のあるアプリケーションを拒否リストに追加することです。
これらのリクエスト名付けツールの使用に注意する主な理由は、アプリケーションにこのような事態が発生するのを防ぐためです。詳細については、 Metric grouping issues をご覧ください。
ガイドライン
設定ルールは、最も具体的なものから最も一般的なものまで定義してください。設定ファイルに記載された最初のルール、または Node.js transaction naming API で追加されたルールが最初に適用されるため、対象を絞る必要があります。より一般的な"fall-through" のルールは、リストの最後の方に追加してください。なぜなら、これらのルールは、Node.js トランザクション ネーミング API を使用して設定または追加された順に評価されるからです。
あるネットショップでは、次のようなURLパターンがあります。
/user/customers/all/prospects
/user/customers/all/current
/user/customers/all/returning
小売業者は次のようなルールを作ることができます。
{ pattern: "/user/customers/all/prospects/", name: "/user/customers/all/prospects" },
{ pattern: "/user/customers/all/.*", name: "/user/customers/all" },
{ pattern: "/user/customers/.*", name: "/user/customers/:customer" }
このルールでは、小売業者は3つのトランザクション名を作成します。
/user/customers/:customer
/user/customers/all
/user/customers/all/prospects
小売業者が順序を逆にした場合、ルールは:customer
でall
トランザクションをキャッチしますが、これはあまり役に立ちません。
APIをロードする
アプリケーションの他の部分がロードされる前に、New Relic モジュールがブートストラップする必要があるため、New Relic モジュールのロードがアプリケーションの最初に行われるようにしてください。
const newrelic = require('newrelic');
これは New Relic Node.js API を返します。 モジュールは一度だけ初期化されるため、アプリケーション内の複数のモジュールからモジュールを安全に要求できます。
APIコールのリクエスト
New Relic の Node.js エージェントの Request API コールをまとめました。
カスタムインストルメントAPIコール
これらのAPIコールを使用して、 カスタムインストルメントでインストルメントを拡張することができます.
カスタムメトリクスのAPIコール
これらのAPIコールを使用して、追加の任意のメトリクスを記録します。
カスタムイベントのAPIコール
これらのAPIコールを使用して、追加のイベントを記録します。
トランザクション処理方法
これらのAPIコールを使用して、現在の段階と対話します。
リクエストの命名と無視のルール
New Relic モジュールへの呼び出しをアプリケーションコードに直接記述したくない場合は、パターンベースのルールを使ってリクエストに名前を付けることができます。ルールには、リクエストの名前を変更するためのものと、New Relic のインスツルメンテーションによって無視されるリクエストをマークするためのものの 2 種類があります。
ここでは、New Relic の Node.js エージェントにおけるルールの構造について説明します。
着信リクエスト URL をpattern
に一致させ、一致する New Relic トランザクションのname
に名前を付けるための、形式{pattern : "pattern", name : "name"}
のルールのリスト。これは正規表現の置換として機能し、パターンを文字列または JavaScript 正規表現リテラルとして設定でき、パターンと名前の両方が必要です。
正規表現を文字列として渡す場合は、バックスラッシュをエスケープしてください。エージェントは、パターン内の文字列として渡された場合、バックスラッシュを保持しません。パターンは順番に評価され、その性質上、最終的なものであるため、最も具体的なものから最も一般的なものまで、設定ルールを定義してください。詳細については、 命名ガイドライン を参照してください。
これは、環境変数NEW_RELIC_NAMING_RULES
を使用して設定することもできます。複数のルールがコンマ区切りの JSON オブジェクト リテラルのリストとして渡されます。
NEW_RELIC_NAMING_RULES='{"pattern":"^t","name":"u"},{"pattern":"^u","name":"t"}'
オプションのルール属性 [#optional-rules-attribute]
追加のオプション属性があります。
Optional rules attributes | Description |
---|
terminate_chain
| デフォルト: true true (デフォルト) に設定すると、このルールが一致した場合、それ以上のルールは評価されません。これを false に設定すると、複数のルールを一緒に使用する必要がある場合に便利です。たとえば、1 つのルールで多くの異なる URL の共通パターンを置き換え、その後のルールはより具体的にすることができます。
|
replace_all
| デフォルト: false true に設定すると、パターンのすべての一致が置き換えられます。それ以外の場合は、最初の一致のみが置き換えられます。正規表現リテラルでg フラグを使用すると、同じ効果があります。例えば:
これはpattern: /[0-9]+/g と同じ効果があります。 |
precedence
| デフォルトでは、ルールは最初から最後まで順番に評価されます。順序を完全に制御したい場合は、各ルールにprecedence 属性を与えることができます。優先順位は整数で、ルールは昇順で評価されます。precedence が明示的に定義されていない場合、デフォルトで 500 に設定されます。 追加属性は無視されます。 |
ネーミングルールのテスト [#testing-naming-rules]
Node.jsエージェントには、ネーミングルールをテストするためのコマンドラインツールが付属しています。詳しくは、アプリがインストールされているディレクトリのターミナル・ウィンドウで以下のコマンドを実行してください。
$node node_modules/.bin/newrelic-naming-rules
ネーミングルールの例 [#examples-rules]
ネーミングルールとその結果の例をご紹介します。
pattern: '^/items/[0-9]+$',
が発生します。
/orders/123 => /orders/123 (not replaced since the rule is a full match)
が発生します。
/orders/123 => /orders/:id
/orders/123/items/123 => /orders/:id/items/123
が発生します。
/orders/123/items/123 => /orders/:id/items/:id
正規表現のマッチグループ参照の使用
pattern: '^/(items|orders)/[0-9]+$',
が発生します。
/orders/123 => /orders/:id
これは、環境変数NEW_RELIC_IGNORING_RULES
を介して設定することもでき、コンマ区切りのパターンのリストとして複数のルールが渡されます。現在、パターン内のコンマをエスケープする方法はありません。
NEW_RELIC_IGNORING_RULES='^/socket\.io/\*/xhr-polling,ignore_me'
ここでは、設定ファイルに含まれるルールの全例をご紹介します。
{ pattern: "/tables/name-here", name: "/name-hererule1" }
socket.ioを使用している場合は、すぐにルールを無視するユースケースが使用できます。 socket.io のロングポーリングがレスポンスタイム メトリックを支配し、アプリケーションの Apdex メトリックに影響を与えないようにするには、次のようなルールを追加します。
'^\/socket\.io\/.*\/xhr-polling'
ルールのAPIコール
ここでは、New Relic の Node.js エージェントでルールを命名したり無視したりするための API コールを紹介します。