@kronos-ts/opentelemetry 0.1.4 → 0.2.1

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/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { createOpenTelemetrySpanFactory, type OpenTelemetrySpanFactoryOptions, } from "./opentelemetry-span-factory.js";
2
2
  export { openTelemetry } from "./opentelemetry.js";
3
+ export { createOpenTelemetryDeadLetterListener } from "./opentelemetry-dead-letter-listener.js";
3
4
  export { createTracingCommandBus } from "@kronos-ts/messaging";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,KAAK,+BAA+B,GACrC,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,KAAK,+BAA+B,GACrC,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAA;AAG/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { createOpenTelemetrySpanFactory, } from "./opentelemetry-span-factory.js";
2
2
  export { openTelemetry } from "./opentelemetry.js";
3
+ export { createOpenTelemetryDeadLetterListener } from "./opentelemetry-dead-letter-listener.js";
3
4
  // Re-export tracing command bus for convenience
4
5
  export { createTracingCommandBus } from "@kronos-ts/messaging";
5
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,GAE/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,gDAAgD;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,GAE/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAA;AAE/F,gDAAgD;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,21 @@
1
+ import type { DeadLetterListener, SpanFactory } from "@kronos-ts/messaging";
2
+ import { type OpenTelemetrySpanFactoryOptions } from "./opentelemetry-span-factory.js";
3
+ /**
4
+ * An OpenTelemetry {@link DeadLetterListener} that emits a short internal span
5
+ * for each dead-letter lifecycle transition, recording the cause as a span
6
+ * exception on failures and overflow (backpressure).
7
+ *
8
+ * Attach it to a processor via the builder:
9
+ * ```typescript
10
+ * trackingProcessor("balances")
11
+ * .deadLetterQueue(dlq)
12
+ * .deadLetterListener(createOpenTelemetryDeadLetterListener())
13
+ * ```
14
+ *
15
+ * Unlike {@link openTelemetry} (which decorates the command bus and enhances
16
+ * handlers app-wide), the DLQ listener is attached per processor, so this is a
17
+ * standalone factory. Pass a shared `spanFactory` to correlate with the rest of
18
+ * your tracing, or let it build one from `options`.
19
+ */
20
+ export declare function createOpenTelemetryDeadLetterListener(options?: OpenTelemetrySpanFactoryOptions, spanFactory?: SpanFactory): DeadLetterListener;
21
+ //# sourceMappingURL=opentelemetry-dead-letter-listener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opentelemetry-dead-letter-listener.d.ts","sourceRoot":"","sources":["../src/opentelemetry-dead-letter-listener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,iCAAiC,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qCAAqC,CACnD,OAAO,GAAE,+BAAoC,EAC7C,WAAW,GAAE,WAAqD,GACjE,kBAAkB,CA4BpB"}
@@ -0,0 +1,52 @@
1
+ import { createOpenTelemetrySpanFactory, } from "./opentelemetry-span-factory.js";
2
+ /**
3
+ * An OpenTelemetry {@link DeadLetterListener} that emits a short internal span
4
+ * for each dead-letter lifecycle transition, recording the cause as a span
5
+ * exception on failures and overflow (backpressure).
6
+ *
7
+ * Attach it to a processor via the builder:
8
+ * ```typescript
9
+ * trackingProcessor("balances")
10
+ * .deadLetterQueue(dlq)
11
+ * .deadLetterListener(createOpenTelemetryDeadLetterListener())
12
+ * ```
13
+ *
14
+ * Unlike {@link openTelemetry} (which decorates the command bus and enhances
15
+ * handlers app-wide), the DLQ listener is attached per processor, so this is a
16
+ * standalone factory. Pass a shared `spanFactory` to correlate with the rest of
17
+ * your tracing, or let it build one from `options`.
18
+ */
19
+ export function createOpenTelemetryDeadLetterListener(options = {}, spanFactory = createOpenTelemetrySpanFactory(options)) {
20
+ const emit = (name, error) => {
21
+ const span = spanFactory.createInternalSpan(name).start();
22
+ // recordException ends the span; otherwise end it normally.
23
+ if (error)
24
+ span.recordException(error);
25
+ else
26
+ span.end();
27
+ };
28
+ return {
29
+ onEnqueued(letter, info) {
30
+ if (info.blocked)
31
+ emit("dlq.blocked");
32
+ else
33
+ emit("dlq.enqueue", letter.cause);
34
+ },
35
+ onEvicted() {
36
+ emit("dlq.evict");
37
+ },
38
+ onRequeued() {
39
+ emit("dlq.requeue");
40
+ },
41
+ onReprocessSuccess() {
42
+ emit("dlq.reprocess.success");
43
+ },
44
+ onReprocessFailure(_letter, cause) {
45
+ emit("dlq.reprocess.failure", cause);
46
+ },
47
+ onOverflow(_sequenceIdentifier, cause) {
48
+ emit("dlq.overflow", cause);
49
+ },
50
+ };
51
+ }
52
+ //# sourceMappingURL=opentelemetry-dead-letter-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opentelemetry-dead-letter-listener.js","sourceRoot":"","sources":["../src/opentelemetry-dead-letter-listener.ts"],"names":[],"mappings":"AACA,OAAO,EACL,8BAA8B,GAE/B,MAAM,iCAAiC,CAAA;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,qCAAqC,CACnD,UAA2C,EAAE,EAC7C,cAA2B,8BAA8B,CAAC,OAAO,CAAC;IAElE,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE;QAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAA;QACzD,4DAA4D;QAC5D,IAAI,KAAK;YAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;;YACjC,IAAI,CAAC,GAAG,EAAE,CAAA;IACjB,CAAC,CAAA;IACD,OAAO;QACL,UAAU,CAAC,MAAM,EAAE,IAAI;YACrB,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,aAAa,CAAC,CAAA;;gBAChC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QACxC,CAAC;QACD,SAAS;YACP,IAAI,CAAC,WAAW,CAAC,CAAA;QACnB,CAAC;QACD,UAAU;YACR,IAAI,CAAC,aAAa,CAAC,CAAA;QACrB,CAAC;QACD,kBAAkB;YAChB,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAC/B,CAAC;QACD,kBAAkB,CAAC,OAAO,EAAE,KAAK;YAC/B,IAAI,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;QACtC,CAAC;QACD,UAAU,CAAC,mBAAmB,EAAE,KAAK;YACnC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;QAC7B,CAAC;KACF,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kronos-ts/opentelemetry",
3
- "version": "0.1.4",
3
+ "version": "0.2.1",
4
4
  "description": "OpenTelemetry extension for Kronos — tracing for commands and events.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -49,14 +49,14 @@
49
49
  }
50
50
  },
51
51
  "dependencies": {
52
- "@kronos-ts/common": "0.1.0",
53
- "@kronos-ts/app": "0.1.0",
54
- "@kronos-ts/messaging": "0.1.0",
52
+ "@kronos-ts/common": "0.1.1",
53
+ "@kronos-ts/app": "0.3.3",
54
+ "@kronos-ts/messaging": "0.5.0",
55
55
  "@opentelemetry/api": "^1.9"
56
56
  },
57
57
  "devDependencies": {
58
- "@kronos-ts/eventsourcing": "0.1.0",
59
- "@kronos-ts/modelling": "0.1.0",
58
+ "@kronos-ts/eventsourcing": "0.2.0",
59
+ "@kronos-ts/modelling": "0.2.3",
60
60
  "@opentelemetry/sdk-trace-base": "^1.30.0",
61
61
  "@opentelemetry/sdk-trace-node": "^1.30.0",
62
62
  "zod": "^4.3.6"
package/src/index.ts CHANGED
@@ -5,5 +5,7 @@ export {
5
5
 
6
6
  export { openTelemetry } from "./opentelemetry.js"
7
7
 
8
+ export { createOpenTelemetryDeadLetterListener } from "./opentelemetry-dead-letter-listener.js"
9
+
8
10
  // Re-export tracing command bus for convenience
9
11
  export { createTracingCommandBus } from "@kronos-ts/messaging"
@@ -0,0 +1,55 @@
1
+ import type { DeadLetterListener, SpanFactory } from "@kronos-ts/messaging"
2
+ import {
3
+ createOpenTelemetrySpanFactory,
4
+ type OpenTelemetrySpanFactoryOptions,
5
+ } from "./opentelemetry-span-factory.js"
6
+
7
+ /**
8
+ * An OpenTelemetry {@link DeadLetterListener} that emits a short internal span
9
+ * for each dead-letter lifecycle transition, recording the cause as a span
10
+ * exception on failures and overflow (backpressure).
11
+ *
12
+ * Attach it to a processor via the builder:
13
+ * ```typescript
14
+ * trackingProcessor("balances")
15
+ * .deadLetterQueue(dlq)
16
+ * .deadLetterListener(createOpenTelemetryDeadLetterListener())
17
+ * ```
18
+ *
19
+ * Unlike {@link openTelemetry} (which decorates the command bus and enhances
20
+ * handlers app-wide), the DLQ listener is attached per processor, so this is a
21
+ * standalone factory. Pass a shared `spanFactory` to correlate with the rest of
22
+ * your tracing, or let it build one from `options`.
23
+ */
24
+ export function createOpenTelemetryDeadLetterListener(
25
+ options: OpenTelemetrySpanFactoryOptions = {},
26
+ spanFactory: SpanFactory = createOpenTelemetrySpanFactory(options),
27
+ ): DeadLetterListener {
28
+ const emit = (name: string, error?: Error) => {
29
+ const span = spanFactory.createInternalSpan(name).start()
30
+ // recordException ends the span; otherwise end it normally.
31
+ if (error) span.recordException(error)
32
+ else span.end()
33
+ }
34
+ return {
35
+ onEnqueued(letter, info) {
36
+ if (info.blocked) emit("dlq.blocked")
37
+ else emit("dlq.enqueue", letter.cause)
38
+ },
39
+ onEvicted() {
40
+ emit("dlq.evict")
41
+ },
42
+ onRequeued() {
43
+ emit("dlq.requeue")
44
+ },
45
+ onReprocessSuccess() {
46
+ emit("dlq.reprocess.success")
47
+ },
48
+ onReprocessFailure(_letter, cause) {
49
+ emit("dlq.reprocess.failure", cause)
50
+ },
51
+ onOverflow(_sequenceIdentifier, cause) {
52
+ emit("dlq.overflow", cause)
53
+ },
54
+ }
55
+ }