{"_id":"@021.is/spine-telemetry","_rev":"2-039b6f04dab1f275db2dfda1d241729a","name":"@021.is/spine-telemetry","dist-tags":{"latest":"0.4.3"},"versions":{"0.4.0":{"name":"@021.is/spine-telemetry","version":"0.4.0","license":"MIT","_id":"@021.is/spine-telemetry@0.4.0","maintainers":[{"name":"edvone","email":"edvard@edvone.dev"}],"homepage":"https://github.com/021is/spine-ts#readme","bugs":{"url":"https://github.com/021is/spine-ts/issues"},"dist":{"shasum":"e260a4fa2c76f096b191f57729ad807384f86d72","tarball":"https://registry.npmjs.org/@021.is/spine-telemetry/-/spine-telemetry-0.4.0.tgz","fileCount":6,"integrity":"sha512-hO8vxnIPzxRN6XeKsvpv5ofivyAs26IoFLlckPv9NFXoxfahZrtTPW1cV+3ISq1AgER3CZ8nyInpWX+AaX3iyQ==","signatures":[{"sig":"MEYCIQC3d8p3CbqR6h1naJuRNq6VW7B5PEKgBY1V4u9D1GayiwIhANNEUDQuLIYELqJA5eHI9CCTdy20uBbSkcFQHJUJwWtf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9805},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./tracing":{"types":"./dist/tracing.d.ts","import":"./dist/tracing.js"}},"gitHead":"e4434c6f59db8f586e0f05ffdb3b88a96e68e67b","scripts":{"build":"tsup src/index.ts src/tracing.ts --format esm --dts --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"edvone","email":"edvard@edvone.dev"},"repository":{"url":"git+https://github.com/021is/spine-ts.git","type":"git","directory":"packages/telemetry"},"_npmVersion":"10.9.4","description":"Pino structured JSON logger + AsyncLocalStorage request context + opt-in OpenTelemetry SDK wire-up (withSpan helper, OTLP HTTP exporter).","directories":{},"_nodeVersion":"22.22.0","dependencies":{"pino":"^9.5.0","@opentelemetry/api":"^1.9.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@opentelemetry/sdk-node":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/semantic-conventions":"^1.41.1","@opentelemetry/exporter-trace-otlp-http":"^0.218.0"},"peerDependencies":{"@opentelemetry/sdk-node":">=0.55","@opentelemetry/resources":">=1.30","@opentelemetry/semantic-conventions":">=1.30","@opentelemetry/exporter-trace-otlp-http":">=0.55"},"peerDependenciesMeta":{"@opentelemetry/sdk-node":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/semantic-conventions":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/spine-telemetry_0.4.0_1779981971803_0.30282574015712327","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@021.is/spine-telemetry","version":"0.4.3","license":"MIT","description":"Pino structured JSON logger + AsyncLocalStorage request context + opt-in OpenTelemetry SDK wire-up (withSpan helper, OTLP HTTP exporter).","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./tracing":{"types":"./dist/tracing.d.ts","import":"./dist/tracing.js"}},"scripts":{"build":"tsup src/index.ts src/tracing.ts --format esm --dts --clean","typecheck":"tsc --noEmit"},"dependencies":{"@opentelemetry/api":"^1.9.1","pino":"^9.5.0"},"repository":{"type":"git","url":"git+https://github.com/021is/spine-ts.git","directory":"packages/telemetry"},"publishConfig":{"access":"public"},"devDependencies":{"@opentelemetry/exporter-trace-otlp-http":"^0.218.0","@opentelemetry/resources":"^2.7.1","@opentelemetry/sdk-node":"^0.218.0","@opentelemetry/semantic-conventions":"^1.41.1"},"peerDependencies":{"@opentelemetry/sdk-node":">=0.55","@opentelemetry/exporter-trace-otlp-http":">=0.55","@opentelemetry/resources":">=1.30","@opentelemetry/semantic-conventions":">=1.30"},"peerDependenciesMeta":{"@opentelemetry/sdk-node":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/semantic-conventions":{"optional":true}},"_id":"@021.is/spine-telemetry@0.4.3","gitHead":"b9f9333776fa55686cc2feb05f851aa6000b0e05","bugs":{"url":"https://github.com/021is/spine-ts/issues"},"homepage":"https://github.com/021is/spine-ts#readme","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-uv9MitAgX0e+T01mt+jClMuzpIvXOhAbIMpyA2rSGEsakYglezvwqbfntx4J8k5PZDWnsfesa4MZpzverCk+YQ==","shasum":"c7d213f48b31c64b262363a46ab75b6d1ba9005a","tarball":"https://registry.npmjs.org/@021.is/spine-telemetry/-/spine-telemetry-0.4.3.tgz","fileCount":7,"unpackedSize":11753,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGW8THA7SiOWNSNsz6OlAvBVC0hcwA1BcxgjypjqFl3MAiEA3+e3zQL7z4ACOwLqZnvmMyqYmceYaXoEv6iC03bs1N8="}]},"_npmUser":{"name":"edvone","email":"edvard@edvone.dev"},"directories":{},"maintainers":[{"name":"edvone","email":"edvard@edvone.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spine-telemetry_0.4.3_1779995257213_0.5715613384080236"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-28T15:26:11.604Z","modified":"2026-05-28T19:07:37.538Z","0.4.0":"2026-05-28T15:26:11.955Z","0.4.3":"2026-05-28T19:07:37.401Z"},"bugs":{"url":"https://github.com/021is/spine-ts/issues"},"license":"MIT","homepage":"https://github.com/021is/spine-ts#readme","repository":{"type":"git","url":"git+https://github.com/021is/spine-ts.git","directory":"packages/telemetry"},"description":"Pino structured JSON logger + AsyncLocalStorage request context + opt-in OpenTelemetry SDK wire-up (withSpan helper, OTLP HTTP exporter).","maintainers":[{"name":"edvone","email":"edvard@edvone.dev"}],"readme":"# @021.is/spine-telemetry\n\nPino structured JSON logger with Loki-friendly base fields + AsyncLocalStorage-backed request context. Every log line automatically tagged with `request_id` when inside a request scope — no per-log boilerplate.\n\n## Use\n\n```ts\n// src/lib/logger.ts\nimport { makeLogger } from \"@021.is/spine-telemetry\";\n\nexport const log = makeLogger({\n  service: \"my-app\",\n  cluster: \"eu-1\",\n  env: process.env.NODE_ENV,\n  level: \"info\",\n});\n```\n\n## Request context (Next.js middleware or route wrapper)\n\n```ts\nimport { newRequestId, withRequestContext } from \"@021.is/spine-telemetry\";\n\nexport async function middleware(req: Request) {\n  const requestId = newRequestId();\n  return withRequestContext({ requestId, path: req.url }, async () => {\n    return NextResponse.next();\n  });\n}\n```\n\nNow every `log.info(...)` inside the request chain (across awaits, across files) emits:\n\n```json\n{\n  \"level\": \"info\",\n  \"time\": \"2026-05-25T12:00:00.000Z\",\n  \"service\": \"my-app\",\n  \"cluster\": \"eu-1\",\n  \"env\": \"production\",\n  \"request_id\": \"req_lvxn9k0a1b2c3d\",\n  \"msg\": \"...\"\n}\n```\n\nLoki labels (`service`, `cluster`) make per-app filtering instant in Grafana.\n\n## Why AsyncLocalStorage\n\nDon't pass `logger` or `requestId` through every function argument. The async store does it for you — works across `await`, `setTimeout`, `Promise.all`, etc.\n\n## What's NOT included (yet)\n\n- OpenTelemetry tracer wire-up — planned for next release.\n- Pino transport for Loki HTTP push — for now, write to stdout + ship via Vector.\n","readmeFilename":"README.md"}