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 requireHook=require("../../../util/requireHook"),tracingUtil=require("../../tracingUtil"),constants=require("../../constants"),cls=require("../../cls");let isActive=!1;function instrument(es){const OriginalClient=es.Client;OriginalClient&&"function"==typeof OriginalClient&&(es.Client=function(){var client=OriginalClient.apply(OriginalClient,arguments),clusterInfo={};return gatherClusterInfo(client,clusterInfo),instrumentApi(client,["search"],clusterInfo),instrumentApi(client,["index"],clusterInfo),instrumentApi(client,["indices","refresh"],clusterInfo),instrumentApi(client,["get"],clusterInfo),instrumentApi(client,["msearch"],clusterInfo),instrumentApi(client,["mget"],clusterInfo),client},Object.keys(OriginalClient).forEach(key=>{es.Client[key]=OriginalClient[key]}))}function gatherClusterInfo(client,clusterInfo){client.info().then(_clusterInfo=>{clusterInfo.clusterName=_clusterInfo.cluster_name},()=>{setTimeout(()=>{gatherClusterInfo(client,clusterInfo)},3e4).unref()})}function instrumentApi(client,actionPath,clusterInfo){const action=actionPath.join(".");var parent=2===actionPath.length?client[actionPath[0]]:client;const originalFunction=2===actionPath.length?client[actionPath[0]][actionPath[1]]:client[actionPath[0]];"function"==typeof originalFunction&&(parent[actionPath[actionPath.length-1]]=function instrumentedAction(params,cb){if(cls.skipExitTracing({isActive:isActive}))return originalFunction.apply(this,arguments);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.stack=tracingUtil.getStackTrace(instrumentedAction),span.data.elasticsearch={action:action,cluster:clusterInfo.clusterName},"mget"===action&¶ms.body&¶ms.body.docs&&Array.isArray(params.body.docs)?getSpanDataFromMget1(span,params.body.docs):"mget"===action&¶ms.body&¶ms.body.ids&&Array.isArray(params.body.ids)?getSpanDataFromMget2(span,params):"msearch"===action&&Array.isArray(params.body)?getSpanDataFromMsearch(span,params.body):(span.data.elasticsearch.index=toStringEsMultiParameter(params.index),span.data.elasticsearch.type=toStringEsMultiParameter(params.type),span.data.elasticsearch.stats=toStringEsMultiParameter(params.stats),span.data.elasticsearch.id=params.id,0===action.indexOf("search")&&(span.data.elasticsearch.query=tracingUtil.shortenDatabaseStatement(JSON.stringify(params)))),2===originalArgs.length)return originalArgs[1]=cls.ns.bind(function(error,response){return error?onError(span,error):onSuccess(span,response),cb.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,response){return null!=response.hits&&null!=response.hits.total?"number"==typeof response.hits.total?span.data.elasticsearch.hits=response.hits.total:"number"==typeof response.hits.total.value&&(span.data.elasticsearch.hits=response.hits.total.value):null!=response.responses&&Array.isArray(response.responses)&&(span.data.elasticsearch.hits=response.responses.reduce((hits,res)=>res.hits&&"number"==typeof res.hits.total?hits+res.hits.total:res.hits&&res.hits.total&&"number"==typeof res.hits.total.value?hits+res.hits.total.value:hits,0)),span.d=Date.now()-span.ts,span.transmit(),response}function onError(span,error){span.d=Date.now()-span.ts,span.ec=1,error&&(span.data.elasticsearch.error=tracingUtil.getErrorDetails(error)),span.transmit()}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=[],stats=[],ids=[];for(let i=0;i<docs.length;i++)collectParamFrom(docs[i],"_index",indices),collectParamFrom(docs[i],"_type",types),collectParamFrom(docs[i],"_stats",stats),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.stats=0<stats.length?stats.join(","):void 0,span.data.elasticsearch.id=0<ids.length?ids.join(","):void 0}function getSpanDataFromMget2(span,params){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.stats=params.index?toStringEsMultiParameter(params.stats):void 0,span.data.elasticsearch.id=0<params.body.ids.length?params.body.ids.join(","):void 0}function getSpanDataFromMsearch(span,body){var indices=[],types=[],stats=[],query=[];for(let i=0;i<body.length;i++)collectParamFrom(body[i],"index",indices),collectParamFrom(body[i],"type",types),collectParamFrom(body[i],"stats",stats),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.stats=0<stats.length?stats.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)}exports.spanName="elasticsearch",exports.batchable=!0,exports.init=function(){requireHook.onModuleLoad("elasticsearch",instrument)},exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1};