hud-sdk
Version:
Hud's Node SDK
2 lines • 17.7 kB
JavaScript
!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 n in o)("object"==typeof exports?exports:e)[n]=o[n]}}(global,()=>(()=>{"use strict";var e={523:e=>{e.exports=require("./logger")},857:e=>{e.exports=require("os")},1638:e=>{e.exports=require("./declarations")},1886:function(e,t,o){var n,r=this&&this.__createBinding||(Object.create?function(e,t,o,n){void 0===n&&(n=o);var r=Object.getOwnPropertyDescriptor(t,o);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[o]}}),Object.defineProperty(e,n,r)}:function(e,t,o,n){void 0===n&&(n=o),e[n]=t[o]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||(n=function(e){return n=Object.getOwnPropertyNames||function(e){var t=[];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(t[t.length]=o);return t},n(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o=n(e),a=0;a<o.length;a++)"default"!==o[a]&&r(t,e,o[a]);return i(t,e),t}),s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const c=a(o(9896)),l=o(8167),g=o(5809),d=o(2546),u=a(o(523)),f=o(523),m=o(8528),p=o(2546),w=o(4672),h=o(8269),k=o(2546),y=o(6982),_=o(6261),v=s(o(6928)),b=o(4678),C=o(6304),x=l.parentPort,S=l.workerData.apiKey,M=l.workerData.service,F=l.workerData.startTime,D=l.workerData.tags,E=l.workerData.lambdaExtensionId,I=l.workerData.shouldCreateDeclaraionWorker;let L,T=new AbortController,O=!1,R=!1;const A=p.safeCall.bind(p.safeCall,f.worker_logger);if(g.hudConfig.userConfig=l.workerData.userConfig,f.worker_logger.info("Worker started"),null===x)throw new p.HudWorkerError("Failed to get port");const W=new Set;let P;E&&(P=new _.EventEmitter,P.setMaxListeners(0),A((0,k.extensionMainLoop)(E,P))),x.postMessage({msg:"started"}),(0,p.setSentEventsCountInterval)();const q=new w.HudClient(P);function N(){O||(O=!0,u.customer_logger.log(d.UserLogs.FirstDecalarationSent()),R&&u.customer_logger.log(d.UserLogs.HappyFlowCompleted()))}async function K(e,t,n,r){if(0!==e.length)for(const i of e)try{if(r&&(0,_.once)(r,"eventloop"),f.worker_logger.debug("Sending file to parser worker",{filename:i.filename}),n){n.postMessage({msg:"SourceFileMetadata",content:i});continue}const{filename:e,indexOffset:s,indexOffsetEnd:c}=i,l=await(0,p.readFile)(e,s,c);if(!l)continue;const{parseDeclarations:g}=await Promise.resolve().then(()=>a(o(1638))),d=await g(i,l,void 0,L);await j(d,t),d.declarations.length>0&&N()}catch(e){f.worker_logger.error("Failed to parse declarations",{filename:i.filename,error:e})}else N()}async function j(e,t){e.blacklist&&e.blacklist.uuids.length>0&&(x?.postMessage(m.KeepAliveMessage),e.blacklist.uuids.forEach(e=>{W.add(e)}),await t.batch("CorruptedFile",[e.blacklist],{event_version:"1.0.0"}));for(let o=0;o<e.declarations.length;o+=g.hudConfig.communicationBatchSize)x?.postMessage(m.KeepAliveMessage),await t.batch("FunctionDeclaration",e.declarations.slice(o,o+g.hudConfig.communicationBatchSize),{event_version:m.FUNCTION_DECLARATION_VERSION})}function U(e){return`investigation-${e?.context?.timestamp??Date.now()}-${(0,y.randomUUID)()}.json`}async function B(e,t){await c.promises.writeFile(v.default.join(t.path,U(e)),JSON.stringify(e,null,2))}async function H(e,t,o,n={}){for(let r=0;r<e.length;r+=g.hudConfig.communicationBatchSize)x?.postMessage(m.KeepAliveMessage),await o.batch(t,e.slice(r,r+g.hudConfig.communicationBatchSize),n)}q.initSession(S,M,F,D).then(async e=>{q.setSession(e);const{sessionId:t}=e;f.worker_logger.info("Initialized successfuly",{sessionId:t});const o=m.HudSessionInitStatus.success;x.postMessage({msg:"initialized",content:{status:o}}),await async function(e){if(null===x)throw new p.HudWorkerError("Failed to get port");const t=await e.getRemoteConfig();return t?(f.worker_logger.info("Remote configuration exists"),g.hudConfig.dynamicConfig=(0,g.updateDynamicConfig)(t,g.hudConfig,f.worker_logger),f.worker_logger.info("Current dynamic configuration:",{currentDynamicConfig:g.hudConfig.dynamicConfig})):f.worker_logger.info("No remote configuration - falling back to default dynamic configuration",{defaultDynamicConfig:g.hudConfig.dynamicConfig}),x.postMessage({msg:"initDynamicConfig",content:t}),t}(q);try{await async function(e,t){if(null===x)throw new p.HudWorkerError("Failed to get port");const o=I?function(e,t){const o=p.myRequire.resolve(`${g.SDK_MODULE_NAME}/declarationWorker`),n=new l.Worker(o);return n.unref(),n.on("message",o=>{"eventlooptime"!==o?A(j(o,e)):t&&(0,_.once)(t,"eventloop")}),n.on("error",e=>{f.worker_logger.error("Declaration parser worker failed",{msg:e instanceof Error?e.message:void 0})}),n.on("exit",e=>{f.worker_logger.warn("Declaration parser worker exited",{code:e})}),n}(e,t):void 0;x.on("message",n=>{const{msg:r,content:i}=n;switch(f.worker_logger.debug("Got message from main thread",{msg:r}),r){case"Terminate":A(async function(e,t){const o=process.hrtime();f.worker_logger.warn("Notified to terminate. flushing.",{grace:e.grace}),await G(e.logBuffers,t),await $({filenames:e.logFiles},t),await G((0,f.getSavedLogs)(),t),await $({filenames:Array.from(z())},t),await J();const n=process.hrtime(o),r=1e3*n[0]+n[1]/1e6;f.worker_logger.info("Done flushing. responsing to parent",{grace:e.grace,termination_time_ms:r}),x?.postMessage({msg:"terminated"}),x?.close()}(i,e));break;case"StartPeriodicTasks":A(async function(e){A((0,b.loopWorkloadDataCollector)(e,g.hudConfig.workloadMetadata,g.hudConfig.workloadMetadata.sendInterval,T.signal)),A((0,p.loopLogProcessPerformance)(f.worker_logger,g.hudConfig.logPerfInterval,T.signal)),A((0,p.loopLogThreadPerformance)(f.worker_logger,g.hudConfig.logPerfInterval,T.signal)),A(async function(e,t,o){for await(const n of(0,p.unrefSetInterval)(t,void 0,{signal:o.signal})){x?.postMessage(m.KeepAliveMessage);const t=(0,f.getSavedLogs)();await G(t,e)}}(e,g.hudConfig.logsSendInterval,T))}(e));break;case"Abort":A(J());break;case"Invocations":A(async function(e,t,o){const n=e;f.worker_logger.debug("Got invocations message",{msg:t,size:e.length});const r=n.filter(e=>!W.has(e.function_id));for(let e=0;e<r.length;e+=g.hudConfig.communicationBatchSize)x?.postMessage(m.KeepAliveMessage),await o.batch("Invocations",r.slice(e,e+g.hudConfig.communicationBatchSize),{event_version:"1.0.1"});R||(R=!0,u.customer_logger.log(d.UserLogs.FirstInvocationSent()),O&&u.customer_logger.log(d.UserLogs.HappyFlowCompleted()))}(i,r,e));break;case"FlowMetrics":A(async function(e,t,o){const{aggregatedMetrics:n}=e;f.worker_logger.debug("Got aggregated flow metrics message",{msg:t,size:Object.keys(n).length}),x?.postMessage(m.KeepAliveMessage);for(const e in n){const{eventVersion:t,metrics:r}=n[e];if(0!==r.length)for(let n=0;n<r.length;n+=g.hudConfig.communicationBatchSize)x?.postMessage(m.KeepAliveMessage),await o.batch(e,r.slice(n,n+g.hudConfig.communicationBatchSize),t?{event_version:t}:{})}}(i,r,e));break;case"ProcessedFiles":A(async function(e,t,o,n){if("true"===process.env.HUD_SKIP_DECLS)return f.worker_logger.debug("Skipping file declarations"),void await K([],t,o,n);if("true"===process.env.HUD_FORCE_ALL_DECLS)return f.worker_logger.debug("Forcing all file declarations"),void await K(e,t,o,n);try{const r=await(0,p.getFilesForDeclarations)(e,t.sendFileDeclarations.bind(t));await K(r,t,o,n)}catch{return f.worker_logger.error("Failed to send file declarations, parsing all files"),void await K(e,t,o,n)}}(i,e,o,t));break;case"GetMode":A(async function(e,t){const{runningMode:o}=e,n=await t.getMode({runningMode:o});x?.postMessage({msg:"GetMode",content:{mode:n}})}(i,e));break;case"EndpointDeclaration":A(async function(e,t,o){for(let n=0;n<e.length;n+=g.hudConfig.communicationBatchSize)x?.postMessage(m.KeepAliveMessage),await o.batch(t,e.slice(n,n+g.hudConfig.communicationBatchSize),{event_version:"1.0.2"})}(i,r,e));break;case"Runtime":case"PreInitLoadedModules":case"PostInitLoadedModules":case"PatchedModules":A(async function(e,t,o){x?.postMessage(m.KeepAliveMessage),await o.send(t,e)}(i,r,e));break;case"GraphQLResolvers":case"GraphQLDocuments":case"KafkaJSTopics":A(H(i,r,e));break;case"SqsQueue":A(H(i,r,e,{event_version:"1.0.1"}));break;case"StaticNextJsEndpoints":A(async function(e,t){const o=JSON.parse(e.NextConfig),n=await(0,h.extractNextEndpointDeclarations)(o);await H(n,"EndpointDeclaration",t)}(i,e));break;case"Investigations":A(async function(e,t){const o=g.hudConfig.investigation.store,n=[];for(const r of e)try{const e=(0,C.createRegexes)(g.hudConfig.dynamicConfig.censorshipRegexes),i={...(0,C.censorInvestigation)(r,{valueRegexToRedact:e,keysToRedact:g.hudConfig.dynamicConfig.blacklistParams,whitelistNestedFields:g.hudConfig.dynamicConfig.forensicsWhitelistFields,blacklistNestedFields:g.hudConfig.dynamicConfig.forensicsBlacklistFields}),version:g.hudConfig.investigation.objectVersion};if("disk"===o.type)await B(i,o);else if("s3"===o.type){const e=U(i),o=await t.storeObject(e,Buffer.from(JSON.stringify(i)));if(!o){f.worker_logger.error("Failed to store investigation",{investigationSaveName:e});continue}if(!r.context){f.worker_logger.error("Investigation has no context, even though it should");continue}const a={version:g.hudConfig.investigation.objectVersion,flow_type:r.context.type,flow_uuid:"sqs"===r.context.type?r.context.flow_id:r.context.endpoint_uuid,s3_pointer:o,timestamp:r.context.timestamp,exceptions:r.exceptions.map(e=>({name:e.name,functions:e.executionFlow.map(e=>e.function_id)}))};n.push(a)}}catch(e){f.worker_logger.error("Failed to save investigation",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0})}n.length>0&&await t.batch("FlowInvestigation",n)}(i,e));break;case"LogFilename":A($(i,e));break;case"Logs":A(async function(e,t){x?.postMessage(m.KeepAliveMessage),await t.logs(e.logs)}(i,e));break;case"TsNodeConfig":L=i.tsConfig,o&&o.postMessage({msg:"TsNodeConfig",content:{tsOptions:L}});break;case"Reingest":A(async function(e,t){for(const o of e){N();try{await t.triggerReingest(o)}catch(e){f.worker_logger.error("Failed to trigger reingest",{buildId:o,error:e})}}}(i,e));break;default:f.worker_logger.error("Unknown command",{msg:r})}})}(q,P)}catch(e){f.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 p.HudSessionThrottle)return f.worker_logger.info("Session throttled, exiting worker"),void x.postMessage({msg:"throttled"});if(e instanceof p.HudClientError)return f.worker_logger.error("Posting network error to main thread",{message:e.message,originalMessage:e.originalAxiosErrorCode}),void x.postMessage({msg:"networkError",content:{message:e.message,originalMessage:e.originalAxiosErrorCode}});throw f.worker_logger.error("Failed initiating session, exiting worker",{msg:e.message,stack:e.stack}),e});const z=(0,p.suppressTraces)(f.renewFileTransports);async function $(e,t){for(const o of e.filenames)x?.postMessage(m.KeepAliveMessage),await t.logs(c.readFileSync(o,{encoding:"utf-8"})),g.hudConfig.deleteLogsAfterSending&&c.unlinkSync(o);const o=z();for(const e of o)x?.postMessage(m.KeepAliveMessage),await t.logs(c.readFileSync(e,{encoding:"utf-8"})),g.hudConfig.deleteLogsAfterSending&&c.unlinkSync(e)}async function G(e,t){const o=e.join("\n");o.length>0&&await t.logs(o)}async function J(){T.abort(),T=new AbortController}},2546:e=>{e.exports=require("./lib")},4672:e=>{e.exports=require("./client")},4678:function(e,t,o){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.loopWorkloadDataCollector=async function(e,t,o,n){try{const i=new l(e,t),a=await i.getWorkloadData();await r(i,a);for await(const e of(0,s.unrefSetInterval)(o,void 0,{signal:n}))await r(i,a)}catch(e){(0,s.isAbortError)(e)||c.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 r(e,t){try{await e.send(t)}catch(e){c.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})}}};const r=n(o(8938)),i=o(9896),a=n(o(857)),s=o(2546),c=o(523);class l{client;config;constructor(e,t){this.client=e,this.config=t}getOperatingSystem(){return a.default.platform()}isKubernetesPod(){return!!process.env.KUBERNETES_SERVICE_HOST}getFileContentSilentFail(e){try{return(0,i.readFileSync)(e,"utf8")}catch{return c.worker_logger.debug(`Could not read file ${e}`),null}}getKubernetesWorkloadData(){if("linux"!==this.getOperatingSystem())return c.worker_logger.info("Kubernetes workload data is only available on Linux, current OS is "+this.getOperatingSystem()),null;if(!this.isKubernetesPod())return null;const e=a.default.hostname(),t=this.getFileContentSilentFail(this.config.kubernetes.namespaceFile),o=this.getFileContentSilentFail(this.config.kubernetes.uuidFile),n=(0,s.getCpuLimit)(c.worker_logger),r=(0,s.getPodMemoryLimit)(c.worker_logger),i=null!==r.podMemoryLimitMB?r.podMemoryLimitMB.toString():null;return{product_uuid:o?.trim()||null,pod_name:e.trim(),pod_namespace:t?.trim()||null,pod_memory_limit:i?.trim()||null,pod_cpu_limit:n?.toString()||null}}async getLocalAWSWorkloadData(){const e=(0,i.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,s.suppressTraces)(async()=>await r.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 s.HudWorkloadCollectorError(`Could not retrieve instance metadata token: ${e}`)}const t={"X-aws-ec2-metadata-token":e.data};let o;try{o=await(0,s.suppressTraces)(async()=>await r.default.get(`${this.config.aws.imds.baseURL}${this.config.aws.imds.identityURI}`,{timeout:this.config.aws.imds.requestTimeout,headers:t}))()}catch(e){throw new s.HudWorkloadCollectorError(`Could not retrieve instance identity document: ${e}`)}const n=o.data;let i;try{i=await(0,s.suppressTraces)(async()=>await r.default.get(`${this.config.aws.imds.baseURL}${this.config.aws.imds.lifeCycleURI}`,{timeout:this.config.aws.imds.requestTimeout,headers:t}))()}catch(e){throw new s.HudWorkloadCollectorError(`Could not retrieve instance life cycle: ${e}`)}const a=i.data;return{workload_id:n.instanceId,workload_instance_type:n.instanceType,region:n.region,ami_id:n.imageId,launched_date:n.pendingTime,life_cycle:a}}async getAWSWorkloadData(){try{return await this.getLocalAWSWorkloadData()}catch(e){c.worker_logger.info("Failed to get workload metadata from local file",{msg:e.message})}try{return await this.getIMDSWorkloadData()}catch(e){c.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){c.worker_logger.info("Sending workload metadata to the server",{msg:e}),await this.client.send("WorkloadData",e)}}},5809:e=>{e.exports=require("./config")},6261:e=>{e.exports=require("events")},6304:(e,t,o)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createRegexes=function(e){return e.map(e=>({regex:new RegExp(e.regex,"g"),replacement:e.replacement}))},t.censorInvestigation=function(e,t){const o=e.context?function(e,t,o){const n={system_info:e?.system_info,machine_metrics:e?.machine_metrics,observability_identifiers:e?.observability_identifiers};if("http"===e.type)return{...n,...r(e,t,o)};if("sqs"===e.type)return{...n,...i(e,t,o)};throw new Error(`Unknown context type: ${e}`)}(e.context,t.valueRegexToRedact,t.keysToRedact):void 0;let s={status:e.status,context:o,exceptions:e.exceptions.map(e=>({name:e.name,message:e.message?a(e.message,t.valueRegexToRedact):void 0,stackTrace:e.stackTrace,executionFlow:e.executionFlow})),...e.userContext?{userContext:e.userContext}:{}};return t.whitelistNestedFields.length>0&&(s=(0,n.pickDeep)(s,t.whitelistNestedFields)),t.blacklistNestedFields.length>0&&(s=(0,n.omitDeep)(s,t.blacklistNestedFields)),s};const n=o(2546);function r(e,t,o){return{type:e.type,endpoint_uuid:e.endpoint_uuid,status_code:e.status_code,route:a(e?.route,t),params:s(e?.params,t,o),query:s(e?.query,t,o),request_body:s(e?.request_body,t,o),method:e?.method,timestamp:e?.timestamp,extra_headers:e.extra_headers??{}}}function i(e,t,o){return{type:e.type,flow_id:e.flow_id,messages:s(e.messages,t,o),timestamp:e.timestamp}}function a(e,t){for(const o of t)e=e.replace(o.regex,o.replacement);return e}function s(e,t,o){if("string"==typeof e)return a(e,t);if("object"==typeof e&&null!==e)for(const n in e)o.includes(n)?e[n]="[REDACTED]":e[n]=s(e[n],t,o);return e}},6928:e=>{e.exports=require("path")},6982:e=>{e.exports=require("crypto")},8167:e=>{e.exports=require("worker_threads")},8269:e=>{e.exports=require("./globalstate")},8528:e=>{e.exports=require("./dto")},8938:e=>{e.exports=require("axios")},9896:e=>{e.exports=require("fs")}},t={};return function o(n){var r=t[n];if(void 0!==r)return r.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,o),i.exports}(1886)})());
//# sourceMappingURL=worker.js.map