@storyshelf/observability 0.8.0 → 0.9.0-next-d2cc082
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -3
- package/dist/config.d.mts +1 -3
- package/dist/config.mjs +2 -7
- package/dist/config.mjs.map +1 -1
- package/dist/node.d.mts +1 -1
- package/dist/node.mjs +2 -3
- package/dist/node.mjs.map +1 -1
- package/dist/tracing.mjs +1 -2
- package/dist/tracing.mjs.map +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +2 -11
package/README.md
CHANGED
|
@@ -48,9 +48,7 @@ await app.lifecycle.setup();
|
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
`storyshelf server init` scaffolds exactly this preamble. Two entrypoints by design: the root is `@opentelemetry/api`
|
|
51
|
-
only (
|
|
52
|
-
must never be imported under Deno (`OTEL_DENO=true` uses Deno's native OTEL
|
|
53
|
-
instead).
|
|
51
|
+
only (runtime-agnostic); `./node` holds the Node SDK lifecycle.
|
|
54
52
|
|
|
55
53
|
## What it exports
|
|
56
54
|
|
package/dist/config.d.mts
CHANGED
|
@@ -5,9 +5,7 @@ import __tsdown_shims_url from 'node:url';
|
|
|
5
5
|
*
|
|
6
6
|
* Standard `OTEL_*` variables win; `STORYSHELF_OTEL_*` covers StoryShelf
|
|
7
7
|
* specifics. When `OTEL_EXPORTER_OTLP_ENDPOINT` is unset the SDK stays a
|
|
8
|
-
* noop (zero overhead, hermetic tests).
|
|
9
|
-
* Deno's built-in OTEL (`OTEL_DENO=true`) bridges `npm:@opentelemetry/api`
|
|
10
|
-
* natively, so a NodeSDK must never start under Deno.
|
|
8
|
+
* noop (zero overhead, hermetic tests).
|
|
11
9
|
*/
|
|
12
10
|
/** Resolved observability configuration for the Node SDK entrypoint. */
|
|
13
11
|
interface ObservabilityConfig {
|
package/dist/config.mjs
CHANGED
|
@@ -4,11 +4,6 @@ import.meta.url;
|
|
|
4
4
|
// src/config.ts
|
|
5
5
|
const DEFAULT_SERVICE_NAME = "storyshelf";
|
|
6
6
|
const DEFAULT_METRICS_INTERVAL_MS = 6e4;
|
|
7
|
-
/** Whether the current runtime is Deno (native OTEL owns the SDK there). */
|
|
8
|
-
function isDenoRuntime(env) {
|
|
9
|
-
if (env["OTEL_DENO"] === "true") return true;
|
|
10
|
-
return globalThis.Deno !== void 0;
|
|
11
|
-
}
|
|
12
7
|
/** Parse one `k=v` pair into the headers record. */
|
|
13
8
|
function parseHeaderPair(pair, headers) {
|
|
14
9
|
const separator = pair.indexOf("=");
|
|
@@ -42,7 +37,7 @@ function resolveObservabilityConfig(env = process.env, serviceVersion) {
|
|
|
42
37
|
const sdkDisabled = env["OTEL_SDK_DISABLED"] === "true";
|
|
43
38
|
const explicit = env["STORYSHELF_OTEL_ENABLED"];
|
|
44
39
|
return {
|
|
45
|
-
enabled: !sdkDisabled &&
|
|
40
|
+
enabled: !sdkDisabled && (explicit ? explicit === "true" : Boolean(endpoint)),
|
|
46
41
|
endpoint,
|
|
47
42
|
headers: parseHeaders(env["OTEL_EXPORTER_OTLP_HEADERS"]),
|
|
48
43
|
serviceName: env["OTEL_SERVICE_NAME"] ?? DEFAULT_SERVICE_NAME,
|
|
@@ -56,7 +51,7 @@ function resolveObservabilityConfig(env = process.env, serviceVersion) {
|
|
|
56
51
|
* runs, where the identifier is undeclared, from throwing.
|
|
57
52
|
*/
|
|
58
53
|
function packageVersion() {
|
|
59
|
-
return "0.
|
|
54
|
+
return "0.9.0-next-d2cc082";
|
|
60
55
|
}
|
|
61
56
|
export { resolveObservabilityConfig };
|
|
62
57
|
|
package/dist/config.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["/**\n * Environment-driven observability configuration.\n *\n * Standard `OTEL_*` variables win; `STORYSHELF_OTEL_*` covers StoryShelf\n * specifics. When `OTEL_EXPORTER_OTLP_ENDPOINT` is unset the SDK stays a\n * noop (zero overhead, hermetic tests)
|
|
1
|
+
{"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["/**\n * Environment-driven observability configuration.\n *\n * Standard `OTEL_*` variables win; `STORYSHELF_OTEL_*` covers StoryShelf\n * specifics. When `OTEL_EXPORTER_OTLP_ENDPOINT` is unset the SDK stays a\n * noop (zero overhead, hermetic tests).\n */\n\n/** Resolved observability configuration for the Node SDK entrypoint. */\nexport interface ObservabilityConfig {\n /** Whether to start the SDK (false = noop handle). */\n enabled: boolean;\n /** OTLP/HTTP endpoint, e.g. `http://collector:4318`. */\n endpoint?: string;\n /** Extra OTLP headers (`OTEL_EXPORTER_OTLP_HEADERS`, `k=v,k2=v2`). */\n headers?: Record<string, string>;\n /** Resource `service.name`. */\n serviceName: string;\n /** Resource `service.version`. */\n serviceVersion?: string;\n /** Metric export interval in milliseconds. */\n metricsIntervalMs: number;\n}\n\nconst DEFAULT_SERVICE_NAME = \"storyshelf\";\nconst DEFAULT_METRICS_INTERVAL_MS = 60_000;\n\n/** Parse one `k=v` pair into the headers record. */\nfunction parseHeaderPair(pair: string, headers: Record<string, string>): void {\n const separator = pair.indexOf(\"=\");\n if (separator === -1) {\n return;\n }\n const key = pair.slice(0, separator).trim();\n const value = pair.slice(separator + 1).trim();\n if (key) {\n headers[key] = value;\n }\n}\n\n/** Parse `k=v,k2=v2` header syntax into a record. */\nfunction parseHeaders(raw: string | undefined): Record<string, string> | undefined {\n if (!raw) {\n return undefined;\n }\n const headers: Record<string, string> = {};\n for (const pair of raw.split(\",\")) {\n parseHeaderPair(pair, headers);\n }\n return Object.keys(headers).length === 0 ? undefined : headers;\n}\n\n/** Parse a positive integer env value with a fallback. */\nfunction parseInterval(raw: string | undefined, fallback: number): number {\n const parsed = Number(raw);\n if (!raw || !Number.isFinite(parsed) || parsed <= 0) {\n return fallback;\n }\n return Math.trunc(parsed);\n}\n\n/**\n * Resolve the observability configuration from the environment.\n *\n * @param env - Environment record (defaults to `process.env`).\n * @param serviceVersion - Version for the resource (defaults to `__PKG_VERSION__`).\n * @returns The resolved config; `enabled` is false without an endpoint.\n */\nexport function resolveObservabilityConfig(\n env: NodeJS.ProcessEnv = process.env,\n serviceVersion?: string,\n): ObservabilityConfig {\n const endpoint = env[\"OTEL_EXPORTER_OTLP_ENDPOINT\"];\n const sdkDisabled = env[\"OTEL_SDK_DISABLED\"] === \"true\";\n const explicit = env[\"STORYSHELF_OTEL_ENABLED\"];\n const enabled = !sdkDisabled && (explicit ? explicit === \"true\" : Boolean(endpoint));\n return {\n enabled,\n endpoint,\n headers: parseHeaders(env[\"OTEL_EXPORTER_OTLP_HEADERS\"]),\n serviceName: env[\"OTEL_SERVICE_NAME\"] ?? DEFAULT_SERVICE_NAME,\n serviceVersion: serviceVersion ?? packageVersion(),\n metricsIntervalMs: parseInterval(\n env[\"STORYSHELF_OTEL_METRICS_INTERVAL_MS\"],\n DEFAULT_METRICS_INTERVAL_MS,\n ),\n };\n}\n\ndeclare const __PKG_VERSION__: string | undefined;\n\n/**\n * Package version injected at build via the `__PKG_VERSION__` define. Read as a bare identifier\n * (defines don't replace `globalThis` member reads); the `typeof` guard keeps source-condition\n * runs, where the identifier is undeclared, from throwing.\n */\nfunction packageVersion(): string | undefined {\n return typeof __PKG_VERSION__ === \"string\" ? __PKG_VERSION__ : undefined;\n}\n"],"mappings":";;;;AAwBA,MAAM,uBAAuB;AAC7B,MAAM,8BAA8B;;AAGpC,SAAS,gBAAgB,MAAc,SAAuC;CAC5E,MAAM,YAAY,KAAK,QAAQ,GAAG;CAClC,IAAI,cAAc,IAChB;CAEF,MAAM,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC,KAAK;CAC1C,MAAM,QAAQ,KAAK,MAAM,YAAY,CAAC,CAAC,CAAC,KAAK;CAC7C,IAAI,KACF,QAAQ,OAAO;AAEnB;;AAGA,SAAS,aAAa,KAA6D;CACjF,IAAI,CAAC,KACH;CAEF,MAAM,UAAkC,CAAC;CACzC,KAAK,MAAM,QAAQ,IAAI,MAAM,GAAG,GAC9B,gBAAgB,MAAM,OAAO;CAE/B,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,IAAI,KAAA,IAAY;AACzD;;AAGA,SAAS,cAAc,KAAyB,UAA0B;CACxE,MAAM,SAAS,OAAO,GAAG;CACzB,IAAI,CAAC,OAAO,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAChD,OAAO;CAET,OAAO,KAAK,MAAM,MAAM;AAC1B;;;;;;;;AASA,SAAgB,2BACd,MAAyB,QAAQ,KACjC,gBACqB;CACrB,MAAM,WAAW,IAAI;CACrB,MAAM,cAAc,IAAI,yBAAyB;CACjD,MAAM,WAAW,IAAI;CAErB,OAAO;EACL,SAFc,CAAC,gBAAgB,WAAW,aAAa,SAAS,QAAQ,QAAQ;EAGhF;EACA,SAAS,aAAa,IAAI,6BAA6B;EACvD,aAAa,IAAI,wBAAwB;EACzC,gBAAgB,kBAAkB,eAAe;EACjD,mBAAmB,cACjB,IAAI,wCACJ,2BACF;CACF;AACF;;;;;;AASA,SAAS,iBAAqC;CAC5C,OAAA;AACF"}
|
package/dist/node.d.mts
CHANGED
|
@@ -7,7 +7,7 @@ import { ObservabilityConfig, resolveObservabilityConfig } from "./config.mjs";
|
|
|
7
7
|
*
|
|
8
8
|
* Starts the Node SDK when `OTEL_EXPORTER_OTLP_ENDPOINT` (or
|
|
9
9
|
* `STORYSHELF_OTEL_ENABLED=true`) is set; otherwise returns a noop handle
|
|
10
|
-
* (also
|
|
10
|
+
* (also when `OTEL_SDK_DISABLED=true`). Call before
|
|
11
11
|
* `createShelfApp` and flush via the handle next to `app.lifecycle.teardown`.
|
|
12
12
|
*
|
|
13
13
|
* @param env - Environment record (defaults to `process.env`).
|
package/dist/node.mjs
CHANGED
|
@@ -13,8 +13,7 @@ import { ATTR_DEPLOYMENT_ENVIRONMENT_NAME, ATTR_SERVICE_NAME, ATTR_SERVICE_VERSI
|
|
|
13
13
|
* Node-only OTEL SDK lifecycle.
|
|
14
14
|
*
|
|
15
15
|
* Separate entrypoint (`@storyshelf/observability/node`) so the cross-runtime
|
|
16
|
-
* root never pulls Node SDK modules.
|
|
17
|
-
* `initObservabilityFromEnv` noops there and Deno's native OTEL owns export.
|
|
16
|
+
* root never pulls Node SDK modules.
|
|
18
17
|
*/
|
|
19
18
|
/** Noop handle: SDK disabled, nothing to flush. */
|
|
20
19
|
function noopHandle() {
|
|
@@ -66,7 +65,7 @@ function startSdk(config) {
|
|
|
66
65
|
*
|
|
67
66
|
* Starts the Node SDK when `OTEL_EXPORTER_OTLP_ENDPOINT` (or
|
|
68
67
|
* `STORYSHELF_OTEL_ENABLED=true`) is set; otherwise returns a noop handle
|
|
69
|
-
* (also
|
|
68
|
+
* (also when `OTEL_SDK_DISABLED=true`). Call before
|
|
70
69
|
* `createShelfApp` and flush via the handle next to `app.lifecycle.teardown`.
|
|
71
70
|
*
|
|
72
71
|
* @param env - Environment record (defaults to `process.env`).
|
package/dist/node.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.mjs","names":[],"sources":["../src/node.ts"],"sourcesContent":["/**\n * Node-only OTEL SDK lifecycle.\n *\n * Separate entrypoint (`@storyshelf/observability/node`) so the cross-runtime\n * root never pulls Node SDK modules
|
|
1
|
+
{"version":3,"file":"node.mjs","names":[],"sources":["../src/node.ts"],"sourcesContent":["/**\n * Node-only OTEL SDK lifecycle.\n *\n * Separate entrypoint (`@storyshelf/observability/node`) so the cross-runtime\n * root never pulls Node SDK modules.\n */\nimport { OTLPMetricExporter } from \"@opentelemetry/exporter-metrics-otlp-http\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { PeriodicExportingMetricReader } from \"@opentelemetry/sdk-metrics\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport {\n ATTR_DEPLOYMENT_ENVIRONMENT_NAME,\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from \"@opentelemetry/semantic-conventions\";\nimport { resolveObservabilityConfig, type ObservabilityConfig } from \"./config.ts\";\nimport type { ObservabilityHandle } from \"./types.ts\";\n\n/** Noop handle: SDK disabled, nothing to flush. */\nfunction noopHandle(): ObservabilityHandle {\n return {\n enabled: false,\n shutdown: async (): Promise<void> => {\n await Promise.resolve();\n },\n };\n}\n\n/** OTLP/HTTP exporter options shared by trace and metric exporters. */\nfunction exporterOptions(config: ObservabilityConfig): {\n url?: string;\n headers?: Record<string, string>;\n} {\n return {\n url: config.endpoint ? `${config.endpoint}/v1/traces` : undefined,\n headers: config.headers,\n };\n}\n\n/** Start the Node SDK wired to the OTLP/HTTP endpoint. */\nfunction startSdk(config: ObservabilityConfig): ObservabilityHandle {\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n ...(config.serviceVersion ? { [ATTR_SERVICE_VERSION]: config.serviceVersion } : {}),\n ...(process.env[\"NODE_ENV\"]\n ? { [ATTR_DEPLOYMENT_ENVIRONMENT_NAME]: process.env[\"NODE_ENV\"] }\n : {}),\n });\n const sdk = new NodeSDK({\n resource,\n traceExporter: new OTLPTraceExporter(exporterOptions(config)),\n metricReaders: [\n new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({\n url: config.endpoint ? `${config.endpoint}/v1/metrics` : undefined,\n headers: config.headers,\n }),\n exportIntervalMillis: config.metricsIntervalMs,\n }),\n ],\n });\n sdk.start();\n let shut = false;\n return {\n enabled: true,\n shutdown: async (): Promise<void> => {\n if (shut) {\n return;\n }\n shut = true;\n await sdk.shutdown();\n },\n };\n}\n\n/**\n * Initialize observability from the environment.\n *\n * Starts the Node SDK when `OTEL_EXPORTER_OTLP_ENDPOINT` (or\n * `STORYSHELF_OTEL_ENABLED=true`) is set; otherwise returns a noop handle\n * (also when `OTEL_SDK_DISABLED=true`). Call before\n * `createShelfApp` and flush via the handle next to `app.lifecycle.teardown`.\n *\n * @param env - Environment record (defaults to `process.env`).\n * @returns The SDK handle (check `enabled`, always call `shutdown`).\n */\n// oxlint-disable-next-line typescript/require-await -- async signature; the disabled fast-path is synchronous\nexport async function initObservabilityFromEnv(\n env: NodeJS.ProcessEnv = process.env,\n): Promise<ObservabilityHandle> {\n const config = resolveObservabilityConfig(env);\n if (!config.enabled) {\n return noopHandle();\n }\n return startSdk(config);\n}\n\nexport { resolveObservabilityConfig } from \"./config.ts\";\nexport type { ObservabilityConfig } from \"./config.ts\";\nexport type { ObservabilityHandle } from \"./types.ts\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoBA,SAAS,aAAkC;CACzC,OAAO;EACL,SAAS;EACT,UAAU,YAA2B;GACnC,MAAM,QAAQ,QAAQ;EACxB;CACF;AACF;;AAGA,SAAS,gBAAgB,QAGvB;CACA,OAAO;EACL,KAAK,OAAO,WAAW,GAAG,OAAO,SAAS,cAAc,KAAA;EACxD,SAAS,OAAO;CAClB;AACF;;AAGA,SAAS,SAAS,QAAkD;CAClE,MAAM,WAAW,uBAAuB;GACrC,oBAAoB,OAAO;EAC5B,GAAI,OAAO,iBAAiB,GAAG,uBAAuB,OAAO,eAAe,IAAI,CAAC;EACjF,GAAI,QAAQ,IAAI,cACZ,GAAG,mCAAmC,QAAQ,IAAI,YAAY,IAC9D,CAAC;CACP,CAAC;CACD,MAAM,MAAM,IAAI,QAAQ;EACtB;EACA,eAAe,IAAI,kBAAkB,gBAAgB,MAAM,CAAC;EAC5D,eAAe,CACb,IAAI,8BAA8B;GAChC,UAAU,IAAI,mBAAmB;IAC/B,KAAK,OAAO,WAAW,GAAG,OAAO,SAAS,eAAe,KAAA;IACzD,SAAS,OAAO;GAClB,CAAC;GACD,sBAAsB,OAAO;EAC/B,CAAC,CACH;CACF,CAAC;CACD,IAAI,MAAM;CACV,IAAI,OAAO;CACX,OAAO;EACL,SAAS;EACT,UAAU,YAA2B;GACnC,IAAI,MACF;GAEF,OAAO;GACP,MAAM,IAAI,SAAS;EACrB;CACF;AACF;;;;;;;;;;;;AAcA,eAAsB,yBACpB,MAAyB,QAAQ,KACH;CAC9B,MAAM,SAAS,2BAA2B,GAAG;CAC7C,IAAI,CAAC,OAAO,SACV,OAAO,WAAW;CAEpB,OAAO,SAAS,MAAM;AACxB"}
|
package/dist/tracing.mjs
CHANGED
|
@@ -5,8 +5,7 @@ import { HttpError, redactSecrets } from "@storyshelf/core/utils";
|
|
|
5
5
|
import { SpanKind, SpanStatusCode, context, trace } from "@opentelemetry/api";
|
|
6
6
|
// src/tracing.ts
|
|
7
7
|
/**
|
|
8
|
-
* Span helpers over `@opentelemetry/api` (runtime-agnostic
|
|
9
|
-
* Deno's native bridge). Without a configured provider these are cheap
|
|
8
|
+
* Span helpers over `@opentelemetry/api` (runtime-agnostic). Without a configured provider these are cheap
|
|
10
9
|
* noops, so call sites need no enabled-checks.
|
|
11
10
|
*/
|
|
12
11
|
/**
|
package/dist/tracing.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.mjs","names":[],"sources":["../src/tracing.ts"],"sourcesContent":["/**\n * Span helpers over `@opentelemetry/api` (runtime-agnostic
|
|
1
|
+
{"version":3,"file":"tracing.mjs","names":[],"sources":["../src/tracing.ts"],"sourcesContent":["/**\n * Span helpers over `@opentelemetry/api` (runtime-agnostic). Without a configured provider these are cheap\n * noops, so call sites need no enabled-checks.\n */\nimport {\n SpanKind,\n SpanStatusCode,\n context,\n trace,\n type Attributes,\n type Context,\n type Span,\n} from \"@opentelemetry/api\";\nimport { HttpError, redactSecrets } from \"@storyshelf/core/utils\";\n\n/**\n * What a span records of a caught error: a copy with the same `name` and a `redactSecrets` message\n * (connection strings, tokens and keys stay out of exported spans), and for an `HttpError` its\n * status only, never the response body. The caller still gets the original error rethrown.\n * Intentional copy of core's `spanException` (ADR 0015 §5 no-cycle rule: do not deduplicate).\n */\nfunction recordedError(error: unknown): Error | string {\n if (!(error instanceof Error)) {\n return redactSecrets(String(error));\n }\n const message =\n error instanceof HttpError ? `HTTP ${String(error.status)}` : redactSecrets(error.message);\n const copy = new Error(message);\n copy.name = error.name;\n const header = `${error.name}: ${error.message}`;\n const frames = error.stack?.startsWith(header) ? error.stack.slice(header.length) : \"\";\n copy.stack = `${error.name}: ${message}${redactSecrets(frames)}`;\n return copy;\n}\n\n/** Instrumentation scope for observability-package spans. */\nconst SCOPE = \"storyshelf.observability\";\n\n/**\n * Run `fn` inside an internal span.\n *\n * On throw the span records the exception, is marked ERROR, and the error\n * is rethrown — mirroring the pino `{ err }` convention.\n *\n * @param name - Span name (`domain.operation`, never a high-cardinality value).\n * @param fn - Work to run with the span active.\n * @param attributes - Fixed span attributes (no high-cardinality values in names).\n * @param parent - Parent context (defaults to the active context).\n * @returns Whatever `fn` returns.\n */\nexport async function withSpan<T>(\n name: string,\n fn: (span: Span) => Promise<T>,\n attributes?: Attributes,\n parent?: Context,\n): Promise<T> {\n const tracer = trace.getTracer(SCOPE);\n return await tracer.startActiveSpan(\n name,\n { kind: SpanKind.INTERNAL, attributes },\n parent ?? context.active(),\n async (span) => {\n try {\n return await fn(span);\n } catch (error) {\n span.recordException(recordedError(error));\n span.setStatus({ code: SpanStatusCode.ERROR });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAqBA,SAAS,cAAc,OAAgC;CACrD,IAAI,EAAE,iBAAiB,QACrB,OAAO,cAAc,OAAO,KAAK,CAAC;CAEpC,MAAM,UACJ,iBAAiB,YAAY,QAAQ,OAAO,MAAM,MAAM,MAAM,cAAc,MAAM,OAAO;CAC3F,MAAM,OAAO,IAAI,MAAM,OAAO;CAC9B,KAAK,OAAO,MAAM;CAClB,MAAM,SAAS,GAAG,MAAM,KAAK,IAAI,MAAM;CACvC,MAAM,SAAS,MAAM,OAAO,WAAW,MAAM,IAAI,MAAM,MAAM,MAAM,OAAO,MAAM,IAAI;CACpF,KAAK,QAAQ,GAAG,MAAM,KAAK,IAAI,UAAU,cAAc,MAAM;CAC7D,OAAO;AACT;;AAGA,MAAM,QAAQ;;;;;;;;;;;;;AAcd,eAAsB,SACpB,MACA,IACA,YACA,QACY;CAEZ,OAAO,MADQ,MAAM,UAAU,KACb,CAAC,CAAC,gBAClB,MACA;EAAE,MAAM,SAAS;EAAU;CAAW,GACtC,UAAU,QAAQ,OAAO,GACzB,OAAO,SAAS;EACd,IAAI;GACF,OAAO,MAAM,GAAG,IAAI;EACtB,SAAS,OAAO;GACd,KAAK,gBAAgB,cAAc,KAAK,CAAC;GACzC,KAAK,UAAU,EAAE,MAAM,eAAe,MAAM,CAAC;GAC7C,MAAM;EACR,UAAU;GACR,KAAK,IAAI;EACX;CACF,CACF;AACF"}
|
package/dist/types.d.mts
CHANGED
|
@@ -5,7 +5,7 @@ import { Attributes } from "@opentelemetry/api";
|
|
|
5
5
|
type SpanAttributes = Attributes;
|
|
6
6
|
/** Shutdown handle for the observability SDK (see `node.ts`). */
|
|
7
7
|
interface ObservabilityHandle {
|
|
8
|
-
/** Whether the SDK is active (false = noop: no endpoint configured
|
|
8
|
+
/** Whether the SDK is active (false = noop: no endpoint configured). */
|
|
9
9
|
readonly enabled: boolean;
|
|
10
10
|
/** Flush exporters and release SDK resources. Idempotent. */
|
|
11
11
|
shutdown(): Promise<void>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@storyshelf/observability",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0-next-d2cc082",
|
|
4
4
|
"description": "StoryShelf observability: OpenTelemetry tracing, metrics, and log correlation over @storyshelf/core adapters.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"metrics",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"@opentelemetry/sdk-metrics": "^2.11.0",
|
|
66
66
|
"@opentelemetry/sdk-node": "^0.222.0",
|
|
67
67
|
"@opentelemetry/semantic-conventions": "^1.43.0",
|
|
68
|
-
"@storyshelf/core": "0.
|
|
68
|
+
"@storyshelf/core": "0.9.0-next-d2cc082",
|
|
69
69
|
"drizzle-orm": "^0.45.4",
|
|
70
70
|
"hono": "^4.11.0"
|
|
71
71
|
},
|
|
@@ -86,14 +86,5 @@
|
|
|
86
86
|
},
|
|
87
87
|
"engines": {
|
|
88
88
|
"node": ">=24"
|
|
89
|
-
},
|
|
90
|
-
"jsr": {
|
|
91
|
-
"runtimeCompat": {
|
|
92
|
-
"node": true,
|
|
93
|
-
"deno": true,
|
|
94
|
-
"bun": true,
|
|
95
|
-
"workerd": false,
|
|
96
|
-
"browser": false
|
|
97
|
-
}
|
|
98
89
|
}
|
|
99
90
|
}
|