Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
// (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"),EventEmitter=require("events").EventEmitter,superbrain=require("@supertenant/superbrain")["superbrain"],superconsts=require("@supertenant/superconsts"),getOrCreateTask=require("../../taskManager")["getOrCreateTask"],{getWaitPollInterval,getMysqlRejectActionResult}=require("../../actions"),dedupReportError=require("../../../logger")["dedupReportError"],DefaultErrorConstants={1317:"ER_QUERY_INTERRUPTED",2013:"ER_LOST_CONNECTION_DURING_QUERY"};let ErrorConstants={};Object.assign(ErrorConstants,DefaultErrorConstants);try{Object.assign(ErrorConstants,require("mysql/lib/protocol/constants/errors"))}catch(e){try{Object.assign(ErrorConstants,require("mysql2/lib/constants/errors"))}catch(ee){}}let isActive=!1;function instrumentMysql2(mysql){instrumentConnection(mysql.Connection.prototype,!0),mysql.Pool&&instrumentPool(mysql.Pool.prototype)}function instrumentMysql2WithPromises(mysql){instrumentPoolWithPromises(mysql),instrumentConnectionWithPromises(mysql.PromiseConnection.prototype)}function instrumentPool(Pool){shimmer.wrap(Pool,"getConnection",shimGetConnection)}function instrumentConnection(Connection,mysql2){shimmer.wrap(Connection,"addCommand",shimAddCommand),shimmer.wrap(Connection,"query",shimQuery),mysql2&&shimmer.wrap(Connection,"execute",shimExecute)}function instrumentPoolWithPromises(mysql){shimmer.wrap(mysql,"createPool",original=>function(){var Pool=original.apply(this,arguments),poolPrototype=Object.getPrototypeOf(Pool);return shimmer.wrap(poolPrototype,"getConnection",shimPromiseConnection),shimmer.wrap(poolPrototype,"query",shimPromiseQuery),shimmer.wrap(poolPrototype,"execute",shimPromiseExecute),Pool})}function instrumentConnectionWithPromises(Connection){shimmer.wrap(Connection,"query",shimPromiseQuery),shimmer.wrap(Connection,"execute",shimPromiseExecute)}function shimAddCommand(original){return function(){return"Execute"!==arguments[0].constructor.name&&"Query"!==arguments[0].constructor.name||!this._st_openSpanResult?original.apply(this,arguments):(callbackHandleAction(this._st_openSpanResult,this,original,arguments,this._st_onResult),arguments[0])}}function shimQuery(original){return function(){return cls.skipExitTracing({isActive:isActive})?original.apply(this,arguments):instrumentedAccessFunction(this,original,arguments[0],arguments[1],arguments[2])}}function shimExecute(original){return function(){return cls.skipExitTracing({isActive:isActive})?original.apply(this,arguments):instrumentedAccessFunction(this,original,arguments[0],arguments[1],arguments[2])}}function shimPromiseQuery(originalQuery){return function(){return cls.skipExitTracing({isActive:isActive})?originalQuery.apply(this,arguments):instrumentedAccessFunction(this,originalQuery,arguments[0],arguments[1],null,!0)}}function shimPromiseExecute(originalExecute){return function(){return cls.skipExitTracing({isActive:isActive})?originalExecute.apply(this,arguments):instrumentedAccessFunction(this,originalExecute,arguments[0],arguments[1],null,!0)}}function rejectToError(rejectActionResult){var err=new Error(rejectActionResult.sqlMessage);return err.code=ErrorConstants[rejectActionResult.errno],err.errno=rejectActionResult.errno,err.sqlState=rejectActionResult.sqlState,err.sqlMessage=rejectActionResult.sqlMessage,err}function promiseCallOriginal(span,openSpanResult,ctx,originalFunction,originalArgs){originalFunction=originalFunction.apply(ctx,originalArgs);return originalFunction.then(result=>(span.d=Date.now()-span.ts,span.transmit(),null!=openSpanResult&&superbrain.closeSpan(openSpanResult.spanId,{}),result)).catch(error=>{var closeSpanData;return span.ec=1,span.data.mysql.error=tracingUtil.getErrorDetails(error),span.d=Date.now()-span.ts,span.transmit(),null!=openSpanResult&&((closeSpanData={})[superconsts.Label.SupertenantError]="true",superbrain.closeSpan(openSpanResult.spanId,closeSpanData)),error}),originalFunction}function promiseHandleAction(span,openSpanResult,ctx,originalFunction,originalArgs,firstCall=!0){let actionRef;if((actionRef=firstCall?superbrain.getAction(openSpanResult.action):superbrain.pollSpanAction(openSpanResult.openSpanResult)).Action===superconsts.Action.Execute)return promiseCallOriginal(span,openSpanResult,ctx,originalFunction,originalArgs);if(actionRef.Action!==superconsts.Action.Wait)return actionRef.Action===superconsts.Action.Reject?Promise.reject(rejectToError(getMysqlRejectActionResult(actionRef))):(dedupReportError("httpServer:UNKNOWN_ACTION","received unknown action ID",actionRef),promiseCallOriginal(span,openSpanResult,ctx,originalFunction,originalArgs));{let pollInterval=getWaitPollInterval(actionRef);return new Promise(resolve=>setTimeout(resolve,pollInterval).unref()).then(cls.ns.bind(()=>promiseHandleAction(span,openSpanResult,ctx,originalFunction,originalArgs,!1)))}}function callbackHandleAction(openSpanResult,ctx,originalFunction,originalArgs,resultCallback){var pollInterval,actionRef=superbrain.pollSpanAction(openSpanResult.openSpanResult);actionRef.Action===superconsts.Action.Execute?openSpanResult.canceled||(openSpanResult.executed=!0,originalFunction.apply(ctx,originalArgs)):actionRef.Action===superconsts.Action.Wait?(pollInterval=getWaitPollInterval(actionRef),setTimeout(cls.ns.bind(function(){callbackHandleAction(openSpanResult,ctx,originalFunction,originalArgs,resultCallback)}),pollInterval).unref()):actionRef.Action===superconsts.Action.Reject?(resultCallback(rejectToError(getMysqlRejectActionResult(actionRef))),originalArgs[0]instanceof EventEmitter&&originalArgs[0].emit("end")):(dedupReportError("httpServer:UNKNOWN_ACTION","received unknown action ID",actionRef),originalFunction.apply(ctx,originalArgs))}function connectionConfigFromCtx(ctx){return null!=ctx.connection?ctx.connection.config:null!=ctx.config?ctx.config:null!=ctx.pool&&null!=ctx.pool.config?ctx.pool.config:(dedupReportError("mysql:NO_CONNECTION_CONFIG","failed to find connection config",ctx),null)}function instrumentedAccessFunction(ctx,originalFunction,statementOrOpts,valuesOrCallback,optCallback,isPromiseImpl){const originalArgs=[statementOrOpts,valuesOrCallback];void 0!==optCallback&&originalArgs.push(optCallback);let host,port,user,db;valuesOrCallback=connectionConfigFromCtx(ctx);return valuesOrCallback&&(db=(valuesOrCallback.connectionConfig?(host=valuesOrCallback.connectionConfig.host,port=valuesOrCallback.connectionConfig.port,user=valuesOrCallback.connectionConfig.user,valuesOrCallback.connectionConfig):(host=valuesOrCallback.host,port=valuesOrCallback.port,user=valuesOrCallback.user,valuesOrCallback)).database),cls.ns.runAndReturn(()=>{const span=cls.startSpan(exports.spanName,constants.EXIT);span.b={s:1},span.stack=tracingUtil.getStackTrace(instrumentedAccessFunction);var spanData={stmt:tracingUtil.shortenDatabaseStatement("string"==typeof statementOrOpts?statementOrOpts:statementOrOpts.sql),host:host,port:port,user:user,db:db};span.data.mysql=spanData;let openSpanResult=null;var stSpanLabels,stTaskId=getOrCreateTask();if(0!==stTaskId&&((stSpanLabels={})[superconsts.Label.SupertenantResourceType]=superconsts.ResourceType.Mysql,stSpanLabels[superconsts.Label.IntegrationModuleResourceId]=host,stSpanLabels[superconsts.Label.DbDatabase]=db,stSpanLabels[superconsts.Label.DbHost]=host,stSpanLabels[superconsts.Label.DbPort]=port,stSpanLabels[superconsts.Label.DbUser]=user,stSpanLabels[superconsts.Label.DbStatement]=spanData.stmt,openSpanResult=superbrain.openSpan(stTaskId,superconsts.SpanType.ClientRequest,stSpanLabels)),isPromiseImpl)return null!=openSpanResult?promiseHandleAction(span,openSpanResult,ctx,originalFunction,originalArgs):promiseCallOriginal(span,null,ctx,originalFunction,originalArgs);let originalCallback;function onResult(error){var stSpanData={};if(error&&(span.ec=1,span.data.mysql.error=tracingUtil.getErrorDetails(error),stSpanData[superconsts.Label.SupertenantError]="true"),span.d=Date.now()-span.ts,span.transmit(),null!=openSpanResult&&(openSpanResult.executed||(openSpanResult.canceled=!0,stSpanData[superconsts.Label.SupertenantCanceled]="true"),superbrain.closeSpan(openSpanResult.spanId,stSpanData)),originalCallback)return originalCallback.apply(this,arguments)}return"function"==typeof statementOrOpts._callback?(originalCallback=cls.ns.bind(statementOrOpts._callback),statementOrOpts._callback=onResult):("function"==typeof originalArgs[originalArgs.length-1]&&(originalCallback=cls.ns.bind(originalArgs[originalArgs.length-1])),originalArgs[originalArgs.length-1]=onResult),ctx._st_openSpanResult=openSpanResult,ctx._st_onResult=onResult,originalFunction.apply(ctx,originalArgs)})}function shimGetConnection(original){return function(cb){return original.call(this,cls.ns.bind(cb))}}function shimPromiseConnection(original){return function(){return original.apply(this,arguments).then(connection=>(shimmer.wrap(connection,"query",shimPromiseQuery),shimmer.wrap(connection,"execute",shimPromiseExecute),connection))}}exports.spanName="mysql",exports.batchable=!0,exports.init=function(){requireHook.onModuleLoad("mysql2",instrumentMysql2),requireHook.onModuleLoad("mysql2/promise",instrumentMysql2WithPromises)},exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1};