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/serverless / src / backend_connector.js
Size: Mime:
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
"use strict";const environmentUtil=require("./environment"),uninstrumented=require("./uninstrumentedHttp"),constants=require("./constants");let logger=require("./console_logger");const layerExtensionHostname="localhost",layerExtensionPort=7365;let useLambdaExtension=!1;const timeoutEnvVar="INSTANA_TIMEOUT";let defaultTimeout=500;const layerExtensionTimeout=300;let backendTimeout=defaultTimeout;const proxyEnvVar="INSTANA_ENDPOINT_PROXY";let proxyAgent,stopSendingOnFailure=!0,propagateErrorsUpstream=!1,requestHasFailed=!1,warningsHaveBeenLogged=!1;const disableCaCheckEnvVar="INSTANA_DISABLE_CA_CHECK",disableCaCheck="true"===process.env[disableCaCheckEnvVar];if(process.env[proxyEnvVar]&&!environmentUtil.sendUnencrypted){const proxyUrl=process.env[proxyEnvVar],HttpsProxyAgent=(logger.info(`The environment variable ${proxyEnvVar} is set. Requests to the Instana back end will be routed via a proxy `+`server: ${proxyUrl}.`),require("https-proxy-agent"));proxyAgent=new HttpsProxyAgent(proxyUrl)}else process.env[proxyEnvVar]&&environmentUtil.sendUnencrypted&&logger.warn(`Both ${proxyEnvVar} and ${environmentUtil.sendUnencryptedEnvVar} are set, but this combination is not supported.`+" Requests to the Instana back end will not be routed via a proxy server.");let hostHeader;exports.init=function(identityProvider,_logger,_stopSendingOnFailure,_propagateErrorsUpstream,_defaultTimeout,_useLambdaExtension){stopSendingOnFailure=null==_stopSendingOnFailure||_stopSendingOnFailure,propagateErrorsUpstream=null!=_propagateErrorsUpstream&&_propagateErrorsUpstream,defaultTimeout=null==_defaultTimeout?defaultTimeout:_defaultTimeout,useLambdaExtension=_useLambdaExtension,backendTimeout=defaultTimeout,process.env[timeoutEnvVar]&&(backendTimeout=parseInt(process.env[timeoutEnvVar],10),isNaN(backendTimeout)||backendTimeout<0)&&(logger.warn(`The value of ${timeoutEnvVar} (${process.env[timeoutEnvVar]}) cannot be parsed to a valid numerical value. `+`Will fall back to the default timeout (${defaultTimeout} ms).`),backendTimeout=defaultTimeout),identityProvider&&null!=(hostHeader=identityProvider.getHostHeader())||(hostHeader="nodejs-serverless"),_logger&&(logger=_logger),requestHasFailed=!1,useLambdaExtension&&scheduleLambdaExtensionHeartbeatRequest()},exports.setLogger=function(_logger){logger=_logger},exports.sendBundle=function(bundle,finalLambdaRequest,callback){send("/bundle",bundle,finalLambdaRequest,callback)},exports.sendMetrics=function(metrics,callback){send("/metrics",metrics,!1,callback)},exports.sendSpans=function(spans,callback){send("/traces",spans,!1,callback)};let heartbeatInterval;function scheduleLambdaExtensionHeartbeatRequest(){var executeHeartbeat=()=>{logger.debug("Executing Heartbeat request to Lambda extension.");const req=uninstrumented.http.request({hostname:layerExtensionHostname,port:layerExtensionPort,path:"/heartbeat",method:"POST",timeout:layerExtensionTimeout},res=>{200===res.statusCode?logger.debug("The Instana Lambda extension Heartbeat request has succeeded."):handleHeartbeatError(new Error("The Instana Lambda extension Heartbeat request has returned an unexpected status code: "+res.statusCode))});function handleHeartbeatError(e){useLambdaExtension=!1,clearInterval(heartbeatInterval),logger.debug("The Instana Lambda extension Heartbeat request did not succeed. Falling back to talking to the Instana back end directly.",e)}req.on("error",e=>{req.destroyed||handleHeartbeatError(e)}),req.setTimeout(layerExtensionTimeout,()=>{if(handleHeartbeatError(new Error("The Lambda extension Heartbeat request timed out.")),req&&!req.destroyed)try{destroyRequest(req)}catch(e){}}),req.end()};executeHeartbeat(),(heartbeatInterval=setInterval(executeHeartbeat,500)).unref()}function getTransport(localUseLambdaExtension){return localUseLambdaExtension||environmentUtil.sendUnencrypted?uninstrumented.http:uninstrumented.https}function getBackendTimeout(localUseLambdaExtension){return localUseLambdaExtension?layerExtensionTimeout:backendTimeout}function send(resourcePath,payload,finalLambdaRequest,callback){let localUseLambdaExtension=useLambdaExtension;if(requestHasFailed&&stopSendingOnFailure)logger.info(`Not attempting to send data to ${resourcePath} as a previous request has already timed out or failed.`),callback();else{logger.debug(`Sending data to Instana (${resourcePath}).`),warningsHaveBeenLogged||(warningsHaveBeenLogged=!0,environmentUtil.sendUnencrypted&&logger.error(environmentUtil.sendUnencryptedEnvVar+" is set, which means that all traffic to Instana is send unencrypted via plain HTTP, not via HTTPS. This will effectively make that traffic public. This setting should never be used in production."),disableCaCheck&&logger.warn(disableCaCheckEnvVar+" is set, which means that the server certificate will not be verified against the list of known CAs. This makes your service vulnerable to MITM attacks when connecting to Instana. This setting should never be used in production, unless you use our on-premises product and are unable to operate the Instana back end with a certificate with a known root CA."));var requestPath=localUseLambdaExtension||"/"===environmentUtil.getBackendPath()?resourcePath:environmentUtil.getBackendPath()+resourcePath,serializedPayload=JSON.stringify(payload),requestPath={hostname:localUseLambdaExtension?layerExtensionHostname:environmentUtil.getBackendHost(),port:localUseLambdaExtension?layerExtensionPort:environmentUtil.getBackendPort(),path:requestPath,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(serializedPayload),[constants.xInstanaHost]:hostHeader,[constants.xInstanaKey]:environmentUtil.getInstanaAgentKey()},rejectUnauthorized:!disableCaCheck};requestPath.timeout=getBackendTimeout(localUseLambdaExtension),proxyAgent&&!localUseLambdaExtension&&(requestPath.agent=proxyAgent);let req;var skipWaitingForHttpResponse=!proxyAgent&&!localUseLambdaExtension,transport=getTransport(localUseLambdaExtension);(req=skipWaitingForHttpResponse?transport.request(requestPath):transport.request(requestPath,()=>{finalLambdaRequest&&(req.removeAllListeners(),req.on("error",()=>{})),callback()})).on("timeout",()=>onTimeout(localUseLambdaExtension,req,resourcePath,payload,finalLambdaRequest,callback)),req.on("error",e=>{req.destroyed||(localUseLambdaExtension?(logger.debug("Could not connect to the Instana Lambda extension. Falling back to talking to the Instana back end directly.",e),useLambdaExtension=localUseLambdaExtension=!1,clearInterval(heartbeatInterval),send(resourcePath,payload,finalLambdaRequest,callback)):(requestHasFailed=!0,propagateErrorsUpstream||(proxyAgent?logger.warn("Could not send traces and metrics to Instana. Could not connect to the configured proxy "+process.env[proxyEnvVar]+".",e):logger.warn("Could not send traces and metrics to Instana. The Instana back end seems to be unavailable.",e)),callback(propagateErrorsUpstream?e:void 0)))}),req.on("finish",()=>{logger.debug(`Sent data to Instana (${resourcePath}).`),useLambdaExtension&&finalLambdaRequest&&clearInterval(heartbeatInterval)}),skipWaitingForHttpResponse?req.end(serializedPayload,()=>{finalLambdaRequest&&(req.removeAllListeners(),req.on("error",()=>{}),req.abort()),callback()}):req.end(serializedPayload)}}function onTimeout(localUseLambdaExtension,req,resourcePath,payload,finalLambdaRequest,callback){if(localUseLambdaExtension){if(logger.debug("Request timed out while trying to talk to Instana Lambda extension. Falling back to talking to the Instana back end directly."),useLambdaExtension=localUseLambdaExtension=!1,clearInterval(heartbeatInterval),req&&!req.destroyed)try{destroyRequest(req)}catch(e){}send(resourcePath,payload,finalLambdaRequest,callback)}else{if(requestHasFailed=!0,req&&!req.destroyed)try{destroyRequest(req)}catch(e){}localUseLambdaExtension="Could not send traces and metrics to Instana. The Instana back end did not respond in the configured timeout "+`of ${backendTimeout} ms. The timeout can be configured by setting the environment variable ${timeoutEnvVar}.`;propagateErrorsUpstream||logger.warn(localUseLambdaExtension),callback(propagateErrorsUpstream?new Error(localUseLambdaExtension):void 0)}}function destroyRequest(req){req.destroy(),req.destroyed=!0}