in lib/instrumentation/modules/tedious.js [93:154]
makeRequest(request, _packetType, payload) {
// if not a Request object (i.e. a BulkLoad), then bail
if (!request.parametersByName) {
return super.makeRequest(...arguments);
}
const span = ins.createSpan(null, 'db', 'mssql', 'query', {
exitSpan: true,
});
if (!span) {
return super.makeRequest(...arguments);
}
let host, port, instanceName;
if (typeof this.config === 'object') {
// http://tediousjs.github.io/tedious/api-connection.html#function_newConnection
host = this.config.server;
if (this.config.options) {
port = this.config.options.port;
instanceName = this.config.options.instanceName;
}
}
span._setDestinationContext(getDBDestination(host, port));
let sql;
let preparing;
if (payload.parameters !== undefined) {
// This looks for tedious instance with `RpcRequestPayload` started
// since version >=v11.0.10, when RPC parameter handling was refactored
// (https://github.com/tediousjs/tedious/pull/1275).
preparing =
typeof payload.procedure === 'number'
? // tedious@16.2.0 starts using stored procedure *IDs*
// (https://github.com/tediousjs/tedious/pull/1327)
payload.procedure === 11
: payload.procedure === 'sp_prepare';
const stmtParam =
payload.parameters.find(({ name }) => name === 'statement') ||
payload.parameters.find(({ name }) => name === 'stmt');
sql = stmtParam ? stmtParam.value : request.sqlTextOrProcedure;
} else {
preparing = request.sqlTextOrProcedure === 'sp_prepare';
const params = request.parametersByName;
sql = (params.statement || params.stmt || {}).value;
}
span.name = sqlSummary(sql) + (preparing ? ' (prepare)' : '');
const dbContext = { type: 'sql', statement: sql };
if (instanceName) {
dbContext.instance = instanceName;
}
span.setDbContext(dbContext);
const origCallback = request.userCallback;
request.userCallback = ins.bindFunction(function tracedCallback() {
// TODO: captureError and setOutcome on err first arg here
span.end();
if (origCallback) {
return origCallback.apply(this, arguments);
}
});
return super.makeRequest(...arguments);
}