@kronos-ts/opentelemetry 0.3.0 → 0.4.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 +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/opentelemetry-metrics-recorder.d.ts +17 -0
- package/dist/opentelemetry-metrics-recorder.d.ts.map +1 -0
- package/dist/opentelemetry-metrics-recorder.js +38 -0
- package/dist/opentelemetry-metrics-recorder.js.map +1 -0
- package/dist/opentelemetry.d.ts +23 -0
- package/dist/opentelemetry.d.ts.map +1 -1
- package/dist/opentelemetry.js +28 -1
- package/dist/opentelemetry.js.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +6 -1
- package/src/opentelemetry-metrics-recorder.ts +52 -0
- package/src/opentelemetry.ts +35 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { createOpenTelemetrySpanFactory, type OpenTelemetrySpanFactoryOptions, } from "./opentelemetry-span-factory.js";
|
|
2
|
-
export { openTelemetry } from "./opentelemetry.js";
|
|
2
|
+
export { openTelemetry, openTelemetryMetrics } from "./opentelemetry.js";
|
|
3
|
+
export { createOpenTelemetryMetricsRecorder, type OpenTelemetryMetricsRecorderOptions, } from "./opentelemetry-metrics-recorder.js";
|
|
3
4
|
export { createOpenTelemetryDeadLetterListener } from "./opentelemetry-dead-letter-listener.js";
|
|
4
5
|
export { createTracingCommandBus } from "@kronos-ts/messaging";
|
|
5
6
|
//# 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,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAExE,OAAO,EACL,kCAAkC,EAClC,KAAK,mCAAmC,GACzC,MAAM,qCAAqC,CAAA;AAE5C,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
|
-
export { openTelemetry } from "./opentelemetry.js";
|
|
2
|
+
export { openTelemetry, openTelemetryMetrics } from "./opentelemetry.js";
|
|
3
|
+
export { createOpenTelemetryMetricsRecorder, } from "./opentelemetry-metrics-recorder.js";
|
|
3
4
|
export { createOpenTelemetryDeadLetterListener } from "./opentelemetry-dead-letter-listener.js";
|
|
4
5
|
// Re-export tracing command bus for convenience
|
|
5
6
|
export { createTracingCommandBus } from "@kronos-ts/messaging";
|
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;
|
|
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,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAExE,OAAO,EACL,kCAAkC,GAEnC,MAAM,qCAAqC,CAAA;AAE5C,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAA;AAE/F,gDAAgD;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Meter } from "@opentelemetry/api";
|
|
2
|
+
import type { MetricsRecorder } from "@kronos-ts/messaging";
|
|
3
|
+
export interface OpenTelemetryMetricsRecorderOptions {
|
|
4
|
+
/** Meter to create instruments from. Defaults to `metrics.getMeter("kronos-framework")`. */
|
|
5
|
+
meter?: Meter;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* MetricsRecorder implementation backed by the OpenTelemetry Metrics API.
|
|
9
|
+
*
|
|
10
|
+
* Instruments are created lazily on the configured Meter; the OTel SDK
|
|
11
|
+
* deduplicates instruments by name, so repeated `counter`/`histogram` calls for
|
|
12
|
+
* the same name write to the same series. As with the span factory, you need an
|
|
13
|
+
* OpenTelemetry MeterProvider configured (e.g. via the OTel SDK or java agent)
|
|
14
|
+
* for measurements to be exported — otherwise this is effectively a no-op.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createOpenTelemetryMetricsRecorder(options?: OpenTelemetryMetricsRecorderOptions): MetricsRecorder;
|
|
17
|
+
//# sourceMappingURL=opentelemetry-metrics-recorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opentelemetry-metrics-recorder.d.ts","sourceRoot":"","sources":["../src/opentelemetry-metrics-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,sBAAsB,CAAA;AAE7B,MAAM,WAAW,mCAAmC;IAClD,4FAA4F;IAC5F,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED;;;;;;;;GAQG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,GAAE,mCAAwC,GAChD,eAAe,CA2BjB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { metrics } from "@opentelemetry/api";
|
|
2
|
+
/**
|
|
3
|
+
* MetricsRecorder implementation backed by the OpenTelemetry Metrics API.
|
|
4
|
+
*
|
|
5
|
+
* Instruments are created lazily on the configured Meter; the OTel SDK
|
|
6
|
+
* deduplicates instruments by name, so repeated `counter`/`histogram` calls for
|
|
7
|
+
* the same name write to the same series. As with the span factory, you need an
|
|
8
|
+
* OpenTelemetry MeterProvider configured (e.g. via the OTel SDK or java agent)
|
|
9
|
+
* for measurements to be exported — otherwise this is effectively a no-op.
|
|
10
|
+
*/
|
|
11
|
+
export function createOpenTelemetryMetricsRecorder(options = {}) {
|
|
12
|
+
const meter = options.meter ?? metrics.getMeter("kronos-framework");
|
|
13
|
+
return {
|
|
14
|
+
counter(name, opts) {
|
|
15
|
+
const instrument = meter.createCounter(name, {
|
|
16
|
+
description: opts?.description,
|
|
17
|
+
unit: opts?.unit,
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
add(value, attributes) {
|
|
21
|
+
instrument.add(value, attributes);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
histogram(name, opts) {
|
|
26
|
+
const instrument = meter.createHistogram(name, {
|
|
27
|
+
description: opts?.description,
|
|
28
|
+
unit: opts?.unit,
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
record(value, attributes) {
|
|
32
|
+
instrument.record(value, attributes);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=opentelemetry-metrics-recorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opentelemetry-metrics-recorder.js","sourceRoot":"","sources":["../src/opentelemetry-metrics-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAc,MAAM,oBAAoB,CAAA;AAaxD;;;;;;;;GAQG;AACH,MAAM,UAAU,kCAAkC,CAChD,UAA+C,EAAE;IAEjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;IAEnE,OAAO;QACL,OAAO,CAAC,IAAY,EAAE,IAAwB;YAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE;gBAC3C,WAAW,EAAE,IAAI,EAAE,WAAW;gBAC9B,IAAI,EAAE,IAAI,EAAE,IAAI;aACjB,CAAC,CAAA;YACF,OAAO;gBACL,GAAG,CAAC,KAAK,EAAE,UAAU;oBACnB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;gBACnC,CAAC;aACF,CAAA;QACH,CAAC;QACD,SAAS,CAAC,IAAY,EAAE,IAAwB;YAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE;gBAC7C,WAAW,EAAE,IAAI,EAAE,WAAW;gBAC9B,IAAI,EAAE,IAAI,EAAE,IAAI;aACjB,CAAC,CAAA;YACF,OAAO;gBACL,MAAM,CAAC,KAAK,EAAE,UAAU;oBACtB,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;gBACtC,CAAC;aACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/opentelemetry.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { App } from "@kronos-ts/app";
|
|
2
|
+
import { type MeteringOptions } from "@kronos-ts/messaging";
|
|
2
3
|
import { type OpenTelemetrySpanFactoryOptions } from "./opentelemetry-span-factory.js";
|
|
4
|
+
import { type OpenTelemetryMetricsRecorderOptions } from "./opentelemetry-metrics-recorder.js";
|
|
3
5
|
/**
|
|
4
6
|
* OpenTelemetry tracing extension for Kronos.
|
|
5
7
|
*
|
|
@@ -33,4 +35,25 @@ import { type OpenTelemetrySpanFactoryOptions } from "./opentelemetry-span-facto
|
|
|
33
35
|
* ```
|
|
34
36
|
*/
|
|
35
37
|
export declare function openTelemetry(options?: OpenTelemetrySpanFactoryOptions): (app: App) => void;
|
|
38
|
+
/**
|
|
39
|
+
* OpenTelemetry metrics extension for Kronos.
|
|
40
|
+
*
|
|
41
|
+
* Wires a metering handler enhancer (via `app.handlerEnhancer(...)`) that
|
|
42
|
+
* records throughput, latency, error rate, and event-processing lag for every
|
|
43
|
+
* command/query/event handler invocation, using the OpenTelemetry Metrics API.
|
|
44
|
+
*
|
|
45
|
+
* Compose independently of (and alongside) {@link openTelemetry}:
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* await kronos()
|
|
50
|
+
* .use(openTelemetry()) // tracing
|
|
51
|
+
* .use(openTelemetryMetrics()) // metrics
|
|
52
|
+
* .start()
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* Requires an OpenTelemetry MeterProvider to be configured for measurements to
|
|
56
|
+
* be exported; without one this is effectively a no-op.
|
|
57
|
+
*/
|
|
58
|
+
export declare function openTelemetryMetrics(options?: OpenTelemetryMetricsRecorderOptions & MeteringOptions): (app: App) => void;
|
|
36
59
|
//# sourceMappingURL=opentelemetry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opentelemetry.d.ts","sourceRoot":"","sources":["../src/opentelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"opentelemetry.d.ts","sourceRoot":"","sources":["../src/opentelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAEL,KAAK,mCAAmC,EACzC,MAAM,qCAAqC,CAAA;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,aAAa,CAC3B,OAAO,GAAE,+BAAoC,GAC5C,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAQpB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,mCAAmC,GAAG,eAAoB,GAClE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAKpB"}
|
package/dist/opentelemetry.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { createTracingCommandBus, tracingHandlerEnhancerDefinition, } from "@kronos-ts/messaging";
|
|
1
|
+
import { createTracingCommandBus, tracingHandlerEnhancerDefinition, meteringHandlerEnhancerDefinition, } from "@kronos-ts/messaging";
|
|
2
2
|
import { createOpenTelemetrySpanFactory, } from "./opentelemetry-span-factory.js";
|
|
3
|
+
import { createOpenTelemetryMetricsRecorder, } from "./opentelemetry-metrics-recorder.js";
|
|
3
4
|
/**
|
|
4
5
|
* OpenTelemetry tracing extension for Kronos.
|
|
5
6
|
*
|
|
@@ -39,4 +40,30 @@ export function openTelemetry(options = {}) {
|
|
|
39
40
|
app.handlerEnhancer(tracingHandlerEnhancerDefinition(spanFactory));
|
|
40
41
|
};
|
|
41
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* OpenTelemetry metrics extension for Kronos.
|
|
45
|
+
*
|
|
46
|
+
* Wires a metering handler enhancer (via `app.handlerEnhancer(...)`) that
|
|
47
|
+
* records throughput, latency, error rate, and event-processing lag for every
|
|
48
|
+
* command/query/event handler invocation, using the OpenTelemetry Metrics API.
|
|
49
|
+
*
|
|
50
|
+
* Compose independently of (and alongside) {@link openTelemetry}:
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* await kronos()
|
|
55
|
+
* .use(openTelemetry()) // tracing
|
|
56
|
+
* .use(openTelemetryMetrics()) // metrics
|
|
57
|
+
* .start()
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* Requires an OpenTelemetry MeterProvider to be configured for measurements to
|
|
61
|
+
* be exported; without one this is effectively a no-op.
|
|
62
|
+
*/
|
|
63
|
+
export function openTelemetryMetrics(options = {}) {
|
|
64
|
+
return (app) => {
|
|
65
|
+
const recorder = createOpenTelemetryMetricsRecorder(options);
|
|
66
|
+
app.handlerEnhancer(meteringHandlerEnhancerDefinition(recorder, options));
|
|
67
|
+
};
|
|
68
|
+
}
|
|
42
69
|
//# sourceMappingURL=opentelemetry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opentelemetry.js","sourceRoot":"","sources":["../src/opentelemetry.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,gCAAgC,
|
|
1
|
+
{"version":3,"file":"opentelemetry.js","sourceRoot":"","sources":["../src/opentelemetry.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,GAElC,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,8BAA8B,GAE/B,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,kCAAkC,GAEnC,MAAM,qCAAqC,CAAA;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,aAAa,CAC3B,UAA2C,EAAE;IAE7C,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,WAAW,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAA;QAC3D,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE,CACtC,uBAAuB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAC/C,CAAA;QACD,GAAG,CAAC,eAAe,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC,CAAA;IACpE,CAAC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAiE,EAAE;IAEnE,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,QAAQ,GAAG,kCAAkC,CAAC,OAAO,CAAC,CAAA;QAC5D,GAAG,CAAC,eAAe,CAAC,iCAAiC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3E,CAAC,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.4.0",
|
|
4
4
|
"description": "OpenTelemetry extension for Kronos — tracing for commands and events.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -50,13 +50,13 @@
|
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@kronos-ts/common": "0.1.1",
|
|
53
|
-
"@kronos-ts/app": "0.4.
|
|
54
|
-
"@kronos-ts/messaging": "0.
|
|
53
|
+
"@kronos-ts/app": "0.4.1",
|
|
54
|
+
"@kronos-ts/messaging": "0.7.0",
|
|
55
55
|
"@opentelemetry/api": "^1.9"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@kronos-ts/eventsourcing": "0.2.
|
|
59
|
-
"@kronos-ts/modelling": "0.2.
|
|
58
|
+
"@kronos-ts/eventsourcing": "0.2.3",
|
|
59
|
+
"@kronos-ts/modelling": "0.2.6",
|
|
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
|
@@ -3,7 +3,12 @@ export {
|
|
|
3
3
|
type OpenTelemetrySpanFactoryOptions,
|
|
4
4
|
} from "./opentelemetry-span-factory.js"
|
|
5
5
|
|
|
6
|
-
export { openTelemetry } from "./opentelemetry.js"
|
|
6
|
+
export { openTelemetry, openTelemetryMetrics } from "./opentelemetry.js"
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
createOpenTelemetryMetricsRecorder,
|
|
10
|
+
type OpenTelemetryMetricsRecorderOptions,
|
|
11
|
+
} from "./opentelemetry-metrics-recorder.js"
|
|
7
12
|
|
|
8
13
|
export { createOpenTelemetryDeadLetterListener } from "./opentelemetry-dead-letter-listener.js"
|
|
9
14
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { metrics, type Meter } from "@opentelemetry/api"
|
|
2
|
+
import type {
|
|
3
|
+
MetricsRecorder,
|
|
4
|
+
Counter,
|
|
5
|
+
Histogram,
|
|
6
|
+
InstrumentOptions,
|
|
7
|
+
} from "@kronos-ts/messaging"
|
|
8
|
+
|
|
9
|
+
export interface OpenTelemetryMetricsRecorderOptions {
|
|
10
|
+
/** Meter to create instruments from. Defaults to `metrics.getMeter("kronos-framework")`. */
|
|
11
|
+
meter?: Meter
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* MetricsRecorder implementation backed by the OpenTelemetry Metrics API.
|
|
16
|
+
*
|
|
17
|
+
* Instruments are created lazily on the configured Meter; the OTel SDK
|
|
18
|
+
* deduplicates instruments by name, so repeated `counter`/`histogram` calls for
|
|
19
|
+
* the same name write to the same series. As with the span factory, you need an
|
|
20
|
+
* OpenTelemetry MeterProvider configured (e.g. via the OTel SDK or java agent)
|
|
21
|
+
* for measurements to be exported — otherwise this is effectively a no-op.
|
|
22
|
+
*/
|
|
23
|
+
export function createOpenTelemetryMetricsRecorder(
|
|
24
|
+
options: OpenTelemetryMetricsRecorderOptions = {},
|
|
25
|
+
): MetricsRecorder {
|
|
26
|
+
const meter = options.meter ?? metrics.getMeter("kronos-framework")
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
counter(name: string, opts?: InstrumentOptions): Counter {
|
|
30
|
+
const instrument = meter.createCounter(name, {
|
|
31
|
+
description: opts?.description,
|
|
32
|
+
unit: opts?.unit,
|
|
33
|
+
})
|
|
34
|
+
return {
|
|
35
|
+
add(value, attributes) {
|
|
36
|
+
instrument.add(value, attributes)
|
|
37
|
+
},
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
histogram(name: string, opts?: InstrumentOptions): Histogram {
|
|
41
|
+
const instrument = meter.createHistogram(name, {
|
|
42
|
+
description: opts?.description,
|
|
43
|
+
unit: opts?.unit,
|
|
44
|
+
})
|
|
45
|
+
return {
|
|
46
|
+
record(value, attributes) {
|
|
47
|
+
instrument.record(value, attributes)
|
|
48
|
+
},
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
}
|
|
52
|
+
}
|
package/src/opentelemetry.ts
CHANGED
|
@@ -2,11 +2,17 @@ import type { App } from "@kronos-ts/app"
|
|
|
2
2
|
import {
|
|
3
3
|
createTracingCommandBus,
|
|
4
4
|
tracingHandlerEnhancerDefinition,
|
|
5
|
+
meteringHandlerEnhancerDefinition,
|
|
6
|
+
type MeteringOptions,
|
|
5
7
|
} from "@kronos-ts/messaging"
|
|
6
8
|
import {
|
|
7
9
|
createOpenTelemetrySpanFactory,
|
|
8
10
|
type OpenTelemetrySpanFactoryOptions,
|
|
9
11
|
} from "./opentelemetry-span-factory.js"
|
|
12
|
+
import {
|
|
13
|
+
createOpenTelemetryMetricsRecorder,
|
|
14
|
+
type OpenTelemetryMetricsRecorderOptions,
|
|
15
|
+
} from "./opentelemetry-metrics-recorder.js"
|
|
10
16
|
|
|
11
17
|
/**
|
|
12
18
|
* OpenTelemetry tracing extension for Kronos.
|
|
@@ -51,3 +57,32 @@ export function openTelemetry(
|
|
|
51
57
|
app.handlerEnhancer(tracingHandlerEnhancerDefinition(spanFactory))
|
|
52
58
|
}
|
|
53
59
|
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* OpenTelemetry metrics extension for Kronos.
|
|
63
|
+
*
|
|
64
|
+
* Wires a metering handler enhancer (via `app.handlerEnhancer(...)`) that
|
|
65
|
+
* records throughput, latency, error rate, and event-processing lag for every
|
|
66
|
+
* command/query/event handler invocation, using the OpenTelemetry Metrics API.
|
|
67
|
+
*
|
|
68
|
+
* Compose independently of (and alongside) {@link openTelemetry}:
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* await kronos()
|
|
73
|
+
* .use(openTelemetry()) // tracing
|
|
74
|
+
* .use(openTelemetryMetrics()) // metrics
|
|
75
|
+
* .start()
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
78
|
+
* Requires an OpenTelemetry MeterProvider to be configured for measurements to
|
|
79
|
+
* be exported; without one this is effectively a no-op.
|
|
80
|
+
*/
|
|
81
|
+
export function openTelemetryMetrics(
|
|
82
|
+
options: OpenTelemetryMetricsRecorderOptions & MeteringOptions = {},
|
|
83
|
+
): (app: App) => void {
|
|
84
|
+
return (app) => {
|
|
85
|
+
const recorder = createOpenTelemetryMetricsRecorder(options)
|
|
86
|
+
app.handlerEnhancer(meteringHandlerEnhancerDefinition(recorder, options))
|
|
87
|
+
}
|
|
88
|
+
}
|