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 cls=require("../../cls"),EXIT=require("../../constants")["EXIT"],tracingUtil=require("../../tracingUtil"),shimmer=require("shimmer"),requireHook=require("../../../util/requireHook"),getFunctionArguments=require("../../../util/function_arguments")["getFunctionArguments"],operationsInfo={add:"add",set:"set",append:"append",prepend:"prepend",touch:"touch",replace:"replace",cas:"cas",incr:"incr",decr:"decr",get:"get",getMulti:"getMulti",gets:"gets",del:"delete",delete:"delete"},SPAN_NAME="memcached";let isActive=!1;function instrumentMemcached(Memcached){shimmer.wrap(Memcached.prototype,"command",shimCommand)}function shimCommand(originalCommand){return function(){var originalArgs;return cls.skipExitTracing({isActive:isActive})?originalCommand.apply(this,arguments):(originalArgs=getFunctionArguments(arguments),instrumentedCommand(this,originalCommand,originalArgs))}}function instrumentedCommand(ctx,originalCommand,originaCommandArgs){return cls.ns.runAndReturn(()=>{const originalQuery=originaCommandArgs[0],span=cls.startSpan(SPAN_NAME,EXIT);return span.ts=Date.now(),span.stack=tracingUtil.getStackTrace(instrumentedCommand),originaCommandArgs[0]=cls.ns.bind(function(){var originalQueryArgs=getFunctionArguments(arguments);const queryResult=originalQuery.apply(this,originalQueryArgs),originalCallback=queryResult.callback;return queryResult.callback=cls.ns.bind(function(){var originalCallbackArgs=getFunctionArguments(arguments),err=originalCallbackArgs[0];return span.data[SPAN_NAME]=buildSpanData(queryResult,ctx.servers),finishSpan(err,span),originalCallback.apply(this,originalCallbackArgs)}),queryResult}),originalCommand.apply(ctx,originaCommandArgs)})}function buildSpanData(queryResult,connections){var{type:queryResult,key,multi}=queryResult;let op=queryResult;multi&&"get"===queryResult&&(op="getMulti");multi=operationsInfo[op],queryResult={key:Array.isArray(key)?key.join(", "):key,connection:connections[0]};return multi&&(queryResult.operation=multi),queryResult}function finishSpan(err,span){err&&addErrorToSpan(err,span),span.d=Date.now()-span.ts,span.transmit()}function addErrorToSpan(err,span){err&&(span.ec=1,span=span.data&&span.data[SPAN_NAME])&&(span.error=err.message||err.code||JSON.stringify(err))}exports.isActive=function(){return isActive},exports.init=function(){requireHook.onModuleLoad("memcached",instrumentMemcached)},exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1};