@vtvlive/interactive-apm 0.0.13 → 0.0.14
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/interfaces/tracing-provider.interface.d.ts +4 -4
- package/dist/interfaces/tracing-provider.interface.d.ts.map +1 -1
- package/dist/providers/elastic-apm.tracing-provider.d.ts +6 -5
- package/dist/providers/elastic-apm.tracing-provider.d.ts.map +1 -1
- package/dist/providers/elastic-apm.tracing-provider.js +11 -3
- package/dist/providers/opentelemetry.tracing-provider.d.ts +4 -4
- package/dist/providers/opentelemetry.tracing-provider.d.ts.map +1 -1
- package/dist/providers/opentelemetry.tracing-provider.js +1 -1
- package/dist/services/tracing.service.d.ts +4 -4
- package/dist/services/tracing.service.d.ts.map +1 -1
- package/dist/types/apm.types.d.ts +4 -2
- package/dist/types/apm.types.d.ts.map +1 -1
- package/dist/utils/tracing.helper.d.ts +7 -6
- package/dist/utils/tracing.helper.d.ts.map +1 -1
- package/dist/utils/tracing.helper.js +30 -16
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ISpan, SpanKind } from "../types/apm.types";
|
|
1
|
+
import { ISpan, SpanAttributes, SpanAttributeValue, SpanKind } from "../types/apm.types";
|
|
2
2
|
/**
|
|
3
3
|
* Interface chung cho APM Tracing Provider
|
|
4
4
|
* Cho phép switch giữa OpenTelemetry và Elastic APM thông qua DI
|
|
@@ -16,7 +16,7 @@ export interface ITracingProvider {
|
|
|
16
16
|
* @param spanKind Loại span (INTERNAL, SERVER, CLIENT, PRODUCER, CONSUMER, WEBSOCKET, OTHER)
|
|
17
17
|
* @returns Span object - cần gọi end() khi hoàn thành
|
|
18
18
|
*/
|
|
19
|
-
startSpan(name: string, attributes?:
|
|
19
|
+
startSpan(name: string, attributes?: SpanAttributes, spanKind?: SpanKind): ISpan | null;
|
|
20
20
|
/**
|
|
21
21
|
* Thực thi function với context tracing (auto-close span)
|
|
22
22
|
* @param name Tên của span
|
|
@@ -24,7 +24,7 @@ export interface ITracingProvider {
|
|
|
24
24
|
* @param attributes Các attributes metadata
|
|
25
25
|
* @returns Kết quả của function
|
|
26
26
|
*/
|
|
27
|
-
startSpanWithParent<T>(name: string, fn: (span: ISpan | null) => Promise<T>, attributes?:
|
|
27
|
+
startSpanWithParent<T>(name: string, fn: (span: ISpan | null) => Promise<T>, attributes?: SpanAttributes): Promise<T>;
|
|
28
28
|
/**
|
|
29
29
|
* Capture error vào active span hiện tại
|
|
30
30
|
* @param error Error object
|
|
@@ -35,7 +35,7 @@ export interface ITracingProvider {
|
|
|
35
35
|
* @param key Tên attribute
|
|
36
36
|
* @param value Giá trị attribute
|
|
37
37
|
*/
|
|
38
|
-
setAttribute(key: string, value:
|
|
38
|
+
setAttribute(key: string, value: SpanAttributeValue): void;
|
|
39
39
|
/**
|
|
40
40
|
* Force flush all pending spans
|
|
41
41
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing-provider.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/tracing-provider.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"tracing-provider.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/tracing-provider.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEzF;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;IAExF;;;;;;OAMG;IACH,mBAAmB,CAAC,CAAC,EACnB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,UAAU,CAAC,EAAE,cAAc,GAC1B,OAAO,CAAC,CAAC,CAAC,CAAC;IAEd;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAEjC;;;;OAIG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAE3D;;OAEG;IACH,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;;OAGG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAErD;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { SpanKind } from "../types/apm-provider.type";
|
|
2
2
|
import { ITracingProvider } from "../interfaces/tracing-provider.interface";
|
|
3
|
-
import { ISpan } from "../types/apm.types";
|
|
3
|
+
import { ISpan, SpanAttributes, SpanAttributeValue } from "../types/apm.types";
|
|
4
4
|
/**
|
|
5
5
|
* Elastic APM specific span interface
|
|
6
6
|
*/
|
|
7
7
|
export interface IElasticApmSpan extends ISpan {
|
|
8
8
|
/** Set a label on the span */
|
|
9
|
-
setLabel(key: string, value: string): void;
|
|
9
|
+
setLabel(key: string, value: string | number | boolean): void;
|
|
10
10
|
/** Set the span type */
|
|
11
11
|
setType(type: string): void;
|
|
12
12
|
/** Set the outcome (success, failure) */
|
|
@@ -22,6 +22,7 @@ export declare class ElasticApmTracingProvider implements ITracingProvider {
|
|
|
22
22
|
private apm;
|
|
23
23
|
private readonly serviceName;
|
|
24
24
|
private readonly environment;
|
|
25
|
+
private static isElasticLabelValue;
|
|
25
26
|
constructor(config?: {
|
|
26
27
|
serviceName?: string;
|
|
27
28
|
environment?: string;
|
|
@@ -43,11 +44,11 @@ export declare class ElasticApmTracingProvider implements ITracingProvider {
|
|
|
43
44
|
/**
|
|
44
45
|
* Bắt đầu một span mới
|
|
45
46
|
*/
|
|
46
|
-
startSpan(name: string, attributes?:
|
|
47
|
+
startSpan(name: string, attributes?: SpanAttributes, spanKind?: SpanKind): IElasticApmSpan | null;
|
|
47
48
|
/**
|
|
48
49
|
* Thực thi function với tracing context
|
|
49
50
|
*/
|
|
50
|
-
startSpanWithParent<T>(name: string, fn: (span: ISpan | null) => Promise<T>, attributes?:
|
|
51
|
+
startSpanWithParent<T>(name: string, fn: (span: ISpan | null) => Promise<T>, attributes?: SpanAttributes): Promise<T>;
|
|
51
52
|
/**
|
|
52
53
|
* Capture error vào APM
|
|
53
54
|
*/
|
|
@@ -55,7 +56,7 @@ export declare class ElasticApmTracingProvider implements ITracingProvider {
|
|
|
55
56
|
/**
|
|
56
57
|
* Set label cho current transaction/span
|
|
57
58
|
*/
|
|
58
|
-
setAttribute(key: string, value:
|
|
59
|
+
setAttribute(key: string, value: SpanAttributeValue): void;
|
|
59
60
|
/**
|
|
60
61
|
* End span manually
|
|
61
62
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elastic-apm.tracing-provider.d.ts","sourceRoot":"","sources":["../../src/providers/elastic-apm.tracing-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"elastic-apm.tracing-provider.d.ts","sourceRoot":"","sources":["../../src/providers/elastic-apm.tracing-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAU/E;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,KAAK;IAC5C,8BAA8B;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAE9D,wBAAwB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,mBAAmB;IACnB,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7B;AA0BD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,gBAAgB;IAChE,OAAO,CAAC,GAAG,CAAiC;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,MAAM,CAAC,mBAAmB;gBAOhC,MAAM,GAAE;QACN,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;KACpB;IAOR;;;OAGG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDjB;;OAEG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,cAAc,EAC3B,QAAQ,GAAE,QAA4B,GACrC,eAAe,GAAG,IAAI;IAsHzB;;OAEG;IACG,mBAAmB,CAAC,CAAC,EACzB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,UAAU,CAAC,EAAE,cAAc,GAC1B,OAAO,CAAC,CAAC,CAAC;IAsBb;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAMhC;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAO1D;;OAEG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAOpD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAe5B"}
|
|
@@ -9,6 +9,9 @@ const elastic_apm_compat_1 = require("../utils/elastic-apm-compat");
|
|
|
9
9
|
* Sử dụng elastic-apm-node agent để gửi traces về Elastic APM server
|
|
10
10
|
*/
|
|
11
11
|
class ElasticApmTracingProvider {
|
|
12
|
+
static isElasticLabelValue(value) {
|
|
13
|
+
return value !== undefined && !Array.isArray(value);
|
|
14
|
+
}
|
|
12
15
|
constructor(config = {}) {
|
|
13
16
|
this.apm = null;
|
|
14
17
|
this.serviceName =
|
|
@@ -93,7 +96,9 @@ class ElasticApmTracingProvider {
|
|
|
93
96
|
// Set labels từ attributes
|
|
94
97
|
if (attributes) {
|
|
95
98
|
for (const [key, value] of Object.entries(attributes)) {
|
|
96
|
-
|
|
99
|
+
if (ElasticApmTracingProvider.isElasticLabelValue(value)) {
|
|
100
|
+
span.setLabel(key, value);
|
|
101
|
+
}
|
|
97
102
|
}
|
|
98
103
|
}
|
|
99
104
|
// Set span type dựa trên kind
|
|
@@ -112,6 +117,9 @@ class ElasticApmTracingProvider {
|
|
|
112
117
|
}
|
|
113
118
|
return;
|
|
114
119
|
}
|
|
120
|
+
if (!ElasticApmTracingProvider.isElasticLabelValue(value)) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
115
123
|
originalSetLabel(key, value);
|
|
116
124
|
};
|
|
117
125
|
// Override setAttribute (if it exists, maps to setLabel)
|
|
@@ -192,8 +200,8 @@ class ElasticApmTracingProvider {
|
|
|
192
200
|
*/
|
|
193
201
|
setAttribute(key, value) {
|
|
194
202
|
const span = this.apm?.currentSpan;
|
|
195
|
-
if (span) {
|
|
196
|
-
span.setLabel(key,
|
|
203
|
+
if (span && ElasticApmTracingProvider.isElasticLabelValue(value)) {
|
|
204
|
+
span.setLabel(key, value);
|
|
197
205
|
}
|
|
198
206
|
}
|
|
199
207
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ITracingProvider } from "../interfaces/tracing-provider.interface";
|
|
2
2
|
import { OtlpTransport } from "../types/otlp-transport.type";
|
|
3
|
-
import { ISpan, SpanKind } from "../types/apm.types";
|
|
3
|
+
import { ISpan, SpanAttributes, SpanAttributeValue, SpanKind } from "../types/apm.types";
|
|
4
4
|
/**
|
|
5
5
|
* OpenTelemetry Tracing Provider Implementation
|
|
6
6
|
* Sử dụng OpenTelemetry SDK với OTLP exporter để gửi traces về Elastic APM
|
|
@@ -43,11 +43,11 @@ export declare class OpenTelemetryTracingProvider implements ITracingProvider {
|
|
|
43
43
|
/**
|
|
44
44
|
* Bắt đầu một span mới
|
|
45
45
|
*/
|
|
46
|
-
startSpan(name: string, attributes?:
|
|
46
|
+
startSpan(name: string, attributes?: SpanAttributes, spanKind?: SpanKind): ISpan | null;
|
|
47
47
|
/**
|
|
48
48
|
* Thực thi function với tracing context
|
|
49
49
|
*/
|
|
50
|
-
startSpanWithParent<T>(name: string, fn: (span: ISpan | null) => Promise<T>, attributes?:
|
|
50
|
+
startSpanWithParent<T>(name: string, fn: (span: ISpan | null) => Promise<T>, attributes?: SpanAttributes): Promise<T>;
|
|
51
51
|
/**
|
|
52
52
|
* Capture error vào active span
|
|
53
53
|
*/
|
|
@@ -55,7 +55,7 @@ export declare class OpenTelemetryTracingProvider implements ITracingProvider {
|
|
|
55
55
|
/**
|
|
56
56
|
* Set attribute cho active span
|
|
57
57
|
*/
|
|
58
|
-
setAttribute(key: string, value:
|
|
58
|
+
setAttribute(key: string, value: SpanAttributeValue): void;
|
|
59
59
|
/**
|
|
60
60
|
* Force flush all pending spans
|
|
61
61
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opentelemetry.tracing-provider.d.ts","sourceRoot":"","sources":["../../src/providers/opentelemetry.tracing-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"opentelemetry.tracing-provider.d.ts","sourceRoot":"","sources":["../../src/providers/opentelemetry.tracing-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAyGzF;;;GAGG;AACH,qBAAa,4BAA6B,YAAW,gBAAgB;IACnE,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD,OAAO,CAAC,WAAW,CAAS;gBAG1B,MAAM,GAAE;QACN,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;QACvC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,qBAAqB,CAAC,EAAE,OAAO,CAAC;KAC5B;IA6BR;;;OAGG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+NjB;;OAEG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,cAAc,EAC3B,QAAQ,GAAE,QAA4B,GACrC,KAAK,GAAG,IAAI;IA+Gf;;OAEG;IACG,mBAAmB,CAAC,CAAC,EACzB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,UAAU,CAAC,EAAE,cAAc,GAC1B,OAAO,CAAC,CAAC,CAAC;IAmCb;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAiBhC;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAa1D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAapD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;OAEG;IACH,OAAO,CAAC,WAAW;CAmBpB"}
|
|
@@ -478,7 +478,7 @@ class OpenTelemetryTracingProvider {
|
|
|
478
478
|
* Set attribute cho active span
|
|
479
479
|
*/
|
|
480
480
|
setAttribute(key, value) {
|
|
481
|
-
if (!this.initialized) {
|
|
481
|
+
if (!this.initialized || value === undefined) {
|
|
482
482
|
return;
|
|
483
483
|
}
|
|
484
484
|
// @ts-ignore - Optional peer dependency
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ITracingProvider } from "../interfaces/tracing-provider.interface";
|
|
2
|
-
import { ISpan, SpanKind } from "../types/apm.types";
|
|
2
|
+
import { ISpan, SpanAttributes, SpanAttributeValue, SpanKind } from "../types/apm.types";
|
|
3
3
|
/**
|
|
4
4
|
* Tracing Service - Wrapper cho ITracingProvider
|
|
5
5
|
* Service này được inject vào controllers/services để sử dụng tracing
|
|
@@ -47,7 +47,7 @@ export declare class TracingService {
|
|
|
47
47
|
* span.end();
|
|
48
48
|
* }
|
|
49
49
|
*/
|
|
50
|
-
startSpan(name: string, attributes?:
|
|
50
|
+
startSpan(name: string, attributes?: SpanAttributes, spanKind?: SpanKind): ISpan | null;
|
|
51
51
|
/**
|
|
52
52
|
* Thực thi function với context tracing (auto-close span)
|
|
53
53
|
* @param name Tên của span
|
|
@@ -64,7 +64,7 @@ export declare class TracingService {
|
|
|
64
64
|
* }
|
|
65
65
|
* );
|
|
66
66
|
*/
|
|
67
|
-
startSpanWithParent<T>(name: string, fn: (span: ISpan | null) => Promise<T>, attributes?:
|
|
67
|
+
startSpanWithParent<T>(name: string, fn: (span: ISpan | null) => Promise<T>, attributes?: SpanAttributes): Promise<T>;
|
|
68
68
|
/**
|
|
69
69
|
* Capture error vào active span hiện tại
|
|
70
70
|
* @param error Error object
|
|
@@ -75,7 +75,7 @@ export declare class TracingService {
|
|
|
75
75
|
* @param key Tên attribute
|
|
76
76
|
* @param value Giá trị attribute
|
|
77
77
|
*/
|
|
78
|
-
setAttribute(key: string, value:
|
|
78
|
+
setAttribute(key: string, value: SpanAttributeValue): void;
|
|
79
79
|
/**
|
|
80
80
|
* Kết thúc span manually
|
|
81
81
|
* @param span Span cần end (nếu không truyền, sẽ end active span)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.service.d.ts","sourceRoot":"","sources":["../../src/services/tracing.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"tracing.service.d.ts","sourceRoot":"","sources":["../../src/services/tracing.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEzF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAEvD;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,cAAc,EAC3B,QAAQ,GAAE,QAA4B,GACrC,KAAK,GAAG,IAAI;IAIf;;;;;;;;;;;;;;;OAeG;IACH,mBAAmB,CAAC,CAAC,EACnB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,UAAU,CAAC,EAAE,cAAc,GAC1B,OAAO,CAAC,CAAC,CAAC;IAIb;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIhC;;;;OAIG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAI1D;;;OAGG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAI7C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC"}
|
|
@@ -10,13 +10,15 @@ export { ApmProvider, type ApmProviderType, SpanKind, OtlpTransport, type OtlpTr
|
|
|
10
10
|
/**
|
|
11
11
|
* Common Span interface - works with both Elastic APM and OpenTelemetry
|
|
12
12
|
*/
|
|
13
|
+
export type SpanAttributeValue = string | number | boolean | string[] | undefined;
|
|
14
|
+
export type SpanAttributes = Record<string, SpanAttributeValue>;
|
|
13
15
|
export interface ISpan {
|
|
14
16
|
/** Span name */
|
|
15
17
|
name: string;
|
|
16
18
|
/** End the span */
|
|
17
19
|
end(result?: unknown): void;
|
|
18
20
|
/** Set an attribute on the span */
|
|
19
|
-
setAttribute(key: string, value:
|
|
21
|
+
setAttribute(key: string, value: SpanAttributeValue): void;
|
|
20
22
|
/** Add an event to the span */
|
|
21
23
|
addEvent?(name: string, attributes?: Record<string, unknown>): void;
|
|
22
24
|
/** Set the span status */
|
|
@@ -47,7 +49,7 @@ export interface ITracer {
|
|
|
47
49
|
*/
|
|
48
50
|
export interface SpanOptions {
|
|
49
51
|
/** Span attributes */
|
|
50
|
-
attributes?:
|
|
52
|
+
attributes?: SpanAttributes;
|
|
51
53
|
/** Span kind (server, client, internal, etc.) */
|
|
52
54
|
kind?: SpanKind;
|
|
53
55
|
/** Parent span context */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apm.types.d.ts","sourceRoot":"","sources":["../../src/types/apm.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG9E,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,CAAC;AAE9F;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IAEb,mBAAmB;IACnB,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE5B,mCAAmC;IACnC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"apm.types.d.ts","sourceRoot":"","sources":["../../src/types/apm.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ISpan, SpanAttributes, SpanAttributeValue } from "../types/apm.types";
|
|
2
2
|
import { SpanKind } from "../types/apm-provider.type";
|
|
3
3
|
/**
|
|
4
4
|
* TracingHelper - Static utility class for unified APM usage
|
|
@@ -19,6 +19,7 @@ import { SpanKind } from "../types/apm-provider.type";
|
|
|
19
19
|
export declare class TracingHelper {
|
|
20
20
|
private static tracer;
|
|
21
21
|
private static apmProvider;
|
|
22
|
+
private static isElasticLabelValue;
|
|
22
23
|
/**
|
|
23
24
|
* Get the current APM provider (cached)
|
|
24
25
|
*/
|
|
@@ -34,7 +35,7 @@ export declare class TracingHelper {
|
|
|
34
35
|
* @param spanKind Loại span (mặc định: INTERNAL). Dùng SERVER cho API endpoints
|
|
35
36
|
* @returns Span object
|
|
36
37
|
*/
|
|
37
|
-
static startSpan(name: string, attributes?:
|
|
38
|
+
static startSpan(name: string, attributes?: SpanAttributes, spanKind?: SpanKind): ISpan;
|
|
38
39
|
private static mapSpanKindToOtlpSpanKind;
|
|
39
40
|
/**
|
|
40
41
|
* Start span using OpenTelemetry API
|
|
@@ -63,7 +64,7 @@ export declare class TracingHelper {
|
|
|
63
64
|
* @param attributes Các attributes metadata
|
|
64
65
|
* @returns Kết quả của function
|
|
65
66
|
*/
|
|
66
|
-
static startSpanWithParent<T>(name: string, fn: (span:
|
|
67
|
+
static startSpanWithParent<T>(name: string, fn: (span: ISpan | undefined) => Promise<T>, attributes?: SpanAttributes): Promise<T>;
|
|
67
68
|
/**
|
|
68
69
|
* Capture error vào active span hiện tại
|
|
69
70
|
* @param error Error object
|
|
@@ -74,17 +75,17 @@ export declare class TracingHelper {
|
|
|
74
75
|
* @param key Tên attribute
|
|
75
76
|
* @param value Giá trị attribute
|
|
76
77
|
*/
|
|
77
|
-
static setAttribute(key: string, value:
|
|
78
|
+
static setAttribute(key: string, value: SpanAttributeValue): void;
|
|
78
79
|
/**
|
|
79
80
|
* Kết thúc span manually
|
|
80
81
|
* @param span Span cần end
|
|
81
82
|
*/
|
|
82
|
-
static endSpan(span?:
|
|
83
|
+
static endSpan(span?: ISpan, result?: unknown): void;
|
|
83
84
|
/**
|
|
84
85
|
* Get the current active span
|
|
85
86
|
* @returns The active span or undefined
|
|
86
87
|
*/
|
|
87
|
-
static getActiveSpan():
|
|
88
|
+
static getActiveSpan(): ISpan | undefined;
|
|
88
89
|
/**
|
|
89
90
|
* Get the current trace ID
|
|
90
91
|
* @returns The trace ID or undefined
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.helper.d.ts","sourceRoot":"","sources":["../../src/utils/tracing.helper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tracing.helper.d.ts","sourceRoot":"","sources":["../../src/utils/tracing.helper.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAwCtD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAsC;IAC3D,OAAO,CAAC,MAAM,CAAC,WAAW,CAAoD;IAE9E,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAMlC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAO1B;;OAEG;IACH,MAAM,CAAC,kBAAkB,IAAI,IAAI;IAIjC;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,CACd,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,cAAc,EAC3B,QAAQ,GAAE,QAA4B,GACrC,KAAK;IAWR,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAiBxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiBrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAsGlC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAqB3C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAsBpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAoB7B;;;;;;OAMG;WACU,mBAAmB,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,EAC3C,UAAU,CAAC,EAAE,cAAc,GAC1B,OAAO,CAAC,CAAC,CAAC;IA2Cb;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAsBvC;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAwBjE;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IA2BpD;;;OAGG;IACH,MAAM,CAAC,aAAa,IAAI,KAAK,GAAG,SAAS;IAqBzC;;;OAGG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM,GAAG,SAAS;CAqBxC"}
|
|
@@ -52,6 +52,9 @@ function getApmProvider() {
|
|
|
52
52
|
* }
|
|
53
53
|
*/
|
|
54
54
|
class TracingHelper {
|
|
55
|
+
static isElasticLabelValue(value) {
|
|
56
|
+
return value !== undefined && !Array.isArray(value);
|
|
57
|
+
}
|
|
55
58
|
/**
|
|
56
59
|
* Get the current APM provider (cached)
|
|
57
60
|
*/
|
|
@@ -139,7 +142,9 @@ class TracingHelper {
|
|
|
139
142
|
// Set attributes as labels
|
|
140
143
|
if (attributes) {
|
|
141
144
|
for (const [key, value] of Object.entries(attributes)) {
|
|
142
|
-
|
|
145
|
+
if (TracingHelper.isElasticLabelValue(value)) {
|
|
146
|
+
apmSpan.setLabel(key, value);
|
|
147
|
+
}
|
|
143
148
|
}
|
|
144
149
|
}
|
|
145
150
|
// Set span type
|
|
@@ -153,14 +158,18 @@ class TracingHelper {
|
|
|
153
158
|
// Add setAttribute method that maps to setLabel
|
|
154
159
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
155
160
|
span.setAttribute = (key, value) => {
|
|
156
|
-
|
|
161
|
+
if (TracingHelper.isElasticLabelValue(value)) {
|
|
162
|
+
originalSetLabel(key, value);
|
|
163
|
+
}
|
|
157
164
|
return span; // Return span for chaining
|
|
158
165
|
};
|
|
159
166
|
// Add setAttributes method for batch setting
|
|
160
167
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
161
168
|
span.setAttributes = (attrs) => {
|
|
162
169
|
for (const [k, v] of Object.entries(attrs)) {
|
|
163
|
-
|
|
170
|
+
if (TracingHelper.isElasticLabelValue(v)) {
|
|
171
|
+
originalSetLabel(k, v);
|
|
172
|
+
}
|
|
164
173
|
}
|
|
165
174
|
return span; // Return span for chaining
|
|
166
175
|
};
|
|
@@ -235,18 +244,23 @@ class TracingHelper {
|
|
|
235
244
|
* Create a no-op span that does nothing
|
|
236
245
|
*/
|
|
237
246
|
static createNoOpSpan(name) {
|
|
238
|
-
|
|
247
|
+
const noOpSpan = {
|
|
239
248
|
name,
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
+
setAttribute: function () {
|
|
250
|
+
return this;
|
|
251
|
+
},
|
|
252
|
+
addEvent: function () {
|
|
253
|
+
return this;
|
|
254
|
+
},
|
|
255
|
+
recordException: function () {
|
|
256
|
+
return this;
|
|
257
|
+
},
|
|
258
|
+
setStatus: function () {
|
|
259
|
+
return this;
|
|
260
|
+
},
|
|
261
|
+
end: () => { },
|
|
249
262
|
};
|
|
263
|
+
return noOpSpan;
|
|
250
264
|
}
|
|
251
265
|
/**
|
|
252
266
|
* Thực thi function với context tracing (auto-close span)
|
|
@@ -327,8 +341,8 @@ class TracingHelper {
|
|
|
327
341
|
// @ts-ignore - Optional dependency
|
|
328
342
|
const apm = require("elastic-apm-node");
|
|
329
343
|
const span = apm.currentSpan;
|
|
330
|
-
if (span) {
|
|
331
|
-
span.setLabel(key,
|
|
344
|
+
if (span && TracingHelper.isElasticLabelValue(value)) {
|
|
345
|
+
span.setLabel(key, value);
|
|
332
346
|
}
|
|
333
347
|
}
|
|
334
348
|
catch {
|
|
@@ -338,7 +352,7 @@ class TracingHelper {
|
|
|
338
352
|
}
|
|
339
353
|
// OpenTelemetry
|
|
340
354
|
const span = api_1.trace.getActiveSpan();
|
|
341
|
-
if (span) {
|
|
355
|
+
if (span && value !== undefined) {
|
|
342
356
|
span.setAttribute(key, value);
|
|
343
357
|
}
|
|
344
358
|
}
|
package/package.json
CHANGED