UNPKG

hud-sdk

Version:

Hud's Node SDK

2 lines 28.6 kB
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var o=t();for(var r in o)("object"==typeof exports?exports:e)[r]=o[r]}}(global,(()=>(()=>{"use strict";var e={857:e=>{e.exports=require("os")},1886:function(e,t,o){var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o);var n=Object.getOwnPropertyDescriptor(t,o);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[o]}}),Object.defineProperty(e,r,n)}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const a=s(o(9896)),c=o(8167),u=o(2546),l=s(o(2546)),d=o(2546),g=o(3319),f=o(8528),m=o(2546),h=o(6982),p=o(6261),w=i(o(6928)),_=o(4678),k=o(6304),y=o(9426),v=o(9748),C=c.parentPort,b=c.workerData.apiKey,S=c.workerData.service,x=c.workerData.startTime,D=c.workerData.shouldRunLambdaExtension,M=c.workerData.shouldCreateDeclaraionWorker;let E,I=new AbortController,q=!1,O=!1;const F=m.safeCall.bind(m.safeCall,u.worker_logger);if(u.hudConfig.userConfig=c.workerData.userConfig,u.worker_logger.info("Worker started"),null===C)throw new m.HudWorkerError("Failed to get port");const R=new Set;function T(){q||(q=!0,l.customer_logger.log(d.UserLogs.FirstDecalarationSent()),O&&l.customer_logger.log(d.UserLogs.HappyFlowCompleted()))}async function L(e,t,o,r){if(0!==e.length)for(const n of e)try{if(r&&(0,p.once)(r,"eventloop"),u.worker_logger.debug("Sending file to parser worker",{filename:n.filename}),o){o.postMessage({msg:"SourceFileMetadata",content:n});continue}const{filename:e,indexOffset:s,indexOffsetEnd:i}=n,a=await(0,m.readFile)(e,s,i);if(!a)continue;const c=await(0,m.parseDeclarations)(n,a,void 0,E);await j(c,t),T()}catch(e){u.worker_logger.error("Failed to parse declarations",{filename:n.filename,error:e})}else T()}async function j(e,t){e.blacklist&&e.blacklist.uuids.length>0&&(C?.postMessage(f.KeepAliveMessage),e.blacklist.uuids.forEach((e=>{R.add(e)})),await t.batch("CorruptedFile",[e.blacklist],{event_version:"1.0.0"}));for(let o=0;o<e.declarations.length;o+=u.hudConfig.communicationBatchSize)C?.postMessage(f.KeepAliveMessage),await t.batch("FunctionDeclaration",e.declarations.slice(o,o+u.hudConfig.communicationBatchSize),{event_version:f.FUNCTION_DECLARATION_VERSION})}function A(e){return`investigation-${e.context?.timestamp??Date.now()}-${(0,h.randomUUID)()}.json`}async function $(e,t){await a.promises.writeFile(w.default.join(t.path,A(e)),JSON.stringify(e,null,2))}(0,y.registerIfNeeded)(D).then((e=>{let t;e?(t=new p.EventEmitter,t.setMaxListeners(0),F((0,y.extensionMainLoop)(e,t)),u.worker_logger.info("Lambda extension registered",{extensionId:e}),C.postMessage({msg:"extensionRegistered",content:{extensionId:e}})):C.postMessage({msg:"startedNoExtension"});const o=new g.HudClient(t);o.initSession(b,S,x).then((async e=>{o.setSession(e);const{sessionId:r}=e;u.worker_logger.info("Initialized successfuly",{sessionId:r});const n=f.HudSessionInitStatus.success;C.postMessage({msg:"initialized",content:{status:n}}),await async function(e){if(null===C)throw new m.HudWorkerError("Failed to get port");const t=await e.getRemoteConfig();return t?(u.worker_logger.info("Remote configuration exists"),u.hudConfig.dynamicConfig=(0,m.updateDynamicConfig)(t,u.hudConfig,u.worker_logger),u.worker_logger.info("Current dynamic configuration:",{currentDynamicConfig:u.hudConfig.dynamicConfig})):u.worker_logger.info("No remote configuration - falling back to default dynamic configuration",{defaultDynamicConfig:u.hudConfig.dynamicConfig}),C.postMessage({msg:"initDynamicConfig",content:t}),t}(o);try{await async function(e,t){if(null===C)throw new m.HudWorkerError("Failed to get port");const o=M?function(e,t){const o=m.myRequire.resolve(`${u.SDK_MODULE_NAME}/declaraionWorker`),r=new c.Worker(o);return r.unref(),r.on("message",(o=>{"eventlooptime"!==o?F(j(o,e)):t&&(0,p.once)(t,"eventloop")})),r.on("error",(e=>{u.worker_logger.error("Declaration parser worker failed",{msg:e instanceof Error?e.message:void 0})})),r.on("exit",(e=>{u.worker_logger.warn("Declaration parser worker exited",{code:e})})),r}(e,t):void 0;C.on("message",(r=>{const{msg:n,content:s}=r;switch(u.worker_logger.debug("Got message from main thread",{msg:n}),n){case"Terminate":F(async function(e,t){const o=process.hrtime();u.worker_logger.warn("Notified to terminate. flushing.",{grace:e.grace}),await B(e.logBuffers,t),await W({filenames:e.logFiles},t),await B((0,u.getSavedLogs)(),t),await W({filenames:Array.from(P())},t),await z();const r=process.hrtime(o),n=1e3*r[0]+r[1]/1e6;u.worker_logger.info("Done flushing. responsing to parent",{grace:e.grace,termination_time_ms:n}),C?.postMessage({msg:"terminated"}),C?.close()}(s,e));break;case"StartPeriodicTasks":F(async function(e){F((0,_.loopWorkloadDataCollector)(e,u.hudConfig.workloadMetadata,u.hudConfig.workloadMetadata.sendInterval,I.signal)),F((0,m.loopLogProcessPerformance)(u.worker_logger,u.hudConfig.logPerfInterval,I.signal)),F((0,m.loopLogThreadPerformance)(u.worker_logger,u.hudConfig.logPerfInterval,I.signal)),F(async function(e,t,o){for await(const r of(0,m.unrefSetInterval)(t,void 0,{signal:o.signal})){C?.postMessage(f.KeepAliveMessage);const t=(0,u.getSavedLogs)();await B(t,e)}}(e,u.hudConfig.logsSendInterval,I))}(e));break;case"Abort":F(z());break;case"Invocations":F(async function(e,t,o){const r=e;u.worker_logger.debug("Got invocations message",{msg:t,size:e.length});const n=r.filter((e=>!R.has(e.function_id)));for(let e=0;e<n.length;e+=u.hudConfig.communicationBatchSize)C?.postMessage(f.KeepAliveMessage),await o.batch("Invocations",n.slice(e,e+u.hudConfig.communicationBatchSize),{event_version:"1.0.1"});O||(O=!0,l.customer_logger.log(d.UserLogs.FirstInvocationSent()),q&&l.customer_logger.log(d.UserLogs.HappyFlowCompleted()))}(s,n,e));break;case"FlowMetrics":F(async function(e,t,o){const{rawMetrics:r,timeslice:n}=e,s=(new Date).toISOString();u.worker_logger.debug("Got flow metrics message",{msg:t,size:r.length}),C?.postMessage(f.KeepAliveMessage);const i=(0,v.processMetrics)(r,s,n);for(const e in i){const t=i[e];for(let r=0;r<t.length;r+=u.hudConfig.communicationBatchSize)C?.postMessage(f.KeepAliveMessage),await o.batch(e,t.slice(r,r+u.hudConfig.communicationBatchSize))}}(s,n,e));break;case"ProcessedFiles":F(async function(e,t,o,r){const n=new Map;for(const t of e)n.set(`${t.file_path_checksum}|${t.file_checksum}`,t);const s=Array.from(n.entries()).sort((([e],[t])=>e.localeCompare(t))).map((([,e])=>({file_path_checksum:e.file_path_checksum,file_checksum:e.file_checksum})));if("true"===process.env.HUD_SKIP_DECLS)return u.worker_logger.debug("Skipping file declarations"),void await L([],t,o,r);if("true"===process.env.HUD_FORCE_ALL_DECLS)return u.worker_logger.debug("Forcing all file declarations"),void await L(e,t,o,r);let i;try{i=await t.sendFileDeclarations(s)}catch(n){return u.worker_logger.error("Failed to send file declarations"),void await L(e,t,o,r)}if(i.send_all)return u.worker_logger.debug("All file declarations are requested by sink"),void await L(e,t,o,r);u.worker_logger.debug("Partial file declarations are requested by sink",{fileCount:i.files.length});const a=[];for(const e of i.files){const t=`${e.file_path_checksum}|${e.file_checksum}`,o=n.get(t);o&&a.push(o)}await L(a,t,o,r)}(s,e,o,t));break;case"GetMode":F(async function(e,t){const{runningMode:o}=e,r=await t.getMode({runningMode:o});C?.postMessage({msg:"GetMode",content:{mode:r}})}(s,e));break;case"EndpointDeclaration":F(async function(e,t,o){for(let r=0;r<e.length;r+=u.hudConfig.communicationBatchSize)C?.postMessage(f.KeepAliveMessage),await o.batch(t,e.slice(r,r+u.hudConfig.communicationBatchSize),{event_version:"1.0.2"})}(s,n,e));break;case"Runtime":case"PreInitLoadedModules":case"PostInitLoadedModules":case"PatchedModules":F(async function(e,t,o){C?.postMessage(f.KeepAliveMessage),await o.send(t,e)}(s,n,e));break;case"GraphQLResolvers":case"GraphQLDocuments":case"KafkaJSTopics":case"SqsQueue":F(async function(e,t,o){for(let r=0;r<e.length;r+=u.hudConfig.communicationBatchSize)C?.postMessage(f.KeepAliveMessage),await o.batch(t,e.slice(r,r+u.hudConfig.communicationBatchSize))}(s,n,e));break;case"Investigations":F(async function(e,t){const o=u.hudConfig.investigation.store,r=[];for(const n of e)try{const e={...(0,k.censorInvestigation)(n),version:u.hudConfig.investigation.objectVersion};if("disk"===o.type)await $(e,o);else if("s3"===o.type){const o=A(n),s=await t.storeObject(o,Buffer.from(JSON.stringify(e)));if(!s){u.worker_logger.error("Failed to store investigation",{investigationSaveName:o});continue}if(!n.context){u.worker_logger.error("Investigation has no context, even though it should");continue}const i={version:u.hudConfig.investigation.objectVersion,flow_type:n.context.type,flow_uuid:n.context.endpoint_uuid,s3_pointer:s,timestamp:n.context.timestamp,exceptions:n.exceptions.map((e=>({name:e.name,functions:e.executionFlow.map((e=>e.function_id))})))};r.push(i)}}catch(e){u.worker_logger.error("Failed to save investigation",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0})}r.length>0&&await t.batch("FlowInvestigation",r)}(s,e));break;case"LogFilename":F(W(s,e));break;case"Logs":F(async function(e,t){C?.postMessage(f.KeepAliveMessage),await t.logs(e.logs)}(s,e));break;case"TsNodeConfig":E=s.tsConfig,o&&o.postMessage({msg:"TsNodeConfig",content:{tsOptions:E}});break;default:u.worker_logger.error("Unknown command",{msg:n})}}))}(o,t)}catch(e){u.worker_logger.error("CRITICAL: Worker's main failed",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0})}})).catch((e=>{if(e instanceof m.HudSessionThrottle)return u.worker_logger.info("Session throttled, exiting worker"),void C.postMessage({msg:"throttled"});if(e instanceof m.HudClientError)return u.worker_logger.error("Posting network error to main thread",{message:e.message,originalMessage:e.originalAxiosErrorCode}),void C.postMessage({msg:"networkError",content:{message:e.message,originalMessage:e.originalAxiosErrorCode}});throw u.worker_logger.error("Failed initiating session, exiting worker",{msg:e.message,stack:e.stack}),e}))})).catch((e=>{throw u.worker_logger.error("Failed to register lambda extension",{msg:e.message}),C.postMessage({msg:"failed"}),e}));const P=(0,m.suppressTraces)(u.renewFileTransports);async function W(e,t){for(const o of e.filenames)C?.postMessage(f.KeepAliveMessage),await t.logs(a.readFileSync(o,{encoding:"utf-8"})),u.hudConfig.deleteLogsAfterSending&&a.unlinkSync(o);const o=P();for(const e of o)C?.postMessage(f.KeepAliveMessage),await t.logs(a.readFileSync(e,{encoding:"utf-8"})),u.hudConfig.deleteLogsAfterSending&&a.unlinkSync(e)}async function B(e,t){const o=e.join("\n");o.length>0&&await t.logs(o)}async function z(){I.abort(),I=new AbortController}},2546:e=>{e.exports=require("./lib")},3106:e=>{e.exports=require("zlib")},3319:function(e,t,o){var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o);var n=Object.getOwnPropertyDescriptor(t,o);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[o]}}),Object.defineProperty(e,r,n)}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&r(t,e,o);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.HudClient=void 0;const i=o(2546),a=s(o(8938)),c=o(6982),u=o(6261),l=o(9023),d=o(3106),g=(0,l.promisify)(d.gzip);class f{sessionId;httpClient;extensionEventEmitter;static config={baseURL:i.hudConfig.sink.url,timeout:i.hudConfig.sink.timeout,headers:{"Content-Type":"application/json"}};static defaultRequest={version:"1.0.0",source:"node-sdk",event_version:"1.0.0"};constructor(e){this.httpClient=a.default.create(f.config),this.extensionEventEmitter=e}setSession(e){const{sessionId:t,extraHeaders:o}=e;this.sessionId=t,this.httpClient.defaults.headers.common[i.hudConfig.sink.session_attr]=t;try{for(const[e,t]of Object.entries(o))try{this.httpClient.defaults.headers.common[e]=t}catch(o){i.worker_logger.error("Failed to set extra header",{msg:o instanceof Error?o.message:void 0,stack:o instanceof Error?o.stack:void 0,key:e,value:t})}}catch(e){i.worker_logger.error("Failed to set extra headers",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0})}}setExtensionEventEmitter(e){this.extensionEventEmitter=e}async logs(e){const t={logs:e,send_time:(new Date).toISOString()};await this._requestRelentless(i.hudConfig.endpoints.logs,t,"logs"),i.worker_logger.debug("sent logs successfully",{size:e.length})}async send(e,t,o={}){const r={...f.defaultRequest,type:e,raw:t,send_time:(new Date).toISOString(),...o};await this._requestRelentless(i.hudConfig.endpoints.send,r,e),i.worker_logger.debug("sent event successfully",{type:e})}async batch(e,t,o={}){const r={...f.defaultRequest,type:e,arr:t,send_time:(new Date).toISOString(),...o};await this._requestRelentless(i.hudConfig.endpoints.batch,r,e),i.worker_logger.debug("sent batched events successfully",{type:e})}async getRemoteConfig(){const e=await this._requestDataRelentless(i.hudConfig.endpoints.getRemoteConfig,{},"getRemoteConfig");return i.worker_logger.info("Received remote configuration from server",{remoteConfiguration:e}),e}async getMode(e){const t={extra:e,send_time:(new Date).toISOString()},o=await this._requestDataRelentless(i.hudConfig.endpoints.getMode,t,"getMode");return i.worker_logger.info("Received mode from server "+o),o}async storeObject(e,t){const o={key:e,value:t.toString("base64")},r=await this._requestDataRelentless(i.hudConfig.endpoints.storeObject,o,"storeObject");if("reference"in r)return i.worker_logger.debug("Stored object successfully",{reference:r.reference}),r.reference;i.worker_logger.error("Failed to store object",{key:e,response:r})}async sendFileDeclarations(e){i.worker_logger.debug("Sending file declarations request",{count:e.length});const t={files:e},o=await this._requestRelentless(i.hudConfig.endpoints.fileDeclarations,t,"fileDeclarations");return{files:o.data.files,send_all:o.data.send_all}}async _requestRelentless(e,t,o,r=3){const n={"X-Hud-Type":o,"X-Hud-Request-ID":(0,c.randomUUID)()},s=[];let u;for(let c=0;c<r;c++)try{return await this._request(e,t,o,n)}catch(t){if(t instanceof Error&&(u=t),t instanceof a.AxiosError){if(401===t.response?.status)throw i.worker_logger.error("Unauthorized request",{endpoint:e,requestType:o}),new i.HudClientUnauthorizedError(`Unauthorized request for ${e}`);const{code:r,name:n,status:a,message:c}=t;s.push({code:r,name:n,status:a,message:c})}else if(t instanceof Error){const{name:e,message:o}=t;s.push({name:e,message:o})}await new Promise((e=>setTimeout(e,1)))}throw i.worker_logger.error("Exceeded max retries to request",{endpoint:e,requestType:o,failures:s,retries:r}),new i.HudClientError(`Exceeded max retries for ${e}`,u instanceof a.AxiosError?u.code:void 0)}async _requestDataRelentless(e,t,o,r=3){return(await this._requestRelentless(e,t,o,r)).data}async _request(e,t,o,r){try{this.extensionEventEmitter&&await(0,u.once)(this.extensionEventEmitter,"eventloop");const o=await this._gzipCompress(JSON.stringify(t));return r={...r,"Content-Encoding":"gzip","Content-Type":"application/json"},await(0,i.suppressTraces)((async()=>await this.httpClient.post(e,o,{headers:r})))()}catch(t){if(t instanceof a.AxiosError){const{code:r,name:n,status:s,cause:a,message:c}=t;i.worker_logger.error(`${e} request failed`,{requestType:o,code:r,name:n,status:s,cause:a,msg:c})}else i.worker_logger.error("Caught an unexpected error",{msg:t instanceof Error?t.message:void 0,stack:t instanceof Error?t.stack:void 0});throw t}}async _gzipCompress(e){return g(e)}async initSession(e,t,o){const r={token:e,service:t,start_time:o.toISOString(),type:"node-sdk",version:"1.0.0",sdk_version:i.SDK_VERSION};i.worker_logger.debug("Requesting init",{data:r});const n=await this._requestRelentless(i.hudConfig.endpoints.init,r,"init");if(n.status===i.hudConfig.throttleStatusCode)throw i.worker_logger.debug("Init request throttled"),new i.HudSessionThrottle;const s=n.data.sessionId,a=n.data.extraHeaders??{};return i.worker_logger.info("Succesfuly created session with backend",{host:f.config.baseURL,service:t,sessionId:s,extraHeaders:a}),{sessionId:s,extraHeaders:a}}}t.HudClient=f},4678:function(e,t,o){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.loopWorkloadDataCollector=void 0;const n=r(o(8938)),s=o(9896),i=r(o(857)),a=o(2546);class c{client;config;constructor(e,t){this.client=e,this.config=t}getOperatingSystem(){return i.default.platform()}isKubernetesPod(){return!!process.env.KUBERNETES_SERVICE_HOST}getFileContentSilentFail(e){try{return(0,s.readFileSync)(e,"utf8")}catch{return a.worker_logger.debug(`Could not read file ${e}`),null}}getKubernetesWorkloadData(){if("linux"!==this.getOperatingSystem())return a.worker_logger.info("Kubernetes workload data is only available on Linux, current OS is "+this.getOperatingSystem()),null;if(!this.isKubernetesPod())return null;const e=i.default.hostname(),t=this.getFileContentSilentFail(this.config.kubernetes.namespaceFile),o=this.getFileContentSilentFail(this.config.kubernetes.uuidFile),r=(0,a.getCpuLimit)(a.worker_logger),n=(0,a.getPodMemoryLimit)(a.worker_logger),s=null!==n.podMemoryLimitMB?n.podMemoryLimitMB.toString():null;return{product_uuid:o?.trim()||null,pod_name:e.trim(),pod_namespace:t?.trim()||null,pod_memory_limit:s?.trim()||null,pod_cpu_limit:r?.toString()||null}}async getLocalAWSWorkloadData(){const e=(0,s.readFileSync)(this.config.aws.metadataFile,"utf8"),t=JSON.parse(e),o=t.ds.dynamic["instance-identity"].document;return{workload_id:o.instanceId,workload_instance_type:o.instanceType,region:o.region,ami_id:o.imageId,launched_date:o.pendingTime,life_cycle:t.ds["meta-data"]["instance-life-cycle"]}}async getIMDSWorkloadData(){let e;try{e=await(0,a.suppressTraces)((async()=>await n.default.put(`${this.config.aws.imds.baseURL}${this.config.aws.imds.tokenURI}`,{},{timeout:this.config.aws.imds.requestTimeout,headers:{"X-aws-ec2-metadata-token-ttl-seconds":"21600"}})))()}catch(e){throw new a.HudWorkloadCollectorError(`Could not retrieve instance metadata token: ${e}`)}const t={"X-aws-ec2-metadata-token":e.data};let o;try{o=await(0,a.suppressTraces)((async()=>await n.default.get(`${this.config.aws.imds.baseURL}${this.config.aws.imds.identityURI}`,{timeout:this.config.aws.imds.requestTimeout,headers:t})))()}catch(e){throw new a.HudWorkloadCollectorError(`Could not retrieve instance identity document: ${e}`)}const r=o.data;let s;try{s=await(0,a.suppressTraces)((async()=>await n.default.get(`${this.config.aws.imds.baseURL}${this.config.aws.imds.lifeCycleURI}`,{timeout:this.config.aws.imds.requestTimeout,headers:t})))()}catch(e){throw new a.HudWorkloadCollectorError(`Could not retrieve instance life cycle: ${e}`)}const i=s.data;return{workload_id:r.instanceId,workload_instance_type:r.instanceType,region:r.region,ami_id:r.imageId,launched_date:r.pendingTime,life_cycle:i}}async getAWSWorkloadData(){try{return await this.getLocalAWSWorkloadData()}catch(e){a.worker_logger.info("Failed to get workload metadata from local file",{msg:e.message})}try{return await this.getIMDSWorkloadData()}catch(e){a.worker_logger.info("Failed to get workload metadata from IMDS",{msg:e.message})}return null}async getWorkloadData(){return{aws_workload_data:await this.getAWSWorkloadData(),kubernetes_workload_data:this.getKubernetesWorkloadData()}}async send(e){a.worker_logger.info("Sending workload metadata to the server",{msg:e}),await this.client.send("WorkloadData",e)}}t.loopWorkloadDataCollector=async function(e,t,o,r){try{const s=new c(e,t),i=await s.getWorkloadData();await n(s,i);for await(const e of(0,a.unrefSetInterval)(o,void 0,{signal:r}))await n(s,i)}catch(e){(0,a.isAbortError)(e)||a.worker_logger.error("Failed collecting workload metadata",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0})}async function n(e,t){try{await e.send(t)}catch(e){a.worker_logger.error("Failed to send workload metadata, skipping",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0})}}}},6261:e=>{e.exports=require("events")},6304:(e,t,o)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.censorInvestigation=void 0;const r=o(2546);function n(e){for(const t of r.hudConfig.investigation.censorshipRegexes)e=e.replace(t.regex,t.replacement);return e}function s(e){if("string"==typeof e)return n(e);if("object"==typeof e&&null!==e)for(const t in e)r.hudConfig.investigation.blacklistParams.includes(t)?e[t]="[REDACTED]":e[t]=s(e[t]);return e}t.censorInvestigation=function(e){const t=e.context?{type:e.context.type,endpoint_uuid:e.context.endpoint_uuid,status_code:e.context.status_code,route:n(e.context?.route),params:s(e.context?.params),query:s(e.context?.query),request_body:s(e.context?.request_body),method:e.context?.method,timestamp:e.context?.timestamp}:void 0;return{status:e.status,context:t,exceptions:e.exceptions.map((e=>({name:e.name,message:e.message?n(e.message):void 0,stackTrace:e.stackTrace,executionFlow:e.executionFlow})))}}},6928:e=>{e.exports=require("path")},6982:e=>{e.exports=require("crypto")},7131:e=>{e.exports=require("./wrap")},8167:e=>{e.exports=require("worker_threads")},8528:e=>{e.exports=require("./dto")},8938:e=>{e.exports=require("axios")},9023:e=>{e.exports=require("util")},9426:(e,t,o)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.extensionMainLoop=t.registerIfNeeded=void 0;const r=o(2546),n=`http://${process.env.AWS_LAMBDA_RUNTIME_API}/2020-01-01/extension`;async function s(e){const t=await async function(e){return await fetch(`${n}/event/next`,{method:"get",headers:{"Content-Type":"application/json","Lambda-Extension-Identifier":e}})}(e);if(!t.ok)throw r.worker_logger.info("next failed",await t.text()),new r.HudExtensionNextFailedError;return await t.json()}t.registerIfNeeded=async function(e){return e?await async function(){r.worker_logger.info("registering extension");const e=await fetch(`${n}/register`,{method:"post",body:JSON.stringify({events:["INVOKE"]}),headers:{"Content-Type":"application/json","Lambda-Extension-Name":"hud-extension"}});if(!e.ok)throw r.worker_logger.error("register failed",{status:e.status,statusText:e.statusText,body:await e.text(),baseUrl:n}),new r.HudExtensionRegisterError("register failed");return e.headers.get("lambda-extension-identifier")}():null},t.extensionMainLoop=async function(e,t){let o=Date.now();for(r.worker_logger.info("starting extension main loop");;)try{const n=await s(e);if(t.listenerCount("eventloop")>0){const e=t.listenerCount("eventloop"),n=Date.now()-o;t.emit("eventloop",""),o=Date.now();const s=Math.min(r.hudConfig.lambdaBaseGivenTime+e*r.hudConfig.lambdaExtraGivenTimePerRequest,r.hudConfig.lambdaMaxGivenTime);r.worker_logger.debug(`Starting giving time for the eventloop to run at ${(new Date).toISOString()}. ${n}ms since last eventloop request. Given time: ${s}ms`),await new Promise((e=>setTimeout(e,s))),r.worker_logger.debug(`Done giving time for the eventloop to run ${(new Date).toISOString()}`)}if("SHUTDOWN"===n?.eventType)return void r.worker_logger.info("shutting down")}catch(e){e instanceof r.HudExtnensionError?r.worker_logger.warn("Extension tick failed, continuing",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0}):r.worker_logger.error("Extension tick failed with unexpected error, continuing",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0});continue}}},9748:(e,t,o)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.processMetrics=void 0;const r=o(2546),n=o(7131);class s{}class i extends s{flowId;count;sumDuration;sumSquaredDuration;timestamp;timeslice;sketchBuilder;constructor(e,t,o,r){super(),this.flowId=e.flow_id,this.count=1,this.sumDuration=e.duration,this.sumSquaredDuration=e.duration**2,this.timestamp=t,this.timeslice=o,this.sketchBuilder=r.newSketchDataWithValue(e.duration)}getKey(){return this.flowId??""}update(e,t){this.sumDuration+=e.duration,this.sumSquaredDuration+=e.duration**2,this.count+=1,t.add(this.sketchBuilder,e.duration)}finalize(e){return{flow_id:this.flowId,count:this.count,sum_duration:this.sumDuration,sum_squared_duration:this.sumSquaredDuration,timestamp:this.timestamp,timeslice:this.timeslice,sketch:e.encode(this.sketchBuilder)}}}class a{static registry={};static registerMetric(e,t){a.registry[e]=t}static createMetric(e,t,o,r){const n=a.registry[e.type];if(!n)throw new Error(`Unknown metric type: ${e.type}`);return new n(e,t,o,r)}}a.registerMetric("EndpointMetric",class extends i{route;method;statusCode;constructor(e,t,o,r){super(e,t,o,r),this.route=e.route,this.method=e.method,this.statusCode=e.status_code}getKey(){return`${this.flowId}|${this.route}|${this.method}|${this.statusCode}`}finalize(e){return{...super.finalize(e),route:this.route,method:this.method,status_code:this.statusCode}}}),a.registerMetric("GraphQLMetric",class extends i{constructor(e,t,o,r){super(e,t,o,r)}}),a.registerMetric("KafkaJSMetric",class extends i{partition;error;ConsumeSketchBuilder;sumConsumedDuration;sumSquaredConsumedDuration;constructor(e,t,o,r){super(e,t,o,r),this.partition=e.partition,this.error=e.error,e.total_consume_duration&&(this.ConsumeSketchBuilder=r.newSketchDataWithValue(e.total_consume_duration)),this.sumConsumedDuration=e.total_consume_duration??0,this.sumSquaredConsumedDuration=(e.total_consume_duration??0)**2}getKey(){return`${this.flowId}|${this.partition}|${this.error}`}update(e,t){super.update(e,t),e.total_consume_duration&&(this.sumConsumedDuration+=e.total_consume_duration,this.sumSquaredConsumedDuration+=e.total_consume_duration**2,this.ConsumeSketchBuilder?t.add(this.ConsumeSketchBuilder,e.total_consume_duration):this.ConsumeSketchBuilder=t.newSketchDataWithValue(e.total_consume_duration))}finalize(e){return{...super.finalize(e),partition:this.partition,error:this.error,sum_consumed_duration:this.sumConsumedDuration,sum_squared_consumed_duration:this.sumSquaredConsumedDuration,sketch_consume:e.encode(this.ConsumeSketchBuilder)}}}),a.registerMetric("SqsMetric",class extends i{msgCount;error;e2eData;constructor(e,t,o,r){super(e,t,o,r),this.msgCount=e.msg_count,this.error=e.error,e.e2e_duration&&(this.e2eData={duration:e.e2e_duration,squaredDuration:e.e2e_duration**2,sketchBuilder:r.newSketchDataWithValue(e.e2e_duration)})}update(e,t){super.update(e,t),this.msgCount&&e.msg_count&&(this.msgCount+=e.msg_count),this.e2eData&&e.e2e_duration&&(this.e2eData.duration+=e.e2e_duration,this.e2eData.squaredDuration+=e.e2e_duration**2,t.add(this.e2eData.sketchBuilder,e.e2e_duration))}finalize(e){return{...super.finalize(e),error:this.error,msg_count:this.msgCount,...this.e2eData?{e2e_sum_duration:this.e2eData.duration,e2e_sum_squared_duration:this.e2eData.squaredDuration,e2e_sketch:e.encode(this.e2eData.sketchBuilder)}:{}}}getKey(){return`${this.flowId}|${this.error}`}}),t.processMetrics=function(e,t,o){const s=new n.SketchManager(r.hudConfig.huddBinWidth),i=function(e){return e.reduce(((e,t)=>(e[t.type]||(e[t.type]=[]),e[t.type].push(t),e)),{})}(e),c={};return Object.entries(i).forEach((([e,n])=>{c[e]=function(e,t,o,n){const s={};return e.forEach((e=>{try{const r=a.createMetric(e,t,o,n),i=r.getKey();s[i]?s[i].update(e,n):s[i]=r}catch(t){r.worker_logger.error("Error processing metric",{metric:e,msg:t instanceof Error?t.message:void 0,stack:t instanceof Error?t.stack:void 0})}})),Object.values(s).map((e=>e.finalize(n)))}(n,t,o,s)})),c}},9896:e=>{e.exports=require("fs")}},t={};return function o(r){var n=t[r];if(void 0!==n)return n.exports;var s=t[r]={exports:{}};return e[r].call(s.exports,s,s.exports,o),s.exports}(1886)})())); //# sourceMappingURL=worker.js.map