Repository URL to install this package:
|
Version:
0.7.10 ▾
|
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
"use strict";const http2=require("http2"),cls=require("../../cls"),constants=require("../../constants"),{getExtraHeadersCaseInsensitive,mergeExtraHeadersFromNormalizedObjectLiteral}=require("./captureHttpHeadersUtil"),readSymbolProperty=require("../../../util/readSymbolProperty"),{sanitizeUrl,splitAndFilter}=require("../../../util/url");let extraHttpHeadersToCapture,isActive=!1;const originS="Symbol(origin)",sentHeadersS="Symbol(sent-headers)",HTTP2_HEADER_METHOD=http2.constants.HTTP2_HEADER_METHOD,HTTP2_HEADER_PATH=http2.constants.HTTP2_HEADER_PATH,HTTP2_HEADER_STATUS=http2.constants.HTTP2_HEADER_STATUS;function instrument(coreModule){const originalConnect=coreModule.connect;coreModule.connect=function(){var clientHttp2Session=originalConnect.apply(this,arguments);return instrumentClientHttp2Session(clientHttp2Session),clientHttp2Session}}function instrumentClientHttp2Session(clientHttp2Session){const originalRequest=clientHttp2Session.request;clientHttp2Session.request=function(headers){let w3cTraceContext=cls.getW3cTraceContext();var skipTracingResult=cls.skipExitTracing({isActive:isActive,extendedResponse:!0,skipParentSpanCheck:!0}),parentSpan=cls.getCurrentSpan()||cls.getReducedSpan();if(skipTracingResult.skip||!parentSpan||constants.isExitSpan(parentSpan))return skipTracingResult.suppressed&&addTraceLevelHeader(headers,"0",w3cTraceContext),originalRequest.apply(this,arguments);const originalThis=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("node.http.client",constants.EXIT);w3cTraceContext=cls.getW3cTraceContext(),addHeaders(headers,span,w3cTraceContext);var stream=originalRequest.apply(originalThis,originalArgs),origin=readSymbolProperty(stream,originS),reqHeaders=readSymbolProperty(stream,sentHeadersS);let capturedHeaders=getExtraHeadersCaseInsensitive(reqHeaders,extraHttpHeadersToCapture),method,path,status;reqHeaders&&(method=reqHeaders[HTTP2_HEADER_METHOD],path=reqHeaders[HTTP2_HEADER_PATH]),method=method||"GET",path=path||"/";var reqHeaders=sanitizeUrl(path),params=splitAndFilter(path);return span.data.http={method:method,url:origin+reqHeaders,params:params},stream.on("response",resHeaders=>{status=resHeaders[HTTP2_HEADER_STATUS],capturedHeaders=mergeExtraHeadersFromNormalizedObjectLiteral(capturedHeaders,resHeaders,extraHttpHeadersToCapture)}),stream.on("end",()=>{span.d=Date.now()-span.ts,span.ec=500<=status?1:0,span.data.http.status=status,capturedHeaders&&(span.data.http.header=capturedHeaders),span.transmit()}),stream})}}function addTraceLevelHeader(headers,level,w3cTraceContext){headers&&(headers[constants.traceLevelHeaderName]=level,addW3cHeaders(headers,w3cTraceContext))}function addHeaders(headers,span,w3cTraceContext){headers&&(headers[constants.spanIdHeaderName]=span.s,headers[constants.traceIdHeaderName]=span.t,headers[constants.traceLevelHeaderName]="1",addW3cHeaders(headers,w3cTraceContext))}function addW3cHeaders(headers,w3cTraceContext){w3cTraceContext&&(headers[constants.w3cTraceParent]=w3cTraceContext.renderTraceParent(),w3cTraceContext.hasTraceState())&&(headers[constants.w3cTraceState]=w3cTraceContext.renderTraceState())}exports.init=function(config){instrument(http2),extraHttpHeadersToCapture=config.tracing.http.extraHttpHeadersToCapture},exports.updateConfig=config=>{extraHttpHeadersToCapture=config.tracing.http.extraHttpHeadersToCapture},exports.activate=function(extraConfig){extraConfig&&extraConfig.tracing&&extraConfig.tracing.http&&Array.isArray(extraConfig.tracing.http.extraHttpHeadersToCapture)&&(extraHttpHeadersToCapture=extraConfig.tracing.http.extraHttpHeadersToCapture),isActive=!0},exports.deactivate=function(){isActive=!1};