@lensmcp/node-instrumentation 1.22.5 → 1.22.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +1 -1
- package/lib/active-work.js +1 -1
- package/lib/emit.js +3 -3
- package/lib/flood-guard.js +1 -1
- package/lib/flow-context.js +1 -1
- package/lib/install.js +1 -1
- package/lib/require-hook.js +1 -1
- package/lib/tap-bullmq.js +1 -1
- package/lib/tap-egress.js +1 -1
- package/lib/tap-event-loop.js +1 -1
- package/lib/tap-exec.js +1 -1
- package/lib/tap-fs.js +1 -1
- package/lib/tap-nest.js +1 -1
- package/lib/tap-pg.js +1 -1
- package/lib/tap-redis.js +1 -1
- package/lib/tap-stdout.js +3 -3
- package/package.json +4 -4
- package/register.js +1 -1
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var n=Object.defineProperty;var e=(t,r)=>n(t,"name",{value:r,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.resetActiveWorkForTests=exports.installActiveWorkProbe=exports.beginActiveWork=exports.activeWorkSnapshot=exports.installLensmcpNodeInstrumentation=exports.installChildAppBridge=exports.nestTap=exports.bullmqTap=exports.redisTap=exports.pgTap=exports.tapExec=exports.tapFs=exports.stopEventLoopTapForTests=exports.tapEventLoop=exports.resetEgressTapForTests=exports.tapEgress=exports.installRequireHook=exports.createEventFloodGuard=exports.maybeRotateEventFile=exports.EVENT_MAX_FILES=exports.EVENT_MAX_BYTES=exports.EVENT_FILE=exports.PROJECT=exports.isLensWriting=exports.lensEmit=void 0;var emit_1=require("./lib/emit");Object.defineProperty(exports,"lensEmit",{enumerable:!0,get:e(function(){return emit_1.lensEmit},"get")}),Object.defineProperty(exports,"isLensWriting",{enumerable:!0,get:e(function(){return emit_1.isLensWriting},"get")}),Object.defineProperty(exports,"PROJECT",{enumerable:!0,get:e(function(){return emit_1.PROJECT},"get")}),Object.defineProperty(exports,"EVENT_FILE",{enumerable:!0,get:e(function(){return emit_1.EVENT_FILE},"get")}),Object.defineProperty(exports,"EVENT_MAX_BYTES",{enumerable:!0,get:e(function(){return emit_1.EVENT_MAX_BYTES},"get")}),Object.defineProperty(exports,"EVENT_MAX_FILES",{enumerable:!0,get:e(function(){return emit_1.EVENT_MAX_FILES},"get")}),Object.defineProperty(exports,"maybeRotateEventFile",{enumerable:!0,get:e(function(){return emit_1.maybeRotateEventFile},"get")});var flood_guard_1=require("./lib/flood-guard");Object.defineProperty(exports,"createEventFloodGuard",{enumerable:!0,get:e(function(){return flood_guard_1.createEventFloodGuard},"get")});var require_hook_1=require("./lib/require-hook");Object.defineProperty(exports,"installRequireHook",{enumerable:!0,get:e(function(){return require_hook_1.installRequireHook},"get")});var tap_egress_1=require("./lib/tap-egress");Object.defineProperty(exports,"tapEgress",{enumerable:!0,get:e(function(){return tap_egress_1.tapEgress},"get")}),Object.defineProperty(exports,"resetEgressTapForTests",{enumerable:!0,get:e(function(){return tap_egress_1.resetEgressTapForTests},"get")});var tap_event_loop_1=require("./lib/tap-event-loop");Object.defineProperty(exports,"tapEventLoop",{enumerable:!0,get:e(function(){return tap_event_loop_1.tapEventLoop},"get")}),Object.defineProperty(exports,"stopEventLoopTapForTests",{enumerable:!0,get:e(function(){return tap_event_loop_1.stopEventLoopTapForTests},"get")});var tap_fs_1=require("./lib/tap-fs");Object.defineProperty(exports,"tapFs",{enumerable:!0,get:e(function(){return tap_fs_1.tapFs},"get")});var tap_exec_1=require("./lib/tap-exec");Object.defineProperty(exports,"tapExec",{enumerable:!0,get:e(function(){return tap_exec_1.tapExec},"get")});var tap_pg_1=require("./lib/tap-pg");Object.defineProperty(exports,"pgTap",{enumerable:!0,get:e(function(){return tap_pg_1.pgTap},"get")});var tap_redis_1=require("./lib/tap-redis");Object.defineProperty(exports,"redisTap",{enumerable:!0,get:e(function(){return tap_redis_1.redisTap},"get")});var tap_bullmq_1=require("./lib/tap-bullmq");Object.defineProperty(exports,"bullmqTap",{enumerable:!0,get:e(function(){return tap_bullmq_1.bullmqTap},"get")});var tap_nest_1=require("./lib/tap-nest");Object.defineProperty(exports,"nestTap",{enumerable:!0,get:e(function(){return tap_nest_1.nestTap},"get")}),Object.defineProperty(exports,"installChildAppBridge",{enumerable:!0,get:e(function(){return tap_nest_1.installChildAppBridge},"get")});var install_1=require("./lib/install");Object.defineProperty(exports,"installLensmcpNodeInstrumentation",{enumerable:!0,get:e(function(){return install_1.installLensmcpNodeInstrumentation},"get")});var active_work_1=require("./lib/active-work");Object.defineProperty(exports,"activeWorkSnapshot",{enumerable:!0,get:e(function(){return active_work_1.activeWorkSnapshot},"get")}),Object.defineProperty(exports,"beginActiveWork",{enumerable:!0,get:e(function(){return active_work_1.beginActiveWork},"get")}),Object.defineProperty(exports,"installActiveWorkProbe",{enumerable:!0,get:e(function(){return active_work_1.installActiveWorkProbe},"get")}),Object.defineProperty(exports,"resetActiveWorkForTests",{enumerable:!0,get:e(function(){return active_work_1.resetActiveWorkForTests},"get")});
|
package/lib/active-work.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var i=Object.defineProperty;var n=(t,e)=>i(t,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.beginActiveWorkGeneration=beginActiveWorkGeneration,exports.activeWorkGeneration=activeWorkGeneration,exports.beginActiveWork=beginActiveWork,exports.activeWorkSnapshot=activeWorkSnapshot,exports.installActiveWorkProbe=installActiveWorkProbe,exports.resetActiveWorkForTests=resetActiveWorkForTests;const GLOBAL_KEY="__lensmcpActiveWork",running=new Set;let currentGeneration=0;function beginActiveWorkGeneration(){return++currentGeneration}n(beginActiveWorkGeneration,"beginActiveWorkGeneration");function activeWorkGeneration(){return currentGeneration}n(activeWorkGeneration,"activeWorkGeneration");function beginActiveWork(t){const e={at:Date.now(),...t===void 0?{}:{gen:t}};running.add(e);let r=!1;return()=>{r||(r=!0,running.delete(e))}}n(beginActiveWork,"beginActiveWork");function activeWorkSnapshot(t){let e,r=0;for(const o of running)t!==void 0&&o.gen!==void 0&&o.gen!==t||(r+=1,(e===void 0||o.at<e)&&(e=o.at));return{count:r,...e===void 0?{}:{oldestStartedAt:e}}}n(activeWorkSnapshot,"activeWorkSnapshot");function installActiveWorkProbe(){globalThis[GLOBAL_KEY]=activeWorkSnapshot,globalThis.__lensmcpBeginWorkGeneration=beginActiveWorkGeneration}n(installActiveWorkProbe,"installActiveWorkProbe");function resetActiveWorkForTests(){running.clear(),currentGeneration=0}n(resetActiveWorkForTests,"resetActiveWorkForTests");
|
package/lib/emit.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`;maybeRotateEventFile(exports.EVENT_FILE,
|
|
3
|
-
`;maybeRotateEventFile(exports.EVENT_FILE,r.length),appendFileSync(exports.EVENT_FILE,r)}catch{}finally{writing=!1}}
|
|
1
|
+
"use strict";var a=Object.defineProperty;var c=(e,n)=>a(e,"name",{value:n,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.EVENT_FILE=exports.PROJECT=exports.EVENT_MAX_FILES=exports.EVENT_MAX_BYTES=void 0,exports.maybeRotateEventFile=maybeRotateEventFile,exports.isLensWriting=isLensWriting,exports.lensEmit=lensEmit,exports.lensLog=lensLog;const tslib_1=require("tslib"),nodeFs=tslib_1.__importStar(require("node:fs")),node_path_1=require("node:path"),flood_guard_1=require("./flood-guard"),flow_context_1=require("./flow-context"),appendFileSync=nodeFs.appendFileSync,mkdirSync=nodeFs.mkdirSync,statSync=nodeFs.statSync,renameSync=nodeFs.renameSync,unlinkSync=nodeFs.unlinkSync;exports.EVENT_MAX_BYTES=(()=>{const e=Number(process.env.LENSMCP_EVENT_MAX_BYTES);return Number.isFinite(e)&&e>0?e:50*1024*1024})(),exports.EVENT_MAX_FILES=(()=>{const e=Number(process.env.LENSMCP_EVENT_MAX_FILES);return Number.isFinite(e)&&e>=1&&e<=20?Math.floor(e):5})();const ROTATE_CHECK_BYTES=1024*1024,bytesSinceCheck=new Map;function maybeRotateEventFile(e,n,o){const s=(bytesSinceCheck.get(e)??0)+n;if(s<ROTATE_CHECK_BYTES&&o===void 0){bytesSinceCheck.set(e,s);return}const i=o?.maxBytes??exports.EVENT_MAX_BYTES,t=o?.maxFiles??exports.EVENT_MAX_FILES;try{const r=statSync(e).size;if(bytesSinceCheck.set(e,0),r<=i)return}catch{bytesSinceCheck.set(e,s);return}try{unlinkSync(`${e}.${t}`)}catch{}for(let r=t-1;r>=1;r--)try{renameSync(`${e}.${r}`,`${e}.${r+1}`)}catch{}try{renameSync(e,`${e}.1`)}catch{}}c(maybeRotateEventFile,"maybeRotateEventFile"),exports.PROJECT=process.env.LENSMCP_PROJECT||process.env.SERVICE_NAME||"app",exports.EVENT_FILE=process.env.LENSMCP_EVENT_FILE||`${process.cwd()}/.lensmcp/events.jsonl`;let writing=!1,dirReady=!1;const emitGuard=(0,flood_guard_1.createEventFloodGuard)({burst:30,perSec:5}),logGuard=(0,flood_guard_1.createEventFloodGuard)({burst:120,perSec:20});function isLensWriting(){return writing}c(isLensWriting,"isLensWriting");function lensEmit(e,n,o,s,i,t,r="cluster"){try{writing=!0;const p=i??`${e}:${String(s.name??e)}`,E=emitGuard.admit(p);if(!E.ok)return;dirReady||(mkdirSync((0,node_path_1.dirname)(exports.EVENT_FILE),{recursive:!0}),dirReady=!0);const d=JSON.stringify({id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),sessionId:"pending",timestamp:Date.now(),source:e,category:r,severity:n,context:{sessionId:"pending",projectName:exports.PROJECT,...t?.flowId?{flowId:t.flowId}:{},...t?.requestId?{requestId:t.requestId}:{},...t?.originNodeId?{originNodeId:t.originNodeId}:{}},fingerprint:p,title:o,raw:{project:exports.PROJECT,...s,...E.suppressed>0?{floodSuppressed:E.suppressed}:{}}})+`
|
|
2
|
+
`;maybeRotateEventFile(exports.EVENT_FILE,d.length),appendFileSync(exports.EVENT_FILE,d)}catch{}finally{writing=!1}}c(lensEmit,"lensEmit");function lensLog(e,n,o){try{writing=!0;const s=e==="error"||e==="fatal"?`log:error:${exports.PROJECT}`:`log:${exports.PROJECT}`,i=logGuard.admit(s);if(!i.ok)return;dirReady||(mkdirSync((0,node_path_1.dirname)(exports.EVENT_FILE),{recursive:!0}),dirReady=!0);const t=(0,flow_context_1.flowContext)(),r=JSON.stringify({id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),sessionId:"pending",timestamp:Date.now(),source:"nestjs",category:"runtime",severity:e,context:{sessionId:"pending",projectName:exports.PROJECT,...t?.flowId?{flowId:t.flowId}:{},...t?.requestId?{requestId:t.requestId}:{}},fingerprint:s,title:n,raw:{project:exports.PROJECT,kind:"log",...o?.stack?{request:{error:{message:n,stack:o.stack}}}:{},...i.suppressed>0?{floodSuppressed:i.suppressed}:{}}})+`
|
|
3
|
+
`;maybeRotateEventFile(exports.EVENT_FILE,r.length),appendFileSync(exports.EVENT_FILE,r)}catch{}finally{writing=!1}}c(lensLog,"lensLog");
|
package/lib/flood-guard.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var e=(r,t)=>o(r,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.createEventFloodGuard=void 0;var protocol_types_1=require("@lensmcp/protocol-types");Object.defineProperty(exports,"createEventFloodGuard",{enumerable:!0,get:e(function(){return protocol_types_1.createEventFloodGuard},"get")});
|
package/lib/flow-context.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var n=(t,e)=>s(t,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.flowContextStatus=flowContextStatus,exports.resetFlowContextForTests=resetFlowContextForTests,exports.isRequireEsmError=isRequireEsmError,exports.isModuleNotFoundError=isModuleNotFoundError,exports.primeFlowContext=primeFlowContext,exports.runInFlowContext=runInFlowContext,exports.liveFlowContext=liveFlowContext,exports.flowContext=flowContext;let getCtx=null,runWith=null,status={state:"not-primed"},warned=!1;function flowContextStatus(){return status}n(flowContextStatus,"flowContextStatus");function resetFlowContextForTests(){getCtx=null,runWith=null,status={state:"not-primed"},warned=!1}n(resetFlowContextForTests,"resetFlowContextForTests");function isRequireEsmError(t){const e=t?.code;return e==="ERR_REQUIRE_ESM"||e==="ERR_REQUIRE_ASYNC_MODULE"}n(isRequireEsmError,"isRequireEsmError");function isModuleNotFoundError(t){const e=t;return e?.code!=="MODULE_NOT_FOUND"&&e?.code!=="ERR_MODULE_NOT_FOUND"?!1:String(e?.message??"").includes("@lensmcp/nest-instrumentation")}n(isModuleNotFoundError,"isModuleNotFoundError");function requireNestInstrumentation(){return require("@lensmcp/nest-instrumentation")}n(requireNestInstrumentation,"requireNestInstrumentation");function primeFlowContext(t=requireNestInstrumentation){try{const e=t();getCtx=e.currentLensmcpContext,runWith=e.runInLensmcpContext,status={state:"ready"}}catch(e){if(getCtx=null,runWith=null,isModuleNotFoundError(e)){status={state:"absent"};return}const o=e instanceof Error?e.message:String(e);if(status=isRequireEsmError(e)?{state:"runtime-too-old",detail:o}:{state:"failed",detail:o},!warned){warned=!0;const r=status.state==="runtime-too-old"?`this Node (${process.version}) cannot require an ESM package; @lensmcp/node-instrumentation needs >=20.19`:o;console.warn(`[lensmcp] flow correlation is OFF \u2014 could not load @lensmcp/nest-instrumentation: ${r}`)}}}n(primeFlowContext,"primeFlowContext");function runInFlowContext(t,e){if(!runWith)return e();try{return runWith({sessionId:"pending",requestId:t.requestId,...t.flowId?{flowId:t.flowId}:{}},e)}catch{return e()}}n(runInFlowContext,"runInFlowContext");function liveFlowContext(){try{return getCtx?.()}catch{return}}n(liveFlowContext,"liveFlowContext");function flowContext(){const t=liveFlowContext();if(t)return{...t.flowId?{flowId:t.flowId}:{},...t.requestId?{requestId:t.requestId}:{},...t.originNodeId?{originNodeId:t.originNodeId}:{}}}n(flowContext,"flowContext");
|
package/lib/install.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var e=(t,r)=>s(t,"name",{value:r,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.installLensmcpNodeInstrumentation=installLensmcpNodeInstrumentation;const require_hook_1=require("./require-hook"),flow_context_1=require("./flow-context"),tap_egress_1=require("./tap-egress"),tap_fs_1=require("./tap-fs"),tap_exec_1=require("./tap-exec"),tap_pg_1=require("./tap-pg"),tap_redis_1=require("./tap-redis"),active_work_1=require("./active-work"),tap_bullmq_1=require("./tap-bullmq"),tap_nest_1=require("./tap-nest"),tap_event_loop_1=require("./tap-event-loop"),tap_stdout_1=require("./tap-stdout");function installLensmcpNodeInstrumentation(){const t=globalThis;if(!t.__lensmcpNodeInstrumented&&(t.__lensmcpNodeInstrumented=!0,process.env.LENSMCP_AUTO!=="0")){try{(0,active_work_1.installActiveWorkProbe)()}catch{}try{(0,flow_context_1.primeFlowContext)()}catch{}try{(0,tap_egress_1.tapEgress)()}catch{}try{(0,tap_fs_1.tapFs)()}catch{}try{(0,tap_exec_1.tapExec)()}catch{}try{(0,tap_stdout_1.tapStdout)()}catch{}try{(0,tap_event_loop_1.tapEventLoop)()}catch{}try{(0,require_hook_1.installRequireHook)({pg:tap_pg_1.pgTap,ioredis:tap_redis_1.redisTap,bullmq:tap_bullmq_1.bullmqTap,"@nestjs/core":tap_nest_1.nestTap})}catch{}try{(0,tap_nest_1.installChildAppBridge)()}catch{}}}e(installLensmcpNodeInstrumentation,"installLensmcpNodeInstrumentation");
|
package/lib/require-hook.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var a=Object.defineProperty;var r=(o,t)=>a(o,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.installRequireHook=installRequireHook;const tapped=new Set;function runTap(o,t,s){try{t(s)!==!1&&tapped.add(o)}catch{tapped.add(o)}}r(runTap,"runTap");function installRequireHook(o){const t=require("node:module"),s=t._load;t._load=function(e,...c){const i=s.call(this,e,...c),n=o[e];return n&&!tapped.has(e)&&runTap(e,n,i),i};for(const e of Object.keys(o)){if(tapped.has(e))continue;const c=o[e];if(c)try{const i=require.resolve(e),n=require.cache[i];n&&runTap(e,c,n.exports)}catch{}}}r(installRequireHook,"installRequireHook");
|
package/lib/tap-bullmq.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var w=Object.defineProperty;var l=(r,e)=>w(r,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.bullmqTap=bullmqTap;const active_work_1=require("./active-work"),workerGeneration=new WeakMap,emit_1=require("./emit"),flow_context_1=require("./flow-context");function jobFlow(r){const e=r?.opts?.__lensmcpFlow;return e&&typeof e=="object"?e:void 0}l(jobFlow,"jobFlow");const jobLegId=l((r,e)=>`job:${r}#${e?.id??"?"}`,"jobLegId"),publishers=new Map;function bullmqTap(r){const e=r;if(typeof e?.Queue!="function"||typeof e?.Worker!="function")return!1;try{tapQueueAdd(e)}catch{}try{tapWorkerEmit(e)}catch{}try{tapWorkerProcess(e)}catch{}try{tapWorkerConstruct(e)}catch{}return!0}l(bullmqTap,"bullmqTap");function tapWorkerConstruct(r){const e=r.Worker;if(typeof e!="function"||e.__lensmcpGen)return;const u=new Proxy(e,{construct(n,o,t){const c=Reflect.construct(n,o,t);try{workerGeneration.set(c,(0,active_work_1.activeWorkGeneration)())}catch{}return c}});Object.defineProperty(e,"__lensmcpGen",{value:!0,enumerable:!1}),r.Worker=u}l(tapWorkerConstruct,"tapWorkerConstruct");function tapWorkerProcess(r){const u=r.Worker?.prototype,n=u?.callProcessJob;if(!u||typeof n!="function"||n.__lensmcp)return;const o=l(async function(t,...c){const a=workerGeneration.get(this),i=(0,active_work_1.beginActiveWork)(a),s=jobFlow(t);if(!s?.flowId)return n.call(this,t,...c).finally(i);const d=String(this?.name??t?.queueName??"queue"),q=jobLegId(d,t),f=Date.now(),p={flowId:s.flowId,requestId:q};return(0,flow_context_1.runInFlowContext)(p,async()=>{try{const m=await n.call(this,t,...c);return(0,emit_1.lensEmit)("queue","info",`process ${t?.name}#${t?.id} (${Date.now()-f}ms)`,{queue:d,kind:"queue-process",job:t?.name,jobId:t?.id,startedAt:f,durationMs:Date.now()-f,status:"ok"},`queue:${d}`,p),m}catch(m){throw(0,emit_1.lensEmit)("queue","error",`process ${t?.name}#${t?.id} failed (${Date.now()-f}ms)`,{queue:d,kind:"queue-process",job:t?.name,jobId:t?.id,startedAt:f,durationMs:Date.now()-f,status:"error",error:String(m?.message??m)},`queue:${d}`,p),m}finally{i()}})},"wrapped");o.__lensmcp=!0,u.callProcessJob=o}l(tapWorkerProcess,"tapWorkerProcess");function tapQueueAdd(r){const u=r.Queue?.prototype,n=u?.add;if(!u||typeof n!="function"||n.__lensmcp)return;const o=l(async function(t,...c){const a=Date.now(),i=(0,flow_context_1.flowContext)();if(i?.flowId){const d=c[1]??{};c[1]={...d,__lensmcpFlow:{flowId:i.flowId,...i.requestId?{originRequestId:i.requestId}:{}}}}const s=await n.call(this,t,...c);try{const d=String(this?.name??"queue"),q=c[0];let f;try{const p=JSON.stringify(q);f=p&&p!=="undefined"?p.length>300?p.slice(0,299)+"\u2026":p:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`enqueued ${t}#${s?.id} \u2192 ${d}`,{queue:d,kind:"queue-enqueued",job:t,jobId:s?.id,...f?{data:f}:{},startedAt:a,durationMs:Date.now()-a},`queue:${d}`,i),ensureStatePublisher(d,this)}catch{}return s},"wrapped");o.__lensmcp=!0,u.add=o}l(tapQueueAdd,"tapQueueAdd");function tapWorkerEmit(r){const u=r.Worker?.prototype,n=u?.emit;if(!u||typeof n!="function"||n.__lensmcp)return;const o=l(function(t,...c){try{observeWorkerEvent(this,String(t),c)}catch{}return n.call(this,t,...c)},"wrapped");o.__lensmcp=!0,u.emit=o}l(tapWorkerEmit,"tapWorkerEmit");function observeWorkerEvent(r,e,u){if(e!=="active"&&e!=="completed"&&e!=="failed")return;const n=String(r.name??"queue"),o=u[0],t=jobFlow(o),c=t?.flowId?{flowId:t.flowId,requestId:jobLegId(n,o)}:void 0;if(e==="active")(0,emit_1.lensEmit)("queue","info",`processing ${o?.name}#${o?.id}`,{queue:n,kind:"queue-active",jobId:o?.id},`queue:${n}`,c);else if(e==="completed"){let a;try{const i=o?.returnvalue??u[1],s=JSON.stringify(i);a=s&&s!=="undefined"?s.length>160?s.slice(0,159)+"\u2026":s:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`completed ${o?.name}#${o?.id}`,{queue:n,kind:"queue-completed",jobId:o?.id,...a?{returned:a}:{}},`queue:${n}`,c)}else{const a=u[1];(0,emit_1.lensEmit)("queue","error",`job ${o?.id} failed: ${a?.message}`,{queue:n,kind:"queue-failed",jobId:o?.id,error:String(a?.message??a)},`queue:${n}`,c)}if(!publishers.has(n))try{const a=r.opts,s=require("bullmq").Queue;ensureStatePublisher(n,new s(n,{connection:a?.connection}))}catch{}}l(observeWorkerEvent,"observeWorkerEvent");function ensureStatePublisher(r,e){if(publishers.has(r))return;let u="";const n=setInterval(()=>{(async()=>{try{const o=await e.getJobCounts(),t=[];for(const i of["active","waiting","failed","completed","delayed"])for(const s of await e.getJobs([i],0,7)){const d=s?.data?.to;t.push({id:String(s.id),name:s.name,state:i,timestamp:s.timestamp??0,...typeof d=="string"?{to:d}:{}})}t.sort((i,s)=>Number(s.timestamp)-Number(i.timestamp));const c=t.slice(0,8),a=JSON.stringify([o,c.map(i=>`${i.id}${i.state}`)]);if(a===u)return;u=a,(0,emit_1.lensEmit)("queue","info",`queue state: ${o.active??0} active \xB7 ${o.waiting??0} waiting \xB7 ${o.failed??0} failed`,{queue:r,kind:"queue-state",counts:o,recent:c},`queue:${r}`)}catch{}})()},2e3);n.unref?.(),publishers.set(r,n)}l(ensureStatePublisher,"ensureStatePublisher");
|
package/lib/tap-egress.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var g=Object.defineProperty;var i=(t,s)=>g(t,"name",{value:s,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapEgress=tapEgress,exports.resetEgressTapForTests=resetEgressTapForTests;const redact_1=require("@lensmcp/core/redact"),emit_1=require("./emit"),flow_context_1=require("./flow-context"),INTERNAL=[/\.local$/i,/\.internal$/i,/^localhost$/i,/^127\./,/^\[?::1\]?$/,/^0\.0\.0\.0$/,/^10\./,/^192\.168\./,/^172\.(1[6-9]|2\d|3[01])\./,/^169\.254\./,/^\[?[fF][cCdD][0-9a-fA-F]{2}:/,/^\[?[fF][eE]80:/],isInternal=i(t=>t===""||INTERNAL.some(s=>s.test(t)),"isInternal"),CAPTURE_QUERY=process.env.LENSMCP_EGRESS_QUERY==="1",MAX_PATH_CHARS=256,clipPath=i(t=>t.length>MAX_PATH_CHARS?`${t.slice(0,MAX_PATH_CHARS)}\u2026`:t,"clipPath");function capturePath(t,s){const e=t||"/";return!CAPTURE_QUERY||s.length<=1?clipPath(e):(0,redact_1.redactUrl)(`${e}${s}`)}i(capturePath,"capturePath");const fingerprintFor=i((t,s)=>s?`external:error:${t}`:`external:${t}`,"fingerprintFor");function tapEgress(){tapFetch(),tapHttpModule("http"),tapHttpModule("https")}i(tapEgress,"tapEgress");let savedFetch;const httpOriginals=new Map;function resetEgressTapForTests(){const t=globalThis;savedFetch&&(t.fetch=savedFetch),delete t.__lensmcpFetchTap,restoreHttp("http"),restoreHttp("https"),savedFetch=void 0}i(resetEgressTapForTests,"resetEgressTapForTests");function restoreHttp(t){const s=httpOriginals.get(t);if(!s)return;const e=require(`node:${t}`);e.request=s.request,e.get=s.get,httpOriginals.delete(t)}i(restoreHttp,"restoreHttp");function tapFetch(){const t=globalThis;if(typeof t.fetch!="function"||t.__lensmcpFetchTap)return;t.__lensmcpFetchTap=!0;const s=t.fetch.bind(globalThis);savedFetch=t.fetch,t.fetch=(async(e,c)=>{let a="",l="/",n=!1;try{const o=new URL(typeof e=="string"?e:e instanceof URL?e.href:e.url);a=o.hostname,n=o.search.length>1,l=capturePath(o.pathname,o.search)}catch{}if(isInternal(a))return s(e,c);const r=Date.now(),u=(0,flow_context_1.flowContext)(),f=(0,flow_context_1.liveFlowContext)();f&&(f.externalCallCount=(f.externalCallCount??0)+1);const p=typeof e=="object"&&e!==null&&!(e instanceof URL)?e.method:void 0,h=String(c?.method??p??"GET").toUpperCase();try{const o=await s(e,c),d=o.status>=500;return(0,emit_1.lensEmit)("external","info",`egress ${h} ${a} \u2192 ${o.status}`,{name:a,kind:"egress",method:h,host:a,path:l,status:o.status,...n?{hasQuery:!0}:{},startedAt:r,durationMs:Date.now()-r},fingerprintFor(a,d),u),o}catch(o){throw(0,emit_1.lensEmit)("external","error",`egress ${h} ${a} failed`,{name:a,kind:"egress",method:h,host:a,path:l,...n?{hasQuery:!0}:{},error:String(o?.message??o),startedAt:r,durationMs:Date.now()-r},fingerprintFor(a,!0),u),o}})}i(tapFetch,"tapFetch");function tapHttpModule(t){const s=require(`node:${t}`),e=s.request;if(typeof e!="function"||e.__lensmcp)return;httpOriginals.set(t,{request:e,get:s.get});const c=i(function(...l){const n=e.apply(this,l);try{observe(l,n)}catch{}return n},"wrapped");c.__lensmcp=!0,s.request=c,typeof s.get=="function"&&(s.get=function(...l){const n=c.apply(this,l);return n.end(),n})}i(tapHttpModule,"tapHttpModule");function observe(t,s){const{host:e,method:c,path:a,hasQuery:l}=parseTarget(t);if(isInternal(e))return;const n=Date.now(),r=(0,flow_context_1.flowContext)(),u=(0,flow_context_1.liveFlowContext)();u&&(u.externalCallCount=(u.externalCallCount??0)+1);let f=!1;s.once("response",(...p)=>{if(f)return;f=!0;const o=p[0]?.statusCode;(0,emit_1.lensEmit)("external","info",`egress ${c} ${e} \u2192 ${o??"?"}`,{name:e,kind:"egress",method:c,host:e,path:a,...o!=null?{status:o}:{},...l?{hasQuery:!0}:{},startedAt:n,durationMs:Date.now()-n},fingerprintFor(e,o!=null&&o>=500),r)}),s.once("error",(...p)=>{if(f)return;f=!0;const h=p[0];(0,emit_1.lensEmit)("external","error",`egress ${c} ${e} failed`,{name:e,kind:"egress",method:c,host:e,path:a,...l?{hasQuery:!0}:{},error:String(h?.message??h),startedAt:n,durationMs:Date.now()-n},fingerprintFor(e,!0),r)})}i(observe,"observe");function parseTarget(t){let s="",e="GET",c="/",a=!1;const l=i((n,r)=>{a=r.length>1,c=capturePath(n,r)},"take");for(const n of t)if(typeof n=="string")try{const r=new URL(n);s=r.hostname,l(r.pathname,r.search)}catch{}else if(n instanceof URL)s=n.hostname,l(n.pathname,n.search);else if(n&&typeof n=="object"){const r=n;if(typeof r.method=="string"&&(e=r.method.toUpperCase()),typeof r.socketPath=="string")return{host:"",method:e,path:c,hasQuery:a};if(typeof r.path=="string"){const u=r.path,f=u.indexOf("?");l(f===-1?u:u.slice(0,f),f===-1?"":u.slice(f))}typeof r.hostname=="string"&&r.hostname?s=r.hostname:typeof r.host=="string"&&r.host&&(s=r.host.split(":")[0]??"")}return{host:s,method:e,path:c,hasQuery:a}}i(parseTarget,"parseTarget");
|
package/lib/tap-event-loop.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var a=Object.defineProperty;var n=(e,t)=>a(e,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapEventLoop=tapEventLoop,exports.stopEventLoopTapForTests=stopEventLoopTapForTests;const node_perf_hooks_1=require("node:perf_hooks"),emit_1=require("./emit"),SAMPLE_MS=(()=>{const e=Number(process.env.LENSMCP_EVENT_LOOP_SAMPLE_MS);return Number.isFinite(e)&&e>=1e3?e:3e4})(),REPORT_ABOVE_MS=(()=>{const e=Number(process.env.LENSMCP_EVENT_LOOP_MIN_MS);return Number.isFinite(e)&&e>=0?e:50})(),RESOLUTION_MS=20;let timer,published=!1;function tapEventLoop(){if(process.env.LENSMCP_EVENT_LOOP==="0"||timer)return;const e=(0,node_perf_hooks_1.monitorEventLoopDelay)({resolution:RESOLUTION_MS});e.enable(),timer=setInterval(()=>{const t=RESOLUTION_MS,r=e.mean/1e6;if(!Number.isFinite(r))return;const s=Math.max(0,r-t),o=Math.max(0,e.max/1e6-t),i=Math.max(0,e.percentile(99)/1e6-t);e.reset(),!(published&&o<REPORT_ABOVE_MS)&&(published=!0,(0,emit_1.lensEmit)("perf",o>=1e3?"error":"info",`event loop lag ${s.toFixed(1)}ms mean / ${o.toFixed(1)}ms max`,{kind:"event-loop-lag",lagMs:Number(s.toFixed(2)),maxMs:Number(o.toFixed(2)),p99Ms:Number(i.toFixed(2)),windowMs:SAMPLE_MS},"perf:event-loop-lag",void 0,"performance"))},SAMPLE_MS),timer.unref?.()}n(tapEventLoop,"tapEventLoop");function stopEventLoopTapForTests(){timer&&clearInterval(timer),timer=void 0,published=!1}n(stopEventLoopTapForTests,"stopEventLoopTapForTests");
|
package/lib/tap-exec.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var x=Object.defineProperty;var u=(o,e)=>x(o,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapExec=tapExec;const emit_1=require("./emit"),fmtCmd=u((o,e)=>{const t=Array.isArray(e)?e.map(String).slice(0,8).join(" "):"";return`${String(o)}${t?" "+t:""}`.slice(0,200)},"fmtCmd");function wrap(o,e,t){const n=o[e];if(typeof n!="function"||n.__lensmcp)return;const r=t(n);r.__lensmcp=!0,o[e]=r}u(wrap,"wrap");function observeChild(o,e,t){if(!t||typeof t.once!="function")return;const n=t;if(n.__lensmcpObserved)return;n.__lensmcpObserved=!0;const r=Date.now();t.once("exit",(...s)=>{const c=s[0],a=s[1];(0,emit_1.lensEmit)("exec",c===0?"info":"error",`exec ${e.split(" ")[0]} \u2192 ${c??a}`,{name:"exec",kind:"exec",cmd:e,via:o,...c!=null?{code:c}:{},...a?{signal:a}:{},durationMs:Date.now()-r,...t.pid?{pid:t.pid}:{}})}),t.once("error",(...s)=>{const c=s[0];(0,emit_1.lensEmit)("exec","error",`exec ${e.split(" ")[0]} failed to start`,{name:"exec",kind:"exec",cmd:e,via:o,error:String(c?.message??c),durationMs:Date.now()-r})})}u(observeChild,"observeChild");function tapExec(){const o=require("node:child_process");for(const e of["spawn","fork"])wrap(o,e,t=>function(n,...r){const s=Array.isArray(r[0])?r[0]:[],c=t.call(this,n,...r);try{observeChild(e,fmtCmd(n,s),c)}catch{}return c});wrap(o,"exec",e=>function(t,...n){const r=e.call(this,t,...n);try{observeChild("exec",String(t).slice(0,200),r)}catch{}return r}),wrap(o,"execFile",e=>function(t,...n){const r=Array.isArray(n[0])?n[0]:[],s=e.call(this,t,...n);try{observeChild("execFile",fmtCmd(t,r),s)}catch{}return s});for(const e of["execSync","execFileSync","spawnSync"])wrap(o,e,t=>function(n,...r){const s=Array.isArray(r[0])?r[0]:[],c=e==="execSync"?String(n).slice(0,200):fmtCmd(n,s),a=Date.now();try{const i=t.call(this,n,...r),l=i&&typeof i=="object"&&"status"in i?i.status??0:0;return(0,emit_1.lensEmit)("exec",l===0?"info":"error",`exec ${c.split(" ")[0]} \u2192 ${l}`,{name:"exec",kind:"exec",cmd:c,via:e,code:l,durationMs:Date.now()-a,sync:!0}),i}catch(i){throw(0,emit_1.lensEmit)("exec","error",`exec ${c.split(" ")[0]} failed`,{name:"exec",kind:"exec",cmd:c,via:e,error:String(i?.message??i),durationMs:Date.now()-a,sync:!0}),i}})}u(tapExec,"tapExec");
|
package/lib/tap-fs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var u=Object.defineProperty;var l=(n,s)=>u(n,"name",{value:s,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapFs=tapFs;const tslib_1=require("tslib"),os=tslib_1.__importStar(require("node:os")),emit_1=require("./emit"),bucket={reads:0,writes:0,bytesRead:0,bytesWritten:0,paths:new Map};let timer=null;const TMP=os.tmpdir(),CWD=process.cwd(),SKIP=["node_modules","/.nx/","/dist/","/.git/",".lensmcp"];function trackedPath(n){if((0,emit_1.isLensWriting)())return null;const s=typeof n=="string"?n:Buffer.isBuffer(n)?n.toString():n instanceof URL?n.pathname:null;return!s||s===emit_1.EVENT_FILE||s.startsWith(TMP)||SKIP.some(r=>s.includes(r))?null:s}l(trackedPath,"trackedPath");function record(n,s,r=0){const t=trackedPath(s);if(!t)return;n==="read"?(bucket.reads+=1,bucket.bytesRead+=r):(bucket.writes+=1,bucket.bytesWritten+=r);const e=t.startsWith(CWD)?t.slice(CWD.length+1):t;bucket.paths.size<50&&bucket.paths.set(e,(bucket.paths.get(e)??0)+1),timer||(timer=setTimeout(flush,1e3),timer.unref?.())}l(record,"record");function flush(){timer=null;const{reads:n,writes:s,bytesRead:r,bytesWritten:t}=bucket;if(n+s===0)return;const e=[...bucket.paths.entries()].sort((i,c)=>c[1]-i[1]).slice(0,3).map(([i])=>i);bucket.reads=bucket.writes=bucket.bytesRead=bucket.bytesWritten=0,bucket.paths.clear(),(0,emit_1.lensEmit)("fs","info",`fs ${n} reads \xB7 ${s} writes`,{name:"fs",kind:"fs-ops",reads:n,writes:s,bytesRead:r,bytesWritten:t,top:e},`fs:${emit_1.PROJECT}`)}l(flush,"flush");const byteLen=l(n=>typeof n=="string"?Buffer.byteLength(n):Buffer.isBuffer(n)?n.length:0,"byteLen");function wrap(n,s,r){const t=n?.[s];if(!n||typeof t!="function"||t.__lensmcp)return;const e=r(t);e.__lensmcp=!0;try{n[s]=e}catch{}}l(wrap,"wrap");function tapFs(){const n=require("node:fs");wrap(n,"readFileSync",r=>function(t,...e){const i=r.call(this,t,...e);return record("read",t,byteLen(i)),i}),wrap(n,"writeFileSync",r=>function(t,e,...i){const c=r.call(this,t,e,...i);return record("write",t,byteLen(e)),c}),wrap(n,"appendFileSync",r=>function(t,e,...i){const c=r.call(this,t,e,...i);return record("write",t,byteLen(e)),c}),wrap(n,"readFile",r=>function(t,...e){const i=e[e.length-1];return typeof i=="function"&&(e[e.length-1]=(c,o)=>{c||record("read",t,byteLen(o)),i(c,o)}),r.call(this,t,...e)});for(const r of["writeFile","appendFile"])wrap(n,r,t=>function(e,i,...c){const o=c[c.length-1];return typeof o=="function"&&(c[c.length-1]=f=>{f||record("write",e,byteLen(i)),o(f)}),t.call(this,e,i,...c)});const s=n.promises;wrap(s,"readFile",r=>async function(t,...e){const i=await r.call(this,t,...e);return record("read",t,byteLen(i)),i});for(const r of["writeFile","appendFile"])wrap(s,r,t=>async function(e,i,...c){const o=await t.call(this,e,i,...c);return record("write",e,byteLen(i)),o});wrap(n,"createReadStream",r=>function(t,...e){return record("read",t,0),r.call(this,t,...e)}),wrap(n,"createWriteStream",r=>function(t,...e){return record("write",t,0),r.call(this,t,...e)})}l(tapFs,"tapFs");
|
package/lib/tap-nest.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var f=Object.defineProperty;var s=(e,t)=>f(e,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.installChildAppBridge=installChildAppBridge,exports.nestTap=nestTap;const emit_1=require("./emit"),WRAPPED=Symbol.for("lensmcp.wrappedRoot"),captures=[],waiters=[];function pushCapture(e){const t=waiters.shift();t?(clearTimeout(t.timer),t.resolve(e)):captures.push(e)}s(pushCapture,"pushCapture");function nextCapture(e=6e4){const t=captures.shift();return t?Promise.resolve(t):new Promise((c,o)=>{const n={resolve:c,reject:o,timer:setTimeout(()=>{const r=waiters.indexOf(n);r>=0&&waiters.splice(r,1),o(new Error("[lensmcp] no NestJS app captured within 60s \u2014 does main.ts call app.listen()? (zero-touch pods boot by running your main and intercepting listen)"))},e)};n.timer.unref?.(),waiters.push(n)})}s(nextCapture,"nextCapture");function installChildAppBridge(){if(process.env.APP_RUNNER!=="1")return;const e=global,t=s(()=>nextCapture(),"factory");e.createChildApp=t,e.__lensmcpCreateChildApp=t}s(installChildAppBridge,"installChildAppBridge");function nestTap(e){const t=e,c=t?.NestFactory,o=c?.create;if(!c||typeof o!="function")return!1;if(o.__lensmcp)return!0;const n=s(async function(r,...i){let p=r;const a=r,u=!!(a?.[WRAPPED]||a?.module?.[WRAPPED]);if(process.env.LENSMCP_NEST!=="0"&&!u)try{p=await buildLensmcpRoot(r)}catch{p=r}return o.call(this??c,p,...i)},"wrapped");if(n.__lensmcp=!0,c.create=n,process.env.APP_RUNNER==="1"){const r=t?.NestApplication?.prototype,i=r?.listen;if(r&&typeof i=="function"&&!i.__lensmcp){const p=s(async function(a,...u){return captureApp(this,a).catch(l=>(console.error("[lensmcp] pod capture failed, falling back to TCP listen:",l),i.call(this,a,...u)))},"listenWrapped");p.__lensmcp=!0,r.listen=p}}return!0}s(nestTap,"nestTap");async function buildLensmcpRoot(e){const t=await import("@lensmcp/nest-instrumentation"),c=require("@nestjs/common"),o=t.LensmcpModule.forRoot({projectName:emit_1.PROJECT,trace:{autoInstrumentMethods:!0},memory:{mode:"light",scope:"all"}});class n{static{s(this,"LensmcpZeroTouchRoot")}}return n[WRAPPED]=!0,c.Module({imports:[o,e]})(n),n}s(buildLensmcpRoot,"buildLensmcpRoot");async function captureApp(e,t){await e.init();let o=e.getHttpAdapter?.()?.getInstance?.();if(typeof o!="function"){const n=o;n?.ready&&await n.ready(),typeof n?.routing=="function"&&(o=s((r,i)=>n.routing(r,i),"handler"))}if(typeof o!="function")throw new Error("[lensmcp] cannot derive a request handler from the HTTP adapter");return pushCapture({handler:o,serviceConfig:{port:t??process.env.PORT??0},close:s(()=>Promise.resolve(e.close()).then(()=>{}),"close")}),e.getHttpServer?.()}s(captureApp,"captureApp");
|
package/lib/tap-pg.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var E=Object.defineProperty;var n=(t,e)=>E(t,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.pgTap=pgTap;const emit_1=require("./emit"),flow_context_1=require("./flow-context"),SKIP_OPS=new Set(["BEGIN","COMMIT","ROLLBACK","SET","SHOW","DEALLOCATE","DISCARD"]);function parseSql(t){const e=(t.match(/^\s*(\w+)/)?.[1]??"query").toUpperCase(),r=t.match(/\b(?:from|into|update|join|table(?:\s+if\s+not\s+exists)?)\s+"?([\w$.]+)"?/i)?.[1]?.split(".").pop();return{op:e,...r?{table:r}:{}}}n(parseSql,"parseSql");const oneLine=n(t=>t.replace(/\s+/g," ").trim(),"oneLine"),clip=n((t,e)=>t.length>e?t.slice(0,e-1)+"\u2026":t,"clip");function paramPreview(t){if(!(!Array.isArray(t)||t.length===0))return t.slice(0,10).map(e=>{if(e==null)return String(e);const p=typeof e=="string"?e:(()=>{try{return JSON.stringify(e)}catch{return String(e)}})();return clip(p,80)})}n(paramPreview,"paramPreview");const rowsOf=n(t=>t?.rowCount??t?.rows?.length??0,"rowsOf");function resultPreview(t){const e=t?.rows;if(!(!Array.isArray(e)||e.length===0))try{return clip(JSON.stringify(e.slice(0,2)),240)}catch{return}}n(resultPreview,"resultPreview");function pgTap(t){const p=t?.Client?.prototype,r=p?.query;if(!p||typeof r!="function")return!1;if(r.__lensmcp)return!0;const b=n(function(c,s,a){const f=c,w=typeof f=="string"?f:f?.text;if(!w||f&&typeof f=="object"&&typeof f.submit=="function")return r.call(this,c,s,a);const{op:q,table:i}=parseSql(w);if(SKIP_OPS.has(q))return r.call(this,c,s,a);const d=q.toLowerCase(),O=`db:${d}:${i??"query"}`,h=Date.now(),A=(0,flow_context_1.flowContext)(),g=(0,flow_context_1.liveFlowContext)();g&&(g.dbCallCount=(g.dbCallCount??0)+1);const S=clip(oneLine(w),500),y=paramPreview(Array.isArray(s)?s:c?.values),C=n((o,l)=>{const u=Date.now()-h;if(o)(0,emit_1.lensEmit)("db","error",`${d}${i?" "+i:""} failed (${u}ms)`,{name:"postgres",kind:"db-query",op:d,...i?{table:i}:{},query:S,...y?{params:y}:{},startedAt:h,error:String(o?.message??o),durationMs:u},`db:error:${d}:${i??"query"}`,A);else{const _=rowsOf(l),x=resultPreview(l);(0,emit_1.lensEmit)("db","info",`${d} ${i??"query"} (${_} rows, ${u}ms)`,{name:"postgres",kind:"db-query",op:d,...i?{table:i}:{},query:S,...y?{params:y}:{},...x?{result:x}:{},startedAt:h,rows:_,durationMs:u},O,A)}},"done"),$=typeof a=="function"?a:typeof s=="function"?s:void 0;if($){const o=n((l,u)=>{try{C(l,u)}catch{}$(l,u)},"wrappedCb");return typeof s=="function"?r.call(this,c,o):r.call(this,c,s,o)}const m=r.call(this,c,s);return m&&typeof m.then=="function"&&m.then(o=>C(void 0,o),o=>C(o,void 0)),m},"wrapped");return b.__lensmcp=!0,p.query=b,!0}n(pgTap,"pgTap");
|
package/lib/tap-redis.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var h=Object.defineProperty;var c=(e,t)=>h(e,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.redisTap=redisTap;const emit_1=require("./emit"),flow_context_1=require("./flow-context"),HOUSEKEEPING=new Set(["info","ping","hello","auth","select","client","cluster","command","subscribe","psubscribe","unsubscribe","punsubscribe","echo","quit","wait","script","config","debug","memory","readonly","readwrite"]),MAX_PER_SEC=30;let emitted=0,windowStart=0;function isBullTraffic(e){const t=String(e.name??"").toLowerCase();if(t==="eval"||t==="evalsha")return!0;const i=e.args??[];for(let n=0;n<Math.min(i.length,4);n++){const s=String(i[n]??"");if(s.startsWith("bull:")||s.startsWith("{bull"))return!0}return!1}c(isBullTraffic,"isBullTraffic");function redisTap(e){const t=e,n=(t?.default??t)?.prototype,s=n?.sendCommand;if(!n||typeof s!="function")return!1;if(s.__lensmcp)return!0;const r=c(function(u,d){const l=s.call(this,u,d);try{observe(u)}catch{}return l},"wrapped");return r.__lensmcp=!0,n.sendCommand=r,!0}c(redisTap,"redisTap");const clip=c((e,t)=>e.length>t?e.slice(0,t-1)+"\u2026":e,"clip");function commandLine(e,t){const i=t.slice(0,6).map((n,s)=>{const r=String(n??"");return s>0&&r.length>48?`\u2026(${(r.length/1024).toFixed(1)}kb)`:clip(r,64)});return[e.toUpperCase(),...i].join(" ")}c(commandLine,"commandLine");function observe(e){const t=String(e?.name??"").toLowerCase();if(!t||HOUSEKEEPING.has(t)||isBullTraffic(e))return;const i=(0,flow_context_1.liveFlowContext)();i&&(i.redisCallCount=(i.redisCallCount??0)+1);const n=Date.now();if(n-windowStart>1e3&&(windowStart=n,emitted=0),++emitted>MAX_PER_SEC)return;const s=e?.args??[],r=String(s[0]??""),u=(0,flow_context_1.flowContext)(),d=commandLine(t,s),l={name:"cache",kind:"redis-op",op:t,key:r,command:d,startedAt:n};if(t==="get"&&e.promise&&typeof e.promise.then=="function"){const f=n;e.promise.then(a=>{const o=a!=null;(0,emit_1.lensEmit)("redis","info",`cache ${o?"hit":"miss"} ${r}`,{...l,hit:o,durationMs:Date.now()-f,...o?{value:clip(String(a),120)}:{}},"redis:cache",u)},()=>{});return}if(t==="set"){const f=s.map(p=>String(p)),a=f.findIndex(p=>p.toUpperCase()==="EX"),o=a>=0?Number(f[a+1]):void 0;(0,emit_1.lensEmit)("redis","info",o?`cache set ${r} (ttl ${o}s)`:`cache set ${r}`,{...l,...o?{ttlSec:o}:{}},"redis:cache",u);return}(0,emit_1.lensEmit)("redis","info",`cache ${t} ${r}`,l,"redis:cache",u)}c(observe,"observe");
|
package/lib/tap-stdout.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`).map(
|
|
3
|
-
`)}:void 0)}}
|
|
1
|
+
"use strict";var u=Object.defineProperty;var o=(t,e)=>u(t,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapStdout=tapStdout;const emit_1=require("./emit"),ANSI=new RegExp("\x1B\\[[0-9;]*m","g");function severityOf(t,e){return/\bFATAL\b/.test(t)?"fatal":/\bERROR\b/.test(t)?"error":/\bWARN\b/.test(t)?"warning":/\bDEBUG\b/.test(t)||/\bVERBOSE\b/.test(t)?"debug":/\bLOG\b/.test(t)?"info":e}o(severityOf,"severityOf");const STACK_FRAME=/^\s+(at\s|\.\.\.\s\d+\smore)/;function emitChunk(t,e){const i=t.split(`
|
|
2
|
+
`).map(n=>n.replace(ANSI,"").replace(/\s+$/,""));let s=0;for(;s<i.length;){const n=i[s];if(s+=1,!n.trim())continue;const r=[];for(;s<i.length&&STACK_FRAME.test(i[s]);)r.push(i[s]),s+=1;const f=r.length>0?"error":severityOf(n,e);(0,emit_1.lensLog)(f,n,r.length>0?{stack:[n,...r].join(`
|
|
3
|
+
`)}:void 0)}}o(emitChunk,"emitChunk");function tapStdout(){if(process.env.LENSMCP_LOGS==="0"||process.env.APP_RUNNER!=="1")return;const t=[[process.stdout,"info"],[process.stderr,"error"]];for(const[e,i]of t){if(e.write.__lensmcp)continue;const s=e.write.bind(e),n=o(function(r,...f){try{if(!(0,emit_1.isLensWriting)()){const c=typeof r=="string"?r:Buffer.isBuffer(r)?r.toString("utf8"):"";c&&c.indexOf("[lensmcp]")===-1&&emitChunk(c,i)}}catch{}return s(r,...f)},"wrapped");n.__lensmcp=!0,e.write=n}}o(tapStdout,"tapStdout");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lensmcp/node-instrumentation",
|
|
3
|
-
"version": "1.22.
|
|
3
|
+
"version": "1.22.6",
|
|
4
4
|
"main": "./index.js",
|
|
5
5
|
"types": "./index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@lensmcp/core": "1.22.
|
|
19
|
-
"@lensmcp/nest-instrumentation": "1.22.
|
|
20
|
-
"@lensmcp/protocol-types": "1.22.
|
|
18
|
+
"@lensmcp/core": "1.22.6",
|
|
19
|
+
"@lensmcp/nest-instrumentation": "1.22.6",
|
|
20
|
+
"@lensmcp/protocol-types": "1.22.6",
|
|
21
21
|
"tslib": "^2.3.0"
|
|
22
22
|
},
|
|
23
23
|
"optionalDependencies": {
|
package/register.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var e=(t,n)=>s(t,"name",{value:n,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.installLensmcpNodeInstrumentation=void 0;const install_1=require("./lib/install");Object.defineProperty(exports,"installLensmcpNodeInstrumentation",{enumerable:!0,get:e(function(){return install_1.installLensmcpNodeInstrumentation},"get")}),(0,install_1.installLensmcpNodeInstrumentation)();
|