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 util=require("util"),shimmer=require("shimmer");let logger;logger=require("../../../logger").getLogger("tracing/grpc",newLogger=>{logger=newLogger});const requireHook=require("../../../util/requireHook"),tracingUtil=require("../../tracingUtil"),constants=require("../../constants"),cls=require("../../cls");let Metadata,isActive=!1;const typeUnary="unary",typeServerStream="server_stream",typeClientStream="client_stream",typeBidi="bidi",addressRegex=/^(.*):(\d+)$/,supportedTypes=[typeUnary,typeServerStream,typeClientStream,typeBidi],typesWithCallback=[typeUnary,typeClientStream],typesWithCallEnd=[typeServerStream,typeBidi];function instrumentGrpc(grpc){Metadata=grpc.Metadata}function instrumentServer(serverModule){shimmer.wrap(serverModule.Server.prototype,"register",shimServerRegister)}function shimServerRegister(originalFunction){return function(name,handler,serialize,deserialize,type){if(supportedTypes.indexOf(type)<0)return logger.warn(`Failed to instrument GRPC entry ${name}, type is unsupported: `+type),originalFunction.apply(this,arguments);var originalArgs=new Array(arguments.length);for(let i=0;i<arguments.length;i++)originalArgs[i]=arguments[i];var originalHandler=originalArgs[1];return originalArgs[1]=createInstrumentedServerHandler(name,type,originalHandler),originalFunction.apply(this,originalArgs)}}function createInstrumentedServerHandler(name,type,originalHandler){return function(call){const originalThis=this,originalArgs=arguments;var parentSpan=cls.getCurrentSpan();return parentSpan?(logger.warn("Cannot start a GRPC entry span when another span is already active. Currently, the following span is active: "+JSON.stringify(parentSpan)),originalHandler.apply(originalThis,originalArgs)):cls.ns.runAndReturn(()=>{var metadata=call.metadata,level=readMetadata(metadata,constants.traceLevelHeaderName);if("0"===level&&cls.setTracingLevel("0"),isActive&&!cls.tracingSuppressed()){cls.ns.bindEmitter(call);level=readMetadata(metadata,constants.traceIdHeaderName),metadata=readMetadata(metadata,constants.spanIdHeaderName);const span=cls.startSpan("rpc-server",constants.ENTRY,level,metadata);if(span.data.rpc={call:dropLeadingSlash(name),flavor:"grpc"},0<=typesWithCallback.indexOf(type)){const originalCallback=originalArgs[1];originalArgs[1]=cls.ns.bind(function(err){return err&&(span.ec=1,err.message||err.details)&&(span.data.rpc.error=err.message||err.details),span.d=Date.now()-span.ts,span.transmit(),originalCallback.apply(this,arguments)})}if(0<=typesWithCallEnd.indexOf(type)){const originalEnd=call.end;call.end=function(){return span.d=Date.now()-span.ts,process.nextTick(()=>{span.transmit()}),originalEnd.apply(this,arguments)},call.on("error",err=>{span.ec=1,(err.message||err.details)&&(span.data.rpc.error=err.message||err.details)}),call.on("cancelled",()=>{span.d=Date.now()-span.ts,span.transmit()})}}return originalHandler.apply(originalThis,originalArgs)})}}function instrumentClient(clientModule){shimmer.wrap(clientModule,"makeClientConstructor",instrumentedMakeClientConstructor.bind(null,clientModule))}function instrumentedMakeClientConstructor(clientModule,originalFunction){return function(methods){function InstrumentedServiceClient(addressString){return(addressString=addressRegex.exec(addressString))&&3===addressString.length&&(address.host=addressString[1],address.port=addressString[2]),ServiceClient.apply(this,arguments)}const address={host:void 0,port:void 0},ServiceClient=originalFunction.apply(this,arguments);return copyAttributes(ServiceClient,InstrumentedServiceClient),InstrumentedServiceClient.prototype=Object.create(ServiceClient.prototype),InstrumentedServiceClient.prototype.constructor=InstrumentedServiceClient,Object.keys(methods).forEach(name=>{var methodDefinition=methods[name],rpcPath=methodDefinition.path,rpcPath=shimClientMethod.bind(null,address,rpcPath,methodDefinition.requestStream,methodDefinition.responseStream);shimmer.wrap(InstrumentedServiceClient.prototype,name,rpcPath),methodDefinition.originalName&&shimmer.wrap(InstrumentedServiceClient.prototype,methodDefinition.originalName,rpcPath)}),util.inherits(InstrumentedServiceClient,clientModule.Client),InstrumentedServiceClient}}function shimClientMethod(address,rpcPath,requestStream,responseStream,originalFunction){return copyAttributes(originalFunction,function(){var originalArgs=new Array(arguments.length);for(let i=0;i<arguments.length;i++)originalArgs[i]=arguments[i];var skipTracingResponse=cls.skipExitTracing({isActive:isActive,extendedResponse:!0});return skipTracingResponse.skip?(skipTracingResponse.suppressed&&modifyArgs(originalArgs),originalFunction.apply(this,originalArgs)):instrumentedClientMethod(this,originalFunction,originalArgs,address,rpcPath,requestStream,responseStream)})}function instrumentedClientMethod(ctx,originalFunction,originalArgs,address,rpcPath,requestStream,responseStream){return cls.ns.runAndReturn(()=>{const span=cls.startSpan("rpc-client",constants.EXIT);span.ts=Date.now(),span.stack=tracingUtil.getStackTrace(instrumentedClientMethod),span.data.rpc={host:address.host,port:address.port,call:dropLeadingSlash(rpcPath),flavor:"grpc"},modifyArgs(originalArgs,span,responseStream);var call=originalFunction.apply(ctx,originalArgs);return(requestStream||responseStream)&&cls.ns.bindEmitter(call),responseStream&&(call.on("end",()=>{span.d=Date.now()-span.ts,span.transmit()}),call.on("error",err=>{span.d=Date.now()-span.ts;err=err.details||err.message;"Cancelled"!==err&&(span.ec=1,err)&&(span.data.rpc.error=err),span.transmit()})),call})}function modifyArgs(originalArgs,span,responseStream){let metadataIndex=-1,optionsIndex=-1,callbackIndex=-1;for(let i=originalArgs.length-1;0<=i;i--)originalArgs[i]&&originalArgs[i].constructor&&"Metadata"===originalArgs[i].constructor.name?metadataIndex=i:responseStream||"function"!=typeof originalArgs[i]?0<i&&"object"==typeof originalArgs[i]&&(optionsIndex=i):callbackIndex=i;if(span&&0<=callbackIndex){const originalCallback=originalArgs[callbackIndex];originalArgs[callbackIndex]=cls.ns.bind(function(err){span.d=Date.now()-span.ts,err&&"Cancelled"!==(err=err.details||err.message)&&(span.ec=1,err)&&(span.data.rpc.error=err),span.transmit(),originalCallback.apply(this,arguments)})}let metadata;0<=metadataIndex?metadata=originalArgs[metadataIndex]:Metadata&&0<=optionsIndex?(metadata=new Metadata,originalArgs.splice(optionsIndex,0,metadata)):Metadata&&0<=callbackIndex?(metadata=new Metadata,originalArgs.splice(callbackIndex,0,metadata)):Metadata&&(metadata=new Metadata,originalArgs.push(metadata)),span&&metadata?(metadata.set(constants.spanIdHeaderName,span.s),metadata.set(constants.traceIdHeaderName,span.t),metadata.set(constants.traceLevelHeaderName,"1")):metadata&&metadata.set(constants.traceLevelHeaderName,"0")}function readMetadata(metadata,key){metadata=metadata.get(key);return metadata&&0<metadata.length?metadata[0]:null}function dropLeadingSlash(rpcPath){return"string"==typeof rpcPath?"/"===rpcPath[0]?rpcPath.substr(1):rpcPath:"unknown"}function copyAttributes(from,to){return Object.keys(from).forEach(attribute=>{to[attribute]=from[attribute]}),to}exports.init=function(){requireHook.onModuleLoad("grpc",instrumentGrpc),requireHook.onFileLoad(/\/grpc\/src\/server\.js/,instrumentServer),requireHook.onFileLoad(/\/grpc\/src\/client\.js/,instrumentClient)},exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1};