New Relic for Node.js は、ほとんどの標準的な Web リクエストを自動的にインスツルメンテーションしますが、時には拡張インスツルメンテーションが必要な場合もあります。カスタムインスツルメンテーションでは、 ウェブソケット 、 バックグラウンドジョブ 、 サポートされていないデータベース をインスツルメンテーションすることができます。また、カスタムインスツルメンテーションでは、 コードの特定のセクションをターゲットにして、より深い洞察を得ることができます。 。
カスタム・インスツルメンテーションは、Node.jsエージェントのバージョン1.10.0以降で利用可能です。最新の Node.js エージェントの機能を利用するには、 エージェントをアップグレードしてください 。
Webトランザクションのインストゥルメンテーション
WebsocketリクエストなどのWebトランザクションを計測するには、カスタムトランザクションを作成します。カスタムトランザクションを作成すると、エージェントが自動的に計測するトランザクションと同じ種類の可視性が得られます。
- インストルメントするハンドラーを
createWebTransaction()
でラップします。 - トランザクションの最後に必ず
endTransaction()
に電話してください。
重要
トランザクション名の末尾に角かっこ[suffix]
を使用しないでください。 New Relicは、名前から角かっこを自動的に削除します。代わりに、必要に応じて括弧(suffix)
またはその他の記号を使用してください。
この例では、 socket.io内で/websocket/ping
トランザクションと/websocket/new-message
トランザクションを計測します。/ping
の例は同期ですが、 /new-message
の例は非同期です。
var nr = require('newrelic');
var app = require('http').createServer();
var io = require('socket.io')(app);
io.on('connection', function (socket) {
socket.on('ping', nr.createWebTransaction('/websocket/ping', function (data) {
socket.on('new-message', nr.createWebTransaction('/websocket/new-message', function (data) {
addMessageToChat(data, function () {
socket.emit('message-received');
バックグラウンド・トランザクションのインストゥルメンテーション
カスタムトランザクションを使用して、アプリ内の定期的なジョブやリクエストの完了後に継続する作業などのバックグラウンドタスクを計測することもできます。バックグラウンドタスクをインストルメントするには、インストルメントするハンドラーをcreateBackgroundTransaction()
でラップします。トランザクションの最後にendTransaction()
を呼び出すようにしてください。
この例では、 setInterval
}内のupdate:cache
を計測します。
var nr = require('newrelic');
var redis = require('redis').createClient();
setInterval(nr.createBackgroundTransaction('update:cache', function () {
var newValue = someDataGenerator();
redis.set('some:cache:key', newValue, function () {
トランザクション内でのインストゥルメンテーションの拡大
また、カスタム・インスツルメンテーションを使用して、すでにインスツルメンテーションされているウェブ・トランザクションの可視性を高めたり、自動的にインスツルメンテーションされていないデータベースやその他のトランザクション内の作業を把握したりすることもできます。そのためには、コールバックをカスタムトレーサーでラップします。カスタムトレーサーは、特定の関数やデータベースの呼び出しなど、既存のトランザクション内の追加セグメントに対して特定のメトリクスを作成し、収集します。
コールバックをインストルメント化するには、コールバックをcreateTracer()
でラップします。非同期関数内で呼び出される関数をインストルメント化する場合は、ターゲット関数とその親非同期関数の両方をcreateTracer()
でラップする必要があります。
ヒント
これらのサンプルは、すでにインスツルメンテーションされているトランザクションの中に置かなければなりません。トランザクションは、自動的にインスツルメンテーションされるか、カスタム・トランザクションを介してインスツルメンテーションされます。
この例では、1つのコールバックをラップしています。
db.createObject(nr.createTracer('db:createObject', function (err, result) {
if (util.handleError(err, res)) {
res.write(JSON.stringify(result.rows[0].id));
この例では、 pg.connect
とclient.query
の両方をラップしています。これは、 client.query
が非同期の親関数( pg.connect
)によって呼び出されるためです。そうしないと、 client.query
からデータを取得できません。これにより、 createTracer()
はアクティブなトランザクションをこれらの非同期境界を越えて伝播できます。
pg.connect(config.db_string, nr.createTracer('pg:connect', function (err, client, done) {
if (util.handleError(err, '500', res)) {
client.query('SELECT count(*) FROM test_count', nr.createTracer('pg:query', function (err, result) {
if (util.handleError(err, '500', res)) {
res.write(result.rows[0].count);