{"_id":"clawpro-diagnostics-metrics-cls","_rev":"33-1ffd5c0b9178b4cb54d44a7a3ac0a52f","name":"clawpro-diagnostics-metrics-cls","dist-tags":{"beta":"3.0.2-beta.7","latest":"3.0.8"},"versions":{"1.0.0":{"name":"clawpro-diagnostics-metrics-cls","version":"1.0.0","_id":"clawpro-diagnostics-metrics-cls@1.0.0","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"dist":{"shasum":"b0bc54940f9e110ceebabfbbbeec68fcaaa2b979","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-1.0.0.tgz","fileCount":15,"integrity":"sha512-KNYYpDHHwsB3luw2YL0Pv/FTNts6kqJtxh+RMQqNfCkrgZsNA+NzazN3ADbdmY8Fg+LKFPp0bMvcYmJjN9iiBA==","signatures":[{"sig":"MEQCIBw1HIFZwuZSE6J9sLMs4vSLy/Q7ObQ7aq0G0lkH0ruDAiB9vaQmRfeEtp0hmQ8mh54jlgrjK+8QNNGujvtDJ/6hxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242990},"type":"module","gitHead":"d22cdaae07bde6cbcefc2075b6f186e49668569b","scripts":{"test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"extensions":["./index.ts"]},"_npmVersion":"11.9.0","description":"Cls OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write)","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","@vitest/coverage-v8":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_1.0.0_1773995246987_0.864079434677042","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"clawpro-diagnostics-metrics-cls","version":"1.0.1","_id":"clawpro-diagnostics-metrics-cls@1.0.1","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"dist":{"shasum":"61cca74a24b36b22889612dffccb1886c4d75203","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-1.0.1.tgz","fileCount":15,"integrity":"sha512-74dNrgJUzAqQ+lEHPmDg2PhvTehVhdI59T/ET8cHXaXEnues/sGXtgsTtXsaE0mT7PA+GoUfMerqpgi3o2HabQ==","signatures":[{"sig":"MEQCIBUbyOkq5pd0FUly5rPdfMoZlvbqcHx2PM77a6ZoefWOAiBUFpdr1AwWGcUUfuXRsyr/LJ/ebh3SON7tTi+1uMCGEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242990},"type":"module","gitHead":"43b2fbce0df32e00eec3f0076bef549ec50491d9","scripts":{"test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"extensions":["./index.ts"]},"_npmVersion":"11.9.0","description":"Cls OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write)","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","@vitest/coverage-v8":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_1.0.1_1773996209942_0.24691691221016132","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"clawpro-diagnostics-metrics-cls","version":"1.0.2","_id":"clawpro-diagnostics-metrics-cls@1.0.2","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"dist":{"shasum":"3ada622af82565fa2688f571b318d425d5a4352e","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-1.0.2.tgz","fileCount":15,"integrity":"sha512-isa4Eef7YzyVaVLnP3rcP3odJVnH1sTdXpr2N8k3qyGcx+rf0IkNzODat+hZwCXzViyeRmwdNB6bX1K62NvUSA==","signatures":[{"sig":"MEYCIQCAPXx96NlZ/zN1inDK2Y5mDl/A4OUgUzmJIshlSqCJtQIhANPeSS0SpPXe20ocnS0/zFslWOhK7VztZYV5zq9Mx3Av","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":243003},"type":"module","gitHead":"43b2fbce0df32e00eec3f0076bef549ec50491d9","scripts":{"test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"extensions":["./index.ts"]},"_npmVersion":"11.9.0","description":"Cls OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write)","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","@vitest/coverage-v8":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_1.0.2_1774011789016_0.5931916214772548","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"clawpro-diagnostics-metrics-cls","version":"1.0.3","_id":"clawpro-diagnostics-metrics-cls@1.0.3","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"dist":{"shasum":"674ec3f36aa77f8a6ec786c5bd0fe6202c6e1dc5","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-1.0.3.tgz","fileCount":15,"integrity":"sha512-5WTSGZrPYEeWJ/k9ghBcQAhyT4rZ0rjMdVVTgBCA+Rg5skvF8F8YuJ/w6HQ9XmF6mvo6kjtgt5s7rPAGxyay9w==","signatures":[{"sig":"MEUCIQCXgUrB38ppQxNAFUJONLyi56yCMLTDFdbavOvZBxX0rwIgBp4JKJ+haEBiN8rX3Lfb7bWO71BDsbQfh0TmIkdxnCA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":243443},"type":"module","gitHead":"ed42c8309457d8ab352cc65824f920962a106fd7","scripts":{"test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"extensions":["./index.ts"]},"_npmVersion":"11.9.0","description":"Cls OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write)","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","@vitest/coverage-v8":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_1.0.3_1774157849985_0.12778292010084602","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"clawpro-diagnostics-metrics-cls","version":"2.0.0","license":"MIT","_id":"clawpro-diagnostics-metrics-cls@2.0.0","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"dist":{"shasum":"d9d8ccb212f91263d25b1db1d258adab1157d6d1","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-2.0.0.tgz","fileCount":19,"integrity":"sha512-PkzL5gK/LOFm5yhAE/UABeGBpeAVmJVLMoF41UW9izxogW2ZIT+6k9chGuw1cfxBJjZH3MbW47GCwaK0uabpKQ==","signatures":[{"sig":"MEQCIAzdK6vQHfuAJBWRWF1GKwKNBG2FDUV8f/9Be1FsAFV6AiAXdjh/Q59wPb0ax5kqcBPgFXcRCANdDiY0MZDz6tezow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":412184},"main":"index.ts","type":"module","gitHead":"ce627bbaadc9ad30482e6233a60e288a0b7a5f39","scripts":{"dev":"tsc --noEmit --watch","build":"echo 'Plugin publishes .ts source files, no build needed.'","typecheck":"tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"extensions":["./index.ts"]},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_2.0.0_1776779013674_0.6517613073659181","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"clawpro-diagnostics-metrics-cls","version":"2.0.1","license":"MIT","_id":"clawpro-diagnostics-metrics-cls@2.0.1","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"dist":{"shasum":"78144bdef6e906cf222eb7907ea9e3aab30bab41","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-2.0.1.tgz","fileCount":19,"integrity":"sha512-VKG7DpPlWzuR6s9fxeOnuYj8x2WhVZbhsCGu76toOpnwnK4BuKpJVSgE7CaDdoJH4FsBzDRsGI3xebITHUo0Yg==","signatures":[{"sig":"MEYCIQCKVssb9TkiuwNErQrs/Jf6FUO7lMJaMf6Mbn9Q8kE8PAIhAK/cVEccRhz/MLHt+6hPqvLMtmyaZos4lWGPKMe+Ibbh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":426417},"main":"index.ts","type":"module","gitHead":"5049471c3ac6eb5d7c711b21eee93b500ea46979","scripts":{"dev":"tsc --noEmit --watch","build":"echo 'Plugin publishes .ts source files, no build needed.'","typecheck":"tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"extensions":["./index.ts"]},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_2.0.1_1777363374737_0.39746969085874895","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"clawpro-diagnostics-metrics-cls","version":"2.0.2","license":"MIT","_id":"clawpro-diagnostics-metrics-cls@2.0.2","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"dist":{"shasum":"4d5038f8484d7588cb7f4cd0425125662b1e5aca","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-2.0.2.tgz","fileCount":19,"integrity":"sha512-QT+ElUM1TlmHTobaLeJhhtcg4na6wPFkQB4MSG0HUdmFEko+E/F2HWY5cn1UR3+nuJ/dav1Rr+wzr1ZLsqYTsw==","signatures":[{"sig":"MEQCIExS+M5vZECMFqI5shBcJ65QVoaVZnZcYkYxuypl68qOAiAq5HWwzKfpA+5o2TCuXMFb42VXMJM+rTO7aEolAjiDbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":429903},"main":"index.ts","type":"module","gitHead":"1e97b865a8cc654d54ff28a9e9dbba9ba2d376aa","scripts":{"dev":"tsc --noEmit --watch","build":"echo 'Plugin publishes .ts source files, no build needed.'","typecheck":"tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"extensions":["./index.ts"]},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_2.0.2_1778317537721_0.6861530578036275","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"clawpro-diagnostics-metrics-cls","version":"2.0.3","license":"MIT","_id":"clawpro-diagnostics-metrics-cls@2.0.3","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"dist":{"shasum":"2d6398221617ea55cb6a16910d9aa276e34814fc","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-2.0.3.tgz","fileCount":19,"integrity":"sha512-k7WxoOFgsz0qxq+1BDNuTmnv5xkV+Kei7ONlMDSqkMUsUwEjjf0LFfxQvjmkPvj6KyKPyE67tkt/+sK2tt8ALg==","signatures":[{"sig":"MEUCIQCw3mEw9dkhg+GYqbLPqu2Tr7BnO7HJ4ooobddhiZ7zawIgbUNSOxpyMcOhk1/woyNujc5osccW6L/h2N9hJm5BO1U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":429903},"main":"index.ts","type":"module","gitHead":"6ec1a83c3b216e2b7ef049d75f643862300f4e66","scripts":{"dev":"tsc --noEmit --watch","build":"echo 'Plugin publishes .ts source files, no build needed.'","typecheck":"tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"extensions":["./index.ts"]},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_2.0.3_1778321070379_0.23616884458295617","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.0","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.0","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"016bb0e8887330b4d46960eb61efb444f2d10d00","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.0.tgz","fileCount":37,"integrity":"sha512-lq16gs+rsS1MNlPwH45BEQ8QnSI2qOBWhu0g0jlSyCcywCRiXMLpyzsLGshQm2vMxeOPGYw9GbIQQMW7XFYIYA==","signatures":[{"sig":"MEYCIQCfW6HHT9YylyUlReGAz+CUyLqTyvisE59PVQU/ot3LEgIhAKGflwhVZ8c5oqxDEyIvKNWVJeEj05q96QgXLFttq16q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":556891},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"tsc --noEmit --watch","build":"npm run clean && tsc -p tsconfig.build.json","clean":"rm -rf dist","prepack":"npm run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"peerDependencies":{"openclaw":">=2026.3.7"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.0_1778813523297_0.06200713052849194","host":"s3://npm-registry-packages-npm-production"}},"3.0.1-beta.0":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.1-beta.0","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.1-beta.0","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"b2c7dbc20d10217fe621dedf666d1c203254f083","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.1-beta.0.tgz","fileCount":21,"integrity":"sha512-HeOH8pqZmQEjY6Uua7MwVZngMCcMjPtKo378i0edoMVD5kymmR9mDU0dGQDtnX83A3LLJT5Kk5CyGGolsBpIJw==","signatures":[{"sig":"MEUCIQC/otVNvXeLgtbqgh8Y4uvonYQeggNCr0M0ffJfnsbFOAIgfQYMrQB9uVtL0FRNWZajnufQrkbywtidrtpMBzExUL0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1177141},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist","prepack":"npm run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"esbuild":"^0.25.0","snappyjs":"^0.7.0","typescript":"^5.0.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"peerDependencies":{"openclaw":">=2026.3.7"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.1-beta.0_1779110565151_0.26553119479373133","host":"s3://npm-registry-packages-npm-production"}},"3.0.1-beta.2":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.1-beta.2","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.1-beta.2","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"7079f7b5e145bfb88445e05d80163617134171d1","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.1-beta.2.tgz","fileCount":21,"integrity":"sha512-hE6xgF7Ycwavhv6ZPSXl/AiKzhnk1yl43+IYPv0codAN+yqMxA+riK8kMDpkfS1J/IIqLSAD+Ib22/joMvvB6g==","signatures":[{"sig":"MEYCIQCkhKYvxiEX7yjX5/Wt9Cq3yMssWJ1p4HyxsPUW2HdqZQIhAMj0xeJdJ8XKo4UY2qgBUUcNG3t30QS8iKLa7s6p5yOg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1177141},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist","prepack":"npm run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"esbuild":"^0.25.0","snappyjs":"^0.7.0","typescript":"^5.0.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"peerDependencies":{"openclaw":">=2026.3.7"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.1-beta.2_1779110948670_0.18350407209805386","host":"s3://npm-registry-packages-npm-production"}},"3.0.1-beta.3":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.1-beta.3","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.1-beta.3","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"4cc46ad329541ffde1d7cdd9b71aab20a462c9f8","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.1-beta.3.tgz","fileCount":21,"integrity":"sha512-Rb2b6Eg0MJSQWIo4l8aUJDHoarSmvoAfce4NpMzcFFioO+bprWPhuOKGb3SoNDpb6p/FsAPXVdpmJoumagvT8A==","signatures":[{"sig":"MEQCIAc5908eFDBavIr+mZR0BGX2uXjhIiFu05ES737UvPxFAiBsPtIzextc4+Gc7gDRERx3NWuA1/w0k8iPmS1xXYpjCQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1177141},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist","prepack":"npm run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"esbuild":"^0.25.0","snappyjs":"^0.7.0","typescript":"^5.0.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"peerDependencies":{"openclaw":">=2026.3.7"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.1-beta.3_1779172225347_0.08398371745299427","host":"s3://npm-registry-packages-npm-production"}},"3.0.1-beta.4":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.1-beta.4","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.1-beta.4","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"6f8fd08f14bce324bdd06fee6a3a9e16ee09631d","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.1-beta.4.tgz","fileCount":3,"integrity":"sha512-MVmEzIS3i/JOoF9yMFccvHWEvbXfYMxwYRPsZfdyNApKijDdrMl1iW9xKSMnTeTiPMIjtiAlYMZqnnb6e7m/wg==","signatures":[{"sig":"MEQCIFAzCSEUwAFbJn2BVGygDXVt+3EIdixyILsdMDLRAyBnAiA4rJj0eR++UDLDWZRnx2LTkMk+lkvpnConJ9LrJqVitA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121627},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.4.5"},"peerDependencies":{"openclaw":">=2026.3.7"},"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.1-beta.4_1779180839963_0.18530384943400668","host":"s3://npm-registry-packages-npm-production"}},"3.0.1-beta.5":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.1-beta.5","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.1-beta.5","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"82f6e7bf7a946c69102f1e4936eb12049d68f80a","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.1-beta.5.tgz","fileCount":37,"integrity":"sha512-lnFJPy3cB+0iNCtEz32UmES2wy0KjM3Jujg/klhVdzRb40wLcAlSzVKX696Rjyqq6Z+z9BZtXznfOz+pslhEKA==","signatures":[{"sig":"MEQCIAWBK/H5ZD/MFHLPQlEkiPpGXUJRNOo3pBU8KbKOHQL9AiAe+/ZNJpZeqBYa+cDvLrziYGGekiveYbCDeh1obAW16g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":557003},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.4.5"},"peerDependencies":{"openclaw":">=2026.3.7"},"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.1-beta.5_1779182380557_0.8671937872263777","host":"s3://npm-registry-packages-npm-production"}},"3.0.1-beta.6":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.1-beta.6","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.1-beta.6","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"64fcb2c56cf4aedcb4b1c856b9fd0a0367cd9af1","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.1-beta.6.tgz","fileCount":37,"integrity":"sha512-lpOsi09CQsUN1urDix6LHOIH6jiRTrwlwn6JveV11aUnSW2hSi9uHLk8+Xkn7oqZiijqQ08Ccpz1Jfc0cv0c0w==","signatures":[{"sig":"MEQCIAgleVxSw/v35YEA2F+qSOKsU1KNWSEw42Ir6SDTwg8iAiAJ1eDq2Y2W7wTLzxYB7Lf3JkE07+L2typTVsFIT7b6vg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":556865},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.1-beta.6_1779183152846_0.5505349470907441","host":"s3://npm-registry-packages-npm-production"}},"3.0.1-beta.7":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.1-beta.7","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.1-beta.7","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"92e84c83332a2ab592516979414b718a222782a8","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.1-beta.7.tgz","fileCount":37,"integrity":"sha512-kkaYmNTQIYzVoE82Dshtg2oUzyuWLnltONLcDDp18UvdkY3glXbBRHKoB98Dl8OgSXnSPG5tR6xBtyIxF006Ng==","signatures":[{"sig":"MEUCIQCV1oDxGodr23mOLMRgOZgK85yPeJ6gVigjjPKKXWQMIwIgKysqTyFhbY5j1/Rqtj+fF5CjG84XqfL/dq7jL2gjQ3M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":556865},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"11.12.1","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"24.14.0","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.1-beta.7_1779183964180_0.9739199863338355","host":"s3://npm-registry-packages-npm-production"}},"3.0.1-beta.9":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.1-beta.9","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.1-beta.9","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"3d94ce1b290500641a4ecf4d222c90005dcf7fb7","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.1-beta.9.tgz","fileCount":1432,"integrity":"sha512-nme1DFTMseEr+IG17mhabPXQ0NxnlIXN84Z7/pjiNBqLLVplqF+qgDFfUyWVUCugV8TZLr24p9xa0FiKYVTcsg==","signatures":[{"sig":"MEUCIAFA4VG994heQj1HJw+S8TmHyQnpfu9I5EqW5+P1KevVAiEApya86aYKqXjLtXAz33/5Wd08PIPL3lHxim6aMK0pD0I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13630985},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist .tsbuildinfo","prepack":"npm install && npm run build && npm prune --omit=dev","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ms":"*","gopd":"*","long":"*","axios":"*","debug":"*","hasown":"*","mime-db":"*","tdigest":"*","asynckit":"*","bintrees":"*","snappyjs":"^0.7.0","es-errors":"*","form-data":"*","get-proto":"*","agent-base":"*","mime-types":"*","protobufjs":"*","has-symbols":"*","prom-client":"^15.1.3","dunder-proto":"*","function-bind":"*","get-intrinsic":"*","delayed-stream":"*","proxy-from-env":"*","combined-stream":"*","es-object-atoms":"*","has-tostringtag":"*","math-intrinsics":"*","@protobufjs/path":"*","@protobufjs/pool":"*","@protobufjs/utf8":"*","follow-redirects":"*","@protobufjs/fetch":"*","@protobufjs/float":"*","https-proxy-agent":"*","@opentelemetry/api":"*","@protobufjs/base64":"*","es-define-property":"*","es-set-tostringtag":"*","@protobufjs/codegen":"*","@protobufjs/inquire":"*","@protobufjs/aspromise":"*","call-bind-apply-helpers":"*","@protobufjs/eventemitter":"*","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.5"},"bundleDependencies":["prom-client","snappyjs","tencentcloud-cls-sdk-nodejs","protobufjs","@protobufjs/aspromise","@protobufjs/base64","@protobufjs/codegen","@protobufjs/eventemitter","@protobufjs/fetch","@protobufjs/float","@protobufjs/inquire","@protobufjs/path","@protobufjs/pool","@protobufjs/utf8","long","axios","follow-redirects","form-data","https-proxy-agent","proxy-from-env","agent-base","asynckit","combined-stream","delayed-stream","mime-db","mime-types","debug","ms","bintrees","tdigest","call-bind-apply-helpers","dunder-proto","es-define-property","es-errors","es-object-atoms","es-set-tostringtag","function-bind","get-intrinsic","get-proto","gopd","has-symbols","has-tostringtag","hasown","math-intrinsics","@opentelemetry/api"],"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.1-beta.9_1779626857021_0.8164645465861387","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.1","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.1","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"b0d83984b45d4bf38a64c24a15d9cc09f04e3b89","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.1.tgz","fileCount":1432,"integrity":"sha512-HVeHnLSboqsaeuMj9ZHyqLKHvFgkl+ZXrgt3oCWIy325ZaW+/7YdpwXfjZWq6GrrMM4QRLsIPuTtG3oTjkQtog==","signatures":[{"sig":"MEUCIQCGUbUgNBFkTNkS0xlLrUKdPbtBI+1tN/h2GUTzaO68eAIgM+CCHbD9MXrfRIRymXUuT6vsvvkz6QV3P1xcEaxlbdg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13630620},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ms":"*","long":"*","axios":"*","debug":"*","mime-db":"*","tdigest":"*","asynckit":"*","bintrees":"*","snappyjs":"^0.7.0","form-data":"*","agent-base":"*","mime-types":"*","protobufjs":"*","prom-client":"^15.1.3","delayed-stream":"*","proxy-from-env":"*","combined-stream":"*","@protobufjs/path":"*","@protobufjs/pool":"*","@protobufjs/utf8":"*","follow-redirects":"*","@protobufjs/fetch":"*","@protobufjs/float":"*","https-proxy-agent":"*","@protobufjs/base64":"*","@protobufjs/codegen":"*","@protobufjs/inquire":"*","@protobufjs/aspromise":"*","@protobufjs/eventemitter":"*","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"bundleDependencies":["prom-client","snappyjs","tencentcloud-cls-sdk-nodejs","protobufjs","@protobufjs/aspromise","@protobufjs/base64","@protobufjs/codegen","@protobufjs/eventemitter","@protobufjs/fetch","@protobufjs/float","@protobufjs/inquire","@protobufjs/path","@protobufjs/pool","@protobufjs/utf8","long","axios","follow-redirects","form-data","https-proxy-agent","proxy-from-env","agent-base","asynckit","combined-stream","delayed-stream","mime-db","mime-types","debug","ms","bintrees","tdigest"],"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.1_1779628433149_0.1712147447440857","host":"s3://npm-registry-packages-npm-production"}},"3.0.2-beta.1":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.2-beta.1","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.2-beta.1","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"ee1bf33b9cbb6329080e02b977ee95c6fb7f2bb4","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.2-beta.1.tgz","fileCount":1432,"integrity":"sha512-77f+HtyjwPJ1ERDYWtniPYfsLLS3V8g81mUmUOWDToL0pxBY4QCJ3SiN7Ou008byPfxeNisP6OgXHZ5lx7CpoQ==","signatures":[{"sig":"MEUCIG+UkTXzN0YH1qX9Vw4RqQZ0+UYnEPZqUGEAotcKd9YEAiEAkI6PONEChp4Z1Tum+twfyHcMe8+ZlNkzpEwT0VTRbTI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13630139},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"*","tdigest":"*","snappyjs":"^0.7.0","protobufjs":"*","prom-client":"^15.1.3","@opentelemetry/api":"*","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.3"},"bundleDependencies":["prom-client","snappyjs","tencentcloud-cls-sdk-nodejs","protobufjs","axios","tdigest","@opentelemetry/api"],"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.2-beta.1_1779628945729_0.6275942237788719","host":"s3://npm-registry-packages-npm-production"}},"3.0.2-beta.2":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.2-beta.2","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.2-beta.2","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"c6fb271e585df2251cff93ec5ccf5093c0f5ce8b","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.2-beta.2.tgz","fileCount":1432,"integrity":"sha512-AipWDAUj5fL5vtm7gN1d+ZW4ajsXO4/bvLGmZV64UxiO/ILoPzXEoul85nSareMqT1kQGlCxTNuQOvf/2dArjw==","signatures":[{"sig":"MEQCIEpG6VTcKIU1c4BHXHmvvQdAxgNu98Sj7kPEEXbb4TufAiBW16KhiQAsB3eP81Db3Tlmn70z+62+uhTev9y6YCZ3TA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13630139},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"*","tdigest":"*","snappyjs":"^0.7.0","protobufjs":"*","prom-client":"^15.1.3","@opentelemetry/api":"*","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.3"},"bundleDependencies":["prom-client","snappyjs","tencentcloud-cls-sdk-nodejs","protobufjs","axios","tdigest","@opentelemetry/api"],"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.2-beta.2_1779629220330_0.9176541356199199","host":"s3://npm-registry-packages-npm-production"}},"3.0.2-beta.3":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.2-beta.3","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.2-beta.3","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"307bbc08f486e476d73593a17e68891f31a6e69d","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.2-beta.3.tgz","fileCount":1399,"integrity":"sha512-Vxcho0dDm9vSTi/LsyYMhjUgbGSbInAGTL3lXRFwjTml4ioKVyU1t/nATMQOsmZcltzAFVmhhHiOIGzwsrox2w==","signatures":[{"sig":"MEQCIBmM1Xwny8Gne1k3q/AC+Ct9WwaZ2o3kZt+o3lMzXC7bAiA5PMSDg8eAARiHwNT74GYwTCbTHHnv1wfz5eIKlh2bEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13211489},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"gopd":"*","long":"*","axios":"*","hasown":"*","mime-db":"*","tdigest":"*","asynckit":"*","bintrees":"*","snappyjs":"^0.7.0","es-errors":"*","form-data":"*","get-proto":"*","mime-types":"*","protobufjs":"*","@types/node":"*","has-symbols":"*","prom-client":"^15.1.3","dunder-proto":"*","undici-types":"*","function-bind":"*","get-intrinsic":"*","delayed-stream":"*","proxy-from-env":"*","combined-stream":"*","es-object-atoms":"*","has-tostringtag":"*","math-intrinsics":"*","@protobufjs/path":"*","@protobufjs/pool":"*","@protobufjs/utf8":"*","follow-redirects":"*","@protobufjs/fetch":"*","@protobufjs/float":"*","@opentelemetry/api":"*","@protobufjs/base64":"*","es-define-property":"*","es-set-tostringtag":"*","@protobufjs/codegen":"*","@protobufjs/inquire":"*","@protobufjs/aspromise":"*","call-bind-apply-helpers":"*","@protobufjs/eventemitter":"*","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.3"},"bundleDependencies":["prom-client","snappyjs","tencentcloud-cls-sdk-nodejs","axios","protobufjs","@protobufjs/aspromise","@protobufjs/base64","@protobufjs/codegen","@protobufjs/eventemitter","@protobufjs/fetch","@protobufjs/float","@protobufjs/inquire","@protobufjs/path","@protobufjs/pool","@protobufjs/utf8","long","@types/node","undici-types","follow-redirects","form-data","proxy-from-env","asynckit","combined-stream","delayed-stream","mime-db","mime-types","es-set-tostringtag","es-errors","get-intrinsic","call-bind-apply-helpers","es-define-property","es-object-atoms","get-proto","dunder-proto","gopd","has-symbols","math-intrinsics","has-tostringtag","hasown","function-bind","@opentelemetry/api","tdigest","bintrees"],"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.2-beta.3_1779629793643_0.32624432261093994","host":"s3://npm-registry-packages-npm-production"}},"3.0.2-beta.4":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.2-beta.4","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.2-beta.4","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"dc3d2150b2d31417f4414050fee7d26cce399eee","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.2-beta.4.tgz","fileCount":1399,"integrity":"sha512-woZDQWUoPXDJlO41M3nWK6hRSF1xNFF+etmGmMaroh6xRlhobRSgYJvmBtSDyDuoUFiUeKUdthoCLH/Yhjahfw==","signatures":[{"sig":"MEUCIQCIX9wu9PSgmMjj8OVGq/8z0rhXbTGYNPqwBUkMk8IdjgIgOS9my6RfPLwUxvf//utaczmXIXYUWv7t3UjegtkZR0Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13211509},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"npm run clean && npx tsc -p tsconfig.build.json","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"gopd":"*","long":"*","axios":"*","hasown":"*","mime-db":"*","tdigest":"*","asynckit":"*","bintrees":"*","snappyjs":"^0.7.0","es-errors":"*","form-data":"*","get-proto":"*","mime-types":"*","protobufjs":"*","@types/node":"*","has-symbols":"*","prom-client":"^15.1.3","dunder-proto":"*","undici-types":"*","function-bind":"*","get-intrinsic":"*","delayed-stream":"*","proxy-from-env":"*","combined-stream":"*","es-object-atoms":"*","has-tostringtag":"*","math-intrinsics":"*","@protobufjs/path":"*","@protobufjs/pool":"*","@protobufjs/utf8":"*","follow-redirects":"*","@protobufjs/fetch":"*","@protobufjs/float":"*","@opentelemetry/api":"*","@protobufjs/base64":"*","es-define-property":"*","es-set-tostringtag":"*","@protobufjs/codegen":"*","@protobufjs/inquire":"*","@protobufjs/aspromise":"*","call-bind-apply-helpers":"*","@protobufjs/eventemitter":"*","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.3"},"bundleDependencies":["prom-client","snappyjs","tencentcloud-cls-sdk-nodejs","axios","protobufjs","@protobufjs/aspromise","@protobufjs/base64","@protobufjs/codegen","@protobufjs/eventemitter","@protobufjs/fetch","@protobufjs/float","@protobufjs/inquire","@protobufjs/path","@protobufjs/pool","@protobufjs/utf8","long","@types/node","undici-types","follow-redirects","form-data","proxy-from-env","asynckit","combined-stream","delayed-stream","mime-db","mime-types","es-set-tostringtag","es-errors","get-intrinsic","call-bind-apply-helpers","es-define-property","es-object-atoms","get-proto","dunder-proto","gopd","has-symbols","math-intrinsics","has-tostringtag","hasown","function-bind","@opentelemetry/api","tdigest","bintrees"],"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.2-beta.4_1779630001166_0.09490863299728858","host":"s3://npm-registry-packages-npm-production"}},"3.0.2-beta.5":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.2-beta.5","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.2-beta.5","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"f8b925f82b3bbda204947b01581f67170f034f15","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.2-beta.5.tgz","fileCount":4,"integrity":"sha512-ZWjWO9DMARNouH2oQDATD6Sc+aKAELxlOXHqWHuntnDkewoUSHGc4DkQLEJmlXedEk/hS41Ls6cmzu/0bn+j0w==","signatures":[{"sig":"MEYCIQCGkQzGqOdyUelAMfRQ+CTtEtBk9Y+0ObKpMaxarbMtjQIhALexsingzNG9Ghq2Wz9eMmXi2G+7Xu9u1bRTnSrKwnUs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1082640},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"esbuild":"^0.25.0","snappyjs":"^0.7.0","typescript":"^5.9.3","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.2-beta.5_1779631054439_0.8740368140267474","host":"s3://npm-registry-packages-npm-production"}},"3.0.2-beta.6":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.2-beta.6","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.2-beta.6","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"0c65757805a52330788b42701bfef46d29fc6227","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.2-beta.6.tgz","fileCount":4,"integrity":"sha512-fgf1SPbfcKxjc8xymafshPE9Gbk0MRf4B57Lr5lmwNBOMxLjrjgtXj8vyeMMW3ZcdwNsQ1PCJZF+QlB09FMzIg==","signatures":[{"sig":"MEYCIQC2sKLdPlpWWDcPHcpTx0ejJ77A5Wr4/gTSS7YnXwkqyAIhAM3x3WciEvqNsVKXzoye5S7TUuyJOIYyud1bVlbHee+f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":583117},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"esbuild":"^0.25.0","snappyjs":"^0.7.0","typescript":"^5.9.3","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.2-beta.6_1779633096674_0.7894960687212194","host":"s3://npm-registry-packages-npm-production"}},"3.0.2-beta.7":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.2-beta.7","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.2-beta.7","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"8caf6c4de0c4753e38755143f7bf41e300f575ad","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.2-beta.7.tgz","fileCount":4,"integrity":"sha512-f7VHkofXiFEwcRwKIRcbJD0/2GneIcrxb7vV9qS48PF4zcKonfngRf0ZXrESqXPB3B/P4ZQFpXwpab3FlNW8nQ==","signatures":[{"sig":"MEUCICv6Ue13p9l5MFfddAqB5h2jzAFyA1af+dVhYWjBFCIhAiEAphNWv6SUiOVybIYxfkV0UA5AB+lZ2DTXuD//zVZLQYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":583039},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"cea54385d703ce2e24486b1580cee0bce35d330d","scripts":{"dev":"npx tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"esbuild":"^0.25.0","snappyjs":"^0.7.0","typescript":"^5.9.3","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.2-beta.7_1779634745751_0.47172402338764385","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.2","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.2","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"6774bda76ab495d578ebd7d08fd0eacb1e05401d","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.2.tgz","fileCount":4,"integrity":"sha512-WhGIbshdxlrmdYlYOFZMJaSQt8lb/2Q/k9nZ/qLj+7tcc9z6zK46aIYQg4CImOuJP6Bs+H/zD2SJep+a/y5elQ==","signatures":[{"sig":"MEUCIQD4Ww0+QXS6aZOWATFnishcsAq/B+mJsgSWK2XHPNZFZwIgI4/afwhmNdp+1LQbNSfuwoM5HCwfLqBjPstNHBXoTlU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":583030},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"45ab1210176960df260a8aafa0e9ceffd33939bb","scripts":{"dev":"npx tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","snappyjs":"^0.7.0","typescript":"^5.9.3","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.2_1779681967134_0.7800260819237836","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.4","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.4","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"552c049c1241acaf1be9fe15e7073c1ceee69768","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.4.tgz","fileCount":4,"integrity":"sha512-6OYThPhUY1Q68k21EoGcpunhAVDdJjTGg7wSWk8SNbz5za4zuBtI6UIKGzRqAjUxbH90lenwyvswULHFNTfSaw==","signatures":[{"sig":"MEUCIBk2i+n+DtDQJPAgvDf77R1EKuaue1YEy6Ft/t1x6nuDAiEA5p7IdccPzp7BqHPnDTlo4wgVuLdNlrHrNUmF4BYwmIs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":293905},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"d703299f6fc0aca61ea6372306384dd12c532ba2","scripts":{"dev":"npx tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","snappyjs":"^0.7.0","typescript":"^5.9.3","prom-client":"^15.1.3"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.4_1779708855571_0.7546949731303703","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.5","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.5","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"9e3d990e2e200d11160de890fb404d6ebbecf436","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.5.tgz","fileCount":4,"integrity":"sha512-Fw00SY/gilEV8oUfEjNZkE2iNlomZ0ihIUpAlmcvJzhZLxmp5FE1y+fq9KVjMpJTnobD6VpiQZowD8j90j9jfQ==","signatures":[{"sig":"MEUCIFeHqQGBWpjf824nRv6u0efMjrGvNBooz+9BV4Y0TCVxAiEAx9zo8jyGxhFcCU9uFsvyYI4qYJXOVjj6PZF50B0vFu0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229015},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"d703299f6fc0aca61ea6372306384dd12c532ba2","scripts":{"dev":"npx tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","typescript":"^5.9.3","@types/node":"^25.6.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.5_1779726829721_0.6795481871744469","host":"s3://npm-registry-packages-npm-production"}},"3.0.6":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.6","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.6","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"5b98014a36f699c4a128b94d60cf8fc7145286b1","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.6.tgz","fileCount":4,"integrity":"sha512-/ARK4p+Yfk3WpnOIrOvzsVN/1Ii24p1hT8ZGp8E3WT4hXd9tIXeQJ0oEl2PC9SiO4AzRysFngFJPc2m3zNeMtQ==","signatures":[{"sig":"MEYCIQDbe8XZSudfaP4i7d7vzropA0NJvsagOFQlEK5qFelJIwIhAPhbwbIaWHED1gydMq4VkUFiTKHrWzuN1PWhThysgPs7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":230083},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"1273371d4ee932b87ce6197c836e252198d975de","scripts":{"dev":"npx tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","typescript":"^5.9.3","@types/node":"^25.6.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.6_1779729660343_0.41233995383735134","host":"s3://npm-registry-packages-npm-production"}},"3.0.7":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.7","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.7","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"0ddfbeaaacdc9498ed9669c85296b19153514640","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.7.tgz","fileCount":4,"integrity":"sha512-uybd8EeLAFapjclp/9+/q1NV9ai2xGmRswqUtM1LoTwalX4AG8tkU/oqHKWJQOgSyijSTiCoLjQld80yGBnX8Q==","signatures":[{"sig":"MEUCIQDDeKBYW8L60KWW38dtTJa9VCVcwZutYsdaYcz7op83wwIgGlhrh6GtOFW1a6iAXZ0eYvgR7qr4YBziz0gKwSR1Rts=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":230675},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"53b88b283fb67accaf4caf27b54eb5a5a4fc37da","scripts":{"dev":"npx tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","typescript":"^5.9.3","@types/node":"^25.6.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.7_1780468638157_0.5515581480457623","host":"s3://npm-registry-packages-npm-production"}},"3.0.8":{"name":"clawpro-diagnostics-metrics-cls","version":"3.0.8","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"author":{"name":"cls_team"},"license":"MIT","_id":"clawpro-diagnostics-metrics-cls@3.0.8","maintainers":[{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"}],"homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"dist":{"shasum":"a2e0172e62b0a1de3813a464f1e889c842b880f8","tarball":"https://registry.npmjs.org/clawpro-diagnostics-metrics-cls/-/clawpro-diagnostics-metrics-cls-3.0.8.tgz","fileCount":4,"integrity":"sha512-cx3Q09b4xNg7pMAPcBff1mWgM/Yjgc8qR8Fe/ByENzzSZD6pKPLSAjHJEanCWQnerkt56LtdJHylcL7uKMoH6A==","signatures":[{"sig":"MEUCIHC/y5yHtAY//AwXyA1TPs6YPSprsSwEsSe1FwFDKNibAiEAk1TYcKWTH2wcbPIj5t8g2tWt+BJm+ScCotDbF6hifGo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231446},"main":"./dist/index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./openclaw.plugin.json":"./openclaw.plugin.json"},"gitHead":"4f8c4a4a80ad5f9d5eb061dd326d92f452cdfc68","scripts":{"dev":"npx tsc --noEmit --watch","build":"node build.mjs","clean":"rm -rf dist .tsbuildinfo","prepack":"npm run build","typecheck":"npx tsc --noEmit"},"_npmUser":{"name":"zhanxiangli","email":"zhanxiangli@tencent.com"},"openclaw":{"build":{"openclawVersion":"2026.4.16"},"compat":{"pluginApi":">=2026.3.7"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"_npmVersion":"10.8.2","description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","directories":{},"_nodeVersion":"20.20.2","dependencies":{"snappyjs":"^0.7.0","prom-client":"^15.1.3","tencentcloud-cls-sdk-nodejs":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","typescript":"^5.9.3","@types/node":"^25.6.0"},"_npmOperationalInternal":{"tmp":"tmp/clawpro-diagnostics-metrics-cls_3.0.8_1781579401318_0.8534783750227823","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-03-20T08:27:26.987Z","modified":"2026-08-17T11:38:45.913Z","1.0.0":"2026-03-20T08:27:27.156Z","1.0.1":"2026-03-20T08:43:30.097Z","1.0.2":"2026-03-20T13:03:09.196Z","1.0.3":"2026-03-22T05:37:30.139Z","2.0.0":"2026-04-21T13:43:33.880Z","2.0.1":"2026-04-28T08:02:54.900Z","2.0.2":"2026-05-09T09:05:37.907Z","2.0.3":"2026-05-09T10:04:30.544Z","3.0.0":"2026-05-15T02:52:03.505Z","3.0.1-beta.0":"2026-05-18T13:22:45.423Z","3.0.1-beta.2":"2026-05-18T13:29:08.885Z","3.0.1-beta.3":"2026-05-19T06:30:25.512Z","3.0.1-beta.4":"2026-05-19T08:54:00.108Z","3.0.1-beta.5":"2026-05-19T09:19:40.719Z","3.0.1-beta.6":"2026-05-19T09:32:33.004Z","3.0.1-beta.7":"2026-05-19T09:46:04.328Z","3.0.1-beta.9":"2026-05-24T12:47:37.332Z","3.0.1":"2026-05-24T13:13:53.390Z","3.0.2-beta.1":"2026-05-24T13:22:26.016Z","3.0.2-beta.2":"2026-05-24T13:27:00.662Z","3.0.2-beta.3":"2026-05-24T13:36:33.894Z","3.0.2-beta.4":"2026-05-24T13:40:01.402Z","3.0.2-beta.5":"2026-05-24T13:57:34.592Z","3.0.2-beta.6":"2026-05-24T14:31:36.815Z","3.0.2-beta.7":"2026-05-24T14:59:05.976Z","3.0.2":"2026-05-25T04:06:07.365Z","3.0.4":"2026-05-25T11:34:15.729Z","3.0.5":"2026-05-25T16:33:49.883Z","3.0.6":"2026-05-25T17:21:00.603Z","3.0.7":"2026-06-03T06:37:18.293Z","3.0.8":"2026-06-16T03:10:01.470Z"},"bugs":{"url":"https://github.com/openclaw/diagnostics-metrics-cls/issues"},"author":{"name":"cls_team"},"license":"MIT","homepage":"https://github.com/openclaw/diagnostics-metrics-cls#readme","keywords":["openclaw","openclaw-plugin","diagnostics","metrics","prometheus","tencent-cloud","cls","trace","observability"],"repository":{"url":"git+https://github.com/openclaw/diagnostics-metrics-cls.git","type":"git"},"description":"CLS OpenClaw diagnostics exporter: Prometheus metrics (pull/remote-write) + full-link Trace","maintainers":[{"email":"18730590865@163.com","name":"onesuite"},{"email":"zhanxiangli@tencent.com","name":"zhanxiangli"}],"readme":"# Diagnostics Metrics CLS 插件\n\nOpenClaw 诊断指标导出插件，提供以下核心能力：\n\n- **Prometheus 指标采集**：通过 `/metrics` HTTP 端点暴露指标（Pull 模式），或通过 Prometheus Remote Write 协议主动推送到远端（Push 模式）\n- **腾讯云 CLS Prometheus Remote Write**：通过腾讯云 CLS 的 Prometheus Remote Write 接口推送指标数据\n- **全链路 Trace 追踪（v2）**：将 Agent 执行过程中的 Span 数据直接写入腾讯云日志服务（CLS），支持完整的 Trace Context 传播——所有 Span 共享同一个 traceId，通过显式的父子关系串联成一棵调用树，可以完整看到一次请求的全貌。遵循 OTel GenAI 语义约定，支持分段式 LLM Span、Step 层级、跨通道上下文链接、任务队列等高级特性\n\n---\n\n## ⚠️ 数据访问声明（请务必阅读）\n\n> **本插件需要读取 LLM 会话内容才能产出 token / 长度 / 耗时类指标和 Trace 数据。**\n> 通过 onboard CLI 的 `install` / `UpdateParameter` 命令安装时，CLI 会自动在 `~/.openclaw/openclaw.json` 中为本插件写入 `plugins.entries[\"clawpro-diagnostics-metrics-cls\"].hooks.allowConversationAccess = true`，以满足 OpenClaw 对 non-bundled 插件 typed hook 的安全策略。**安装即视为您授权本插件访问会话内容**，请在团队 / 公司合规要求允许的前提下使用。\n\n### 一、本插件会接触哪些数据\n\n| 数据类别 | 来源 hook | 是否上报到 CLS |\n|---|---|---|\n| 用户输入的 prompt 原文（含系统提示词、对话历史） | `llm_input` / `message_received` | ✅ 默认会通过 Trace 模块写入 CLS 的 **Trace 日志主题**（`traceTopicId`）字段 `gen_ai.input.messages` / `gen_ai.prompt`，未配置 `traceTopicId` 或 `trace.enabled=false` 时不上报 |\n| 模型生成的 completion 原文 | `llm_output` / `before_message_write` | ✅ 同上，写入字段 `gen_ai.output.messages` / `gen_ai.completion` |\n| Agent 最终输出 / 工具调用参数 / 工具返回结果 | `agent_end` / `before_tool_call` / `after_tool_call` | ✅ 同上，写入字段 `gen_ai.output.messages` / `gen_ai.tool.call.arguments` / `gen_ai.tool.call.result` |\n| Token 用量 / 耗时 / 模型名等元数据 | 全部 hook | ✅ 写入 **Prometheus 指标主题**（`metricTopicId`），**不含原文** |\n\n> Prometheus 指标主题（`metricTopicId`）只承载聚合后的数值类指标（counter / histogram / gauge），**不会包含 prompt 或 completion 原文**；会话原文仅出现在 Trace 主题（`traceTopicId`）中。\n\n### 二、如果您不希望插件读取会话原文\n\n可以选择以下任一方式，按需削减插件的数据访问范围：\n\n1. **完全禁用 Trace，仅保留指标**：`UpdateParameter --traceEnabled false`，或在 `openclaw.json` 中将 `plugins.entries[\"clawpro-diagnostics-metrics-cls\"].config.trace.enabled` 设为 `false`。此时插件仍会保留 `allowConversationAccess=true` 以采集 token / 耗时类指标，但**不再向 CLS 写入任何 prompt / completion 原文**。\n2. **按 hook 粒度禁用**：在 `openclaw.json` 的 `config.trace.enabledHooks` 中只列出您允许的 hook（例如只保留 `[\"session_start\", \"session_end\", \"agent_end\"]` 等不直接携带消息内容的 hook，不包含 `llm_input` / `before_message_write`），其余 hook 不会被注册到 OpenClaw runtime。\n3. **彻底拒绝插件访问会话内容**：在 `openclaw.json` 中手动将 `plugins.entries[\"clawpro-diagnostics-metrics-cls\"].hooks.allowConversationAccess` 设为 `false`，OpenClaw 会拦截 `llm_input` / `llm_output` / `agent_end` 等 typed hook，本插件相关指标和 trace 将不可用，但其它非会话类指标（如 webhook、队列、会话状态等）仍正常工作。\n\n### 三、CLS 侧数据安全建议\n\n- 为 `traceTopicId` 单独创建日志主题，配置最严格的访问权限（仅运维 / SRE 可读），不要与业务日志主题混用。\n- 如需进一步限制原文长度，插件已内置**结构感知式渐进裁剪**（详见下文 Trace 章节\"超长截断策略\"），单字段最大 3,200,000 字符，APM 索引字段单条消息最长 4,096 字符。\n- 上报前可通过 `external_labels` 加上 `data_classification=internal` 等业务标签，便于在 CLS 侧做 RBAC / 脱敏策略。\n\n---\n\n## 目录\n\n- [⚠️ 数据访问声明（请务必阅读）](#-数据访问声明请务必阅读)\n- [快速安装（推荐）](#快速安装推荐)\n- [手动安装](#手动安装)\n- [配置说明](#配置说明)\n  - [CLS 配置](#cls-配置)\n  - [Prometheus 配置](#prometheus-配置可选)\n  - [Trace 配置](#trace-配置可选)\n  - [Log 日志上报配置](#log-日志上报配置可选)\n- [功能说明](#功能说明)\n  - [Prometheus 指标列表](#prometheus-指标列表)\n  - [全链路 Trace 追踪](#全链路-trace-追踪)\n  - [腾讯云实例元数据注入](#腾讯云实例元数据注入)\n- [更新配置（UpdateParameter）](#更新配置updateparameter)\n- [配置热更新](#配置热更新)\n- [密钥加密存储](#密钥加密存储)\n- [CVM 角色临时密钥](#cvm-角色临时密钥)\n- [验证插件状态](#验证插件状态)\n- [卸载插件](#卸载插件)\n  - [快速卸载（推荐）](#快速卸载推荐)\n  - [手动卸载](#手动卸载)\n- [常见问题](#常见问题)\n\n---\n\n## 快速安装（推荐）\n\n使用 onboard CLI 工具一键完成安装和配置。\n\n### 前置条件\n\n安装前需确保 `~/.openclaw/openclaw.json` 中已包含 CLS 必填配置，CLI 会自动读取该文件。\n\n- **静态密钥模式**（默认）：需要 `secretId`、`secretKey`、`endpoint`（`metricTopicId` 可选）\n- **CVM 角色临时密钥模式**：需要 `endpoint`、`roleName`，无需 `secretId` 和 `secretKey`（`metricTopicId` 可选）\n\n也可以通过命令行参数直接传入，命令行参数优先级高于配置文件中的值。\n\n### 运行安装命令\n\n```bash\nnpx --yes clawpro-diagnostics-metrics-cls-onboard-cli install\n```\n\n### 命令行参数\n\n所有参数均为可选，未传入时会从 `openclaw.json` 中读取已有值：\n\n| 参数 | 说明 | 是否必填 |\n|------|------|----------|\n| `--metricTopicId <id>` | Prometheus Remote Write 使用的 CLS 日志主题 ID | 可选（可在配置文件中动态更新） |\n| `--secretId <id>` | 腾讯云 API 密钥 SecretId | ✅ static 模式必填（配置文件或参数二选一） |\n| `--secretKey <key>` | 腾讯云 API 密钥 SecretKey | ✅ static 模式必填（配置文件或参数二选一） |\n| `--endpoint <endpoint>` | CLS 接入点（如 `ap-guangzhou.cls.tencentcs.com`） | ✅ 必填（配置文件或参数二选一） |\n| `--credentialMode <mode>` | 凭证模式：`static`（静态密钥，默认）或 `cvmRole`（CVM 角色临时密钥） | 可选，默认 `static` |\n| `--roleName <name>` | CVM 角色名称 | ✅ cvmRole 模式必填（配置文件或参数二选一） |\n| `--enableReport <bool>` | 是否启用指标推送（`true`/`false`，默认 `true`） | 可选 |\n| `--prometheusEnabled <bool>` | 是否开启 Prometheus 指标上报（`true`/`false`） | 可选 |\n| `--pushIntervalMs <ms>` | Prometheus Remote Write 推送间隔（毫秒） | 可选 |\n| `--externalLabels <labels>` | Prometheus 自定义标签（格式：`key1=value1,key2=value2`） | 可选 |\n| `--traceEnabled <bool>` | 是否启用 Trace 链路追踪功能（`true`/`false`，默认 `true`） | 可选 |\n| `--traceTopicId <id>` | Trace 数据上报使用的 CLS 日志主题 ID | 可选（可在配置文件中动态更新） |\n| `--enableLogReport <bool>` | 是否启用日志上报（`true`/`false`，默认 `false`） | 可选 |\n| `--logTopicId <id>` | 日志上报使用的 CLS 日志主题 ID | 可选（可在配置文件中动态更新） |\n| `--logSource <source>` | 日志来源标识，写入每条日志的 `source` 字段（默认 `openclaw`） | 可选 |\n| `--enableGatewayLog <bool>` | 是否启用 gateway 运行日志上报（`true`/`false`，默认 `true`） | 可选 |\n| `--enableSessionLog <bool>` | 是否启用会话日志上报（`true`/`false`，默认 `true`） | 可选 |\n| `--logMinLevel <level>` | 最低上报日志级别，仅对 gateway 运行日志生效（默认 `info`） | 可选 |\n| `--instanceId <id>` | 显式指定实例 ID，写入配置文件后插件启动时直接使用，跳过腾讯云 metadata 接口请求 | 可选 |\n| `--instanceName <name>` | 显式指定实例名称，仅覆盖 `cvm_instance_name`，不影响 `host_name`（后者始终取 `os.hostname()`） | 可选 |\n| `--localIpv4 <ip>` | 显式指定内网 IPv4 | 可选 |\n| `--pluginVersion <version>` | 指定安装的插件版本号（如 `1.2.3`），仅在从 npm registry 安装时生效；本地路径存在时忽略 | 可选，默认安装最新版本 |\n\n### 安装示例\n\n从配置文件读取（已预先在 `openclaw.json` 中配置好 CLS 信息）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli install\n```\n\n通过命令行参数传入（静态密钥模式）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli install \\\n  --metricTopicId \"xxxxxxxx-metric-topic-id\" \\\n  --secretId \"AKIDxxxxxxxx\" \\\n  --secretKey \"xxxxxxxxxxxxxxxx\" \\\n  --endpoint \"ap-guangzhou.cls.tencentcs.com\" \\\n  --prometheusEnabled true\n```\n\n使用 CVM 角色临时密钥模式（无需传入 secretId/secretKey，但必须指定 roleName）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli install \\\n  --metricTopicId \"xxxxxxxx-metric-topic-id\" \\\n  --endpoint \"ap-guangzhou.cls.tencentcs.com\" \\\n  --credentialMode cvmRole \\\n  --roleName \"CVM\"\n```\n\n使用 CVM 角色临时密钥模式（自定义角色名）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli install \\\n  --endpoint \"ap-guangzhou.cls.tencentcs.com\" \\\n  --credentialMode cvmRole \\\n  --roleName \"MyCustomRoleName\"\n```\n\n同时配置 Trace 链路追踪（指定 Trace 日志主题 ID）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli install \\\n  --metricTopicId \"xxxxxxxx-metric-topic-id\" \\\n  --secretId \"AKIDxxxxxxxx\" \\\n  --secretKey \"xxxxxxxxxxxxxxxx\" \\\n  --endpoint \"ap-guangzhou.cls.tencentcs.com\" \\\n  --prometheusEnabled true \\\n  --traceTopicId \"zzzzzzzz-trace-topic-id\"\n```\n\n安装指定版本（从 npm registry 安装时生效）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli install \\\n  --metricTopicId \"xxxxxxxx-metric-topic-id\" \\\n  --secretId \"AKIDxxxxxxxx\" \\\n  --secretKey \"xxxxxxxxxxxxxxxx\" \\\n  --endpoint \"ap-guangzhou.cls.tencentcs.com\" \\\n  --pluginVersion \"1.2.3\"\n```\n\n安装完成后，CLI 会自动重启网关并输出确认信息：\n\n```\n✅ 安装完成，clawpro-diagnostics-metrics-cls 已启用\n   凭证模式: 静态密钥\n   CLS 接入点: ap-guangzhou.cls.tencentcs.com\n   指标日志主题 ID: xxxxxxxx-metric-topic-id\n   指标推送: 已启用\n   指标上报: 已开启\n   Prometheus Remote Write: https://ap-guangzhou.cls.tencentcs.com/prometheus/xxxxxxxx-metric-topic-id/api/v1/write\n   推送间隔: 15000ms\n   Trace 链路追踪: 已启用\n   Trace 日志主题 ID: zzzzzzzz-trace-topic-id\n\n运行以下命令验证插件状态：\n   openclaw plugins list\n```\n\n使用 CVM 角色临时密钥模式时的输出示例：\n\n```\n✅ 安装完成，clawpro-diagnostics-metrics-cls 已启用\n   凭证模式: CVM 角色临时密钥\n   CVM 角色名称: CVM\n   CLS 接入点: ap-guangzhou.cls.tencentcs.com\n   指标日志主题 ID: xxxxxxxx-metric-topic-id\n   指标推送: 已启用\n   指标上报: 未开启\n   Trace 链路追踪: 已启用\n   Trace 日志主题 ID: (未配置，可通过配置文件 trace.traceTopicId 字段动态注入)\n\n运行以下命令验证插件状态：\n   openclaw plugins list\n```\n\n> **说明**：启用 Prometheus 时，CLI 会自动根据 `endpoint` 和 `metricTopicId` 生成 Remote Write URL（格式为 `https://<endpoint>/prometheus/<metricTopicId>/api/v1/write`）。静态密钥模式下使用 `secretId` / `secretKey` 的 Basic Auth 进行鉴权；CVM 角色临时密钥模式下由插件运行时动态获取凭证进行鉴权。\n\n---\n\n## 手动安装\n\n### 第一步：安装插件\n\n```bash\nopenclaw plugins install clawpro-diagnostics-metrics-cls\n```\n\n### 第二步：安装插件运行时依赖\n\n在插件安装目录中执行：\n\n```bash\ncd ~/.openclaw/extensions/clawpro-diagnostics-metrics-cls\nnpm install --omit=dev\n```\n\n### 第三步：编辑配置文件\n\n打开 `~/.openclaw/openclaw.json`，添加以下配置：\n\n**静态密钥模式**（默认）：\n\n```json\n{\n  \"diagnostics\": {\n    \"enabled\": true\n  },\n  \"plugins\": {\n    \"allow\": [\"clawpro-diagnostics-metrics-cls\"],\n    \"entries\": {\n      \"clawpro-diagnostics-metrics-cls\": {\n        \"enabled\": true,\n        \"config\": {\n          \"cls\": {\n            \"metricTopicId\": \"your-metric-topic-id\",\n            \"secretId\": \"your-secret-id\",\n            \"secretKey\": \"your-secret-key\",\n            \"endpoint\": \"ap-guangzhou.cls.tencentcs.com\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n**CVM 角色临时密钥模式**（适用于腾讯云 CVM 环境）：\n\n```json\n{\n  \"diagnostics\": {\n    \"enabled\": true\n  },\n  \"plugins\": {\n    \"allow\": [\"clawpro-diagnostics-metrics-cls\"],\n    \"entries\": {\n      \"clawpro-diagnostics-metrics-cls\": {\n        \"enabled\": true,\n        \"config\": {\n          \"cls\": {\n            \"credentialMode\": \"cvmRole\",\n            \"roleName\": \"CVM\",\n            \"metricTopicId\": \"your-metric-topic-id\",\n            \"endpoint\": \"ap-guangzhou.cls.tencentcs.com\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n> **重要**：`diagnostics.enabled` 必须设为 `true`，否则 OpenClaw 不会发出诊断事件，Prometheus 指标将无法采集。使用 CLI 安装时会自动写入此配置。\n\n### 第四步：重启网关\n\n```bash\nopenclaw gateway restart\n```\n\n---\n\n## 配置说明\n\n所有配置均位于 `~/.openclaw/openclaw.json` 中 `plugins.entries[\"clawpro-diagnostics-metrics-cls\"].config` 下，分为 `cls`、`prometheus` 和 `trace` 三个子对象。\n\n### CLS 配置\n\nCLS 配置用于设置腾讯云 CLS Prometheus Remote Write 的凭证和接入信息。\n\n**静态密钥模式**（默认）：\n\n```json\n{\n  \"cls\": {\n    \"metricTopicId\": \"yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\",\n    \"secretId\": \"AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n    \"secretKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n    \"endpoint\": \"ap-guangzhou.cls.tencentcs.com\",\n    \"enableReport\": true\n  }\n}\n```\n\n**CVM 角色临时密钥模式**：\n\n```json\n{\n  \"cls\": {\n    \"credentialMode\": \"cvmRole\",\n    \"roleName\": \"CVM\",\n    \"metricTopicId\": \"yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\",\n    \"endpoint\": \"ap-guangzhou.cls.tencentcs.com\",\n    \"enableReport\": true\n  }\n}\n```\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `metricTopicId` | string | — | 可选。Prometheus Remote Write 使用的 CLS 日志主题 ID，用于构建推送 URL |\n| `credentialMode` | string | `\"static\"` | 凭证模式：`static`（静态密钥）或 `cvmRole`（CVM 角色临时密钥）。详见 [CVM 角色临时密钥](#cvm-角色临时密钥) |\n| `roleName` | string | — | **cvmRole 模式必填**。CVM 角色名称，仅在 `credentialMode` 为 `cvmRole` 时有效 |\n| `credentialRefreshIntervalMs` | number | `300000` | CVM 角色临时密钥刷新间隔（毫秒），仅在 `credentialMode` 为 `cvmRole` 时有效，最小值 60000 |\n| `secretId` | string | — | **static 模式必填**。腾讯云 API 密钥 SecretId（cvmRole 模式下无需配置） |\n| `secretKey` | string | — | **static 模式必填**。腾讯云 API 密钥 SecretKey（cvmRole 模式下无需配置） |\n| `endpoint` | string | — | **必填**。CLS 接入点域名，例如 `ap-guangzhou.cls.tencentcs.com` 或 `ap-guangzhou-open.cls.tencentcs.com` |\n| `enableReport` | boolean | `true` | 是否启用指标推送。`false` 时插件不通过 Remote Write 推送任何指标数据。支持**热更新**，修改配置文件后约 10 秒内生效，无需重启 |\n\n> **获取腾讯云密钥**：登录 [腾讯云控制台](https://console.cloud.tencent.com/cam/capi) → 访问管理 → API 密钥管理。\n>\n> **获取 CLS Topic ID**：登录 [日志服务控制台](https://console.cloud.tencent.com/cls) → 日志主题 → 复制主题 ID。\n>\n> **CLS 接入点列表**：参考 [CLS 可用地域](https://cloud.tencent.com/document/product/614/18940)，格式为 `<region>.cls.tencentcs.com`（内网）、`<region>-open.cls.tencentcs.com`（内网开放接口）或 `<region>.cls.tencentyun.com`（外网）。\n\n---\n\n### Prometheus 配置（可选）\n\nPrometheus 功能通过插件的 `config.prometheus` 配置项控制，与 `cls` 配置并列放在 `plugins.entries[\"clawpro-diagnostics-metrics-cls\"].config` 下。\n\n在 `~/.openclaw/openclaw.json` 中添加：\n\n```json\n{\n  \"plugins\": {\n    \"allow\": [\"clawpro-diagnostics-metrics-cls\"],\n    \"entries\": {\n      \"clawpro-diagnostics-metrics-cls\": {\n        \"enabled\": true,\n        \"config\": {\n          \"prometheus\": {\n            \"enabled\": true,\n            \"metric_prefix\": \"openclaw\",\n            \"pull\": true,\n            \"default_metrics\": true,\n            \"external_labels\": {\n              \"instance\": \"my-openclaw-instance\",\n              \"env\": \"production\"\n            },\n            \"remote_write\": [\n              {\n                \"url\": \"http://prometheus:9090/api/v1/write\"\n              }\n            ],\n            \"push_interval_ms\": 30000\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n#### Prometheus 基础配置\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `enabled` | boolean | `true` | 是否启用 Prometheus 功能 |\n| `metric_prefix` | string | `\"openclaw\"` | 所有指标名称的前缀 |\n| `pull` | boolean | `true` | 是否启用 `/metrics` HTTP Pull 端点 |\n| `default_metrics` | boolean | `true` | 是否采集 Node.js 默认指标（GC、事件循环等） |\n| `external_labels` | object | `{}` | 附加到所有指标的自定义标签 |\n| `push_interval_ms` | number | `30000` | Remote Write 推送间隔（毫秒） |\n\n> **说明**：当部署在腾讯云环境时，插件会自动注入实例元数据作为标签（`cvm_instance_id`、`cvm_instance_name`、`cvm_instance_intra_ip`）。若在 `external_labels` 中手动配置了同名标签，则以手动配置的值为准。\n\n#### Remote Write 配置\n\n`remote_write` 为数组，支持同时配置多个推送目标：\n\n```json\n{\n  \"remote_write\": [\n    {\n      \"url\": \"http://prometheus:9090/api/v1/write\",\n      \"headers\": {\n        \"Authorization\": \"Bearer <token>\"\n      },\n      \"queue_config\": {\n        \"capacity\": 2500,\n        \"max_samples_per_send\": 500,\n        \"batch_send_deadline_ms\": 5000,\n        \"max_retries\": 3\n      },\n      \"tls_config\": {\n        \"insecure_skip_verify\": false\n      }\n    }\n  ]\n}\n```\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `url` | string | — | **必填**。Remote Write 端点 URL |\n| `headers` | object | — | 自定义 HTTP 请求头（可用于传入 `Authorization` 等认证头） |\n| `tls_config.ca_file` | string | — | CA 证书文件路径 |\n| `tls_config.cert_file` | string | — | 客户端证书文件路径 |\n| `tls_config.key_file` | string | — | 客户端私钥文件路径 |\n| `tls_config.insecure_skip_verify` | boolean | `false` | 跳过 TLS 证书验证 |\n| `queue_config.capacity` | number | `2500` | 队列容量（超出后丢弃最旧数据） |\n| `queue_config.max_samples_per_send` | number | `500` | 每批最大发送样本数 |\n| `queue_config.batch_send_deadline_ms` | number | `5000` | 批次最大等待时间（毫秒） |\n| `queue_config.max_retries` | number | `3` | 5xx/429 错误最大重试次数 |\n| `queue_config.min_backoff_ms` | number | `30` | 重试最小退避时间（毫秒） |\n| `queue_config.max_backoff_ms` | number | `5000` | 重试最大退避时间（毫秒） |\n\n> **使用 CLI 安装时**：启用 Prometheus 后，CLI 会自动根据 `endpoint` 和 `metricTopicId` 生成 Remote Write URL（格式为 `https://<endpoint>/prometheus/<metricTopicId>/api/v1/write`）。静态密钥模式下使用 `secretId:secretKey` 的 Basic Auth 进行鉴权；CVM 角色临时密钥模式下由插件运行时动态获取凭证进行鉴权。无需手动配置 `remote_write` 和 `headers`。\n\n---\n\n### Trace 配置（可选）\n\nTrace 功能通过插件的 `config.trace` 配置项控制，与 `cls` 和 `prometheus` 配置并列放在 `plugins.entries[\"clawpro-diagnostics-metrics-cls\"].config` 下。\n\n**Trace 模块复用 `cls` 配置中的 `secretId` / `secretKey` / `endpoint` 凭证**，只需在 `trace` 中独立配置 `enabled` 和 `traceTopicId`。\n\n在 `~/.openclaw/openclaw.json` 中添加：\n\n```json\n{\n  \"plugins\": {\n    \"allow\": [\"clawpro-diagnostics-metrics-cls\"],\n    \"entries\": {\n      \"clawpro-diagnostics-metrics-cls\": {\n        \"enabled\": true,\n        \"config\": {\n          \"cls\": {\n            \"secretId\": \"your-secret-id\",\n            \"secretKey\": \"your-secret-key\",\n            \"endpoint\": \"ap-guangzhou.cls.tencentcs.com\"\n          },\n          \"trace\": {\n            \"enabled\": true,\n            \"traceTopicId\": \"your-trace-topic-id\",\n            \"serviceName\": \"openclaw-agent\",\n            \"debug\": false\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n#### Trace 基础配置\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `enabled` | boolean | `true` | 是否启用 Trace 链路追踪功能 |\n| `traceTopicId` | string | — | **必填**。Trace 数据上报使用的 CLS 日志主题 ID |\n| `serviceName` | string | `\"openclaw-agent\"` | 服务名称，用于标识 Trace 数据来源，会写入每个 Span 的 `service.name` 属性 |\n| `debug` | boolean | `false` | 是否启用 trace 调试日志，开启后会输出详细的 Span 创建/关闭日志 |\n| `batchSize` | number | `10` | Span 缓冲区大小，达到此数量后触发批量发送 |\n| `flushIntervalMs` | number | `5000` | Span 缓冲区最大等待时间（毫秒），超时后强制发送已缓冲的 Span |\n| `enabledHooks` | string[] | — | 可选。指定启用的 hook 列表，未指定时启用所有 hook。支持**热更新**，修改后约 10 秒内生效。例如 `[\"message_received\", \"llm_input\", \"agent_end\"]` |\n\n> **注意**：\n> - Trace 功能复用 `cls` 配置中的 `secretId` / `secretKey` / `endpoint` / `token`，无需在 `trace` 中重复配置凭证\n> - Trace 功能使用独立的 CLS 日志主题（`traceTopicId`），与 Prometheus 指标使用的日志主题（`metricTopicId`）分开，便于分别管理和查询\n> - Trace 配置不完整时（缺少 `traceTopicId` 或 `cls` 凭证不完整），trace 功能会自动禁用，不影响 Prometheus 指标功能\n> - **热更新恢复**：即使初始启动时 trace 配置不完整或 `enabled=false`，trace 服务仍会被创建并启动热更新轮询。后续在 `openclaw.json` 中补全配置后，约 10 秒内自动恢复 trace 功能，无需重启网关\n\n---\n\n### Log 日志上报配置（可选）\n\nLog 日志上报功能通过插件的 `config.log` 配置项控制，与 `cls`、`prometheus` 和 `trace` 配置并列放在 `plugins.entries[\"clawpro-diagnostics-metrics-cls\"].config` 下。\n\n**Log 模块复用 `cls` 配置中的 `secretId` / `secretKey` / `endpoint` 凭证**，只需在 `log` 中独立配置 `enableLogReport` 和 `logTopicId`。\n\n> **默认关闭**：`enableLogReport` 默认为 `false`，需显式设置为 `true` 才会启用日志上报。\n\n#### Log 模块与 Trace 模块的区别\n\n| 维度 | Log 模块 | Trace 模块 |\n|------|---------|-----------|\n| **数据来源** | Gateway 运行日志 + 会话消息（session JSONL） | Agent 执行过程中的 Span 事件 |\n| **数据格式** | 扁平化 KV 字段（`log_type`、`level`、`message`、`role`、`content` 等） | OTel GenAI 标准 Span 格式（`traceID`、`spanID`、`parentSpanID`、`kind` 等） |\n| **查询场景** | 运维排障、会话内容审计、日志级别过滤 | 全链路调用追踪、LLM 耗时分析、工具调用链路 |\n| **日志主题** | `logTopicId`（独立配置） | `traceTopicId`（独立配置） |\n| **默认状态** | 默认关闭（`enableLogReport=false`） | 默认关闭（`enabled=false`） |\n\n#### 上报的日志类型\n\n1. **Gateway 运行日志**（`log_type=gateway`）：OpenClaw gateway 进程的运行日志，通过 `registerLogTransport` 实时 flush 流上报，不读取本地日志文件\n2. **会话日志**（`log_type=session`）：每条写入会话 JSONL 的消息，通过 `before_message_write` hook 实时上报，与 session JSONL 文件内容完全一致\n\n在 `~/.openclaw/openclaw.json` 中添加：\n\n```json\n{\n  \"plugins\": {\n    \"allow\": [\"clawpro-diagnostics-metrics-cls\"],\n    \"entries\": {\n      \"clawpro-diagnostics-metrics-cls\": {\n        \"enabled\": true,\n        \"config\": {\n          \"cls\": {\n            \"secretId\": \"your-secret-id\",\n            \"secretKey\": \"your-secret-key\",\n            \"endpoint\": \"ap-guangzhou.cls.tencentcs.com\"\n          },\n          \"log\": {\n            \"enableLogReport\": true,\n            \"logTopicId\": \"your-log-topic-id\",\n            \"enableGatewayLog\": true,\n            \"enableSessionLog\": true,\n            \"minLevel\": \"info\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n#### Log 基础配置\n\n| 字段 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `enableLogReport` | boolean | `false` | **是否启用日志上报**，默认关闭，需显式设置为 `true` |\n| `logTopicId` | string | — | **必填**（启用时）。日志上报使用的 CLS 日志主题 ID |\n| `source` | string | `\"openclaw\"` | 日志来源标识，写入每条日志的 `source` 字段 |\n| `enableGatewayLog` | boolean | `true` | 是否启用 gateway 运行日志上报 |\n| `enableSessionLog` | boolean | `true` | 是否启用会话日志上报（session JSONL） |\n| `minLevel` | string | `\"info\"` | 最低上报日志级别（仅对 gateway 运行日志生效），可选值：`trace`、`debug`、`info`、`warn`、`error`、`fatal` |\n| `sendTimeThreshold` | number | `2` | 异步发送时间阈值（秒） |\n| `sendCountThreshold` | number | `1000` | 异步发送条数阈值 |\n\n> **注意**：\n> - Log 功能复用 `cls` 配置中的 `secretId` / `secretKey` / `endpoint` / `token`，无需在 `log` 中重复配置凭证\n> - Log 功能使用独立的 CLS 日志主题（`logTopicId`），与 Prometheus 指标（`metricTopicId`）和 Trace（`traceTopicId`）分开\n> - 所有日志均通过实时 flush 流上报，**不读取本地日志文件**\n> - `enableLogReport` 默认为 `false`，避免在未配置 `logTopicId` 时意外上报\n\n#### CLS 日志字段说明\n\n每条上报到 CLS 的日志均包含以下字段（以 CLS LogItem KV 格式存储）：\n\n**Gateway 运行日志（`log_type=gateway`）公共字段：**\n\n| 字段名 | 说明 | 示例值 |\n|--------|------|--------|\n| `log_type` | 日志类型，固定为 `gateway` | `gateway` |\n| `level` | 日志级别 | `info`、`warn`、`error` |\n| `message` | 日志消息内容 | `Plugin started successfully` |\n| `source` | 日志来源标识（对应 `log.source` 配置） | `openclaw` |\n| `subsystem` | 子系统名称（来自 tslog bindings，可选） | `cls-service`、`trace-service` |\n| `logger` | logger 实例名称（可选） | `openclaw` |\n| `args` | 额外参数（JSON 序列化，可选） | `[{\"key\":\"value\"}]` |\n| `cvm_instance_id` | CVM 实例 ID（仅在腾讯云 CVM 环境下注入） | `ins-xxxxxxxx` |\n| `cvm_instance_name` | CVM 实例名称（仅在腾讯云 CVM 环境下注入） | `my-cvm-instance` |\n| `cvm_instance_intra_ip` | CVM 内网 IPv4（仅在腾讯云 CVM 环境下注入） | `10.0.0.1` |\n\n**会话日志（`log_type=session`）公共字段：**\n\n| 字段名 | 说明 | 示例值 |\n|--------|------|--------|\n| `log_type` | 日志类型，固定为 `session` | `session` |\n| `role` | 消息角色 | `user`、`assistant`、`toolResult` |\n| `content` | 完整消息 JSON（与写入 session JSONL 文件的行内容一致） | `{\"role\":\"user\",\"content\":\"...\"}` |\n| `source` | 日志来源标识 | `openclaw` |\n| `session_key` | 会话标识 | `feishu_xxxxxxxx` |\n| `agent_id` | Agent 标识 | `default` |\n| `tool_call_id` | 工具调用 ID（仅 `role=toolResult` 时存在） | `toolu_xxxxxxxx` |\n| `tool_name` | 工具名称（仅 `role=toolResult` 时存在） | `web_search` |\n| `stop_reason` | 停止原因（仅 `role=assistant` 时存在） | `tool_use`、`end_turn` |\n| `tool_calls` | 工具调用数量（仅 `role=assistant` 且包含工具调用时存在） | `2` |\n| `cvm_instance_id` | CVM 实例 ID（仅在腾讯云 CVM 环境下注入） | `ins-xxxxxxxx` |\n| `cvm_instance_name` | CVM 实例名称（仅在腾讯云 CVM 环境下注入） | `my-cvm-instance` |\n| `cvm_instance_intra_ip` | CVM 内网 IPv4（仅在腾讯云 CVM 环境下注入） | `10.0.0.1` |\n\n#### CLS 日志查询示例\n\n在腾讯云 CLS 控制台，选择 `logTopicId` 对应的日志主题，使用以下检索语句：\n\n**查询所有 gateway 运行日志（warn 及以上级别）：**\n```\nlog_type:gateway AND (level:warn OR level:error OR level:fatal)\n```\n\n**查询指定会话的所有消息：**\n```\nlog_type:session AND session_key:feishu_xxxxxxxx\n```\n\n**查询包含工具调用的 assistant 消息：**\n```\nlog_type:session AND role:assistant AND tool_calls:*\n```\n\n**查询指定工具的执行结果：**\n```\nlog_type:session AND role:toolResult AND tool_name:web_search\n```\n\n**查询指定时间段内的 error 日志：**\n```\nlog_type:gateway AND level:error\n```\n\n### Prometheus 指标列表\n\n所有指标名称均以 `metric_prefix`（默认 `openclaw`）为前缀。指标的维度标签统一使用 `openclaw_` 前缀。\n\n#### 维度（Label）字典\n\n| 维度名 | 说明 | 示例值 |\n|--------|------|--------|\n| `openclaw_type` | Token 类型 / 上下文类型 | `input`, `output`, `cache_read`, `cache_write`, `prompt`, `total`, `limit`, `used` |\n| `openclaw_provider` | 模型提供商 | `qwen`, `anthropic` |\n| `openclaw_model` | 模型名称 | `glm-5`, `claude-3-5-sonnet` |\n| `openclaw_channel` | 消息渠道 | `feishu`, `dingtalk`, `wechat`, `telegram` |\n| `openclaw_update_type` | Webhook 更新类型 | `message`, `callback_query` |\n| `openclaw_source` | 消息来源 | `user`, `system` |\n| `openclaw_outcome` | 消息处理结果 | `success`, `error`, `skipped` |\n| `openclaw_lane` | 队列通道 | `default`, `priority` |\n| `openclaw_state` | 会话状态 | `idle`, `running`, `waiting` |\n| `openclaw_reason` | 状态转换原因 | `timeout`, `completed` |\n| `openclaw_attempt` | Agent 运行尝试序号 | `1`, `2`, `3` |\n| `openclaw_tool` | 工具名称 | `web_search`, `code_exec` |\n| `openclaw_detector` | 循环检测器名称 | `repetition`, `token_waste` |\n| `openclaw_level` | 检测等级 | `warn`, `critical` |\n| `openclaw_action` | 检测后执行的动作 | `skip`, `abort` |\n\n#### Counter 类型指标\n\n| 指标名 | 说明 | 维度 |\n|--------|------|------|\n| `openclaw_tokens_total` | 模型 Token 消耗总量 | `openclaw_type`, `openclaw_provider`, `openclaw_model`, `openclaw_channel` |\n| `openclaw_cost_usd_total` | 模型调用预估费用（USD） | `openclaw_provider`, `openclaw_model`, `openclaw_channel` |\n| `openclaw_webhook_received_total` | 收到的 Webhook 请求数 | `openclaw_channel`, `openclaw_update_type` |\n| `openclaw_webhook_error_total` | Webhook 处理错误数 | `openclaw_channel`, `openclaw_update_type` |\n| `openclaw_message_queued_total` | 入队消息总数 | `openclaw_channel`, `openclaw_source` |\n| `openclaw_message_processed_total` | 已处理消息总数 | `openclaw_channel`, `openclaw_outcome` |\n| `openclaw_queue_lane_enqueue_total` | 队列入队事件数 | `openclaw_lane` |\n| `openclaw_queue_lane_dequeue_total` | 队列出队事件数 | `openclaw_lane` |\n| `openclaw_session_state_total` | 会话状态转换次数 | `openclaw_state`, `openclaw_reason` |\n| `openclaw_session_stuck_total` | 检测到的卡住会话数 | `openclaw_state` |\n| `openclaw_run_attempt_total` | Agent 运行尝试次数 | `openclaw_attempt` |\n| `openclaw_tool_loop_total` | 工具循环检测次数 | `openclaw_tool`, `openclaw_detector`, `openclaw_level`, `openclaw_action` |\n\n#### Histogram 类型指标\n\nHistogram 类型指标在 Prometheus 中会自动展开为 `_bucket`（带 `le` 标签）、`_count`、`_sum` 三条子指标。\n\n| 指标名 | 说明 | 维度 | 桶边界（Buckets） |\n|--------|------|------|-------------------|\n| `openclaw_run_duration_ms` | Agent 单次运行耗时（ms） | `openclaw_provider`, `openclaw_model`, `openclaw_channel` | 100, 250, 500, 1k, 2.5k, 5k, 10k, 30k, 60k |\n| `openclaw_context_tokens` | 上下文窗口 Token 数量 | `openclaw_provider`, `openclaw_model`, `openclaw_channel`, `openclaw_type` | 1k, 4k, 8k, 16k, 32k, 64k, 128k, 200k |\n| `openclaw_webhook_duration_ms` | Webhook 处理耗时（ms） | `openclaw_channel`, `openclaw_update_type` | 10, 50, 100, 250, 500, 1k, 2.5k, 5k |\n| `openclaw_message_duration_ms` | 消息处理耗时（ms） | `openclaw_channel`, `openclaw_outcome` | 100, 500, 1k, 2.5k, 5k, 10k, 30k, 60k |\n| `openclaw_queue_wait_ms` | 队列等待时间（ms） | `openclaw_lane` | 10, 50, 100, 500, 1k, 5k, 10k |\n| `openclaw_session_stuck_age_ms` | 卡住会话持续时间（ms） | `openclaw_state` | 1k, 5k, 10k, 30k, 60k, 120k, 300k |\n\n#### Gauge 类型指标\n\n| 指标名 | 说明 | 维度 |\n|--------|------|------|\n| `openclaw_active_sessions` | 当前活跃会话数 | — |\n| `openclaw_waiting_sessions` | 当前等待中的会话数 | — |\n| `openclaw_queued_messages` | 当前队列中的消息总数 | — |\n| `openclaw_queue_depth` | 当前队列深度（按通道分） | `openclaw_lane` |\n\n#### 其他指标\n\n| 指标名 | 类型 | 说明 |\n|--------|------|------|\n| `openclaw_node_*` | 多种 | Node.js 运行时指标（GC、事件循环、内存等，`default_metrics: true` 时启用） |\n\n> **注意**：\n> - 所有指标均可通过 `external_labels` 配置项追加全局标签（如 `job`、`instance` 等）\n> - Pull 模式下 `job` 标签由 Prometheus 服务端自动注入\n> - Push 模式下 `job` 标签需通过 `external_labels` 手动配置\n\n---\n\n### 全链路 Trace 追踪（v2）\n\n插件通过 hook 机制捕获 Agent 执行过程中的关键事件，生成符合 **OTel GenAI 语义约定** 的 Span 数据，并通过腾讯云 CLS SDK 实时上报。\n\n#### 模块文件结构\n\nTrace 模块按职责拆分为以下子模块，便于维护和测试：\n\n| 文件 | 职责 | 行数 |\n|------|------|------|\n| `trace-service.ts` | **主入口**：创建 trace 服务实例、注册 hook、热更新轮询 | ~1560 |\n| `trace-constants.ts` | 常量定义（日志前缀、超时阈值、轮询间隔等） | ~60 |\n| `trace-types.ts` | 接口/类型定义（`TraceConfig`、`TraceContext`、`PendingToolCall` 等） | ~130 |\n| `trace-utils.ts` | 工具函数（加密安全 ID 生成、消息格式化、inbound metadata 剥离） | ~470 |\n| `trace-sender.ts` | `ClsSpanSender` 类（Span → CLS Trace 标准扁平化 LogItem 转换与发送） | ~460 |\n| `trace-config.ts` | 配置解析（`resolveTraceConfig`、`readTraceHotConfigFromDisk`） | ~130 |\n| `shared-credential.ts` | **共享凭证管理器**：trace 和指标服务共用同一份临时密钥，统一管理获取、缓存、定时刷新和事件通知 | ~290 |\n\n> **对外 API 不变**：`trace-service.ts` 通过 re-export 保持了所有对外导出（`createTraceService`、`resolveTraceConfig`、`stripInboundMetadata`、`TraceConfig`、`LOG_PREFIX`），现有调用方无需修改导入路径。\n\n#### 核心设计理念\n\n- **完整的调用树**：所有 Span 共享同一个 `traceId`，通过显式的 `parentSpanId` 串联成一棵调用树\n- **Resource 全局属性**：每个 Span 自动注入 `service.name`、`host.name`、`service.instance.id`、`telemetry.sdk.language` 等 OTel Resource 属性，以及 `cvm_instance_id`、`cvm_instance_name` 等 CVM 实例元数据（字段名格式与指标服务一致）\n- **长生命周期 Span**：Entry Span 和 Agent Span 在请求开始时创建，在请求结束时关闭，确保完整的时间跨度\n- **分段式 LLM Span**：通过 `before_message_write` hook 实现分段导出，每次 LLM 响应（包含 tool call）都会生成独立的 LLM Span\n- **Step 层级**：每轮 LLM + Tool 调用构成一个 react step，形成清晰的推理循环\n- **跨通道上下文链接**：agent 通道自动链接到最近的用户通道上下文\n- **任务队列**：保证同一 trace 的操作按顺序执行，内置上限保护（默认 10000 条），防止异常场景下内存泄漏\n- **Pending Assistant 缓冲**：处理 `before_message_write` 先于 `llm_input` 到达的乱序场景\n- **热重载安全的 Hook 注册**：openclaw 框架在 gateway 热重载（SIGUSR1）时会创建新的 plugin registry，旧 registry 上注册的 hook 不会被新的 hookRunner 识别。因此每次 `register()` 调用都会重新注册 hook 到当前的 api 实例上，确保 hook 始终生效。trace 服务实例通过模块级 `cachedTracePlugin` 缓存复用，避免重复创建 Producer 和 sender\n- **定时器不使用 unref()**：所有内部定时器（任务超时、上下文清理、热更新轮询、`agent_end` 延迟关闭等）均不调用 `unref()`，确保 Node.js 进程在定时器回调执行完毕前不会提前退出，避免 Entry/Agent/Step Span 等长生命周期 Span 因进程退出而丢失\n- **主动 flush 缓冲区**：CLS Producer（`tencentcloud-cls-sdk-nodejs`）没有公开的 `flush()` 方法，数据通过 `send()` 进入内部缓冲区后默认每 2 秒由内部定时器批量发送。`ClsSpanSender.flush()` 通过调用 Producer 的 `batchSend()` 方法主动触发缓冲区刷新，确保 `agent_end` 关闭 Span 后数据能及时发送到 CLS，而不是等待下一个 2 秒定时器周期\n- **关键 Hook 和 Span 诊断日志**：`message_received`、`llm_input`、`before_message_write`、`agent_end` 四个关键 hook 以及 `ensureEntrySpan`、`ensureAgentSpan`、`exportPendingLlmSpan`、`endSpanById`（Agent/Entry）、`flush` 等关键操作始终输出诊断日志（不依赖 `debug` 标志），记录 hook 触发状态、Span 创建/关闭/导出/刷新的完整链路，便于排查 trace 数据丢失问题\n- **ACP 模式自动适配**：当 OpenClaw 运行在 ACP（Agent Control Plane）模式下时，框架不会触发 `llm_input`、`llm_output`、`before_agent_start`、`agent_end`、`before_message_write`、`before_tool_call`/`after_tool_call` 等 hook。插件通过 `acpFallbackPending` 标记自动检测 ACP 模式：在 `message_received` 中设置标记，如果后续 `llm_input` 或 `before_agent_start` 被触发则清除标记（非 ACP 模式）；如果标记未被清除，`message_sent` 中的延迟定时器（2 秒无新消息后触发）会自动结束 Entry Span 并导出，确保 ACP 模式下也能上报完整的对话 trace 数据。ACP 模式下的 Entry Span 会额外携带 `openclaw.acp_mode=true` 属性以便区分\n\n#### Span 层级结构\n\n```\nEntry (enter_openclaw_system)                    ← 长生命周期，message_received → agent_end\n├── Agent (invoke_agent <agentId>)               ← 长生命周期，llm_input → agent_end\n│   ├── Step (react step round=1)                ← 每轮 LLM+Tool 一个 Step\n│   │   ├── LLM (chat <model>)                   ← 分段式导出，before_message_write 触发\n│   │   ├── Tool (execute_tool <name>)            ← before_tool_call → after_tool_call\n│   │   └── Tool (execute_tool <name>)\n│   ├── Step (react step round=2)                ← tool batch 完成后自动开始新 Step\n│   │   └── LLM (chat <model>)                   ← 最终回复（无 tool call）\n│   ├── Compaction (openclaw.compaction)          ← 上下文压缩\n│   └── Subagent (openclaw.subagent.<key>)        ← 子 Agent 调用\n├── Session (session_start / session_end)         ← 会话生命周期事件\n└── Gateway (gateway_start)                       ← 网关启动事件\n```\n\n#### ACP 模式自动适配\n\n当 OpenClaw 运行在 **ACP（Agent Control Plane）模式**下时，对话由 ACP 运行时处理，框架不会触发 `llm_input`、`llm_output`、`before_agent_start`、`agent_end`、`before_message_write`、`before_tool_call`/`after_tool_call` 等 hook。这意味着长生命周期的 Entry Span 无法通过 `agent_end` 正常关闭。\n\n插件通过 **`acpFallbackPending` 标记 + 延迟定时器** 机制自动检测并适配 ACP 模式：\n\n```\nmessage_received → 设置 acpFallbackPending=true，创建 Entry Span\n    ↓\nllm_input / before_agent_start 被触发？\n    ├── 是 → 清除标记（非 ACP 模式），由 agent_end 正常关闭 Entry Span\n    └── 否 → 标记保持（ACP 模式）\n        ↓\nmessage_sent → 检测到 acpFallbackPending=true\n    → 调度延迟定时器（2 秒无新消息后触发）\n    → 每次 message_sent 重置定时器（适配流式输出）\n        ↓\n定时器到期 → 自动结束 Entry Span 并导出\n    → Entry Span 额外携带 openclaw.acp_mode=true 属性\n    → 清理上下文，flush 缓冲区\n```\n\nACP 模式下的 Span 层级结构简化为：\n\n```\nEntry (enter_openclaw_system)                    ← message_received → ACP 回退自动关闭\n├── Session (session_start / session_end)         ← 会话生命周期事件（如有）\n└── Gateway (gateway_start)                       ← 网关启动事件\n```\n\n> **说明**：ACP 模式下不会生成 Agent Span、Step Span、LLM Span、Tool Span 等子 Span，因为框架不触发对应的 hook。Entry Span 仍然包含完整的用户输入（`gen_ai.input.messages`）和最终输出（`gen_ai.output.messages`），可用于基本的对话追踪和延迟分析。\n\n#### 支持的 Hook 事件\n\n| # | Hook 名称 | 对应 Span / 行为 | gen_ai.span.kind | 说明 |\n|---|-----------|-----------------|------------------|------|\n| 1 | `gateway_start` | Gateway Span | ENTRY | 网关启动事件 |\n| 2 | `gateway_stop` | — | — | 网关停止，等待所有排队任务完成后清理资源 |\n| 3 | `session_start` | Session Span | SESSION | 会话开始 |\n| 4 | `session_end` | Session Span | SESSION | 会话结束，记录持续时间、消息数和输出内容，清理通道映射 |\n| 5 | `message_received` | **Entry Span（长生命周期）** | ENTRY | 消息接收，创建 Root Span，记录用户输入 |\n| 6 | `message_sending` | 更新 lastOutput | — | 消息发送中，捕获最终输出 |\n| 7 | `message_sent` | 更新 lastOutput + **ACP 回退** | — | 消息发送完成，捕获最终输出；ACP 模式下调度延迟关闭 Entry Span |\n| 8 | `before_agent_start` | **Agent Span（长生命周期）** | AGENT | 确保 Entry + Agent Span 已创建 |\n| 9 | `llm_input` | 开始 LLM 分段追踪 + **Step Span** | STEP/LLM | LLM 调用开始，创建 Step Span，记录系统指令和输入消息 |\n| 10 | `llm_output` | 回退 LLM Span 导出 | LLM | LLM 调用结束（仅在 before_message_write 未处理时作为回退） |\n| 11 | `before_message_write` | **分段式 LLM Span 导出** | LLM | 核心：assistant 消息写入前触发，导出分段 LLM Span |\n| 12 | `before_tool_call` | 记录 Pending Tool Call | — | 工具调用开始，缓存到 pendingToolCalls |\n| 13 | `after_tool_call` | **Tool Span** | TOOL | 工具调用结束，导出 Tool Span，检查 tool batch 完成状态 |\n| 14 | `before_compaction` | 记录开始时间 | — | 上下文压缩开始 |\n| 15 | `after_compaction` | Compaction Span | TOOL | 上下文压缩结束，记录压缩统计 |\n| 16 | `subagent_spawned` | 记录开始时间 | — | 子 Agent 已创建 |\n| 17 | `subagent_ended` | Subagent Span | AGENT | 子 Agent 结束 |\n| 18 | `agent_end` | **结束 Step + Agent + Entry Span** | — | Agent 结束，延迟 100ms 关闭（等待 lastOutput 写入），传递 agentUsageCost |\n| 19 | `before_reset` | 在 Root Span 上添加 reset 属性 | — | 会话重置事件 |\n\n#### Resource 级别全局属性\n\n每个 Span 都会自动注入以下 Resource 级别的全局属性（对齐 OTel Resource 语义约定）：\n\n| 属性 | 说明 | 示例值 |\n|------|------|--------|\n| `service.name` | 服务名称（默认取 `serviceName` 配置或当前工作目录名） | `openclaw-agent` |\n| `service.instance.id` | 服务实例标识（格式：`<serviceName>@<hostname>:<pid>`） | `openclaw-agent@my-host:12345` |\n| `host.name` | 主机名 | `my-host` |\n| `telemetry.sdk.language` | SDK 语言 | `nodejs` |\n| `cvm_instance_id` | CVM 实例 ID（动态获取，仅在腾讯云环境下有值） | `ins-abc123` |\n| `cvm_instance_name` | CVM 实例名称（动态获取） | `my-cvm-instance` |\n| `cvm_instance_intra_ip` | CVM 内网 IP（动态获取） | `10.0.0.1` |\n| `cvm_instance_internet_ip` | CVM 公网 IP（动态获取） | `1.2.3.4` |\n| `cvm_instance_region` | CVM 所在地域（动态获取） | `ap-guangzhou` |\n| `host_name` | 操作系统 hostname（动态获取） | `my-host` |\n\n> **说明**：`cvm_*` 和 `host_name` 字段由 `instance-metadata` 模块通过腾讯云元数据接口动态获取，字段名格式与指标服务（Prometheus Remote Write）的 external labels 保持一致，便于在 CLS 控制台中通过相同字段名关联 trace 和指标数据。trace 模块只负责读取元数据，不负责启动/停止刷新（由指标服务统一管理）。非腾讯云环境下这些字段不会注入。\n\n#### OTel GenAI 语义约定属性\n\nTrace 数据遵循 [OpenTelemetry GenAI Semantic Conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/) 规范，包含以下标准属性：\n\n| 属性 | 适用 Span | 说明 |\n|------|-----------|------|\n| `gen_ai.span.kind` | 所有 | Span 类型：`ENTRY` / `AGENT` / `STEP` / `LLM` / `TOOL` / `SESSION` |\n| `gen_ai.operation.name` | 所有 | 操作名称：`enter` / `invoke_agent` / `react` / `chat` / `execute_tool` 等 |\n| `gen_ai.provider.name` | LLM / Agent | 模型提供商名称 |\n| `gen_ai.system` | LLM | 模型系统标识 |\n| `gen_ai.request.model` | LLM | 请求使用的模型名称 |\n| `gen_ai.response.model` | LLM | 响应返回的模型名称 |\n| `gen_ai.input.messages` | LLM / Agent | 输入消息（OTel GenAI 格式：`[{role, parts: [{type, content}]}]`） |\n| `gen_ai.output.messages` | LLM / Agent | 输出消息（OTel GenAI 格式） |\n| `gen_ai.system_instructions` | LLM | 系统指令 |\n| `gen_ai.response.finish_reasons` | LLM | 完成原因（如 `[\"stop\"]`、`[\"toolUse\"]`） |\n| `gen_ai.usage.input_tokens` | LLM / Agent | 输入 Token 数 |\n| `gen_ai.usage.output_tokens` | LLM / Agent | 输出 Token 数 |\n| `gen_ai.usage.total_tokens` | LLM / Agent | 总 Token 数 |\n| `gen_ai.usage.cache_read.input_tokens` | LLM | 缓存读取 Token 数 |\n| `gen_ai.usage.cache_creation.input_tokens` | LLM | 缓存创建 Token 数 |\n| `gen_ai.tool.name` | Tool | 工具名称 |\n| `gen_ai.tool.call.id` | Tool | 工具调用 ID |\n| `gen_ai.tool.call.arguments` | Tool | 工具调用参数 |\n| `gen_ai.tool.call.result` | Tool | 工具调用结果 |\n| `gen_ai.react.round` | Step | react 推理轮次 |\n| `gen_ai.react.finish_reason` | Step | Step 结束原因 |\n| `gen_ai.session.id` | 所有 | 会话 ID |\n| `gen_ai.user.id` | Entry | 用户 ID |\n| `gen_ai.agent.id` / `gen_ai.agent.name` | Agent | Agent 标识 |\n\n#### OpenClaw 自定义属性\n\n| 属性 | 说明 |\n|------|------|\n| `openclaw.version` | OpenClaw 版本 |\n| `openclaw.session.id` | 会话 ID |\n| `openclaw.run.id` | 运行 ID（支持临时 runId → 真实 runId 重绑定） |\n| `openclaw.turn.id` | 轮次 ID |\n| `openclaw.message.role` | 消息角色 |\n| `openclaw.message.from` | 消息来源 |\n| `openclaw.reset` | 是否发生了会话重置 |\n| `openclaw.sweep` | 是否被孤儿清理机制关闭 |\n\n#### APM 兼容索引属性\n\nTrace 数据中同时包含以下 APM 兼容的索引属性，可在 CLS 控制台中进行搜索和分析：\n\n| 属性 | 说明 |\n|----------|------|\n| `gen_ai.prompt` | LLM 输入的 prompt 消息聚合（值为 JSON 字符串，格式 `[{role,content}, ...]`） |\n| `gen_ai.completion` | LLM 输出的 completion 消息聚合（值为 JSON 字符串，格式 `[{role,content,finish_reason,tool_calls?}, ...]`） |\n| `gen_ai.usage.*` | Token 用量（input/output/cache/total） |\n| `gen_ai.provider.name` / `gen_ai.model_name` | 模型提供商和模型名称 |\n| `llm.request.type` | LLM 请求类型（chat） |\n\n> ⚠️ **字段格式说明**：为避免 CLS 对带点号（`.`）的扁平化 key（如 `gen_ai.prompt.0.role`）按嵌套结构自动展开，从而在 `gen_ai` / `gen_ai.prompt` 等前缀上与其他 leaf 字段产生 `IndexAllFail: fields like 'a' and 'a.b' can not appear in the same topic` 索引冲突，`gen_ai.prompt` 与 `gen_ai.completion` 均采用**单个 leaf 字符串字段**承载整个消息列表（值为 JSON 字符串），CLS 不会再按 `.` 对其内部路径做索引展开。\n>\n> 📜 **超长截断策略**：上报前经 `truncateJsonAttr()` 对聚合结构进行**结构感知式渐进裁剪**，L1（未超限）→ 原样返回；L2（超限）→ 按“从中间向两端”顺序对消息的 `content` / `tool_calls[*].arguments` 逐条减半截断（保留首条 system prompt 与末条最新对话），每个被裁剪的字段保留 `... [truncated, total N chars]` 尾标；L3（极端情况）→ 丢弃中段消息，保留首条 + 末尾 N 条，并插入 `{role:\"system\", content:\"[...omitted K messages, total L chars]\"}` 占位。任一级输出均由 `JSON.stringify` 生成，保证为合法 JSON，消费方可直接 `JSON.parse` 并根据 `[truncated` / `[...omitted` 标记识别裁剪情况。\n\n#### CLS LogItem 字段声明（完整）\n\n每条 Trace 日志最终以 CLS LogItem 形式上报到腾讯云日志服务。LogItem 由 `ClsSpanSender` 的 `sendRecordCore()` 方法构建，对齐 **CLS Trace 标准日志格式**：所有结构化字段（`traceID`/`spanID`/`kind`/`start`/`end`/`duration` 等）作为 LogItem 的**顶层 Content** 直接写入，非结构化属性统一聚合到 `attribute` 字段（JSON 字符串）。\n\n**CLS LogItem 顶层字段（均为 Content，对齐 CLS Trace 标准格式）：**\n\n| 字段名 | 类型 | 说明 | 来源 |\n|---|---|---|---|\n| `traceID` | string (32位hex) | 全局唯一链路追踪 ID，同一次请求的所有 Span 共享此值 | `TraceContext.traceId`，由 `generateId(32)` 在 `getOrCreateContext()` 中生成 |\n| `spanID` | string (16位hex) | 当前 Span 的唯一标识 | `createSpan()` 中由 `generateId(16)` 生成，或由 `ensureEntrySpan`/`ensureAgentSpan`/`ensureStepSpan` 预分配 |\n| `parentSpanID` | string (16位hex) | 父 Span ID，空字符串表示根节点 | `createSpan()` 的 `parentSpanId` 参数 |\n| `kind` | string | CLS Trace 标准 Span 种类：`server`（ENTRY）/ `client`（LLM/TOOL）/ `internal`（其他） | 由 `mapSpanKindToString()` 将 `gen_ai.span.kind` 映射而来 |\n| `name` | string | Span 名称，描述当前操作 | 如 `\"enter_openclaw_system\"`、`\"chat tc-code-latest\"`、`\"execute_tool search\"` |\n| `links` | string (JSON) | 跨 trace 链接列表，固定为 `\"[]\"` | 硬编码 |\n| `logs` | string (JSON) | Span 事件日志列表，固定为 `\"[]\"` | 硬编码 |\n| `traceState` | string | W3C traceState，固定为空字符串 | 硬编码 |\n| `start` | string | **开始时间（纳秒级 Unix 时间戳，字符串表示）** | `startMs × 1_000_000`（BigInt 运算避免精度丢失） |\n| `end` | string | **结束时间（纳秒级 Unix 时间戳，字符串表示）** | `endMs × 1_000_000`（BigInt 运算避免精度丢失） |\n| `duration` | string | **Span 持续时间（纳秒，字符串表示）** | `(endMs - startMs) × 1_000_000`（BigInt 运算避免精度丢失） |\n| `attribute` | string (JSON) | 所有非结构化属性聚合的 JSON 对象字符串（包含 `gen_ai.*`、`openclaw.*`、Resource 属性、以及保留的 `durationMs` 等） | `sendRecordCore()` 收集非结构化字段后 `JSON.stringify` |\n| `statusCode` | string | Span 状态码：`OK` / `ERROR` / `UNSET` | `export()` 根据 `error`/`error.type` 判断；`dispose()` / `sweepStaleOpenSpans()` 强制关闭时为 `UNSET` |\n| `statusMessage` | string | 状态详细描述，当前固定为空字符串 | 硬编码 |\n\n> **时间单位说明**：`start` / `end` / `duration` **均为纳秒**（与 OTel / CLS Trace 标准一致）。由于纳秒时间戳（约 `1.78×10^18`）超出 JavaScript `Number` 安全整数上限（`2^53-1 ≈ 9×10^15`），内部使用 `BigInt` 运算后转为字符串上报，避免精度丢失。\n>\n> **负值保护**：若出现 `endTime < startTime`（时钟回拨、异常时间戳等），`duration` 会被钳制为 `0`，并打印 warn 日志，避免上报负数污染 CLS 控制台耗时统计。\n>\n> **`LogItem.setTime()`** 使用 `startTime` 的秒级时间戳（`Math.floor(startMs / 1000)`），这是 CLS 日志的索引时间，与 `start` 字段（纳秒）含义相同但粒度不同。\n>\n> ---\n>\n> ### ⚠️ **重要：单位陷阱警告（`duration` vs `durationMs`）**\n>\n> 日志中**同时存在两个\"耗时\"字段**，单位不同，**切勿在查询/告警中混用**：\n>\n> | 字段 | 所在位置 | 单位 | 典型值（耗时 500ms 的 Span） |\n> |---|---|---|---|\n> | `duration` | LogItem 顶层 Content | **纳秒**（ns） | `\"500000000\"` |\n> | `durationMs` | `attribute` JSON 对象内 | **毫秒**（ms） | `\"500\"` |\n>\n> - 🚫 **错误示例**：在 CLS SQL 中写 `duration > 5000` 想表达\"耗时超过 5 秒\" —— 实际只过滤出 **耗时超过 5 微秒（5000 ns）** 的 Span，几乎所有 Span 都会命中。\n> - ✅ **正确写法**：\n>   - 按顶层字段查询：`duration > 5000000000`（5 秒 = 5×10⁹ ns）。\n>   - 按 attribute 查询：`attribute.durationMs > 5000`（5 秒 = 5000 ms）。\n> - 两个字段都是**字符串类型**，CLS 数值比较需要确认索引配置；若配置为 text 则范围查询走字典序，可能不符合预期。\n> - **底层精度仍为毫秒**：`Date.now()` 只有毫秒粒度，`duration` 末 6 位恒为 `0`；小于 1ms 的 Span 的 `duration` 为 `0`，不代表 Span 未执行。\n>\n> 如需要跨两个字段统一，建议固定使用 `attribute.durationMs`（可读性更好），仅在对接 OTel/CLS Trace 标准工具链时使用顶层 `duration`。\n\n##### 二、Resource 级别属性（所有 Span 共有）\n\n由 `getResourceAttrs()` 动态生成，在 `sendRecordCore()` 中放入 OTLP JSON 的 `resourceSpans[0].resource.attributes` 中。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `service.name` | string | 服务名称 | `config.serviceName` 或 `basename(process.cwd())` 或 `\"openclaw-agent\"` | 标识上报数据的服务，多服务环境下区分来源 |\n| `service.instance.id` | string | 服务实例唯一标识 | 格式：`<serviceName>@<hostname>:<pid>`，如 `openclaw-agent@my-host:12345` | 区分同一服务的不同实例（多进程/多机器部署） |\n| `host.name` | string | 主机名 | Node.js `os.hostname()` | 标识运行主机 |\n| `telemetry.sdk.language` | string | SDK 语言 | 固定值 `\"nodejs\"` | OTel 规范要求，标识 SDK 语言 |\n| `cvm_instance_id` | string | CVM 实例 ID | `instance-metadata.ts` 通过腾讯云 metadata API 获取 `instance-id` | 关联腾讯云 CVM 实例，与指标服务的 external labels 保持一致 |\n| `cvm_instance_name` | string | CVM 实例名称 | `instance-metadata.ts` 通过腾讯云 metadata API 获取 `instance-name` | 在 CLS 控制台中显示可读的实例名称 |\n| `cvm_instance_intra_ip` | string | CVM 内网 IP | `instance-metadata.ts` 通过腾讯云 metadata API 获取 `local-ipv4` | 网络定位和故障排查 |\n| `cvm_instance_internet_ip` | string | CVM 公网 IP | `instance-metadata.ts` 通过腾讯云 metadata API 获取 `public-ipv4` | 网络定位和故障排查 |\n| `cvm_instance_region` | string | CVM 所在地域 | `instance-metadata.ts` 通过腾讯云 metadata API 获取 `placement/region` | 标识实例所在地域 |\n\n> **说明**：`cvm_*` 字段仅在腾讯云环境下有值，非腾讯云环境不注入。\n\n##### 三、通用 Span 属性（`createSpan()` 注入）\n\n每个通过 `createSpan()` 创建的 Span 都会自动注入以下属性。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `openclaw.version` | string | OpenClaw 框架版本号 | `api.runtime?.version`，在 `registerHooks()` 中获取 | 版本追踪，排查版本相关问题 |\n| `openclaw.session.id` | string | 会话 ID | `TraceContext.sessionId`（来自 hook event 的 `sessionId`），回退到 `channelId` | 关联同一会话的多次请求 |\n| `gen_ai.session.id` | string | 会话 ID（OTel GenAI 规范） | 与 `openclaw.session.id` 相同 | OTel GenAI 语义约定的标准字段 |\n| `openclaw.run.id` | string | 运行 ID | `TraceContext.runId`，来自 hook event 的 `runId`，支持临时 runId（`__temp_run_` 前缀）→ 真实 runId 重绑定 | 关联同一次 Agent 运行的所有 Span |\n| `openclaw.turn.id` | string | 轮次 ID | `TraceContext.turnId`，由 `generateId(16)` 在 `getOrCreateContext()` 中生成 | 区分同一会话中的不同对话轮次 |\n\n##### 四、Entry Span 字段（`ensureEntrySpan()`）\n\nEntry Span 是长生命周期的 Root Span，在 `message_received` 时创建，在 `agent_end` 或 ACP 回退时关闭。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.span.kind` | string | 固定值 `\"ENTRY\"` | 硬编码 | 标识为入口 Span |\n| `gen_ai.operation.name` | string | 固定值 `\"enter\"` | 硬编码 | 标识操作类型 |\n| `gen_ai.user.id` | string | 用户 ID | `event.from` 或 `event.metadata?.senderId` 或 `hookCtx.trigger` 或 `\"unknown\"` | 标识发起请求的用户 |\n| `openclaw.message.role` | string | 消息角色 | `message_received` 中为 `\"user\"`；`llm_input` 中为 `hookCtx.trigger` 或 `\"system\"` | 区分消息来源角色 |\n| `openclaw.message.from` | string | 消息来源标识 | `event.from`；`llm_input` 中为 `hookCtx.agentId` 或 `\"openclaw\"` | 标识消息的具体来源 |\n| `gen_ai.input.messages` | string (JSON) | 用户输入消息 | `TraceContext.userInput`，格式化为 `[{role:\"user\", parts:[{type:\"text\", content:...}]}]` | 记录用户原始输入，便于回溯 |\n\n**关闭时追加的属性**（`agent_end` 延迟关闭 / ACP 回退关闭）：\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `request.duration_ms` | string | 请求总耗时（毫秒） | `endTime - rootSpanStartTime` | 衡量整个请求的端到端耗时 |\n| `gen_ai.output.messages` | string (JSON) | 最终输出消息 | `TraceContext.lastOutput`，由 `message_sending`/`message_sent` hook 捕获，格式化为 OTel GenAI 格式 | 记录 Agent 最终回复内容 |\n| `openclaw.acp_mode` | boolean | 是否为 ACP 模式 | 仅在 ACP 回退关闭时设为 `true` | 区分 ACP 模式和正常 Agent 模式的请求 |\n\n##### 五、Agent Span 字段（`ensureAgentSpan()`）\n\nAgent Span 是长生命周期 Span，在 `llm_input` / `before_agent_start` 时创建，在 `agent_end` 时关闭。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.span.kind` | string | 固定值 `\"AGENT\"` | 硬编码 | 标识为 Agent Span |\n| `gen_ai.operation.name` | string | 固定值 `\"invoke_agent\"` | 硬编码 | 标识操作类型 |\n| `gen_ai.provider.name` | string | 固定值 `\"openclaw\"` | 硬编码 | 标识 Agent 提供商 |\n| `gen_ai.agent.id` | string | Agent 标识 | `hookCtx.agentId` 或 `\"openclaw\"` | 标识具体的 Agent |\n| `gen_ai.agent.name` | string | Agent 名称 | 与 `gen_ai.agent.id` 相同 | Agent 的可读名称 |\n\n**关闭时追加的属性**（`agent_end`）：\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `agent.duration_ms` | string | Agent 执行耗时 | `event.durationMs` 或 `0` | 衡量 Agent 执行耗时 |\n| `agent.message_count` | string | Agent 处理的消息数 | `event.messages.length` | 统计 Agent 处理的消息总数 |\n| `agent.tool_call_count` | string | Agent 发起的工具调用数 | `countToolCallsFromMessages(event.messages)` 统计 | 统计 Agent 使用工具的次数 |\n| `gen_ai.usage.input_tokens` | string | 输入 Token 数 | `TraceContext.lastLlmUsage.input` | 统计 Agent 整体的 Token 消耗 |\n| `gen_ai.usage.output_tokens` | string | 输出 Token 数 | `TraceContext.lastLlmUsage.output` | 统计 Agent 整体的 Token 消耗 |\n| `gen_ai.usage.total_tokens` | string | 总 Token 数 | `TraceContext.lastLlmUsage.total` | 统计 Agent 整体的 Token 消耗 |\n| `gen_ai.input.messages` | string (JSON) | 用户输入消息 | 同 Entry Span | 记录用户原始输入 |\n\n##### 六、Step Span 字段（`ensureStepSpan()` / `endStepSpan()`）\n\nStep Span 表示一轮 react 推理循环（LLM 调用 + Tool 调用），在 `llm_input` 时创建，在 tool batch 完成或 `agent_end` 时关闭。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.span.kind` | string | 固定值 `\"STEP\"` | 硬编码 | 标识为 Step Span |\n| `gen_ai.operation.name` | string | 固定值 `\"react\"` | 硬编码 | 标识为 react 推理操作 |\n| `gen_ai.react.round` | number | 推理轮次编号 | `TraceContext.stepRoundCounter`，每次创建新 Step 时递增 | 标识当前是第几轮推理 |\n| `gen_ai.react.finish_reason` | string | Step 结束原因 | `\"stop\"`（正常结束）/ `\"agent_end\"`（Agent 结束时强制关闭）/ 其他 | 标识 Step 为何结束 |\n\n##### 七、LLM Span 字段（`exportPendingLlmSpan()`）\n\nLLM Span 是短生命周期 Span（fire-and-forget），由 `before_message_write` 或 `llm_output`（回退）触发导出。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.span.kind` | string | 固定值 `\"LLM\"` | 硬编码 | 标识为 LLM Span |\n| `gen_ai.operation.name` | string | 固定值 `\"chat\"` | 硬编码 | 标识为 chat 操作 |\n| `gen_ai.provider.name` | string | 模型提供商 | `TraceContext.llmProvider`，来自 `llm_input` event 的 `event.provider` | 标识使用的模型提供商（如 `anthropic`、`openai`） |\n| `gen_ai.system` | string | 模型系统标识 | 与 `gen_ai.provider.name` 相同 | OTel GenAI 规范字段 |\n| `gen_ai.request.model` | string | 请求模型名称 | `TraceContext.llmModel`，来自 `llm_input` event 的 `event.model` | 标识请求使用的模型（如 `claude-4-sonnet`） |\n| `gen_ai.response.model` | string | 响应模型名称 | 与 `gen_ai.request.model` 相同 | 标识实际响应的模型 |\n| `gen_ai.usage.input_tokens` | number | 输入 Token 数 | `event.usage.input`（来自 `before_message_write` 或 `llm_output`） | 统计单次 LLM 调用的输入 Token |\n| `gen_ai.usage.output_tokens` | number | 输出 Token 数 | `event.usage.output` | 统计单次 LLM 调用的输出 Token |\n| `gen_ai.usage.total_tokens` | number | 总 Token 数 | `event.usage.total` 或 `input + output + cacheRead + cacheCreation` | 统计单次 LLM 调用的总 Token |\n| `gen_ai.usage.cache_read.input_tokens` | number | 缓存读取 Token 数 | `event.usage.cacheRead` | 统计 prompt cache 命中的 Token 数 |\n| `gen_ai.usage.cache_creation.input_tokens` | number | 缓存创建 Token 数 | `event.usage.cacheWrite` | 统计 prompt cache 创建的 Token 数 |\n| `gen_ai.system_instructions` | string (JSON) | 系统指令 | `TraceContext.llmPendingSystemInstructions`，由 `formatSystemInstructions(event.systemPrompt)` 格式化为 `[{type:\"text\", content:...}]` | 记录 LLM 的系统 prompt |\n| `gen_ai.input.messages` | string (JSON) | 输入消息 | `TraceContext.llmPendingInputMessages` 或 `llmLastInputMessages`，由 `formatInputMessages()` 格式化为 OTel GenAI 格式 | 记录发送给 LLM 的完整输入（含历史消息） |\n| `gen_ai.output.messages` | string (JSON) | 输出消息 | `formatAssistantOutputMessages()` 格式化 assistant 内容，支持多模态（text / tool_call / reasoning） | 记录 LLM 的完整输出 |\n| `gen_ai.response.finish_reasons` | string (JSON) | 完成原因 | `JSON.stringify([stopReason])`，如 `[\"stop\"]`、`[\"toolUse\"]`、`[\"end_turn\"]` | 标识 LLM 为何停止生成 |\n| `llm.request.type` | string | 固定值 `\"chat\"` | 硬编码 | APM 兼容字段 |\n\n**APM 索引属性**（由 `setIndexedPromptAttrs()` / `setIndexedCompletionAttrs()` 设置）：\n\n> 为规避 CLS JSON 索引按 `.` 自动展开产生的 `IndexAllFail: fields like 'a' and 'a.b' can not appear in the same topic` 冲突，prompt / completion 聚合为**单个 leaf 字符串字段**，值为 JSON 字符串整体，CLS 作为普通文本 leaf 索引、不再按内部路径展开。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.prompt` | string (JSON) | 所有 prompt 消息聚合数组 | 解析 `gen_ai.input.messages` JSON 得到 `ChatMessage[]`，最多保留 `MAX_INDEXED_PROMPT_MESSAGES`（20）条，每条形如 `{role, content?}`；`content` 截断到 `MAX_ATTR_CONTENT_LENGTH`（4096）字符；整体经 `truncateJsonAttr()` **结构感知式裁剪**（超限时逐条对中间消息的长字段减半，仍超限则丢弃中段消息并插入占位），总长度 ≤ `MAX_ATTR_LENGTH`（3,200,000）字符，并保证输出是合法 JSON | CLS 控制台中全文搜索 prompt 内容 |\n| `gen_ai.completion` | string (JSON) | 所有 completion 消息聚合数组 | 由 assistant 输出构建，每条形如 `{role, content?, finish_reason, tool_calls?}`；`tool_calls` 由 `extractToolCallsFromContent()` 提取，元素形如 `{id, name, arguments}`；`content` 和 `arguments` 均截断到 4096 字符；整体经 `truncateJsonAttr()` **结构感知式裁剪**后≤ 3,200,000 字符，保证输出是合法 JSON | CLS 控制台中全文搜索 completion / tool_calls |\n\n##### 八、Tool Span 字段（`after_tool_call`）\n\nTool Span 是短生命周期 Span，在 `after_tool_call` hook 中导出。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.span.kind` | string | 固定值 `\"TOOL\"` | 硬编码 | 标识为 Tool Span |\n| `gen_ai.operation.name` | string | 固定值 `\"execute_tool\"` | 硬编码 | 标识操作类型 |\n| `gen_ai.tool.name` | string | 工具名称 | `event.toolName`（来自 `before_tool_call`） | 标识调用的工具 |\n| `gen_ai.tool.call.id` | string | 工具调用 ID | `event.toolCallId` 或自动生成 `call_<12位hex>` | 关联 LLM 的 tool_call 和 tool result |\n| `gen_ai.tool.type` | string | 固定值 `\"function\"` | 硬编码 | 标识工具类型 |\n| `gen_ai.tool.call.arguments` | string | 工具调用参数 | `event.params`，JSON 序列化后截断到 `MAX_ATTR_LENGTH`（3,200,000）字符 | 记录工具输入参数 |\n| `gen_ai.tool.call.result` | string | 工具调用结果 | `event.result`，JSON 序列化后截断 | 记录工具返回结果（仅成功时） |\n| `error.type` | string | 错误类型 | `event.error`（仅工具调用失败时） | 标识工具调用错误 |\n| `tool.duration_ms` | number | 工具执行耗时 | `event.durationMs` 或 `Date.now() - toolStartTime` | 衡量工具执行耗时 |\n\n##### 九、Session Span 字段（`session_start` / `session_end`）\n\nSession Span 是短生命周期 Span，标记会话的开始和结束。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.span.kind` | string | 固定值 `\"SESSION\"` | 硬编码 | 标识为 Session Span |\n| `event.type` | string | `\"session_start\"` | 仅 `session_start` Span | 区分会话开始事件 |\n| `session.duration_ms` | number | 会话持续时间 | `event.durationMs`（仅 `session_end`） | 衡量会话总时长 |\n| `session.message_count` | number | 会话消息数 | `event.messageCount`（仅 `session_end`） | 统计会话中的消息总数 |\n| `session.total_tokens` | number | 会话总 Token 数 | `TraceContext.lastLlmUsage.total`（仅 `session_end`） | 统计会话的总 Token 消耗 |\n| `gen_ai.output.messages` | string (JSON) | 会话最终输出 | `TraceContext.lastOutput`（仅 `session_end`，且有值时） | 记录会话最后的回复内容 |\n\n##### 十、Gateway Span 字段（`gateway_start`）\n\nGateway Span 是短生命周期 Span，标记网关启动事件。每次 `gateway_start` 生成独立的 `traceId`。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.span.kind` | string | 固定值 `\"ENTRY\"` | 硬编码 | 标识为入口类型 |\n| `openclaw.version` | string | OpenClaw 版本号 | `api.runtime?.version` | 版本追踪 |\n| `gateway.port` | number | 网关监听端口 | `event.port` | 记录网关启动的端口号 |\n\n> **注意**：Gateway Span 不通过 `createSpan()` 创建，因此不包含 `openclaw.session.id`、`openclaw.run.id`、`openclaw.turn.id` 等通用属性。\n\n##### 十一、Compaction Span 字段（`after_compaction`）\n\nCompaction Span 记录上下文压缩操作。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.span.kind` | string | 固定值 `\"TOOL\"` | 硬编码 | 标识为工具类型 |\n| `gen_ai.operation.name` | string | 固定值 `\"compaction\"` | 硬编码 | 标识为压缩操作 |\n| `openclaw.compaction.messages.after` | number | 压缩后消息数 | `event.messageCount` | 统计压缩后剩余的消息数 |\n| `openclaw.compaction.tokens.after` | number | 压缩后 Token 数 | `event.tokenCount` | 统计压缩后剩余的 Token 数 |\n| `openclaw.compaction.compacted_count` | number | 被压缩的消息数 | `event.compactedCount` | 统计本次压缩了多少条消息 |\n\n##### 十二、Subagent Span 字段（`subagent_ended`）\n\nSubagent Span 记录子 Agent 的调用。\n\n| 字段名 | 类型 | 作用 | 来源 | 用途 |\n|--------|------|------|------|------|\n| `gen_ai.span.kind` | string | 固定值 `\"AGENT\"` | 硬编码 | 标识为 Agent 类型 |\n| `gen_ai.operation.name` | string | 固定值 `\"invoke_subagent\"` | 硬编码 | 标识为子 Agent 调用 |\n| `openclaw.subagent.session_key` | string | 子 Agent 会话标识 | `event.sessionKey` 或 `event.childSessionKey` 或 `\"unknown-child\"` | 标识具体的子 Agent 实例 |\n\n##### 十三、特殊状态字段\n\n以下字段在特定场景下出现，标记 Span 的异常状态。\n\n| 字段名 | 类型 | 出现场景 | 来源 | 用途 |\n|--------|------|----------|------|------|\n| `openclaw.force_closed` | boolean | `dispose()` 或 `sweepStaleOpenSpans()` 强制关闭长生命周期 Span 时 | 固定值 `true` | 标识 Span 非正常关闭 |\n| `openclaw.force_closed.reason` | string | 同上 | `\"dispose\"`（进程关闭）或 `\"stale_sweep\"`（超时清理） | 标识强制关闭的原因 |\n| `openclaw.reset` | boolean | `before_reset` hook 触发时 | 固定值 `true`，通过 `patchOpenSpanAttributes()` 追加到 Root Span | 标识会话发生了重置 |\n| `openclaw.reset.reason` | string | 同上 | `event.reason` 或 `\"user_request\"` | 标识重置原因 |\n| `openclaw.acp_mode` | boolean | ACP 回退关闭 Entry Span 时 | 固定值 `true` | 标识当前请求处于 ACP 模式 |\n| `error` | boolean | 工具调用失败时 | `true` | 标识 Span 存在错误 |\n| `error.type` | string | 工具调用失败时 | `event.error` | 错误类型描述 |\n\n##### 十四、字段值限制\n\n| 限制项 | 值 | 来源常量 | 说明 |\n|--------|-----|----------|------|\n| 单个属性值最大长度 | 3,200,000 字符 | `MAX_ATTR_LENGTH` | `truncateAttr()` 裸截断，适用于 `gen_ai.input.messages`、`gen_ai.output.messages` 等字符串大字段；`gen_ai.prompt` / `gen_ai.completion` 使用 `truncateJsonAttr()` **结构感知式渐进裁剪**（逐条减半字段 → 丢弃中段消息），尽力保留原内容同时保证输出为合法 JSON |\n| APM 索引内容最大长度 | 4,096 字符 | `MAX_ATTR_CONTENT_LENGTH` | `truncate()` 截断并添加 `... [truncated, total N chars]` 提示 |\n| APM 索引最大 prompt 消息数 | 20 条 | `MAX_INDEXED_PROMPT_MESSAGES` | 超过时保留第 1 条和最后 19 条 |\n| traceId 长度 | 32 位十六进制 | `generateId(32)` | 加密安全随机数（`crypto.randomBytes`） |\n| spanId 长度 | 16 位十六进制 | `generateId(16)` | 加密安全随机数 |\n\n#### Trace Context 传播机制\n\n插件实现了完整的 Trace Context 传播，确保一次请求的所有 Span 形成完整的调用树：\n\n1. **多维上下文管理**：通过 `contextByChannelId`、`contextByRunId`、`contextsByChannelId`、`activeContextByAgentChannel` 四个维度管理上下文\n2. **跨通道链接**：agent 通道（`agent/xxx`）自动链接到最近的用户通道上下文，确保 agent 内部的 Span 与用户请求共享同一个 traceId\n3. **runId 重绑定**：临时 runId（`__temp_run_`前缀）在收到真实 runId 后自动重绑定，更新所有关联的 Span 属性\n4. **并发隔离**：同一通道的多个并发请求通过 `contextsByChannelId` 集合隔离\n5. **上下文轮转**：新消息到达时自动创建新的 trace，避免与旧 trace 混淆\n6. **任务队列**：通过 `traceTaskQueueByTraceId` 保证同一 trace 的操作按顺序执行\n\n#### 分段式 LLM Span 导出\n\n与传统的 `llm_input` → `llm_output` 一对一模式不同，v2 版本通过 `before_message_write` hook 实现分段式导出：\n\n```\nllm_input (开始追踪)\n  → before_message_write (assistant 消息，含 tool_call) → 导出 LLM Span #1\n    → before_tool_call / after_tool_call → 导出 Tool Span\n    → 结束 Step #1，开始 Step #2\n  → before_message_write (assistant 消息，最终回复) → 导出 LLM Span #2\n    → 结束 Step #2\nagent_end (结束所有长生命周期 Span)\n```\n\n这种方式的优势：\n- 每次 LLM 响应都有独立的 Span，包含精确的输入/输出消息\n- Tool call 后的下一轮 LLM 输入自动包含 tool result\n- Step 层级清晰展示推理循环\n\n#### 孤儿 Span 清理\n\n插件内置孤儿 Span 清理机制，每 60 秒扫描一次，超过 5 分钟未结束的 trace 会被自动关闭并标记 `openclaw.sweep=true`。\n\n---\n\n### 腾讯云实例元数据注入\n\n插件会自动获取当前实例的元数据信息，并注入到 Prometheus 指标（Push 模式）中作为 `external_labels` 自动合并（`cvm_instance_id`、`cvm_instance_name`、`cvm_instance_intra_ip`）。\n\n#### 获取的元数据字段\n\n| 字段 | 获取方式 | 说明 |\n|------|---------|------|\n| `cvm_instance_id` | 腾讯云 Metadata 接口 `/latest/meta-data/instance-id` | 实例 ID |\n| `cvm_instance_name` | 腾讯云 Metadata 接口 `/latest/meta-data/instance-name` | 实例名称 |\n| `cvm_instance_intra_ip` | 腾讯云 Metadata 接口 `/latest/meta-data/local-ipv4` | 内网 IPv4 地址 |\n| `host_name` | `os.hostname()` 本机主机名 | OTel 资源属性，独立于 CVM 实例名（不参与持久化） |\n\n> **用户覆盖（Override）**：可在 `openclaw.json` 的 `plugins.entries[\"clawpro-diagnostics-metrics-cls\"].config.instance_metadata` 下显式传入以下字段，覆盖自动获取值。这三个字段**支持热更新**，修改配置文件后约 10 秒内自动生效，无需重启网关：\n>\n> | 配置字段 | 覆盖目标 | 跳过的自动逻辑 |\n> |---------|---------|---------------|\n> | `instance_id` | `cvm_instance_id` | 腾讯云 Metadata HTTP 请求（以及 `openclaw.json` 持久化读写）、首次失败重试 |\n> | `instance_name` | `cvm_instance_name` | 腾讯云 Metadata HTTP 请求与 `openclaw.json` 持久化读写（**但不影响 `host_name` 字段**，后者始终取 `os.hostname()`） |\n> | `local_ipv4` | `cvm_instance_intra_ip` | 腾讯云 Metadata HTTP 请求与 `openclaw.json` 持久化读写 |\n>\n> 空字符串或缺失视为未提供，仍走原自动获取逻辑。任一字段提供后，对应的网络请求/持久化读写均会被跳过。\n\n#### 刷新策略\n\n- 优先级：**`openclaw.json` 中 `instance_metadata` 显式配置值** > `openclaw.json` 已持久化值 > 腾讯云 metadata 接口\n- 持久化字段：`plugins.entries[\"clawpro-diagnostics-metrics-cls\"].config.instance_metadata.{instance_id, instance_name, local_ipv4}`\n- 启动时先从持久化文件读取三个字段，已有值的字段直接使用，不发起网络请求\n- 仅对- 仅对\"未被 override 覆盖且无持久化值\"的字段调用 metadata 接口（请求超时 2 秒），成功后立即增量写入 `openclaw.json`；写入采用文件锁 + 临时文件 rename 的方式，支持多进程并发\n- 首次获取失败的字段会在 30 秒后重试，最多重试 3 次；仅当仍存在未就绪字段时才继续重试，全部就绪后停止\n- 用户显式传入的 `*_override` 值**不会**被持久化写入 `openclaw.json`（视为用户已掌握权威值）\n- 非腾讯云环境下，元数据字段为空字符串，不影响插件正常运行\n\n---\n\n## 更新配置（UpdateParameter）\n\n已安装插件后，如需修改配置参数（如更换密钥、切换凭证模式、调整推送间隔等），可使用 `UpdateParameter` 命令，无需重新安装插件。\n\n### 运行更新命令\n\n```bash\nnpx --yes clawpro-diagnostics-metrics-cls-onboard-cli UpdateParameter [选项]\n```\n\n### 命令行参数\n\n至少需要传入一个参数，未传入的参数保持当前配置不变：\n\n| 参数 | 说明 | 是否需要重启网关 |\n|------|------|------------------|\n| `--metricTopicId <id>` | CLS 指标日志主题 ID | ❌ 热加载（约 10 秒内生效） |\n| `--secretId <id>` | 腾讯云 API 密钥 SecretId | ❌ 热加载（约 10 秒内生效） |\n| `--secretKey <key>` | 腾讯云 API 密钥 SecretKey | ❌ 热加载（约 10 秒内生效） |\n| `--endpoint <endpoint>` | CLS 接入点 | ❌ 热加载（约 10 秒内生效） |\n| `--enableReport <bool>` | 是否启用指标推送（`true`/`false`） | ❌ 热加载（约 10 秒内生效） |\n| `--credentialMode <mode>` | 凭证模式：`static` 或 `cvmRole` | ✅ 需要重启网关 |\n| `--roleName <name>` | CVM 角色名称 | ✅ 需要重启网关 |\n| `--prometheusEnabled <bool>` | 是否开启 Prometheus 指标上报（`true`/`false`） | ✅ 需要重启网关 |\n| `--pushIntervalMs <ms>` | Prometheus Remote Write 推送间隔（毫秒） | ✅ 需要重启网关 |\n| `--externalLabels <labels>` | Prometheus 自定义标签（格式：`key1=value1,key2=value2`） | ✅ 需要重启网关 |\n| `--traceEnabled <bool>` | 是否启用 Trace 链路追踪功能（`true`/`false`） | ❌ 热加载（约 10 秒内生效） |\n| `--traceTopicId <id>` | Trace 数据上报使用的 CLS 日志主题 ID | ❌ 热加载（约 10 秒内生效） |\n| `--enableLogReport <bool>` | 是否启用日志上报（`true`/`false`） | ❌ 热加载（约 10 秒内生效） |\n| `--logTopicId <id>` | 日志上报使用的 CLS 日志主题 ID | ❌ 热加载（约 10 秒内生效） |\n| `--logSource <source>` | 日志来源标识，写入每条日志的 `source` 字段（默认 `openclaw`） | ❌ 热加载（约 10 秒内生效） |\n| `--enableGatewayLog <bool>` | 是否启用 gateway 运行日志上报（`true`/`false`） | ❌ 热加载（约 10 秒内生效） |\n| `--enableSessionLog <bool>` | 是否启用会话日志上报（`true`/`false`） | ❌ 热加载（约 10 秒内生效） |\n| `--logMinLevel <level>` | 最低上报日志级别，仅对 gateway 运行日志生效（`trace`/`debug`/`info`/`warn`/`error`/`fatal`） | ❌ 热加载（约 10 秒内生效） |\n| `--instanceId <id>` | 显式指定实例 ID，写入配置文件后插件启动时直接使用，跳过腾讯云 metadata 接口请求 | ❌ 热加载（约 10 秒内生效） |\n| `--instanceName <name>` | 显式指定实例名称，仅覆盖 `cvm_instance_name`（不影响 `host_name`） | ❌ 热加载（约 10 秒内生效） |\n| `--localIpv4 <ip>` | 显式指定内网 IPv4 | ❌ 热加载（约 10 秒内生效） |\n\n> **智能重启判断**\n> **智能重启判断**：CLI 会自动分析本次更新的参数，如果所有参数均支持热加载，则不会重启网关；如果包含需要重启的参数，CLI 会自动重启网关使配置生效。\n\n### 更新示例\n\n更换静态密钥（热加载，无需重启）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli UpdateParameter \\\n  --secretId \"AKIDxxxxxxxx-new\" \\\n  --secretKey \"xxxxxxxx-new\"\n```\n\n更换 CLS 接入点和日志主题（热加载，无需重启）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli UpdateParameter \\\n  --endpoint \"ap-beijing.cls.tencentcs.com\" \\\n  --metricTopicId \"new-metric-topic-id\"\n```\n\n临时关闭指标推送（热加载，无需重启）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli UpdateParameter \\\n  --enableReport false\n```\n\n更新 Trace 日志主题 ID（热加载，无需重启）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli UpdateParameter \\\n  --traceTopicId \"new-trace-topic-id\"\n```\n\n关闭 Trace 链路追踪（热加载，无需重启）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli UpdateParameter \\\n  --traceEnabled false\n```\n\n切换到 CVM 角色临时密钥模式（需要重启网关）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli UpdateParameter \\\n  --credentialMode cvmRole \\\n  --roleName \"CVM\"\n```\n\n修改 Prometheus 推送间隔和自定义标签（需要重启网关）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli UpdateParameter \\\n  --pushIntervalMs 30000 \\\n  --externalLabels \"env=staging,region=ap-beijing\"\n```\n\n混合更新（热加载 + 需重启参数，CLI 会自动重启网关）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli UpdateParameter \\\n  --endpoint \"ap-beijing.cls.tencentcs.com\" \\\n  --pushIntervalMs 30000\n```\n\n### 输出示例\n\n仅更新热加载参数时：\n\n```\n✅ 已更新 openclaw.json 中的插件配置\n✅ 配置更新完成，以下参数支持热加载，无需重启网关: metricTopicId, endpoint\n   插件将在下一次轮询周期（约 10 秒内）自动应用新配置\n\n📋 更新后的配置：\n   凭证模式: 静态密钥\n   CLS 接入点: ap-beijing.cls.tencentcs.com\n   指标日志主题 ID: new-metric-topic-id\n   指标推送: 已启用\n   Prometheus 指标上报: 已开启\n   Remote Write URL: https://ap-beijing.cls.tencentcs.com/prometheus/new-metric-topic-id/api/v1/write\n   推送间隔: 15000ms\n```\n\n包含需要重启的参数时：\n\n```\n✅ 已更新 openclaw.json 中的插件配置\n\n以下参数需要重启网关才能生效: pushIntervalMs\n✅ 配置更新完成，网关已重启\n\n📋 更新后的配置：\n   凭证模式: 静态密钥\n   CLS 接入点: ap-guangzhou.cls.tencentcs.com\n   指标日志主题 ID: xxxxxxxx-metric-topic-id\n   指标推送: 已启用\n   Prometheus 指标上报: 已开启\n   Remote Write URL: https://ap-guangzhou.cls.tencentcs.com/prometheus/xxxxxxxx-metric-topic-id/api/v1/write\n   推送间隔: 30000ms\n```\n\n### 错误处理\n\n- **插件未安装**：如果插件尚未安装，命令会提示先执行 `install`\n- **未指定参数**：如果未传入任何配置参数，命令会提示可用参数\n- **回滚机制**：更新过程中发生错误（如网关重启失败），CLI 会自动回滚配置到更新前的状态\n- **超时保护**：整个更新流程有 5 分钟超时限制，防止进程无限挂起\n\n---\n\n## 配置热更新\n\n插件支持以下配置字段的**热更新**，修改 `openclaw.json` 后约 **10 秒**内自动生效，无需重启网关：\n\n| 字段 | 热更新行为 |\n|------|-----------|\n| `cls.metricTopicId` | 自动更新 Remote Write URL，切换到新的日志主题 |\n| `cls.endpoint` | 自动更新 Remote Write URL，切换到新的接入点；同时影响 Trace 模块的 CLS 接入点 |\n| `cls.enableReport` | `false` 时立即停止 Remote Write 指标推送；`true` 时立即恢复推送 |\n| `cls.secretId` | 自动更新静态密钥（static 模式），新密钥加密后回写配置文件；同时影响 Trace 模块的凭证 |\n| `cls.secretKey` | 自动更新静态密钥（static 模式），新密钥加密后回写配置文件；同时影响 Trace 模块的凭证 |\n| `cls.token` | 自动更新临时 Token（CVM 角色模式），同时影响 Trace 模块的凭证 |\n| `instance_metadata.instance_id` | 热更新 `cvm_instance_id`，覆盖自动获取值；设为空字符串可清空覆盖值并重新触发 metadata 接口获取 |\n| `instance_metadata.instance_name` | 热更新 `cvm_instance_name`，覆盖自动获取值；不影响 `host_name`（后者始终取 `os.hostname()`）；设为空字符串可清空覆盖值并重新触发 metadata 接口获取 |\n| `instance_metadata.local_ipv4` | 热更新 `cvm_instance_intra_ip`，覆盖自动获取值；设为空字符串可清空覆盖值并重新触发 metadata 接口获取 |\n| `trace.enabled` | 动态启用/禁用 Trace 链路追踪功能。即使初始配置不完整导致 trace 禁用，后续补全配置后也可通过热更新自动恢复 |\n| `trace.traceTopicId` | 自动切换 Trace 数据上报的 CLS 日志主题 |\n| `trace.debug` | 动态开启/关闭 Trace 调试日志，无需重启即可在运行时排查问题 |\n| `trace.enabledHooks` | 动态调整启用的 hook 列表，可在运行时按需启用/禁用特定 hook，无需重启 |\n| `log.enableLogReport` | 动态启用/禁用日志上报。`false` 时立即停止上报并释放 Producer；`true` 时（需同时配置 `logTopicId`）约 10 秒内自动恢复 |\n| `log.logTopicId` | 自动切换日志上报的 CLS 日志主题，切换后立即重建 Producer 使新主题生效 |\n| `log.source` | 动态更新写入每条日志的 `source` 字段标识 |\n| `log.enableGatewayLog` | 动态开启/关闭 gateway 运行日志上报（注意：关闭后需重启网关才能重新注册 transport） |\n| `log.enableSessionLog` | 动态开启/关闭会话日志上报（session JSONL） |\n| `log.minLevel` | 动态调整 gateway 运行日志的最低上报级别，无需重启即可在运行时过滤噪音日志 |\n\n> **注意**：`credentialMode`、`roleName` 等凭证模式相关字段，以及 `prometheusEnabled`、`pushIntervalMs`、`externalLabels` 等 Prometheus 配置字段变更后需要重启网关才能生效。可通过 `UpdateParameter` 命令更新，CLI 会自动判断是否需要重启。\n>\n> `instance_metadata.instance_id`、`instance_metadata.instance_name`、`instance_metadata.local_ipv4` 三个字段支持热更新，修改后约 10 秒内自动生效，无需重启网关。将字段设为空字符串时，插件会清空对应的覆盖值并重新通过 metadata 接口自动获取（最多重试 3 次，每次间隔 30 秒）。\n\n---\n\n## 密钥加密存储\n\n为避免 `secretId` 和 `secretKey` 以明文形式暴露在 `openclaw.json` 配置文件中，插件采用 **AES-256-CBC + 加盐** 的方式对密钥进行加密存储。\n\n#### 工作原理\n\n1. **CLI 安装时自动加密**：通过 `npx clawpro-diagnostics-metrics-cls-onboard-cli install` 安装时，CLI 会自动将 `secretId` 和 `secretKey` 加密后写入配置文件\n2. **插件启动时自动解密**：插件在初始化读取配置时，自动检测并解密密钥，对业务逻辑完全透明\n3. **自动加密明文**：若配置文件中存在明文密钥（手动编辑场景），插件启动时会自动将其加密后回写\n4. **向下兼容**：如果配置中的密钥是明文（旧版本配置），插件会直接使用，不会报错\n\n#### 加密格式\n\n加密后的值以 `ENC:` 前缀标识，格式为：\n\n```\nENC:<base64(iv + ciphertext)>\n```\n\n配置文件中的加密效果示例：\n\n```json\n{\n  \"cls\": {\n    \"secretId\": \"ENC:dGhpcyBpcyBhIGJhc2U2NCBleGFtcGxl...\",\n    \"secretKey\": \"ENC:YW5vdGhlciBiYXNlNjQgZXhhbXBsZQ==\"\n  }\n}\n```\n\n#### 加密方案说明\n\n| 项目 | 说明 |\n|------|------|\n| 算法 | AES-256-CBC |\n| 密钥派生 | SHA-256 哈希固定盐值 |\n| IV | 每次加密生成 16 字节随机初始化向量 |\n| 编码 | Base64 编码存储 |\n| 标识 | `ENC:` 前缀区分密文与明文 |\n\n> ⚠️ **安全说明**：此方案属于对称加密混淆存储，主要目的是防止配置文件被直接浏览时泄露明文密钥。密钥派生因子内嵌在代码中，并非高安全级别的加密方案。如有更高安全需求，建议：\n> - 使用腾讯云密钥管理服务（KMS）或密钥保险箱（SSM）\n> - 限制配置文件读取权限（`chmod 600 openclaw.json`）\n\n#### 手动配置时的注意事项\n\n- **使用 CLI 安装**：无需关心加密细节，CLI 会自动处理\n- **手动编辑配置文件**：可以直接写入明文密钥，插件启动时会自动检测并加密后回写\n- **重新安装/更新密钥**：再次运行 CLI 会自动将新密钥加密后覆盖\n- **CVM 角色临时密钥模式**：使用 `cvmRole` 模式时，配置文件中不会存储 `secretId` 和 `secretKey`，密钥加密存储功能不适用\n\n---\n\n## CVM 角色临时密钥\n\n对于部署在腾讯云 CVM 上的实例，插件支持通过 CVM 角色（CAM Role）自动获取临时密钥，无需在配置文件中存储静态的 `secretId` / `secretKey`，提升安全性。\n\n### 工作原理\n\n1. **元数据接口获取凭证**：插件通过腾讯云 CVM 元数据接口（`http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/<roleName>`）获取绑定了 CAM 角色的临时密钥（`TmpSecretId` / `TmpSecretKey` / `Token`）\n2. **自动缓存与刷新**：首次获取后缓存凭证，过期前自动重新获取，对业务完全透明\n3. **并发安全**：相同 `roleName` 共享同一个 Provider 实例，并发调用时只发起一次元数据请求\n4. **自愈机制**：凭证刷新失败时暂停 Remote Write 推送，下次刷新成功后自动恢复\n5. **Prometheus Remote Write 鉴权**：使用 `secretId` 作为 username，`secretKey#token` 作为 password 的 Basic Auth 方式进行鉴权\n6. **共享凭证管理**：trace 和指标（Prometheus Remote Write）服务通过 `SharedCredentialManager` 共用同一份临时密钥，避免各自独立获取导致的重复元数据请求和凭证状态不一致。管理器统一负责定时刷新和事件通知，两个服务通过订阅机制自动同步最新凭证\n\n### 前置条件\n\n1. 实例必须部署在腾讯云 CVM 上，且能访问元数据接口\n2. CVM 实例需要绑定 CAM 角色，角色需要拥有 CLS 写入权限\n3. 必须通过 `roleName` 参数指定 CVM 角色名称（如 `CVM`）\n\n### 启用方式\n\n**通过 CLI 安装**：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli install \\\n  --credentialMode cvmRole \\\n  --roleName \"CVM\" \\\n  --metricTopicId \"your-metric-topic-id\" \\\n  --endpoint \"ap-guangzhou.cls.tencentcs.com\"\n```\n\n**手动配置**：\n\n在 `openclaw.json` 的 `cls` 配置中设置：\n\n```json\n{\n  \"cls\": {\n    \"credentialMode\": \"cvmRole\",\n    \"roleName\": \"CVM\",\n    \"metricTopicId\": \"your-metric-topic-id\",\n    \"endpoint\": \"ap-guangzhou.cls.tencentcs.com\"\n  }\n}\n```\n\n### 注意事项\n\n- CVM 角色模式仅适用于腾讯云 CVM 环境，非 CVM 环境下无法访问元数据接口\n- 使用 CVM 角色模式时，配置文件中不会存储 `secretId` 和 `secretKey`，CLI 安装时会自动清除已有的静态密钥\n- cvmRole 模式下 `roleName` 为必填参数，必须通过命令行参数或配置文件提供\n- Prometheus Remote Write 鉴权：静态密钥模式下 CLI 会自动生成 Basic Auth 头；CVM 角色模式下由插件运行时动态获取凭证进行鉴权\n\n---\n\n## 验证插件状态\n\n### 查看插件列表\n\n```bash\nopenclaw plugins list\n```\n\n输出示例：\n\n```\nName                  Status    Version\nDiagnostics Metrics   loaded    2026.3.2\n```\n\n`Status` 为 `loaded` 表示插件已成功加载。\n\n### 验证 Prometheus 指标端点\n\n```bash\ncurl http://localhost:<openclaw-port>/metrics\n```\n\n正常响应示例：\n\n```\n# HELP openclaw_tokens_total Total tokens consumed\n# TYPE openclaw_tokens_total counter\nopenclaw_tokens_total{openclaw_type=\"input\",openclaw_provider=\"anthropic\",openclaw_model=\"claude-3-5-sonnet\",openclaw_channel=\"telegram\"} 1234\n...\n```\n\n### 验证 CLS Prometheus Remote Write\n\n查看 OpenClaw 日志中是否有如下日志，表示 Remote Write 推送正常：\n\n```\ndiagnostics-metrics/prometheus: remote write enabled for 1 target(s), push interval 15000ms\n```\n\n也可在 [腾讯云日志服务控制台](https://console.cloud.tencent.com/cls) 的指标日志主题中查看是否有数据写入。\n\n---\n\n## 卸载插件\n\n### 快速卸载（推荐）\n\n使用 onboard CLI 工具一键完成卸载，自动清理配置和安装文件。\n\n#### 运行卸载命令\n\n```bash\nnpx --yes clawpro-diagnostics-metrics-cls-onboard-cli uninstall\n```\n\n#### 命令行参数\n\n| 参数 | 说明 |\n|------|------|\n| `--force` | 跳过交互式确认，直接执行卸载（适用于自动化脚本场景） |\n\n#### 卸载示例\n\n交互式卸载（默认，需手动确认）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli uninstall\n```\n\n跳过确认直接卸载（适用于 CI/CD 或自动化脚本）：\n\n```bash\nnpx clawpro-diagnostics-metrics-cls-onboard-cli uninstall --force\n```\n\n#### 卸载流程\n\nCLI 卸载命令会按以下顺序自动执行：\n\n1. **环境检查**：检测 OpenClaw CLI 是否可用\n2. **配置修复**：修复可能损坏的配置文件，防止清理操作丢失其他插件配置\n3. **幂等性检查**：如果插件当前未安装，提前告知用户并退出\n4. **交互式确认**：提示用户确认卸载操作（`--force` 可跳过）\n5. **备份**：备份当前配置文件和插件安装文件到临时目录，用于失败时回滚\n6. **执行 openclaw plugins uninstall**：通过 OpenClaw CLI 正式卸载插件，清理内部注册表\n7. **清理配置**：从 `openclaw.json` 中移除插件配置（`plugins.entries`、`plugins.allow`），并在无其他插件依赖时将 `diagnostics.enabled` 还原为 `false`\n8. **清理文件**：删除插件安装目录及所有相关文件\n9. **重启网关**：自动重启 OpenClaw 网关使变更生效\n1","readmeFilename":"README.md"}