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    
@supertenant/core / src / tracing / instrumentation / database / elasticsearchModern.js
Size: Mime:
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
"use strict";const url=require("url"),shimmer=require("shimmer"),requireHook=require("../../../util/requireHook"),tracingUtil=require("../../tracingUtil"),constants=require("../../constants"),cls=require("../../cls");let logger;logger=require("../../../logger").getLogger("tracing/elasticsearch",newLogger=>{logger=newLogger});const methodToActionRegex=/^(\w+?)(?:Api)?\.(?:.+) \[as (\w+)\]$/,endpointToIdRegex=/^\/[^/]+\/_doc\/([^/]+)$/;let isActive=!1;exports.spanName="elasticsearch",exports.batchable=!0,exports.init=function(){requireHook.onModuleLoad("@elastic/elasticsearch",instrument)};let parsedConnectionUrl;function instrument(es,esModuleFilename){if(es.SniffingTransport){const OriginalClient=es.Client;es.Client=function(){var client=new OriginalClient(...arguments);if(client.connectionPool&&client.connectionPool.connections&&0<client.connectionPool.connections.length){var connectionString=client.connectionPool.connections[0].url;try{parsedConnectionUrl=new URL(connectionString)}catch(parseErrr){}}return client},instrumentTransport(es)}else{esModuleFilename=tracingUtil.requireModuleFromApplicationUnderMonitoringSafely(esModuleFilename,"..","api");isConstructor(esModuleFilename)?instrumentTransport(es):instrumentApiLayer(es,esModuleFilename)}}function instrumentApiLayer(es,ESAPI){const OriginalClient=es.Client;if(OriginalClient&&"function"==typeof OriginalClient){const actionPaths=[];forEachApiAction(ESAPI,actionPath=>{actionPaths.push(actionPath)}),es.Client=function(){const client=new OriginalClient(...arguments),clusterInfo={};return gatherClusterInfo(client,clusterInfo),actionPaths.forEach(actionPath=>{instrumentApi(client,actionPath,clusterInfo)}),client}}}function gatherClusterInfo(client,clusterInfo){client.info().then(_clusterInfo=>{_clusterInfo&&_clusterInfo.body&&(clusterInfo.clusterName=_clusterInfo.body.cluster_name)},()=>{setTimeout(()=>{gatherClusterInfo(client,clusterInfo)},6e4).unref()})}function instrumentApi(client,actionPath,clusterInfo){const action=actionPath.join(".");var parent=getParentByPath(action,client,actionPath);const originalFunction=getByPath(action,client,actionPath);parent&&"function"==typeof originalFunction&&(parent[actionPath[actionPath.length-1]]=function(params,options,originalCallback){if(cls.skipExitTracing({isActive:isActive}))return originalFunction.apply(this,arguments);let callbackIndex="function"==typeof originalCallback?2:-1;"function"==typeof(options=options||{})&&(originalCallback=options,options={},callbackIndex=1),"function"!=typeof params&&null!=params||(originalCallback=params,params={},options={},callbackIndex=0);const ctx=this,originalArgs=new Array(arguments.length);for(let i=0;i<arguments.length;i++)originalArgs[i]=arguments[i];return cls.ns.runAndReturn(()=>{const span=cls.startSpan(exports.spanName,constants.EXIT);if(span.data.elasticsearch={action:action,cluster:clusterInfo.clusterName},processParams(span,params),0<=callbackIndex)return originalArgs[callbackIndex]=cls.ns.bind(function(error,result){return error?onError(span,error):onSuccess(span,result),originalCallback.apply(this,arguments)}),originalFunction.apply(ctx,originalArgs);try{return originalFunction.apply(ctx,originalArgs).then(onSuccess.bind(null,span),error=>{throw onError(span,error),error})}catch(e){throw e}})})}function onSuccess(span,result){var hits=result.body&&result.body.hits||result.hits,responses=result.body&&result.body.responses||result.responses;return null!=hits&&null!=hits.total?"number"==typeof hits.total?span.data.elasticsearch.hits=hits.total:"number"==typeof hits.total.value&&(span.data.elasticsearch.hits=hits.total.value):null!=responses&&Array.isArray(responses)&&(span.data.elasticsearch.hits=responses.reduce((h,res)=>res.hits&&"number"==typeof res.hits.total?h+res.hits.total:res.hits&&res.hits.total&&"number"==typeof res.hits.total.value?h+res.hits.total.value:h,0)),parseConnectionFromResult(span,result),span.d=Date.now()-span.ts,span.transmit(),result}function onError(span,error){span.d=Date.now()-span.ts,span.ec=1,error&&(span.data.elasticsearch.error=tracingUtil.getErrorDetails(error)),error.meta&&error.meta.meta&&parseConnectionFromResult(span,error.meta),span.transmit()}function parseConnectionFromResult(span,result){!span.data.elasticsearch.cluster&&!span.data.elasticsearch.address&&result.meta&&result.meta.connection?(result=result.meta.connection.url)&&result instanceof url.URL&&(span.data.elasticsearch.address=result.hostname,span.data.elasticsearch.port=result.port):parsedConnectionUrl&&(span.data.elasticsearch.address=parsedConnectionUrl.hostname,span.data.elasticsearch.port=parsedConnectionUrl.port)}function processParams(span,params){var action=span.data.elasticsearch.action,body=params&&params.body||params&&params.bulkBody;"mget"===action&&body&&body.docs&&Array.isArray(body.docs)?getSpanDataFromMget1(span,body.docs):"mget"===action&&body&&body.ids&&Array.isArray(body.ids)?getSpanDataFromMget2(span,params):"msearch"===action&&Array.isArray(body)?getSpanDataFromMsearch(span,body):(span.data.elasticsearch.index=toStringEsMultiParameter(params.index),span.data.elasticsearch.type=toStringEsMultiParameter(params.type),span.data.elasticsearch.id=params.id,action&&0===action.indexOf("search")&&(span.data.elasticsearch.query=tracingUtil.shortenDatabaseStatement(JSON.stringify(params))))}function toStringEsMultiParameter(param){if(null!=param)return"string"==typeof param?""===param?"_all":param:Array.isArray(param)?param.join(","):JSON.stringify(param)}function getSpanDataFromMget1(span,docs){var indices=[],types=[],ids=[];for(let i=0;i<docs.length;i++)collectParamFrom(docs[i],"_index",indices),collectParamFrom(docs[i],"_type",types),collectParamFrom(docs[i],"_id",ids);span.data.elasticsearch.index=0<indices.length?indices.join(","):void 0,span.data.elasticsearch.type=0<types.length?types.join(","):void 0,span.data.elasticsearch.id=0<ids.length?ids.join(","):void 0}function getSpanDataFromMget2(span,params){var body;params&&(body=params&&params.body||params&&params.bulkBody,span.data.elasticsearch.index=params.index?toStringEsMultiParameter(params.index):void 0,span.data.elasticsearch.type=params.index?toStringEsMultiParameter(params.type):void 0,span.data.elasticsearch.id=body&&0<body.ids.length?body.ids.join(","):void 0)}function getSpanDataFromMsearch(span,body){var indices=[],types=[],query=[];for(let i=0;i<body.length;i++)collectParamFrom(body[i],"index",indices),collectParamFrom(body[i],"type",types),collectParamFrom(body[i],"query",query);span.data.elasticsearch.index=0<indices.length?indices.join(","):void 0,span.data.elasticsearch.type=0<types.length?types.join(","):void 0,span.data.elasticsearch.query=0<query.length?tracingUtil.shortenDatabaseStatement(query.join(",")):void 0}function collectParamFrom(bodyItem,key,accumulator){bodyItem&&bodyItem[key]&&null!=(bodyItem=toStringEsMultiParameter(bodyItem[key]))&&accumulator.indexOf(bodyItem)<0&&accumulator.push(bodyItem)}function instrumentTransport(es){es.Transport&&es.Transport.prototype?shimmer.wrap(es.Transport.prototype,"request",shimRequest):logger.error("Cannot instrument @elastic/elasticsearch. Either es.Transport or es.Transport.prototype does not exist.")}function shimRequest(esReq){return function(){if(cls.skipExitTracing({isActive:isActive}))return esReq.apply(this,arguments);var originalArgs=new Array(arguments.length);for(let i=0;i<arguments.length;i++)originalArgs[i]=arguments[i];return instrumentedRequest(this,esReq,originalArgs)}}function instrumentedRequest(ctx,origEsReq,originalArgs){let params=originalArgs[0]||{};var options=originalArgs[1];let callbackIndex=2,originalCallback=originalArgs[callbackIndex];"function"!=typeof originalCallback&&("function"==typeof options?(callbackIndex=1,originalCallback=originalArgs[callbackIndex]):"function"==typeof params?(callbackIndex=0,originalCallback=originalArgs[callbackIndex],params={}):(callbackIndex=-1,originalCallback=null));const httpPath=params.path;return cls.ns.runAndReturn(()=>{const span=cls.startSpan(exports.spanName,constants.EXIT);span.data.elasticsearch={endpoint:httpPath},findActionInStack(span),processParams(span,params),parseIdFromPath(span,httpPath);var q=params.querystring;if(q&&("string"==typeof q?span.data.elasticsearch.query=tracingUtil.shortenDatabaseStatement(q):"object"==typeof q&&0<Object.keys(q).length&&(span.data.elasticsearch.query=tracingUtil.shortenDatabaseStatement(JSON.stringify(q)))),0<=callbackIndex)return originalArgs[callbackIndex]=cls.ns.bind(function(error,result){return error?onError(span,error):onSuccess(span,result),originalCallback.apply(this,arguments)}),origEsReq.apply(ctx,originalArgs);try{return origEsReq.apply(ctx,originalArgs).then(onSuccess.bind(null,span),error=>{throw onError(span,error),error})}catch(e){throw e}})}function findActionInStack(span){var esApiFrames,matchResult;span.stack&&0!==(esApiFrames=span.stack.filter(frame=>frame.c&&frame.c.includes("/api"))).length&&(esApiFrames=esApiFrames[esApiFrames.length-1].m)&&((matchResult=methodToActionRegex.exec(esApiFrames))?"Client"===matchResult[1]?span.data.elasticsearch.action=""+matchResult[2].toLowerCase():span.data.elasticsearch.action=matchResult[1].toLowerCase()+"."+matchResult[2].toLowerCase():span.data.elasticsearch.action=esApiFrames)}function parseIdFromPath(span,httpPath){httpPath&&(httpPath=endpointToIdRegex.exec(httpPath))&&(span.data.elasticsearch.id=httpPath[1])}function forEachApiAction(ESAPI,fn){forEachKeyRecursive(ESAPI({makeRequest:function(){},ConfigurationError:function(){},result:{}}),[],fn)}function forEachKeyRecursive(obj,path,fn){if(!obj||"object"!=typeof obj)return!1;let hadSubKeys;return Object.keys(obj).forEach(key=>{var nextPath=path.concat(key);(hadSubKeys=forEachKeyRecursive(obj[key],nextPath,fn))||fn(nextPath)}),!0}function getByPath(action,obj,path){return 0===path.length?obj:getByPath(action,obj[path[0]],path.slice(1))}function getParentByPath(action,obj,path){return 1===path.length?obj:getParentByPath(action,obj[path[0]],path.slice(1))}function isConstructor(ESAPI){return ESAPI&&"function"==typeof ESAPI.toString&&ESAPI.toString().includes("this[")}exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1};