{"_id":"@photon-ai/otel","_rev":"17-c3cc4bd771cbc17585f5b27bcac94ec1","name":"@photon-ai/otel","dist-tags":{"latest":"3.8.1"},"versions":{"0.1.0":{"name":"@photon-ai/otel","version":"0.1.0","keywords":["opentelemetry","otel","tracing","logging","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@0.1.0","maintainers":[{"name":"photon_dev","email":"photon@something.surf"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"}],"dist":{"shasum":"be0f907e509bd42181281ceb08716ee90c5a5395","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-0.1.0.tgz","fileCount":5,"integrity":"sha512-yCarii47QrVBFkI1dsPNO6K8RP05BGyhxhITI7NOKntTdqjZ/uaAtCLhw7IFj7iEulPzaGJpJa/YxV5QkF7fOA==","signatures":[{"sig":"MEUCICgpmzjEyQhlBtW4bY46nwU0cXcwk1Zxi9Gwe+YGNiSdAiEA5jBKvduOim5YH6zKX/wEpzhCxXIL7+LwdbmeFNmPw98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35638},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"bun":"./src/index.ts","types":"./src/index.ts","default":"./dist/index.js"}},"gitHead":"2440f98d2ea2448340bfc1a7e1327895fa7f536b","scripts":{"fix":"ultracite fix","test":"vitest run","build":"tsup","check":"ultracite check","test:watch":"vitest","prepublishOnly":"bun run build"},"_npmUser":{"name":"photon_dev","email":"photon@something.surf"},"_npmVersion":"10.8.2","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call setup, structured logging, span helper, and built-in PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/api-logs":"^0.216.0","@opentelemetry/sdk-logs":"^0.216.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/exporter-logs-otlp-http":"^0.216.0","@opentelemetry/exporter-trace-otlp-http":"^0.216.0"},"publishConfig":{"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^2.1.0","ultracite":"7.7.0","@types/bun":"latest","@types/node":"^22.0.0","@biomejs/biome":"2.4.15"},"peerDependencies":{"typescript":"^5 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_0.1.0_1778817515135_0.7110060760527082","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@photon-ai/otel","version":"0.1.1","keywords":["opentelemetry","otel","tracing","logging","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@0.1.1","maintainers":[{"name":"photon_dev","email":"photon@something.surf"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"}],"dist":{"shasum":"1aa7faaa3684a4a6b08a8d0c742c190bc3b12a16","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-0.1.1.tgz","fileCount":5,"integrity":"sha512-t/NVepO5+fHOLWDI+Eht+RC8PTik0wi7HQsKhU4yPqBjY5JncXmoBZLnWFvG+/qJ/pn6w+tveabKG9pykfkqKg==","signatures":[{"sig":"MEUCIAmsqmw8/CTlDbEbp8okR78oI/4tvQrpWoXP4KdQtumjAiEAgzxW5XCjnkxv4OhimHW1fkclYQuBK2GcKNaE3lZjpSE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35083},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"7e6f4f726f3738d2e4bad859741340402c5740f5","_npmUser":{"name":"photon_dev","email":"photon@something.surf"},"_npmVersion":"10.8.2","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call setup, structured logging, span helper, and built-in PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/api-logs":"^0.216.0","@opentelemetry/sdk-logs":"^0.216.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/exporter-logs-otlp-http":"^0.216.0","@opentelemetry/exporter-trace-otlp-http":"^0.216.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_0.1.1_1778833567797_0.6549272072637577","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@photon-ai/otel","version":"0.1.2","keywords":["opentelemetry","otel","tracing","logging","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@0.1.2","maintainers":[{"name":"photon_dev","email":"photon@something.surf"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"}],"dist":{"shasum":"cef2f967f57b08239f909ea4dabebd4b2df52930","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-0.1.2.tgz","fileCount":5,"integrity":"sha512-ekAwcChi/wgzcQj92okKGf4jgD2OwQ3WsQDJwCCnwREtKFDbePVdSlE/4BUw3oZTOgLDc+vSz/t9nWq7YZJLjA==","signatures":[{"sig":"MEUCIDKAqFJ9c9nkHMJqhgfSrseCNFmHwqlQmjRhTyRRLO9iAiEA/uus93MSNJAAWYSntHaS/b4Isi1bOfIiwMxAdsMHNw4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35083},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"d31aadded385a09cfb568f7c847672837c4d7d9e","_npmUser":{"name":"photon_dev","email":"photon@something.surf"},"_npmVersion":"11.16.0","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call setup, structured logging, span helper, and built-in PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_0.1.2_1780977855956_0.03910084372313882","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@photon-ai/otel","version":"1.0.0","keywords":["opentelemetry","otel","tracing","logging","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@1.0.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"}],"dist":{"shasum":"ce4b18c1942006fc0f8e9bb0b7332c13eb1bf840","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-1.0.0.tgz","fileCount":5,"integrity":"sha512-5fACVHN7BtGS+phglVAxun5QLckNUSS4p750oCxR//m9JNVzFQMoLFWfC6DnWBP/W0/+B2yP75+3NMVLodEJEg==","signatures":[{"sig":"MEYCIQC/7VoTwdUpNzYa+VCVpEKm+JwuDwkIVAuXkLwuSu/NVwIhAMgxep/VTO8p3Er207rmnmkDZ3x4qmf8WGuxaKGvkf56","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43458},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"e05d76fb2e45419eabd8e91bd33873d401eec2df","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"11.17.0","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call setup, structured logging, span helper, and built-in PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_1.0.0_1781822107398_0.1427572537659103","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@photon-ai/otel","version":"1.1.0","keywords":["opentelemetry","otel","tracing","logging","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@1.1.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"}],"dist":{"shasum":"36ece617ec3df5891d07bf9d06af32032ace9759","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-1.1.0.tgz","fileCount":5,"integrity":"sha512-v6Ai5Anws+gkjzZQirXpuF6VtS4DmSnpx9o208R2mhwqONNp2iqwQx4400C6r8oyqv7mz65tkkTd083kG5/kng==","signatures":[{"sig":"MEUCIQDQ3Xy3m40BSYNa+9BmPepXUX2zYUIfuJuy7k5qaZURHwIgEay+biKvVTzL564sLkWDUTKUosJBQjBVY0lfrlqcDpg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69925},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"61853e78cc5a87f84693ffd452d30ea66dacefb3","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"11.17.0","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call setup, structured logging, span helper, and built-in PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_1.1.0_1782502403812_0.7957015813411259","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@photon-ai/otel","version":"2.0.1","keywords":["opentelemetry","otel","tracing","logging","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@2.0.1","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"}],"dist":{"shasum":"c9549899008e8b644bc0b678a05849d8364953f7","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-2.0.1.tgz","fileCount":5,"integrity":"sha512-6xamro+nJtonEKr0Y1jsup27MUaWk0ZOkJXN36HuMZpjX6qBXyWwPYKxdHXP57BljBjr/3CrkXWOx1OQi3oHxg==","signatures":[{"sig":"MEUCICAb+Z6xE/WWplr61fR0g5jhNXMBsUbbV91/ht15HvoPAiEA2GdfYSJ/8QWItdFdEoC8Guz7Fy4c3plN7fY3ZxP0BDk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91271},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"191a15b669d9283524c8976ea29b3990c48eb946","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"11.17.0","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call setup, structured logging, span helper, and built-in PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_2.0.1_1782599635105_0.4490645138277958","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@photon-ai/otel","version":"2.1.0","keywords":["opentelemetry","otel","tracing","logging","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@2.1.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"}],"dist":{"shasum":"1e061380589b0e17d68b39a3deeb8bc915e2877b","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-2.1.0.tgz","fileCount":5,"integrity":"sha512-dJHYs0NrZcYE8LEvoR381dGKYLH/QgmzqRKdLlHUKvSM+tF0bN27+LQfxhFM4tT7cK+qo2gGUHphBQVrYc0KJA==","signatures":[{"sig":"MEUCIH07wMuWNpvlLqeuwf41v0VvzL1IkPUmwSjLA3qOf5uqAiEAzmAwDdcvr3Ua0v2wJIy/tP1G61OMkUx9+wthXXgqp0o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93786},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"74ed619cac16ea17e81354704e2458274537dcf5","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"11.18.0","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call setup, structured logging, span helper, and built-in PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_2.1.0_1782777583828_0.8742803093889093","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@photon-ai/otel","version":"3.0.0","keywords":["opentelemetry","otel","tracing","logging","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@3.0.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"}],"dist":{"shasum":"57fa90c66293e5b981c7554e8d872d5b69e34309","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-3.0.0.tgz","fileCount":5,"integrity":"sha512-ttHs8YNh7hRsvJzR8xalqzWW37vRhnszYQeSshT6rtPProwpwaRvANEvkOPGKQtDtBOllbogqswWu/w8mBABtQ==","signatures":[{"sig":"MEYCIQCEe1+F6u5n6ivD644ynD9GKvhvYUPwx8FDiygdcOF6RAIhALoWOXxc6adHFDLXZCbLafoquoWupY1C6OQSmMKpHBkj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101085},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"34afd2242e330a81f72c22af9d19f882a42efb16","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"11.18.0","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call setup, structured logging, span helper, and built-in PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_3.0.0_1782850146849_0.24419043848458055","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@photon-ai/otel","version":"3.1.0","keywords":["opentelemetry","otel","tracing","logging","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@3.1.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"}],"dist":{"shasum":"72f435e85af215f2e03400047875a82b2633a690","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-3.1.0.tgz","fileCount":5,"integrity":"sha512-8PvN7o3rySHlMk6+a/5X/F5/w1RqGJkFuvcdaSinhdXYCsuO24AALSFV0g8KY4jNtVDs7L3I6v6QsL7WxZECjw==","signatures":[{"sig":"MEQCICv6EaC+ZP7PUmr/cBa6D+vT7QiAreFhl3TStYwZLjH+AiByLKAfauwO3HG+RxkM4uflo/p2Ekr19EdJoD3WPVnriw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110821},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"27bb1bcad7637bb19931e34eb3f5e17a65ba0908","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"11.18.0","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call setup, structured logging, span helper, and built-in PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_3.1.0_1782855941595_0.7762554709218776","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@photon-ai/otel","version":"3.2.0","keywords":["opentelemetry","otel","tracing","logging","metrics","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@3.2.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"},{"name":"lcandy","email":"synapse-05.giddy@icloud.com"}],"dist":{"shasum":"0b8f6d779d948b86e106e93062d1790831e0ebea","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-3.2.0.tgz","fileCount":5,"integrity":"sha512-UXqJ+CjPtj5ga+mXJnwE+IqLzATIzIxhxJXmo4GyfFxQA2aNZkNtcDujDxOXi8hpodIR2gYm/qsPS6Cv2jzoxQ==","signatures":[{"sig":"MEUCIFROfCXq//DuUZCQWzVQBg09OASYkAIDnXar2/QTBRbTAiEAg8xptFSQ23FqOkGImUWL8oAHTJ2/sCwBywsA9KLuR+Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119405},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"82c15a54ff39b4de1e4c2fc85cf6258671edc7fe","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"12.0.1","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call traces, logs, metrics, fetch instrumentation, and PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-metrics":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0","@opentelemetry/exporter-metrics-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_3.2.0_1784253787320_0.5777300810297117","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"@photon-ai/otel","version":"3.3.0","keywords":["opentelemetry","otel","tracing","logging","metrics","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@3.3.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"},{"name":"lcandy","email":"synapse-05.giddy@icloud.com"}],"dist":{"shasum":"492837f63371d9521f6f40506ab77957bace117e","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-3.3.0.tgz","fileCount":5,"integrity":"sha512-EkFX+CkLzDiwWwp7BaX3eqNjaCT8e1lrrYzhsVT+NWW1wSlULgsIjjsMrBCR32VHTIRZQ0FOzbasJGq3Sx+pVg==","signatures":[{"sig":"MEQCIFVUo4aQ+FlkcQDG84vhyk5m/Mio2Aoq05wKZDnTJkLYAiAagbP93O84URfNUEZnQSzshWi7jXI/ivpP3mElsLmv6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121587},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"8f43275d9523ef0e6230a4b87da4d499aab54c09","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"12.0.1","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call traces, logs, metrics, fetch instrumentation, and PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-metrics":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0","@opentelemetry/exporter-metrics-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_3.3.0_1784673561337_0.28896453497730423","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"name":"@photon-ai/otel","version":"3.4.0","keywords":["opentelemetry","otel","tracing","logging","metrics","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@3.4.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"},{"name":"lcandy","email":"synapse-05.giddy@icloud.com"}],"dist":{"shasum":"1b48c8d483eb8a4c48c8ef77fff32828e0214e6c","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-3.4.0.tgz","fileCount":5,"integrity":"sha512-z7wKTPBbkOd2OLM5ICSgTYY0oKj8we1PVv/b59zYrEirncXi0xHus7lCzgfMLS3DxC/LAlbqZeuYGEj3Dl9OPQ==","signatures":[{"sig":"MEUCID5FTT42Ru4zykwx6klon6jTfIT1lW3f6DN0/519n5W2AiEAuAyT03J829geWB1TNk2c2A9O2PeWtUoO7B5xlOpMF30=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143777},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"f83792229d887cba06b4aa22abcfc35c09702c86","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"12.0.2","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call traces, logs, metrics, fetch instrumentation, and PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-metrics":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0","@opentelemetry/exporter-metrics-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_3.4.0_1786221407141_0.06730934402367472","host":"s3://npm-registry-packages-npm-production"}},"3.5.0":{"name":"@photon-ai/otel","version":"3.5.0","keywords":["opentelemetry","otel","tracing","logging","metrics","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@3.5.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"},{"name":"lcandy","email":"synapse-05.giddy@icloud.com"}],"dist":{"shasum":"58c4c57c74722c7fa3eb97b8a88f5297de7b269a","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-3.5.0.tgz","fileCount":5,"integrity":"sha512-t8fYsCWx0BoqZReocEeIU+qZtr9VHJBe5QYnGD/4vMpj5DTtpYbrIcLrKJDErD1V1AcBBDORCabVykve6sTVqQ==","signatures":[{"sig":"MEQCIB8hDM8wK2LOjHuZgw7BWz6VVkm6PyDG4gvQmCEjzK6ZAiBk3iDWfqYoC4BlKLLNgUaPI3WgyBf+/fK2uIlWcLNbKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145178},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"f584cc5c9c9a502c0f81f59e4b05bc2026897bbc","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"12.0.2","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call traces, logs, metrics, fetch instrumentation, and PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-metrics":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0","@opentelemetry/exporter-metrics-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_3.5.0_1786478853109_0.0975078395502631","host":"s3://npm-registry-packages-npm-production"}},"3.6.0":{"name":"@photon-ai/otel","version":"3.6.0","keywords":["opentelemetry","otel","tracing","logging","metrics","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@3.6.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"},{"name":"lcandy","email":"synapse-05.giddy@icloud.com"}],"dist":{"shasum":"ebd6275f0a50b003ba9a55cb08b5a6f756a47380","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-3.6.0.tgz","fileCount":5,"integrity":"sha512-KHXX5InOmkbTxGEeSPRaypwhnPq1QISyCL7NCgjy6h3fXxWIKN0jvIWAwPPSiwA4wk55A30G/c531n+KXD98eg==","signatures":[{"sig":"MEUCIHC5p49hkwX+b7WfaHDT9dwHPiI09yFm7Q3HFNHq1b5HAiEA5patic1LMWHFlACf5G/sg7xiRnd2WXJTewIE7o3XmWI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148995},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"75507e0c3a2755cce92a807eedb4ecf9cce6b2ea","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"12.0.2","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call traces, logs, metrics, fetch instrumentation, and PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-metrics":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0","@opentelemetry/exporter-metrics-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_3.6.0_1786569776613_0.3444353635425894","host":"s3://npm-registry-packages-npm-production"}},"3.7.0":{"name":"@photon-ai/otel","version":"3.7.0","keywords":["opentelemetry","otel","tracing","logging","metrics","observability","bun","nodejs","otlp"],"license":"MIT","_id":"@photon-ai/otel@3.7.0","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"},{"name":"lcandy","email":"synapse-05.giddy@icloud.com"}],"dist":{"shasum":"840baf2f60ec2d5953d3de218ff5bf59a0c53ece","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-3.7.0.tgz","fileCount":5,"integrity":"sha512-N+fwhvvx/T2tNR8747vFJQgUuLxqyjAVMMLwmakEupgcE4X2M8nbqrfZNSPKN5DL/lpLXYP27a/ACW+jSWAqyA==","signatures":[{"sig":"MEQCIB98q0KbTh/YFtDBXvLnLGQTtmR0cUOwAtgi5+osaHrJAiAKvLidLC0F2U3Ikwp3twxs2tiiDuh9wj0wUAWZncuwTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158761},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"e37f44a17d98469ef2bc94a672a2c5ea6ebcf1ab","_npmUser":{"name":"photon_dev","email":"team@photon.codes"},"_npmVersion":"12.0.2","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call traces, logs, metrics, fetch instrumentation, and PII scrubbing.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.7.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-metrics":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0","@opentelemetry/exporter-metrics-otlp-http":"^0.218.0"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/otel_3.7.0_1787256892341_0.5363917526140383","host":"s3://npm-registry-packages-npm-production"}},"3.8.1":{"name":"@photon-ai/otel","version":"3.8.1","description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call traces, logs, metrics, fetch instrumentation, and PII scrubbing.","repository":{"type":"git","url":"git+https://github.com/photon-hq/otel.git"},"type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","sideEffects":false,"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"dependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/api-logs":"^0.218.0","@opentelemetry/context-async-hooks":"^2.7.1","@opentelemetry/core":"^2.7.1","@opentelemetry/exporter-logs-otlp-http":"^0.218.0","@opentelemetry/exporter-metrics-otlp-http":"^0.218.0","@opentelemetry/exporter-trace-otlp-http":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-logs":"^0.218.0","@opentelemetry/sdk-metrics":"^2.7.1","@opentelemetry/sdk-trace-base":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1"},"peerDependencies":{"typescript":"^5 || ^6.0.0"},"optionalDependencies":{"@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/instrumentation-undici":"^0.29.0"},"engines":{"node":">=20"},"license":"MIT","keywords":["opentelemetry","otel","tracing","logging","metrics","observability","bun","nodejs","otlp"],"gitHead":"4d92a2e78e682600adc71e03a6e939fc7928f341","_id":"@photon-ai/otel@3.8.1","bugs":{"url":"https://github.com/photon-hq/otel/issues"},"homepage":"https://github.com/photon-hq/otel#readme","_nodeVersion":"24.20.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-VDGj/iYk8ZXQhPLUYjNXtIAa7AA3kVGpjupn99ShiSotgbLeskXCOiAO4G0TlER2oUeoI9ovLU2fEyA87bMExw==","shasum":"5e95685ac887741ed21c0689d1d71ea6870ae1a2","tarball":"https://registry.npmjs.org/@photon-ai/otel/-/otel-3.8.1.tgz","fileCount":5,"unpackedSize":221716,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@photon-ai%2fotel@3.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDyeft18UavJqB+XNRA6eSXulN0UuOlq3LF36FAeMzxQAiBpsgQeH7+gCRr2xhJs3/KqIgMJOQnkX5caljMgUpBCxw=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9f2fedf-bd03-4fdf-bd01-a011b75b4de9"}},"directories":{},"maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"},{"name":"lcandy","email":"synapse-05.giddy@icloud.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/otel_3.8.1_1789120551612_0.6236990699006009"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-15T03:58:35.065Z","modified":"2026-09-11T09:55:52.234Z","0.1.0":"2026-05-15T03:58:35.290Z","0.1.1":"2026-05-15T08:26:07.930Z","0.1.2":"2026-06-09T04:04:16.087Z","1.0.0":"2026-06-18T22:35:07.603Z","1.1.0":"2026-06-26T19:33:23.984Z","2.0.1":"2026-06-27T22:33:55.235Z","2.1.0":"2026-06-29T23:59:43.961Z","3.0.0":"2026-06-30T20:09:06.992Z","3.1.0":"2026-06-30T21:45:41.731Z","3.2.0":"2026-07-17T02:03:07.470Z","3.3.0":"2026-07-21T22:39:22.530Z","3.4.0":"2026-08-08T20:36:47.269Z","3.5.0":"2026-08-11T20:07:33.264Z","3.6.0":"2026-08-12T21:22:56.762Z","3.7.0":"2026-08-20T20:14:52.504Z","3.8.1":"2026-09-11T09:55:51.847Z"},"license":"MIT","keywords":["opentelemetry","otel","tracing","logging","metrics","observability","bun","nodejs","otlp"],"description":"DX-focused OpenTelemetry wrapper for Bun and Node.js: one-call traces, logs, metrics, fetch instrumentation, and PII scrubbing.","maintainers":[{"name":"photon_dev","email":"team@photon.codes"},{"name":"ryanzhuuuu","email":"ryan@photon.codes"},{"name":"qwerzl","email":"me@qwerzl.me"},{"name":"lcandy","email":"synapse-05.giddy@icloud.com"}],"readme":"# @photon-ai/otel\n\nA DX-focused OpenTelemetry wrapper for **Bun** and **Node.js**.\n\nVanilla OTel works, but the setup is verbose, the logger plumbing is awkward, and PII scrubbing is on you. `@photon-ai/otel` wraps the OTLP/HTTP stack into a few well-named functions:\n\n- **`setupOtel()`** — idempotent one-call bootstrap for traces + logs + metrics. Honors standard `OTEL_EXPORTER_OTLP_*` env vars.\n- **`createIsolatedOtel()`** — creates an isolated trace + log runtime with its own Resource, configurable trace carrier, and optional private Baggage carrier, without replacing global providers or context.\n- **`otel.getMeter(name)`** — creates standard OpenTelemetry instruments from this setup's meter provider, with identical behavior in global and scoped mode.\n- **`createLogger(module)`** — structured logger that writes to both the OTel logger provider and `console`, with automatic trace correlation and exception capture. Every level (`debug`/`info`/`warn`/`error`) accepts `attrs` **and** an `error`, and shares one configurable level gate.\n- **`withSpan(name, attrs?, fn)`** — wrap any sync or async function in a span; errors are recorded and PII in the error message is scrubbed before being attached to span status.\n- **Automatic `fetch` tracing** — `setupOtel()` instruments outbound `fetch` so every request gets a CLIENT span and W3C trace-context headers. On **Node** it uses the official `@opentelemetry/instrumentation-undici`; on **Bun** — whose native fetch emits nothing for the standard `diagnostics_channel`-based instrumentations — it wraps `globalThis.fetch`. Pass `instrumentFetch: { mode: \"global\" }` to force the wrap on both for identical spans.\n- **`sanitizeEmail` / `sanitizePhone` / `sanitizeErrorMessage`** — PII helpers you can reuse anywhere.\n\nOTLP/HTTP only (no gRPC, no proto). Runs on Bun and Node ≥ 20.\n\n## Install\n\n```bash\nbun add @photon-ai/otel\n# or\nnpm install @photon-ai/otel\n```\n\n## Quick start\n\n```ts\nimport { createLogger, setupOtel, withSpan } from \"@photon-ai/otel\";\n\nconst otel = setupOtel({\n  serviceName: \"my-service\",\n  serviceVersion: \"1.0.0\",\n  endpoint: \"https://otel.example.com\", // optional; env var wins\n});\n\nconst log = createLogger(\"server\");\nconst requests = otel.getMeter(\"server\").createCounter(\"server.requests\");\n\nawait withSpan(\"handle-request\", { route: \"/users\" }, async () => {\n  log.info(\"processing request\", { userId: 42 });\n  requests.add(1, { route: \"/users\" });\n  // Outbound fetch is traced automatically: a CLIENT span, parented to this\n  // one, with a `traceparent` header injected for the downstream service.\n  await fetch(\"https://api.example.com/users\");\n});\n\nawait otel.shutdown();\n```\n\nIf `OTEL_EXPORTER_OTLP_ENDPOINT` (or the `endpoint` option) is unset,\n`setupOtel()` still returns real providers and instruments; measurements simply\nare not exported. This keeps local development zero-config.\n\n## Creating metrics\n\nFor application code, create instruments from the handle returned by\n`setupOtel()`:\n\n```ts\nconst ordersProcessed = otel\n  .getMeter(\"orders\")\n  .createCounter(\"orders.processed\", {\n    description: \"Orders processed by the service\",\n  });\n\nordersProcessed.add(1, { result: \"success\" });\n```\n\nCreate meters and instruments after `setupOtel()` runs. Do not use\n`metrics.getMeter()` in a module-level initializer: if it runs before setup, it\ncan bind instruments to OpenTelemetry's no-op provider.\n\nFor a reusable module, accept an OpenTelemetry `Meter` and build instruments in\na factory:\n\n```ts\nimport type { Meter } from \"@opentelemetry/api\";\n\nexport const createOrderMetrics = (meter: Meter) => ({\n  processed: meter.createCounter(\"orders.processed\", {\n    description: \"Orders processed by the service\",\n  }),\n});\n\nconst orderMetrics = createOrderMetrics(otel.getMeter(\"orders\"));\n```\n\nThis is the recommended integration boundary: application startup owns OTel\nsetup, while reusable code only knows about the standard `Meter` interface.\nSee the [metrics guide](./docs/guides/metrics.mdx) for shared-publisher usage,\nattribute guidance, and scoped mode.\n\n## API\n\n| Function                                      | Description                                                                                                |\n| --------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |\n| `setupOtel(options): OtelHandle`              | Boots OTLP/HTTP traces + logs + metrics. The handle exposes `getMeter()`, providers, and `shutdown()`. Pass `register: false` for scoped mode. |\n| `createIsolatedOtel(options): IsolatedOtelHandle` | Creates an isolated, non-global trace + log runtime with its own endpoint, Resource, private trace carrier, and optional private Baggage carrier. Returns a new runtime on every call. |\n| `isOtelActive(): boolean`                     | Returns `true` if `setupOtel` has already run in this process.                                             |\n| `instrumentFetch(options?): FetchInstrumentation` | Low-level wrap of `globalThis.fetch` for CLIENT spans + W3C propagation. Returns `{ unpatch() }`. `setupOtel` calls this on Bun; on Node it prefers native undici. |\n| `flushFetchRecords({ timeoutMs? }?)` | Drains pending request/response recording, finalizing partial captures at the deadline (5 seconds by default). Flush your own exporters afterward when not using `setupOtel().shutdown()`. |\n| `createInstrumentedFetch(baseFetch?, options?): typeof fetch` | Returns a NEW instrumented fetch (CLIENT spans + W3C propagation) wrapping `baseFetch` (default `globalThis.fetch`) without touching the global. For SDKs that take a `fetch` option. |\n| `createLogger(module): PhotonLogger`          | Returns `{ info, warn, error, debug }`. Each call emits to OTel + `console`, correlates to active span.    |\n| `setLogLevel(level): void`                    | Set the minimum level emitted (`debug`/`info`/`warn`/`error`/`silent`). Programmatic configuration wins over `LOG_LEVEL`. |\n| `getLogLevel(): LogLevel`                     | Current effective level after programmatic / env / default resolution.                                   |\n| `withSpan(name, fn)`                          | Wraps `fn` (sync or async) in a span. Records exceptions and scrubs PII in error messages.                 |\n| `withSpan(name, attrs, fn)`                   | Same as above but attaches `attrs` to the span.                                                            |\n| `sanitizeEmail(input)`                        | Masks an email: `foo.bar@example.com` → `fo***@e***.com`.                                                  |\n| `sanitizePhone(input)`                        | Masks a phone: `+13315553374` → `+133xxxxx3374`.                                                           |\n| `sanitizeErrorMessage(input)`                 | Masks every email and phone embedded in a free-form string.                                                |\n| `PHOTON_OTEL_VERSION`                         | Constant — current package version.                                                                        |\n\n## Isolated runtime\n\nUse `createIsolatedOtel()` when one process must send a small, explicitly\nrecorded trace/log stream to a different OTLP backend without taking over the\nmain OTel runtime:\n\n```ts\nimport { propagation } from \"@opentelemetry/api\";\nimport { createIsolatedOtel } from \"@photon-ai/otel\";\n\nconst auditOtel = createIsolatedOtel({\n  endpoint: \"https://audit-collector.example.com\",\n  serviceName: \"audit-service\",\n  serviceVersion: \"1.2.3\",\n  baggageHeader: \"x-audit-baggage\",\n  traceparentHeader: \"x-audit-traceparent\",\n});\nconst auditLogger = auditOtel.createLogger(\"example.audit\");\n\nconst baggage = propagation.createBaggage({\n  \"audit.tenant.id\": { value: \"tenant-123\" },\n});\nconst baggageContext = propagation.setBaggage(\n  auditOtel.propagation.capture(),\n  baggage\n);\n\nawait auditOtel.propagation.run(baggageContext, () =>\n  auditOtel.withSpan(\"audit.write\", async () => {\n    auditLogger.emit({ body: \"writing audit entry\" });\n  })\n);\n\nawait auditOtel.shutdown();\n```\n\n`serviceName` / `serviceVersion` / `resourceAttributes` work exactly as they do\nin `setupOtel()`. Unlike `setupOtel()`, this is a plain factory rather than a\nprocess-wide singleton: each call returns a new independent runtime that you own\nand shut down yourself.\n\nThe isolated runtime has its own providers, processors, exporters, Resource, and\n`AsyncLocalStorage` context. It does not register globals, instrument fetch,\nread the main `OTEL_EXPORTER_OTLP_*` variables, add `deployment.environment`, or\nrequire `setupOtel()`.\n\nIts propagation helper carries isolated trace context through the configured\n`traceparentHeader`. When `baggageHeader` is present, `inject()` and `extract()`\nalso serialize standard OTel Baggage through that private carrier. They never\nchange the standard `traceparent`, `tracestate`, or `baggage` headers used by\nmain OTel.\n\nThe runtime does not add a second Baggage API. Use\n`@opentelemetry/api`'s `createBaggage()` / `setBaggage()` on the Context returned\nby `propagation.capture()`, then activate the returned immutable Context with\nthe isolated `propagation.run()` as shown above.\n\nIf an isolated Span callback throws, the runtime marks the Span `ERROR` and\nrethrows the same value without automatically recording its type, message, or\nstack. Call `auditOtel.recordError(error)` inside the active callback when those\nexception details should be exported. Calling it outside a local recording Span\nis a diagnostic no-op.\n\n### Logger signatures\n\n```ts\nlog.debug(message, attrs?, error?);\nlog.info(message, attrs?, error?);\nlog.warn(message, attrs?, error?); // attach the exception that caused a retry\nlog.error(message, attrs?, error?);\n```\n\nEvery level takes the same `(message, attrs?, error?)` shape — attach an exception to a\n`warn`/`info`/`debug`, not just `error`. `attrs` is\n`Record<string, string | number | boolean | undefined>`; `undefined` values are dropped.\n\nAn `Error` is recorded as `exception.type` / `exception.message` / `exception.stacktrace`\non the OTLP record (per the OTel exception semantic convention); a non-`Error` throw is\ncoerced so at least `exception.message` is preserved.\n\nEach call also prints a single human-readable console line — `[module] LEVEL message\n{ ...attrs }` plus the raw error (so the runtime renders the full stack) — routed to\n`console.debug` / `console.info` / `console.warn` / `console.error` by severity. Both\nsinks share one level gate.\n\n### Log level\n\nLogs below the active level are dropped from **both** OTLP and the console. The level is\nresolved fresh on every call, so changes take effect immediately:\n\n1. `setLogLevel(level)` or `setupOtel({ logLevel })`.\n2. `LOG_LEVEL` env var (`debug` | `info` | `warn` | `error` | `silent`).\n3. Default: `info`.\n\nLogger configuration is independent of `DEPLOYMENT_ENV`; that variable only supplies\nOpenTelemetry resource metadata. Environment values are trimmed and case-insensitive. An\ninvalid `LOG_LEVEL` falls back to `info` and warns once per distinct value, while an invalid\nprogrammatic value throws a `TypeError` immediately (useful for untyped JavaScript callers).\n\n```ts\nimport { setLogLevel } from \"@photon-ai/otel\";\n\nsetLogLevel(\"warn\"); // debug + info now suppressed everywhere\n// LOG_LEVEL is used only when no programmatic level has been set\n```\n\n`\"silent\"` suppresses everything, including errors.\n\n## Configuration\n\nStandard OpenTelemetry exporter env vars take precedence over endpoint and\nheader options. Logger and deployment metadata variables follow the behavior\nlisted below:\n\n| Variable                                  | Effect                                                  |\n| ----------------------------------------- | ------------------------------------------------------- |\n| `OTEL_EXPORTER_OTLP_ENDPOINT`             | Base endpoint; `/v1/traces`, `/v1/logs`, and `/v1/metrics` auto-appended. |\n| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`      | Full traces URL (overrides the base for traces).        |\n| `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT`        | Full logs URL (overrides the base for logs).            |\n| `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT`     | Full metrics URL (overrides the base for metrics).      |\n| `OTEL_EXPORTER_OTLP_HEADERS`              | `key=value,key=value` headers; merged with `options.headers` (env wins). |\n| `OTEL_EXPORTER_OTLP_<SIGNAL>_HEADERS`     | Trace-, log-, or metric-specific headers; override generic and code headers. |\n| `OTEL_METRIC_EXPORT_INTERVAL`             | Metric export interval in milliseconds. Defaults to `60000`. |\n| `OTEL_METRIC_EXPORT_TIMEOUT`              | Metric export timeout in milliseconds. Defaults to `30000`. |\n| `DEPLOYMENT_ENV`                          | Attached as `deployment.environment` resource attribute. Defaults to `development`; does not affect logging. |\n| `LOG_LEVEL`                               | Minimum log level: `debug` \\| `info` \\| `warn` \\| `error` \\| `silent`. Used when no programmatic level is set; defaults to `info`. |\n\n## Automatic fetch instrumentation\n\n`setupOtel()` instruments outbound `fetch` to emit a CLIENT span per request, carrying W3C\n`traceparent` (and baggage) headers so traces continue across services. Spans are named by HTTP\nmethod (`GET`, `POST`, …) and carry `http.request.method`, `url.full`, `server.address`,\n`server.port`, and `http.response.status_code`. This covers **outbound** requests only — inbound\n`Bun.serve`/Elysia server spans are separate (see [Framework integration](#framework-integration)).\n\nThe strategy depends on the runtime (`mode: \"auto\"`, the default):\n\n- **Node** uses the official `@opentelemetry/instrumentation-undici` (Node's `fetch` is undici-backed).\n  It captures all undici traffic — not just `globalThis.fetch` — emits the full HTTP-client semantic\n  conventions (`url.scheme`, `url.path`, `network.peer.*`, `user_agent.original`, …), and never\n  monkey-patches the global. It ships as an optional dependency; if it isn't installed, the library\n  falls back to the global wrap.\n- **Bun** wraps `globalThis.fetch` directly. Bun's native `fetch` emits no `diagnostics_channel`\n  events, so `@opentelemetry/instrumentation-undici` / `-http` produce no spans there — wrapping the\n  global is the only mechanism that works.\n\nOptions (`instrumentFetch`):\n\n- **`true` / `false`:** force on (even without an endpoint) / off. Defaults to on when a traces\n  endpoint is configured.\n- **`mode`:** `\"auto\"` (default — native on Node, wrap on Bun) or `\"global\"` (wrap on both runtimes).\n  Choose `\"global\"` when you want identical spans everywhere and the built-in PII scrubbing of error\n  messages kept on Node (see caveats).\n- **`ignore`:** `instrumentFetch: { ignore: (url) => url.includes(\"/healthz\") }`. Your own OTLP\n  endpoint is always excluded automatically, so the exporter never traces itself.\n- **`redactUrl`:** `instrumentFetch: { redactUrl: (url) => sanitizeUrl(url, { params: [\"token\"] }) }`\n  rewrites the URL stored as `url.full`, so you keep the span but drop secrets from the query string or\n  path. On Node it forces the `globalThis.fetch` wrap (undici can't rewrite `url.full`).\n- **`record`:** opt-in structured request/response logs linked to the fetch span. Select\n  `{ preset: \"bounded\" }`, `{ preset: \"full\" }`, or `{ preset: \"custom\" }` explicitly.\n  Recording forces the wrapper on Node and requires a logs exporter.\n\n### Request and response recording\n\nRecording is disabled by default. Select a preset; `record: true` is invalid:\n\n```ts\nsetupOtel({\n  serviceName: \"orders-api\",\n  endpoint: \"http://localhost:4318\",\n  instrumentFetch: {\n    record: { preset: \"bounded\" },\n  },\n});\n```\n\n| Setting | `bounded` | `full` | `custom` |\n| --- | --- | --- | --- |\n| Body bytes per direction | 1 MiB | Unlimited | Unlimited |\n| Body capture time per direction | 30 seconds | Unlimited | Unlimited |\n| Concurrent recorded fetches per wrapper | 32 | Unlimited | Unlimited |\n| Headers | Allowlist | All | All |\n| Custom parsers | Not supported | Not supported | Optional |\n\nAll presets support `maxBodyBytes`, `bodyTimeoutMs`, `maxConcurrentCaptures`, and\n`headers` overrides. `Infinity` removes a numerical limit. The bounded header\nallowlist is `accept`, `content-type`, `content-length`, `x-request-id`, `traceparent`,\nand `retry-after`; override it with header names or `\"all\"`.\n\nOnly `custom` accepts parsers, which receive the entire request/response snapshot:\n\n```ts\nconst debugFetch = createInstrumentedFetch(undefined, {\n  record: {\n    preset: \"custom\", // Full defaults; add limits if desired.\n    parseRequest: (request) => ({ ...request, source: \"orders-client\" }),\n    parseResponse: (response) => {\n      const isJson = response.headers[\"content-type\"]?.some(\n        (value) => value.includes(\"application/json\")\n      );\n      if (!isJson || !response.capture.complete || response.body?.encoding !== \"utf8\") {\n        return response;\n      }\n      return { ...response, parsedBody: JSON.parse(response.body.data) };\n    },\n  },\n});\n```\n\nUse `setupOtel({ ..., instrumentFetch: false })` when instrumenting clients separately.\nCalling a wrapper again does not replace its existing configuration.\n\nWithout a parser, bodies stay raw: lossless UTF-8 or base64, never automatic JSON,\nform, or SSE parsing. Custom parsers may be async and must return JSON-compatible\nvalues. `parserTimeoutMs` defaults to 5 seconds. Parser failures default to raw\nfallback plus error details; use `onParserError: \"omit\"` when parsers remove\nsensitive content. Only `custom` accepts these parser settings.\n\nRecords are DEBUG OTLP logs named `photon.fetch.request`, `photon.fetch.response`,\nand `photon.fetch.error`, with the fetch span's trace/span IDs. They do not print\nto the console and are independent of `createLogger()`'s log level. Bodies are\nread from clones in the background; the application receives the original response\nwithout waiting for recording. `shutdown()` drains pending records before exporter\nshutdown. Standalone instrumentation can call `await flushFetchRecords()` before\nshutting down its own providers; this drains capture, not the exporters themselves.\n\n`full` and `custom` collect all Fetch-visible headers, including credentials and\ncookies, and may buffer large or never-ending bodies. They are explicit debugging\nchoices. Records identify incomplete captures and their reasons; full capture is\nlimited to Fetch-visible data and cannot guarantee delivery past process crashes or\nbackend limits. See the [fetch instrumentation guide](docs/guides/fetch-instrumentation.mdx)\nfor the record format, limits, parser failure behavior, and shutdown details.\n\nCaveats:\n\n- **Telemetry differs by runtime under `\"auto\"`.** undici (Node) emits richer attributes and follows\n  HTTP semconv for span status — a 2xx client span is left `UNSET`, and only `5xx`/network failures are\n  marked `ERROR`; the Bun wrap marks all `4xx`/`5xx` as `ERROR`. The Bun wrap also scrubs PII from the\n  error message attached to span status — **undici does not**. Use `mode: \"global\"` for parity.\n- **`url.full` includes the query string** on both. If your URLs carry secrets there, strip them with\n  `redactUrl` (keeps the span) or drop the request with `ignore`.\n- **Native fetch tracing needs Node ≥ 20.6** (the undici instrumentation's floor); older 20.x falls\n  back to the global wrap.\n\n`setupOtel()` also installs a global W3C trace-context + baggage propagator (previously none was\nregistered) — that is what makes the outbound `traceparent` injection, and any manual propagation,\nactually take effect.\n\n## Instrumenting a specific fetch (SDKs)\n\nSometimes you don't want to touch `globalThis.fetch` — you just want one SDK's outbound calls traced.\n`createInstrumentedFetch(baseFetch?, options?)` returns a **new** fetch (CLIENT spans + W3C\n`traceparent` injection) wrapping `baseFetch` (default `globalThis.fetch`, read at call time) **without\nmutating the global**. Pass it wherever an SDK accepts a `fetch`:\n\n```ts\nimport { createInstrumentedFetch } from \"@photon-ai/otel\";\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n  // tag every span from this SDK so it's distinguishable from other traffic\n  fetch: createInstrumentedFetch(undefined, {\n    attributes: { \"peer.service\": \"openai\" },\n  }),\n});\n```\n\n- Returns a fetch function directly — there's no global lifecycle, so no `unpatch()` handle.\n- Idempotent: passing an already-instrumented fetch returns it unchanged.\n- `options`: `ignore: (url) => boolean` skips spans for some URLs; `attributes` merges static attributes\n  into every span (the practical way to tell different SDKs' spans apart); `redactUrl: (url) => string`\n  rewrites `url.full` to strip secrets (pair with `sanitizeUrl`).\n- Always uses the wrapper technique, so it behaves identically on Bun and Node (the native undici\n  instrumentation can't target a single instance).\n\n**Avoid double-counting on Node.** If `setupOtel()`'s global fetch instrumentation is active (the\ndefault on Node uses undici, which captures *all* undici traffic), an SDK request made through a\nper-instance wrapper is recorded **twice** — once by the wrapper, once by undici. When instrumenting\nSDKs per-instance, disable the global path with `setupOtel({ instrumentFetch: false })` (or reserve\nper-instance wrapping for SDKs you accept doubling on). **Bun has no such issue** — its global wrap only\naffects `globalThis.fetch`, so a separately-passed instrumented fetch is counted once.\n\n## Scoped mode (embedding in a library)\n\nBy default `setupOtel()` registers the process-global OpenTelemetry tracer/logger/meter providers — the\nconvenient app-level setup. If you're building a **library** that ships its own telemetry, that would\ntake over the host application's OpenTelemetry. Pass `register: false` to run **scoped**:\n\n```ts\nconst otel = setupOtel({ serviceName: \"my-lib\", register: false });\n\n// withSpan / createLogger emit into the library's own providers...\nawait withSpan(\"work\", async () => {\n  /* ... */\n});\n// ...and the host app's global tracer/logger/meter providers are left untouched.\n```\n\nIn scoped mode:\n\n- **No global takeover.** `setupOtel()` does not register its tracer, logger, or meter provider globally;\n  the library's spans, logs, and metrics flow to its own providers while the host keeps its global OTel.\n- **The top-level helpers still work** — `withSpan`, `createLogger`, and `createInstrumentedFetch` resolve\n  through the library's providers automatically.\n- **Shared context is preserved.** A W3C propagator and an `AsyncLocalStorageContextManager` are installed\n  only if absent, so span nesting and `traceparent` propagation work — and if the host already set them, the\n  library shares the host's (spans nest across the boundary).\n- **Auto fetch instrumentation defaults off** (wrapping `globalThis.fetch` is process-wide, and native undici\n  can only read the global provider). Trace a specific client with `createInstrumentedFetch()` instead.\n- **The handle owns metric lookup.** Use `otel.getMeter(name)` for the common path; it always resolves through\n  this setup's provider, including in scoped mode.\n- **The handle exposes the providers** — `otel.tracerProvider`, `otel.loggerProvider`, and `otel.meterProvider`\n  — as advanced integration escape hatches.\n\n## Running on Node vs Bun\n\nThe same code runs unmodified on both. Pick whichever you prefer:\n\n```bash\nbun run src/server.ts\n# or\nnode --experimental-strip-types src/server.ts\n```\n\nThe package uses `process.env` (not `Bun.env`) and `AsyncLocalStorageContextManager` (backed by `async_hooks`), both of which are supported natively by Bun and Node ≥ 20.\n\nThe one runtime-specific behavior is fetch instrumentation — native undici on Node, a `globalThis.fetch` wrap on Bun (see [Automatic fetch instrumentation](#automatic-fetch-instrumentation)). Set `instrumentFetch: { mode: \"global\" }` for identical behavior on both.\n\nFor Bun consumers, the `exports` map points at the TypeScript source via the `bun` condition for faster cold starts during dev. Node consumers get the pre-built ESM bundle.\n\n## Why HTTP exporters only?\n\n- Bun's gRPC support is incomplete in some paths — HTTP is reliable everywhere.\n- JSON-over-HTTP is trivial to debug with `curl` and a packet sniffer.\n- One fewer transport keeps the dependency surface small.\n\nIf you need gRPC, instantiate your own exporter and processor with `@opentelemetry/api` directly — `setupOtel()` is opinionated, not a wall.\n\n## Framework integration\n\nThis package is framework-agnostic. For Elysia.js (Bun-native), see the [`elysiajs-otel` skill](https://github.com/anthropics/claude-code) for a recipe combining `@photon-ai/otel` with `@elysiajs/opentelemetry` auto-instrumentation. A dedicated `@photon-ai/otel-elysia` package may follow.\n\n## License\n\nMIT\n","readmeFilename":"README.md","homepage":"https://github.com/photon-hq/otel#readme","repository":{"type":"git","url":"git+https://github.com/photon-hq/otel.git"},"bugs":{"url":"https://github.com/photon-hq/otel/issues"}}