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 instrumentPg(pg){instrumentClient(pg.Client)}function instrumentClient(Client){shimmer.wrap(Client.prototype,"query",shimQuery)}function shimQuery(original){return function(){if(cls.skipExitTracing({isActive:isActive}))return original.apply(this,arguments);var argsForOriginalQuery=new Array(arguments.length);for(let i=0;i<arguments.length;i++)argsForOriginalQuery[i]=arguments[i];return instrumentedQuery(this,original,argsForOriginalQuery)}}function instrumentedQuery(ctx,originalQuery,argsForOriginalQuery){const host=ctx.connectionParameters.host,port=ctx.connectionParameters.port,user=ctx.connectionParameters.user,db=ctx.connectionParameters.database,config=argsForOriginalQuery[0];return cls.ns.runAndReturn(()=>{const span=cls.startSpan(exports.spanName,constants.EXIT);span.stack=tracingUtil.getStackTrace(instrumentedQuery),span.data.pg={stmt:tracingUtil.shortenDatabaseStatement("string"==typeof config?config:config.text),host:host,port:port,user:user,db:db};let originalCallback,callbackIndex=-1;for(let i=1;i<argsForOriginalQuery.length;i++)if("function"==typeof argsForOriginalQuery[i]){originalCallback=argsForOriginalQuery[i],callbackIndex=i;break}0<=callbackIndex&&(argsForOriginalQuery[callbackIndex]=cls.ns.bind(function(error){return finishSpan(error,span),originalCallback.apply(this,arguments)}));var promise=originalQuery.apply(ctx,argsForOriginalQuery);return promise&&"function"==typeof promise.then&&promise.then(value=>(finishSpan(null,span),value)).catch(error=>(finishSpan(error,span),error)),promise})}function finishSpan(error,span){error&&(span.ec=1,span.data.pg.error=tracingUtil.getErrorDetails(error)),span.d=Date.now()-span.ts,span.transmit()}exports.spanName="postgres",exports.batchable=!0,exports.init=function(){requireHook.onModuleLoad("pg",instrumentPg)},exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1};