@instana/core
Version:
Core library for Instana's Node.js packages
62 lines (51 loc) • 1.62 kB
JavaScript
/*
* (c) Copyright IBM Corp. 2021
* (c) Copyright Instana Inc. and contributors 2019
*/
;
const shimmer = require('../../shimmer');
const hook = require('../../../util/hook');
const httpServer = require('../protocols/httpServer');
const cls = require('../../cls');
let logger;
let isActive = false;
exports.init = function init(config) {
logger = config.logger;
hook.onModuleLoad('@hapi/call', instrumentHapiCall);
};
function instrumentHapiCall(hapiCall) {
if (!hapiCall.Router || !hapiCall.Router.prototype) {
logger.warn(
'Found @hapi/call module, but it does not export a Router value. Hapi will not be instrumented, calls processed' +
' by Hapi will not have a path template.'
);
return;
}
shimmer.wrap(hapiCall.Router.prototype, 'route', shimRoute);
}
function shimRoute(originalFunction) {
return function () {
if (!isActive || !cls.isTracing()) {
return originalFunction.apply(this, arguments);
}
const routeObject = originalFunction.apply(this, arguments);
annotateHttpEntrySpanWithPathTemplate(routeObject);
return routeObject;
};
}
function annotateHttpEntrySpanWithPathTemplate(routeObject) {
if (routeObject == null || !routeObject.route || typeof routeObject.route.path !== 'string') {
return;
}
const span = cls.getCurrentEntrySpan();
if (!span || span.n !== httpServer.spanName || span.pathTplFrozen) {
return;
}
span.data.http.path_tpl = routeObject.route.path;
}
exports.activate = function activate() {
isActive = true;
};
exports.deactivate = function deactivate() {
isActive = false;
};