@btravstack/observability 0.13.0 → 0.15.0

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 CHANGED
@@ -33,7 +33,7 @@ class OrderRepository extends Port("OrderRepository")<{
33
33
  > **strict** `Logger` port — no `any`, no printf, no mutable context, no static
34
34
  > instance — a default implementation that stamps every line with the ambient
35
35
  > unit's trace id, a dependency-free JSON sink, pino behind a subpath, and the
36
- > kernel's nine lifecycle events as log lines in the same stream.
36
+ > kernel's ten lifecycle events as log lines in the same stream.
37
37
 
38
38
  📖 **[Documentation](https://btravstack.github.io/btravstack/reference/observability)** ·
39
39
  [How-to](https://btravstack.github.io/btravstack/how-to/log-and-correlate) ·
package/dist/index.cjs CHANGED
@@ -222,6 +222,13 @@ const kernelEvents = (logger) => (event) => {
222
222
  abandoned: event.report.abandoned
223
223
  });
224
224
  return;
225
+ case "stoppedWaiting":
226
+ logger.warn("the kernel stopped waiting for a phase with no deadline of its own", {
227
+ event: event.type,
228
+ phase: event.phase,
229
+ ...event.afterMs === void 0 ? {} : { afterMs: event.afterMs }
230
+ });
231
+ return;
225
232
  default: logger.info(event.type, { event: event.type });
226
233
  }
227
234
  };
package/dist/index.d.cts CHANGED
@@ -13,7 +13,7 @@ import { Module } from "@btravstack/di";
13
13
  * `Config.string`, so it inherits the semantics every other variable has: an
14
14
  * unset variable takes the default, a set-but-blank one is an error.
15
15
  */
16
- declare const logLevel: (options?: {
16
+ export declare const logLevel: (options?: {
17
17
  readonly default?: Level;
18
18
  }) => ConfigField<Level>;
19
19
  /** What `observability()` binds from the environment. */
@@ -32,7 +32,7 @@ type LoggerSettings = {
32
32
  * The unit's ids are spread at the top level rather than nested under `unit`,
33
33
  * because `traceId` is the field an operator searches.
34
34
  */
35
- declare const jsonSink: (stream?: {
35
+ export declare const jsonSink: (stream?: {
36
36
  readonly write: (chunk: string) => unknown;
37
37
  }) => Sink;
38
38
  //#endregion
@@ -43,7 +43,7 @@ declare const LoggerConfig_base: import("@btravstack/di").PortClass<"LoggerConfi
43
43
  * filters at. A port of its own, like a starter's `HttpConfig`, so anything
44
44
  * that wants to know reads it rather than re-deriving it.
45
45
  */
46
- declare class LoggerConfig extends LoggerConfig_base<LoggerSettings> {}
46
+ export declare class LoggerConfig extends LoggerConfig_base<LoggerSettings> {}
47
47
  type ObservabilityOptions = {
48
48
  /**
49
49
  * Where lines go. Default: one JSON object per line on `stdout`. The
@@ -63,7 +63,7 @@ type ObservabilityOptions = {
63
63
  * `currentUnit()` per call — so a request's lines are attributable with no
64
64
  * argument threaded through the call stack.
65
65
  */
66
- declare const observability: (options?: ObservabilityOptions) => Module<Logger | LoggerConfig | Observers, ConfigInvalid, Env>;
66
+ export declare const observability: (options?: ObservabilityOptions) => Module<Logger | LoggerConfig | Observers, ConfigInvalid, Env>;
67
67
  /**
68
68
  * The kernel's nine lifecycle events, as log lines on `logger` — the adapter
69
69
  * between `StartOptions.onEvent` and an application's own stream.
@@ -76,6 +76,6 @@ declare const observability: (options?: ObservabilityOptions) => Module<Logger |
76
76
  * The logger is a PARAMETER, not resolved: `building` is emitted while the graph
77
77
  * is still being built, so the sink cannot come from the context it watches.
78
78
  */
79
- declare const kernelEvents: (logger: LoggerService) => EventSink;
79
+ export declare const kernelEvents: (logger: LoggerService) => EventSink;
80
80
  //#endregion
81
- export { type Line, LoggerConfig, type LoggerSettings, type ObservabilityOptions, type Sink, createLogger, jsonSink, kernelEvents, logLevel, observability };
81
+ export { type Line, type LoggerSettings, type ObservabilityOptions, type Sink, createLogger };
package/dist/index.d.mts CHANGED
@@ -13,7 +13,7 @@ import { Module } from "@btravstack/di";
13
13
  * `Config.string`, so it inherits the semantics every other variable has: an
14
14
  * unset variable takes the default, a set-but-blank one is an error.
15
15
  */
16
- declare const logLevel: (options?: {
16
+ export declare const logLevel: (options?: {
17
17
  readonly default?: Level;
18
18
  }) => ConfigField<Level>;
19
19
  /** What `observability()` binds from the environment. */
@@ -32,7 +32,7 @@ type LoggerSettings = {
32
32
  * The unit's ids are spread at the top level rather than nested under `unit`,
33
33
  * because `traceId` is the field an operator searches.
34
34
  */
35
- declare const jsonSink: (stream?: {
35
+ export declare const jsonSink: (stream?: {
36
36
  readonly write: (chunk: string) => unknown;
37
37
  }) => Sink;
38
38
  //#endregion
@@ -43,7 +43,7 @@ declare const LoggerConfig_base: import("@btravstack/di").PortClass<"LoggerConfi
43
43
  * filters at. A port of its own, like a starter's `HttpConfig`, so anything
44
44
  * that wants to know reads it rather than re-deriving it.
45
45
  */
46
- declare class LoggerConfig extends LoggerConfig_base<LoggerSettings> {}
46
+ export declare class LoggerConfig extends LoggerConfig_base<LoggerSettings> {}
47
47
  type ObservabilityOptions = {
48
48
  /**
49
49
  * Where lines go. Default: one JSON object per line on `stdout`. The
@@ -63,7 +63,7 @@ type ObservabilityOptions = {
63
63
  * `currentUnit()` per call — so a request's lines are attributable with no
64
64
  * argument threaded through the call stack.
65
65
  */
66
- declare const observability: (options?: ObservabilityOptions) => Module<Logger | LoggerConfig | Observers, ConfigInvalid, Env>;
66
+ export declare const observability: (options?: ObservabilityOptions) => Module<Logger | LoggerConfig | Observers, ConfigInvalid, Env>;
67
67
  /**
68
68
  * The kernel's nine lifecycle events, as log lines on `logger` — the adapter
69
69
  * between `StartOptions.onEvent` and an application's own stream.
@@ -76,6 +76,6 @@ declare const observability: (options?: ObservabilityOptions) => Module<Logger |
76
76
  * The logger is a PARAMETER, not resolved: `building` is emitted while the graph
77
77
  * is still being built, so the sink cannot come from the context it watches.
78
78
  */
79
- declare const kernelEvents: (logger: LoggerService) => EventSink;
79
+ export declare const kernelEvents: (logger: LoggerService) => EventSink;
80
80
  //#endregion
81
- export { type Line, LoggerConfig, type LoggerSettings, type ObservabilityOptions, type Sink, createLogger, jsonSink, kernelEvents, logLevel, observability };
81
+ export { type Line, type LoggerSettings, type ObservabilityOptions, type Sink, createLogger };
package/dist/index.mjs CHANGED
@@ -221,6 +221,13 @@ const kernelEvents = (logger) => (event) => {
221
221
  abandoned: event.report.abandoned
222
222
  });
223
223
  return;
224
+ case "stoppedWaiting":
225
+ logger.warn("the kernel stopped waiting for a phase with no deadline of its own", {
226
+ event: event.type,
227
+ phase: event.phase,
228
+ ...event.afterMs === void 0 ? {} : { afterMs: event.afterMs }
229
+ });
230
+ return;
224
231
  default: logger.info(event.type, { event: event.type });
225
232
  }
226
233
  };
package/dist/otel.cjs CHANGED
@@ -93,10 +93,7 @@ const otel = (options) => (0, _btravstack_di.Module)("Otel")({
93
93
  }),
94
94
  (0, _btravstack_di.Provider)(_btravstack_core.Tracer)({
95
95
  inject: { sdk: OtelSdk },
96
- sync: () => {
97
- const tracer = _opentelemetry_api.trace.getTracer("@btravstack/observability");
98
- return { startSpan: (name) => tracer.startSpan(name) };
99
- }
96
+ sync: () => _opentelemetry_api.trace.getTracer("@btravstack/observability")
100
97
  }),
101
98
  (0, _btravstack_di.Provider)(_btravstack_core.Meter)({
102
99
  inject: { sdk: OtelSdk },
package/dist/otel.d.cts CHANGED
@@ -29,10 +29,10 @@ import { NodeSDKConfiguration } from "@opentelemetry/sdk-node";
29
29
  * plan time and in `Needs`. Guice's `newSetBinder` declares the empty set for
30
30
  * the same reason.
31
31
  */
32
- declare const otel: (options?: Partial<NodeSDKConfiguration>) => Module<Tracer | Meter | Observers, never, Scope>;
32
+ export declare const otel: (options?: Partial<NodeSDKConfiguration>) => Module<Tracer | Meter | Observers, never, Scope>;
33
33
  declare const UnitSpan_base: import("@btravstack/di").PortClass<"UnitSpan">;
34
34
  /** The span a unit rides, ended when the unit's fork closes. */
35
- declare class UnitSpan extends UnitSpan_base<Span> {}
35
+ export declare class UnitSpan extends UnitSpan_base<Span> {}
36
36
  /**
37
37
  * A span per unit, as a module a starter's own `unit` option binds: the runtime
38
38
  * forks it around every unit it opens, so the span opens when the fork is built
@@ -47,6 +47,5 @@ declare class UnitSpan extends UnitSpan_base<Span> {}
47
47
  * Bind it as a starter's `unit` module — `unit: { anonymous: UnitSpanModule }`,
48
48
  * `unit: { message: … }`, `unit: { activity: … }`; the root must export `Tracer`.
49
49
  */
50
- declare const UnitSpanModule: Module<UnitSpan, never, Scope | Tracer>;
51
- //#endregion
52
- export { UnitSpan, UnitSpanModule, otel };
50
+ export declare const UnitSpanModule: Module<UnitSpan, never, Scope | Tracer>;
51
+ //#endregion
package/dist/otel.d.mts CHANGED
@@ -29,10 +29,10 @@ import { NodeSDKConfiguration } from "@opentelemetry/sdk-node";
29
29
  * plan time and in `Needs`. Guice's `newSetBinder` declares the empty set for
30
30
  * the same reason.
31
31
  */
32
- declare const otel: (options?: Partial<NodeSDKConfiguration>) => Module<Tracer | Meter | Observers, never, Scope>;
32
+ export declare const otel: (options?: Partial<NodeSDKConfiguration>) => Module<Tracer | Meter | Observers, never, Scope>;
33
33
  declare const UnitSpan_base: import("@btravstack/di").PortClass<"UnitSpan">;
34
34
  /** The span a unit rides, ended when the unit's fork closes. */
35
- declare class UnitSpan extends UnitSpan_base<Span> {}
35
+ export declare class UnitSpan extends UnitSpan_base<Span> {}
36
36
  /**
37
37
  * A span per unit, as a module a starter's own `unit` option binds: the runtime
38
38
  * forks it around every unit it opens, so the span opens when the fork is built
@@ -47,6 +47,5 @@ declare class UnitSpan extends UnitSpan_base<Span> {}
47
47
  * Bind it as a starter's `unit` module — `unit: { anonymous: UnitSpanModule }`,
48
48
  * `unit: { message: … }`, `unit: { activity: … }`; the root must export `Tracer`.
49
49
  */
50
- declare const UnitSpanModule: Module<UnitSpan, never, Scope | Tracer>;
51
- //#endregion
52
- export { UnitSpan, UnitSpanModule, otel };
50
+ export declare const UnitSpanModule: Module<UnitSpan, never, Scope | Tracer>;
51
+ //#endregion
package/dist/otel.mjs CHANGED
@@ -92,10 +92,7 @@ const otel = (options) => Module("Otel")({
92
92
  }),
93
93
  Provider(Tracer)({
94
94
  inject: { sdk: OtelSdk },
95
- sync: () => {
96
- const tracer = trace.getTracer("@btravstack/observability");
97
- return { startSpan: (name) => tracer.startSpan(name) };
98
- }
95
+ sync: () => trace.getTracer("@btravstack/observability")
99
96
  }),
100
97
  Provider(Meter)({
101
98
  inject: { sdk: OtelSdk },
package/dist/pino.d.cts CHANGED
@@ -22,6 +22,5 @@ import { Logger } from "pino";
22
22
  * validated at startup. `fatal` and `trace` map to pino's own; the ambient
23
23
  * unit's ids ride as fields, not as a message prefix, so they stay indexable.
24
24
  */
25
- declare const pinoSink: (logger: Logger) => Sink;
26
- //#endregion
27
- export { pinoSink };
25
+ export declare const pinoSink: (logger: Logger) => Sink;
26
+ //#endregion
package/dist/pino.d.mts CHANGED
@@ -22,6 +22,5 @@ import { Logger } from "pino";
22
22
  * validated at startup. `fatal` and `trace` map to pino's own; the ambient
23
23
  * unit's ids ride as fields, not as a message prefix, so they stay indexable.
24
24
  */
25
- declare const pinoSink: (logger: Logger) => Sink;
26
- //#endregion
27
- export { pinoSink };
25
+ export declare const pinoSink: (logger: Logger) => Sink;
26
+ //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@btravstack/observability",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "description": "Observability for @btravstack/core: a strict Logger port correlated with the kernel's units, a dependency-free JSON sink, and the lifecycle events as log lines",
5
5
  "keywords": [
6
6
  "dependency-injection",
@@ -65,31 +65,31 @@
65
65
  "./package.json": "./package.json"
66
66
  },
67
67
  "devDependencies": {
68
+ "@btravstack/config": "0.15.0",
69
+ "@btravstack/core": "0.15.0",
70
+ "@btravstack/di": "0.15.0",
71
+ "@btravstack/testing": "0.15.0",
68
72
  "@btravstack/tsconfig": "0.4.0",
69
73
  "@opentelemetry/api": "1.9.1",
70
- "@opentelemetry/sdk-node": "0.221.0",
71
- "@opentelemetry/sdk-trace": "2.10.0",
72
- "@types/node": "26.4.0",
73
- "@unthrown/vitest": "5.7.0",
74
+ "@opentelemetry/sdk-node": "0.222.0",
75
+ "@opentelemetry/sdk-trace": "2.11.0",
76
+ "@types/node": "26.4.1",
77
+ "@unthrown/vitest": "5.8.0",
74
78
  "@vitest/coverage-v8": "4.1.11",
75
79
  "pino": "10.3.1",
76
- "tsdown": "0.22.14",
80
+ "tsdown": "0.23.0",
77
81
  "typescript": "7.0.2",
78
- "unthrown": "5.7.0",
79
- "vitest": "4.1.11",
80
- "@btravstack/config": "0.13.0",
81
- "@btravstack/core": "0.13.0",
82
- "@btravstack/di": "0.13.0",
83
- "@btravstack/testing": "0.13.0"
82
+ "unthrown": "5.8.0",
83
+ "vitest": "4.1.11"
84
84
  },
85
85
  "peerDependencies": {
86
+ "@btravstack/config": "^0.15.0",
87
+ "@btravstack/core": "^0.15.0",
88
+ "@btravstack/di": "^0.15.0",
86
89
  "@opentelemetry/api": "^1.9.0",
87
90
  "@opentelemetry/sdk-node": "^0.221.0",
88
91
  "pino": "^10",
89
- "unthrown": "^5.0.0",
90
- "@btravstack/config": "^0.13.0",
91
- "@btravstack/core": "^0.13.0",
92
- "@btravstack/di": "^0.13.0"
92
+ "unthrown": "^5.0.0"
93
93
  },
94
94
  "peerDependenciesMeta": {
95
95
  "@opentelemetry/api": {
@@ -107,7 +107,7 @@
107
107
  },
108
108
  "scripts": {
109
109
  "build": "tsdown src/index.ts src/pino.ts src/otel.ts --format cjs,esm --dts --clean",
110
- "dev": "tsdown src/index.ts src/pino.ts --format cjs,esm --dts --watch",
110
+ "dev": "tsdown src/index.ts src/pino.ts src/otel.ts --format cjs,esm --dts --watch",
111
111
  "test": "vitest run --coverage",
112
112
  "typecheck": "tsc --noEmit"
113
113
  }