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"),superbrain=require("@supertenant/superbrain")["superbrain"],superconsts=require("@supertenant/superconsts"),getOrCreateTask=require("../../taskManager")["getOrCreateTask"];let isActive=!0;function instrument(ioredis){shimmer.wrap(ioredis.prototype,"sendCommand",instrumentSendCommand),shimmer.wrap(ioredis.prototype,"multi",instrumentMultiCommand),shimmer.wrap(ioredis.prototype,"pipeline",instrumentPipelineCommand)}function instrumentSendCommand(original){return function(command){const client=this;var parentSpan=cls.getCurrentSpan();let callback;if(null==command.promise||"string"!=typeof command.name||cls.skipExitTracing({isActive:isActive,skipParentSpanCheck:!0}))return original.apply(this,arguments);if(!parentSpan||parentSpan.n!==exports.spanName||"multi"!==parentSpan.data.redis.command&&"pipeline"!==parentSpan.data.redis.command||"multi"===command.name){if(constants.isExitSpan(parentSpan))return original.apply(this,arguments)}else(parentSpan.data.redis.subCommands=parentSpan.data.redis.subCommands||[]).push(command.name);const argsForOriginal=arguments;return cls.ns.runAndReturn(()=>{const span=cls.startSpan(exports.spanName,constants.EXIT);span.data.redis={connection:client.options.host+":"+client.options.port,command:command.name.toLowerCase()};let openSpanResult=null;var stSpanData,stTaskId=getOrCreateTask();return 0!==stTaskId&&((stSpanData={})[superconsts.Label.SupertenantResourceType]=superconsts.ResourceType.Redis,stSpanData[superconsts.Label.IntegrationModuleResourceId]=client.options.host,stSpanData[superconsts.Label.DbDatabase]=client.options.db,stSpanData[superconsts.Label.DbHost]=client.options.host,stSpanData[superconsts.Label.DbPort]=client.options.port,stSpanData[superconsts.Label.DbCommand]=span.data.redis.command,openSpanResult=superbrain.openSpan(stTaskId,superconsts.SpanType.ClientRequest,stSpanData)),callback=cls.ns.bind(function(error){var stSpanData={};"multi"!==command.name&&(span.d=Date.now()-span.ts,error&&(span.ec=1,span.data.redis.error=error.message,stSpanData[superconsts.Label.SupertenantError]="true"),null!=openSpanResult&&superbrain.closeSpan(openSpanResult.spanId,stSpanData),span.transmit())}),command.promise.then(callback.bind(null,null),callback),original.apply(client,argsForOriginal)})}}function instrumentMultiCommand(original){return instrumentMultiOrPipelineCommand("multi",original)}function instrumentPipelineCommand(original){return instrumentMultiOrPipelineCommand("pipeline",original)}function instrumentMultiOrPipelineCommand(commandName,original){return function(){var parentSpan=cls.getCurrentSpan();if(cls.skipExitTracing({isActive:isActive,skipParentSpanCheck:!0})||constants.isExitSpan(parentSpan))return original.apply(this,arguments);var parentSpan=cls.ns.createContext(),span=(cls.ns.enter(parentSpan),cls.startSpan(exports.spanName,constants.EXIT));span.data.redis={connection:this.options.host+":"+this.options.port,command:commandName};let openSpanResult=null;var stSpanData,stTaskId=getOrCreateTask(),stTaskId=(0!==stTaskId&&((stSpanData={})[superconsts.Label.SupertenantResourceType]=superconsts.ResourceType.Redis,stSpanData[superconsts.Label.IntegrationModuleResourceId]=this.options.host,stSpanData[superconsts.Label.DbDatabase]=this.options.db,stSpanData[superconsts.Label.DbHost]=this.options.host,stSpanData[superconsts.Label.DbPort]=this.options.port,stSpanData[superconsts.Label.DbCommand]=span.data.redis.command,openSpanResult=superbrain.openSpan(stTaskId,superconsts.SpanType.ClientRequest,stSpanData)),original.apply(this,arguments));return shimmer.wrap(stTaskId,"exec",instrumentMultiOrPipelineExec.bind(null,parentSpan,commandName,span,openSpanResult)),stTaskId}}function instrumentMultiOrPipelineExec(clsContextForMultiOrPipeline,commandName,span,original,openSpanResult){const endCallback="pipeline"===commandName?pipelineCommandEndCallback:multiCommandEndCallback;return function(){span.ts=Date.now();var result=original.apply(this,arguments);return result.then&&result.then(results=>{endCallback.call(null,clsContextForMultiOrPipeline,span,null,results,openSpanResult)},error=>{endCallback.call(null,clsContextForMultiOrPipeline,span,error,[],openSpanResult)}),result}}function multiCommandEndCallback(clsContextForMultiOrPipeline,span,error,openSpanResult){var stSpanData={},subCommands=(span.d=Date.now()-span.ts,span.data.redis.subCommands);let commandCount=1;subCommands&&(subCommands.pop(),commandCount=subCommands.length),span.b={s:commandCount},error&&(span.ec=commandCount,span.data.redis.error=error.message,stSpanData[superconsts.Label.SupertenantError]="true"),null!=openSpanResult&&superbrain.closeSpan(openSpanResult.spanId,stSpanData),span.transmit(),cls.ns.exit(clsContextForMultiOrPipeline)}function pipelineCommandEndCallback(clsContextForMultiOrPipeline,span,error,results,openSpanResult){var stSpanData={},subCommands=(span.d=Date.now()-span.ts,span.data.redis.subCommands),subCommands=subCommands?subCommands.length:1;if(span.b={s:subCommands},error)span.ec=subCommands,span.data.redis.error=tracingUtil.getErrorDetails(error);else{let numberOfErrors=0,sampledError;for(let i=0;i<results.length;i++)results[i][0]&&(numberOfErrors+=1,sampledError=sampledError||results[i][0]);0<numberOfErrors&&(span.ec=numberOfErrors,span.data.redis.error=tracingUtil.getErrorDetails(sampledError))}span.data.redis.error&&(stSpanData[superconsts.Label.SupertenantError]="true"),null!=openSpanResult&&superbrain.closeSpan(openSpanResult.spanId,stSpanData),span.transmit(),cls.ns.exit(clsContextForMultiOrPipeline)}exports.spanName="redis",exports.batchable=!0,exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1},exports.init=function(){requireHook.onModuleLoad("ioredis",instrument)};