@kronos-ts/opentelemetry 0.1.4 → 0.2.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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/opentelemetry-dead-letter-listener.d.ts +21 -0
- package/dist/opentelemetry-dead-letter-listener.d.ts.map +1 -0
- package/dist/opentelemetry-dead-letter-listener.js +52 -0
- package/dist/opentelemetry-dead-letter-listener.js.map +1 -0
- package/package.json +6 -6
- package/src/index.ts +2 -0
- package/src/opentelemetry-dead-letter-listener.ts +55 -0
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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.
|
|
3
|
+
"version": "0.2.0",
|
|
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.
|
|
53
|
-
"@kronos-ts/app": "0.
|
|
54
|
-
"@kronos-ts/messaging": "0.
|
|
52
|
+
"@kronos-ts/common": "0.1.1",
|
|
53
|
+
"@kronos-ts/app": "0.3.2",
|
|
54
|
+
"@kronos-ts/messaging": "0.4.0",
|
|
55
55
|
"@opentelemetry/api": "^1.9"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@kronos-ts/eventsourcing": "0.1.
|
|
59
|
-
"@kronos-ts/modelling": "0.
|
|
58
|
+
"@kronos-ts/eventsourcing": "0.1.5",
|
|
59
|
+
"@kronos-ts/modelling": "0.2.2",
|
|
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
|
+
}
|