Repository URL to install this package:
|
Version:
0.7.0 ▾
|
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
"use strict";const shimmer=require("shimmer"),requireHook=require("../../../util/requireHook"),tracingUtil=require("../../tracingUtil"),constants=require("../../constants"),cls=require("../../cls");let isActive=!1;function instrumentMssql(mssql){instrumentRequest(mssql.Request),instrumentPreparedStatement(mssql.PreparedStatement),instrumentTransaction(mssql.Transaction)}function instrumentRequest(Request){shimmer.wrap(Request.prototype,"query",shimMethod.bind(null,instrumentedRequestMethod)),shimmer.wrap(Request.prototype,"execute",shimMethod.bind(null,instrumentedRequestMethod)),shimmer.wrap(Request.prototype,"batch",shimMethod.bind(null,instrumentedRequestMethod)),shimmer.wrap(Request.prototype,"bulk",shimMethod.bind(null,instrumentedBulk))}function shimMethod(instrumentedFunction,originalFunction){return function(){if(cls.skipExitTracing({isActive:isActive}))return originalFunction.apply(this,arguments);var originalArgs=new Array(arguments.length);for(let i=0;i<arguments.length;i++)originalArgs[i]=arguments[i];return instrumentedFunction(this,originalFunction,originalArgs)}}function instrumentedRequestMethod(ctx,originalFunction,originalArgs){return instrumentedMethod(ctx,originalFunction,originalArgs,instrumentedRequestMethod,args=>args[0])}function instrumentedBulk(ctx,originalFunction,originalArgs){return instrumentedMethod(ctx,originalFunction,originalArgs,instrumentedBulk,()=>"MSSQL bulk operation")}function instrumentedMethod(ctx,originalFunction,originalArgs,stackTraceRef,commandProvider){const connectionParameters=findConnectionParameters(ctx),command=commandProvider(originalArgs);return cls.ns.runAndReturn(()=>{const span=cls.startSpan(exports.spanName,constants.EXIT);span.stack=tracingUtil.getStackTrace(stackTraceRef),span.data.mssql={stmt:tracingUtil.shortenDatabaseStatement(command),host:connectionParameters.host,port:connectionParameters.port,user:connectionParameters.user,db:connectionParameters.db};let originalCallback;(originalCallback=2<=originalArgs.length&&"function"==typeof originalArgs[1]?originalArgs[1]:originalCallback)&&(originalArgs[1]=cls.ns.bind(function(error){return finishSpan(error,span),originalCallback.apply(this,arguments)}));var promise=originalFunction.apply(ctx,originalArgs);return"function"==typeof promise.then&&promise.then(value=>(finishSpan(null,span),value)).catch(error=>(finishSpan(error,span),error)),promise})}function instrumentPreparedStatement(PreparedStatement){shimmer.wrap(PreparedStatement.prototype,"prepare",shimPrepare),shimmer.wrap(PreparedStatement.prototype,"execute",shimMethod.bind(null,instrumentedExecute))}function shimPrepare(originalFunction){return function(){if(!isActive)return originalFunction.apply(this,arguments);var originalArgs=new Array(arguments.length);for(let i=0;i<arguments.length;i++)originalArgs[i]=arguments[i];return 2<=originalArgs.length&&"function"==typeof originalArgs[1]&&(originalArgs[1]=cls.ns.bind(originalArgs[1])),this.__instanaStatement=originalArgs[0],originalFunction.apply(this,originalArgs)}}function instrumentedExecute(ctx,originalFunction,originalArgs){return instrumentedMethod(ctx,originalFunction,originalArgs,instrumentedExecute,()=>ctx.__instanaStatement)}function instrumentTransaction(Transaction){shimmer.wrap(Transaction.prototype,"begin",shimBeginTransaction)}function shimBeginTransaction(originalFunction){return function(){if(cls.skipExitTracing({isActive:isActive}))return originalFunction.apply(this,arguments);var originalArgs=new Array(arguments.length);for(let i=0;i<arguments.length;i++)originalArgs[i]=arguments[i];return"function"==typeof originalArgs[1]?originalArgs[1]=cls.ns.bind(originalArgs[1]):"function"==typeof originalArgs[0]&&(originalArgs[0]=cls.ns.bind(originalArgs[0])),originalFunction.apply(this,originalArgs)}}function finishSpan(error,span){error&&(span.ec=1,span.data.mssql.error=tracingUtil.getErrorDetails(error)),span.d=Date.now()-span.ts,span.transmit()}function findConnectionParameters(ctx){return ctx.parent&&ctx.parent.config&&ctx.parent.config.server?{host:ctx.parent.config.server,port:ctx.parent.config.port,user:ctx.parent.config.user,db:ctx.parent.config.database}:ctx.parent?findConnectionParameters(ctx.parent):{host:"",port:-1,user:"",db:""}}exports.spanName="mssql",exports.batchable=!0,exports.init=function(){requireHook.onModuleLoad("mssql",instrumentMssql)},exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1};