New Relic for Node.js는 대부분의 표준 웹 요청을 자동으로 계측하지만 때로는 확장된 계측을 원할 때도 있습니다. 에이전트의 사용자 지정 계측 API를 사용하여 지원되지 않는 웹 프레임워크 , 데이터 저장소 및 메시지 서비스 클라이언트 에 대한 계측을 생성할 수 있습니다.
Node.js 에이전트의 사용자 지정 계측 API를 통해 다음을 수행할 수도 있습니다.
웹 트랜잭션 을 생성합니다(트랜잭션을 자동으로 생성할 수 없는 웹 소켓과 같은 경우에 유용).
이 예시는 socket.io 내의 /websocket/ping 트랜잭션, /websocket/update 트랜잭션 및 /websocket/new-message 트랜잭션을 계측합니다. /ping 예시는 동기식이고 /new-message 및 /update 예시는 비동기식입니다.
API의 계측 등록 방법을 사용하여 계측을 생성할 수 있습니다. 인스트루먼테이션 API를 사용하여 인스트루먼테이션을 작성하면 관련 개체에 대한 "원숭이 패치" 방법(함수 교체)을 통해 메트릭과 이름을 더 자세히 지정할 수 있습니다. 다른 옵션은 이미 계측된 웹 트랜잭션에 대한 가시성을 제공하거나 자동으로 계측되지 않는 데이터베이스 및 기타 트랜잭션 내 작업에 대한 통찰력을 얻을 수 있습니다.
이렇게 하려면 사용자 지정 추적 프로그램에서 콜백을 래핑합니다. 사용자 지정 추적기는 특정 기능 또는 데이터베이스 호출과 같은 기존 트랜잭션 내의 추가 세그먼트에 대한 특정 메트릭을 생성하고 수집합니다.
개별 콜백을 계측하려면 콜백 내에서 startSegment() 를 호출하고 기본 콜백 로직을 handler 함수로 이동합니다.
비동기 함수 내에서 호출되는 함수를 계측하려면 대상 함수와 상위 비동기 함수를 모두 startSegment() 으로 래핑합니다.
중요
이러한 예제는 트랜잭션에서 실행되는 코드에 배치해야 합니다. 사용자 지정이든 자동 생성이든 트랜잭션의 출처는 중요하지 않습니다.
// This is recorded as the `db:createObject` segment.
db.createObject(cb);
},function(err, result){
// This is recorded as the callback to the `db:createObject` segment.
if(util.handleError(err, res)){
return;
}
res.write(JSON.stringify(result.rows[0].id));
res.write('\n');
res.end();
});
이 예는 pg.connect 및 client.query 모두를 추적합니다. 이는 client.query 가 비동기 상위 함수( pg.connect )에 의해 호출되기 때문입니다. 그렇지 않으면 client.query 에서 데이터를 얻을 수 없습니다. 이렇게 하면 startSegment() 가 이러한 비동기 경계를 넘어 활성 트랜잭션을 전파할 수 있습니다.
nr.startSegment('pg:connect',true,function(cb){
pg.connect(config.db_string, cb);
},function(err, client, done){
if(util.handleError(err,'500', res)){
returndone();
}
nr.startSegment('pg:query',true,function(cb){
client.query('SELECT count(*) FROM test_count', cb);
},function(err, result){
if(util.handleError(err,'500', res)){
returndone();
}
res.write(result.rows[0].count);
res.write('\n');
});
});
이 예제는 콜백 예제와 동일하지만 Promise 기반 API와 상호 작용하기 위한 것입니다. 프라미스의 경우 단순히 프라미스를 반환하고 startSegment 다음에 then 를 호출하여 실행을 계속하십시오.
nr.startSegment('pg:connect',true,function(){
// This `pg:connect` segment will time until the returned promise
// either resolves or rejects.
return pg.connect(config.db_string);
}).then(function(client){
// The transaction context is propagated into following promises.