nestjs-otel 2.6.1 → 3.0.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/CHANGELOG.md +14 -0
- package/README.md +25 -8
- package/lib/interfaces/opentelemetry-options.interface.d.ts +2 -2
- package/lib/metrics/decorators/common.js +2 -2
- package/lib/metrics/decorators/common.js.map +1 -1
- package/lib/metrics/decorators/counter.js +2 -2
- package/lib/metrics/decorators/counter.js.map +1 -1
- package/lib/metrics/decorators/histogram.d.ts +1 -0
- package/lib/metrics/decorators/histogram.js +12 -0
- package/lib/metrics/decorators/histogram.js.map +1 -0
- package/lib/metrics/decorators/index.d.ts +2 -1
- package/lib/metrics/decorators/index.js +2 -1
- package/lib/metrics/decorators/index.js.map +1 -1
- package/lib/metrics/decorators/observable.d.ts +3 -0
- package/lib/metrics/decorators/observable.js +24 -0
- package/lib/metrics/decorators/observable.js.map +1 -0
- package/lib/metrics/metric-data.d.ts +12 -5
- package/lib/metrics/metric-data.js +53 -24
- package/lib/metrics/metric-data.js.map +1 -1
- package/lib/metrics/metric.service.d.ts +7 -6
- package/lib/metrics/metric.service.js +11 -8
- package/lib/metrics/metric.service.js.map +1 -1
- package/lib/middleware/api-metrics.middleware.d.ts +5 -5
- package/lib/middleware/api-metrics.middleware.js +17 -17
- package/lib/middleware/api-metrics.middleware.js.map +1 -1
- package/lib/opentelemetry-core.module.js.map +1 -1
- package/lib/tracing/trace.service.d.ts +1 -0
- package/lib/tracing/trace.service.js +4 -2
- package/lib/tracing/trace.service.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +30 -31
- package/src/interfaces/opentelemetry-options.interface.ts +3 -3
- package/src/metrics/decorators/common.ts +6 -4
- package/src/metrics/decorators/counter.ts +5 -9
- package/src/metrics/decorators/histogram.ts +10 -0
- package/src/metrics/decorators/observable.ts +28 -0
- package/src/metrics/metric-data.ts +86 -29
- package/src/metrics/metric.service.ts +16 -14
- package/src/middleware/api-metrics.middleware.ts +19 -19
- package/src/opentelemetry-core.module.ts +3 -3
- package/src/tracing/trace.service.ts +5 -2
- package/lib/metrics/decorators/value-recorder.d.ts +0 -1
- package/lib/metrics/decorators/value-recorder.js +0 -12
- package/lib/metrics/decorators/value-recorder.js.map +0 -1
- package/src/metrics/decorators/value-recorder.ts +0 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.0.0](https://www.github.com/pragmaticivan/nestjs-otel/compare/v2.6.1...v3.0.0) (2021-12-30)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### ⚠ BREAKING CHANGES
|
|
7
|
+
|
|
8
|
+
* Anything related to metrics sdk has changed. OTEL now has a stable spec and all the projects are moving towards new interfaces.
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* ename value recorder on decorators and update readme ([646e2ea](https://www.github.com/pragmaticivan/nestjs-otel/commit/646e2eacd07127f9658b302c09d3056b3b2e1771))
|
|
13
|
+
* support all metric types from otel spec ([36a7c5f](https://www.github.com/pragmaticivan/nestjs-otel/commit/36a7c5f2f895157b3e675a7a6ff6693fea6cc8f2))
|
|
14
|
+
* update metric spec to the latest otel lib ([6ed63ae](https://www.github.com/pragmaticivan/nestjs-otel/commit/6ed63aefbc1e39da9659d6e232a4883f7ed93dac))
|
|
15
|
+
* update packages to compply with latest otel metric spec ([943ca06](https://www.github.com/pragmaticivan/nestjs-otel/commit/943ca06ea62e95d8a07af63030609f226b78c4b8))
|
|
16
|
+
|
|
3
17
|
### [2.6.1](https://www.github.com/pragmaticivan/nestjs-otel/compare/v2.6.0...v2.6.1) (2021-10-13)
|
|
4
18
|
|
|
5
19
|
|
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ For questions and support please use the official [Discord channel](https://disc
|
|
|
16
16
|
|
|
17
17
|
## Why
|
|
18
18
|
|
|
19
|
-
Setting up observability metrics with nestjs requires multiple libraries and patterns. OpenTelemetry has support for multiple exporters and
|
|
19
|
+
Setting up observability metrics with nestjs requires multiple libraries and patterns. OpenTelemetry has support for multiple exporters and types of metrics such as Prometheus Metrics.
|
|
20
20
|
|
|
21
21
|
## Observability
|
|
22
22
|
|
|
@@ -179,7 +179,7 @@ export class BookService {
|
|
|
179
179
|
|
|
180
180
|
## Metric Service
|
|
181
181
|
|
|
182
|
-
[OpenTelemetry Metrics](https://www.npmjs.com/package/@opentelemetry/metrics) allow a user to collect data and export it to metrics backend like Prometheus.
|
|
182
|
+
[OpenTelemetry Metrics](https://www.npmjs.com/package/@opentelemetry/api-metrics) allow a user to collect data and export it to metrics backend like Prometheus.
|
|
183
183
|
|
|
184
184
|
```ts
|
|
185
185
|
import { MetricService } from 'nestjs-otel';
|
|
@@ -243,7 +243,10 @@ You have the following decorators:
|
|
|
243
243
|
|
|
244
244
|
* `@OtelCounter()`
|
|
245
245
|
* `@OtelUpDownCounter()`
|
|
246
|
-
* `@
|
|
246
|
+
* `@OtelHistogram()`
|
|
247
|
+
* `@OtelObservableGauge()`
|
|
248
|
+
* `@OtelObservableCounter()`
|
|
249
|
+
* `@OtelObservableUpDownCounter()`
|
|
247
250
|
|
|
248
251
|
Example of usage:
|
|
249
252
|
|
|
@@ -258,7 +261,7 @@ export class AppController {
|
|
|
258
261
|
home(
|
|
259
262
|
@OtelCounter('app_counter_1_inc', { description: 'counter 1 description' }) counter1: Counter,
|
|
260
263
|
) {
|
|
261
|
-
counter1.
|
|
264
|
+
counter1.add(1);
|
|
262
265
|
}
|
|
263
266
|
}
|
|
264
267
|
|
|
@@ -272,12 +275,12 @@ Impl |Metric |Description| Labels | Metric Type
|
|
|
272
275
|
| ✅ | http_response_total| Total number of HTTP responses.| method, status, path | Counter |
|
|
273
276
|
| ✅ | http_response_success_total| Total number of all successful responses.| - | Counter |
|
|
274
277
|
| ✅ | http_response_error_total| Total number of all response errors.| - | Counter |
|
|
275
|
-
| ✅ | http_request_duration_seconds | HTTP latency value recorder in seconds. | method, status, path |
|
|
278
|
+
| ✅ | http_request_duration_seconds | HTTP latency value recorder in seconds. | method, status, path | Histogram |
|
|
276
279
|
| ✅ | http_client_error_total | Total number of client error requests. | - | Counter |
|
|
277
280
|
| ✅ | http_server_error_total | Total number of server error requests. | - | Counter |
|
|
278
281
|
| ✅ | http_server_aborts_total | Total number of data transfers aborted. | - | Counter |
|
|
279
|
-
| ✅ | http_request_size_bytes | Current total of incoming bytes. | - |
|
|
280
|
-
| ✅ | http_response_size_bytes | Current total of outgoing bytes. | - |
|
|
282
|
+
| ✅ | http_request_size_bytes | Current total of incoming bytes. | - | Histogram|
|
|
283
|
+
| ✅ | http_response_size_bytes | Current total of outgoing bytes. | - | Histogram |
|
|
281
284
|
|
|
282
285
|
## Prometheus Metrics
|
|
283
286
|
|
|
@@ -285,7 +288,21 @@ When `metricExporter` is defined in otel SDK with a `PrometheusExporter`it will
|
|
|
285
288
|
|
|
286
289
|
## Using with a logger
|
|
287
290
|
|
|
288
|
-
### Pino
|
|
291
|
+
### Pino with instrumentation
|
|
292
|
+
|
|
293
|
+
This approach uses otel instrumentation to automatically inject spanId and traceId.
|
|
294
|
+
|
|
295
|
+
```ts
|
|
296
|
+
import { PinoInstrumentation } from '@opentelemetry/instrumentation-pino';
|
|
297
|
+
|
|
298
|
+
const otelSDK = new NodeSDK({
|
|
299
|
+
instrumentations: [new PinoInstrumentation()],
|
|
300
|
+
});
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Pino with custom formatter
|
|
304
|
+
|
|
305
|
+
This approach uses the global trace context for injecting SpanId and traceId as a property of your structured log.
|
|
289
306
|
|
|
290
307
|
```ts
|
|
291
308
|
import Pino, { Logger } from 'pino';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ModuleMetadata, Type, Abstract } from '@nestjs/common';
|
|
2
|
-
import {
|
|
2
|
+
import { Attributes } from '@opentelemetry/api-metrics';
|
|
3
3
|
import { RouteInfo } from '@nestjs/common/interfaces';
|
|
4
4
|
export declare type OpenTelemetryModuleOptions = {
|
|
5
5
|
metrics?: OpenTelemetryMetrics;
|
|
@@ -22,7 +22,7 @@ export declare type OpenTelemetryMetrics = {
|
|
|
22
22
|
timeBuckets?: number[];
|
|
23
23
|
requestSizeBuckets?: number[];
|
|
24
24
|
responseSizeBuckets?: number[];
|
|
25
|
-
|
|
25
|
+
defaultAttributes?: Attributes;
|
|
26
26
|
ignoreRoutes?: (string | RouteInfo)[];
|
|
27
27
|
ignoreUndefinedRoutes?: boolean;
|
|
28
28
|
};
|
|
@@ -9,7 +9,7 @@ const OtelInstanceCounter = (options) => (ctor) => {
|
|
|
9
9
|
return class extends ctor {
|
|
10
10
|
constructor(...args) {
|
|
11
11
|
if (!counterMetric) {
|
|
12
|
-
counterMetric = (0, metric_data_1.getOrCreateCounter)(name,
|
|
12
|
+
counterMetric = (0, metric_data_1.getOrCreateCounter)(name, { description, ...options });
|
|
13
13
|
}
|
|
14
14
|
counterMetric.add(1);
|
|
15
15
|
super(...args);
|
|
@@ -25,7 +25,7 @@ const OtelMethodCounter = (options) => (target, propertyKey, descriptor) => {
|
|
|
25
25
|
const methodFunc = descriptor.value;
|
|
26
26
|
descriptor.value = function (...args) {
|
|
27
27
|
if (!counterMetric) {
|
|
28
|
-
counterMetric = (0, metric_data_1.getOrCreateCounter)(name,
|
|
28
|
+
counterMetric = (0, metric_data_1.getOrCreateCounter)(name, { description, ...options });
|
|
29
29
|
}
|
|
30
30
|
counterMetric.add(1);
|
|
31
31
|
return methodFunc.apply(this, args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/metrics/decorators/common.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/metrics/decorators/common.ts"],"names":[],"mappings":";;;AACA,gDAAoD;AAO7C,MAAM,mBAAmB,GAAG,CACjC,OAAuB,EACvB,EAAE,CAAC,CAAwC,IAAO,EAAE,EAAE;IACtD,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,kBAAkB,CAAC;IAChD,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,IAAI,yBAAyB,CAAC;IAC9D,IAAI,aAAsB,CAAC;IAE3B,OAAO,KAAM,SAAQ,IAAI;QACvB,YAAY,GAAG,IAAI;YACjB,IAAI,CAAC,aAAa,EAAE;gBAClB,aAAa,GAAG,IAAA,gCAAkB,EAAC,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;aACvE;YAED,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,mBAAmB,uBAiB9B;AAKK,MAAM,iBAAiB,GAAG,CAC/B,OAAuB,EACvB,EAAE,CAAC,CACH,MAAc,EACd,WAA4B,EAC5B,UACS,EACT,EAAE;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,SAAS,IAAI,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC;IACtE,MAAM,WAAW,GAAG,OAAO,SAAS,IAAI,WAAW,CAAC,QAAQ,EAAE,eAAe,CAAC;IAC9E,IAAI,aAAsB,CAAC;IAC3B,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC;IAEpC,UAAU,CAAC,KAAK,GAAG,UAAU,GAAG,IAAW;QACzC,IAAI,CAAC,aAAa,EAAE;YAClB,aAAa,GAAG,IAAA,gCAAkB,EAAC,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;SACvE;QACD,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC,CAAC;AArBW,QAAA,iBAAiB,qBAqB5B"}
|
|
@@ -7,12 +7,12 @@ exports.OtelCounter = (0, common_1.createParamDecorator)((name, options) => {
|
|
|
7
7
|
if (!name || name.length === 0) {
|
|
8
8
|
throw new Error('OtelCounter need a name argument');
|
|
9
9
|
}
|
|
10
|
-
return (0, metric_data_1.getOrCreateCounter)(name,
|
|
10
|
+
return (0, metric_data_1.getOrCreateCounter)(name, options);
|
|
11
11
|
});
|
|
12
12
|
exports.OtelUpDownCounter = (0, common_1.createParamDecorator)((name, options) => {
|
|
13
13
|
if (!name || name.length === 0) {
|
|
14
14
|
throw new Error('OtelUpDownCounter need a name argument');
|
|
15
15
|
}
|
|
16
|
-
return (0, metric_data_1.getOrCreateCounter)(name,
|
|
16
|
+
return (0, metric_data_1.getOrCreateCounter)(name, options);
|
|
17
17
|
});
|
|
18
18
|
//# sourceMappingURL=counter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counter.js","sourceRoot":"","sources":["../../../src/metrics/decorators/counter.ts"],"names":[],"mappings":";;;AAAA,2CAAsD;AAEtD,
|
|
1
|
+
{"version":3,"file":"counter.js","sourceRoot":"","sources":["../../../src/metrics/decorators/counter.ts"],"names":[],"mappings":";;;AAAA,2CAAsD;AAEtD,gDAAgE;AAEnD,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAAC,CAAC,IAAY,EAAE,OAAuB,EAAE,EAAE;IACxF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;KACrD;IACD,OAAO,IAAA,gCAAkB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEU,QAAA,iBAAiB,GAAG,IAAA,6BAAoB,EAAC,CAAC,IAAY,EAAE,OAAuB,EAAE,EAAE;IAC9F,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;KAC3D;IACD,OAAO,IAAA,gCAAkB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const OtelHistogram: (...dataOrPipes: (string | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>>)[]) => ParameterDecorator;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OtelHistogram = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const metric_data_1 = require("../metric-data");
|
|
6
|
+
exports.OtelHistogram = (0, common_1.createParamDecorator)((name, options) => {
|
|
7
|
+
if (!name || name.length === 0) {
|
|
8
|
+
throw new Error('OtelHistogram need a name argument');
|
|
9
|
+
}
|
|
10
|
+
return (0, metric_data_1.getOrCreateHistogram)(name, options);
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=histogram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram.js","sourceRoot":"","sources":["../../../src/metrics/decorators/histogram.ts"],"names":[],"mappings":";;;AAAA,2CAAsD;AAEtD,gDAAsD;AAEzC,QAAA,aAAa,GAAG,IAAA,6BAAoB,EAAC,CAAC,IAAY,EAAE,OAAuB,EAAE,EAAE;IAC1F,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;KACvD;IACD,OAAO,IAAA,kCAAoB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC"}
|
|
@@ -12,5 +12,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
__exportStar(require("./common"), exports);
|
|
14
14
|
__exportStar(require("./counter"), exports);
|
|
15
|
-
__exportStar(require("./
|
|
15
|
+
__exportStar(require("./histogram"), exports);
|
|
16
|
+
__exportStar(require("./observable"), exports);
|
|
16
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metrics/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAyB;AACzB,4CAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metrics/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAyB;AACzB,4CAA0B;AAC1B,8CAA4B;AAC5B,+CAA6B"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const OtelObservableGauge: (...dataOrPipes: (string | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>>)[]) => ParameterDecorator;
|
|
2
|
+
export declare const OtelObservableCounter: (...dataOrPipes: (string | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>>)[]) => ParameterDecorator;
|
|
3
|
+
export declare const OtelObservableUpDownCounter: (...dataOrPipes: (string | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>>)[]) => ParameterDecorator;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OtelObservableUpDownCounter = exports.OtelObservableCounter = exports.OtelObservableGauge = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const metric_data_1 = require("../metric-data");
|
|
6
|
+
exports.OtelObservableGauge = (0, common_1.createParamDecorator)((name, options) => {
|
|
7
|
+
if (!name || name.length === 0) {
|
|
8
|
+
throw new Error('OtelObservableGauge need a name argument');
|
|
9
|
+
}
|
|
10
|
+
return (0, metric_data_1.getOrCreateObservableGauge)(name, options);
|
|
11
|
+
});
|
|
12
|
+
exports.OtelObservableCounter = (0, common_1.createParamDecorator)((name, options) => {
|
|
13
|
+
if (!name || name.length === 0) {
|
|
14
|
+
throw new Error('OtelObservableCounter need a name argument');
|
|
15
|
+
}
|
|
16
|
+
return (0, metric_data_1.getOrCreateObservableCounter)(name, options);
|
|
17
|
+
});
|
|
18
|
+
exports.OtelObservableUpDownCounter = (0, common_1.createParamDecorator)((name, options) => {
|
|
19
|
+
if (!name || name.length === 0) {
|
|
20
|
+
throw new Error('OtelObservableUpDownCounter need a name argument');
|
|
21
|
+
}
|
|
22
|
+
return (0, metric_data_1.getOrCreateObservableUpDownCounter)(name, options);
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=observable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observable.js","sourceRoot":"","sources":["../../../src/metrics/decorators/observable.ts"],"names":[],"mappings":";;;AAAA,2CAAsD;AAEtD,gDAA8H;AAEjH,QAAA,mBAAmB,GAAG,IAAA,6BAAoB,EAAC,CAAC,IAAY,EAAE,OAAuB,EAAE,EAAE;IAChG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;KAC7D;IACD,OAAO,IAAA,wCAA0B,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEU,QAAA,qBAAqB,GAAG,IAAA,6BAAoB,EACvD,CAAC,IAAY,EAAE,OAAuB,EAAE,EAAE;IACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;KAC/D;IACD,OAAO,IAAA,0CAA4B,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC,CACF,CAAC;AAEW,QAAA,2BAA2B,GAAG,IAAA,6BAAoB,EAC7D,CAAC,IAAY,EAAE,OAAuB,EAAE,EAAE;IACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;KACrE;IACD,OAAO,IAAA,gDAAkC,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC,CACF,CAAC"}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
import { Counter, MetricOptions, UpDownCounter,
|
|
2
|
-
export declare type GenericMetric = Counter | UpDownCounter |
|
|
1
|
+
import { Counter, MetricOptions, UpDownCounter, Histogram, ObservableGauge, ObservableCounter, ObservableUpDownCounter } from '@opentelemetry/api-metrics';
|
|
2
|
+
export declare type GenericMetric = Counter | UpDownCounter | Histogram | ObservableGauge | ObservableCounter | ObservableUpDownCounter;
|
|
3
3
|
export declare enum MetricType {
|
|
4
4
|
'Counter' = "Counter",
|
|
5
5
|
'UpDownCounter' = "UpDownCounter",
|
|
6
|
-
'
|
|
6
|
+
'Histogram' = "Histogram",
|
|
7
|
+
'ObservableGauge' = "ObservableGauge",
|
|
8
|
+
'ObservableCounter' = "ObservableCounter",
|
|
9
|
+
'ObservableUpDownCounter' = "ObservableUpDownCounter"
|
|
7
10
|
}
|
|
8
11
|
export declare const meterData: Map<string, GenericMetric>;
|
|
9
|
-
export declare function
|
|
10
|
-
export declare function getOrCreateCounter(name: string,
|
|
12
|
+
export declare function getOrCreateHistogram(name: string, options: MetricOptions): Histogram;
|
|
13
|
+
export declare function getOrCreateCounter(name: string, options: MetricOptions): Counter;
|
|
14
|
+
export declare function getOrCreateUpDownCounter(name: string, options: MetricOptions): UpDownCounter;
|
|
15
|
+
export declare function getOrCreateObservableGauge(name: string, options: MetricOptions): ObservableGauge;
|
|
16
|
+
export declare function getOrCreateObservableCounter(name: string, options: MetricOptions): ObservableCounter;
|
|
17
|
+
export declare function getOrCreateObservableUpDownCounter(name: string, options: MetricOptions): ObservableUpDownCounter;
|
|
@@ -1,47 +1,76 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getOrCreateCounter = exports.
|
|
3
|
+
exports.getOrCreateObservableUpDownCounter = exports.getOrCreateObservableCounter = exports.getOrCreateObservableGauge = exports.getOrCreateUpDownCounter = exports.getOrCreateCounter = exports.getOrCreateHistogram = exports.meterData = exports.MetricType = void 0;
|
|
4
4
|
const api_metrics_1 = require("@opentelemetry/api-metrics");
|
|
5
5
|
const opentelemetry_constants_1 = require("../opentelemetry.constants");
|
|
6
6
|
var MetricType;
|
|
7
7
|
(function (MetricType) {
|
|
8
8
|
MetricType["Counter"] = "Counter";
|
|
9
9
|
MetricType["UpDownCounter"] = "UpDownCounter";
|
|
10
|
-
MetricType["
|
|
10
|
+
MetricType["Histogram"] = "Histogram";
|
|
11
|
+
MetricType["ObservableGauge"] = "ObservableGauge";
|
|
12
|
+
MetricType["ObservableCounter"] = "ObservableCounter";
|
|
13
|
+
MetricType["ObservableUpDownCounter"] = "ObservableUpDownCounter";
|
|
11
14
|
})(MetricType = exports.MetricType || (exports.MetricType = {}));
|
|
12
15
|
exports.meterData = new Map();
|
|
13
|
-
function
|
|
16
|
+
function getOrCreateHistogram(name, options) {
|
|
14
17
|
if (exports.meterData.has(name)) {
|
|
15
18
|
return exports.meterData.get(name);
|
|
16
19
|
}
|
|
17
20
|
const meter = api_metrics_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
const histogram = meter.createHistogram(name, options);
|
|
22
|
+
exports.meterData.set(name, histogram);
|
|
23
|
+
return histogram;
|
|
24
|
+
}
|
|
25
|
+
exports.getOrCreateHistogram = getOrCreateHistogram;
|
|
26
|
+
function getOrCreateCounter(name, options) {
|
|
27
|
+
if (exports.meterData.has(name)) {
|
|
28
|
+
return exports.meterData.get(name);
|
|
25
29
|
}
|
|
30
|
+
const meter = api_metrics_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
|
|
31
|
+
const counter = meter.createCounter(name, options);
|
|
32
|
+
exports.meterData.set(name, counter);
|
|
33
|
+
return counter;
|
|
26
34
|
}
|
|
27
|
-
exports.
|
|
28
|
-
function
|
|
35
|
+
exports.getOrCreateCounter = getOrCreateCounter;
|
|
36
|
+
function getOrCreateUpDownCounter(name, options) {
|
|
29
37
|
if (exports.meterData.has(name)) {
|
|
30
38
|
return exports.meterData.get(name);
|
|
31
39
|
}
|
|
32
40
|
const meter = api_metrics_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return upDownCounter;
|
|
42
|
-
default:
|
|
43
|
-
throw new Error(`Unknown type: ${type}`);
|
|
41
|
+
const upDownCounter = meter.createUpDownCounter(name, options);
|
|
42
|
+
exports.meterData.set(name, upDownCounter);
|
|
43
|
+
return upDownCounter;
|
|
44
|
+
}
|
|
45
|
+
exports.getOrCreateUpDownCounter = getOrCreateUpDownCounter;
|
|
46
|
+
function getOrCreateObservableGauge(name, options) {
|
|
47
|
+
if (exports.meterData.has(name)) {
|
|
48
|
+
return exports.meterData.get(name);
|
|
44
49
|
}
|
|
50
|
+
const meter = api_metrics_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
|
|
51
|
+
const observableGauge = meter.createObservableGauge(name, options);
|
|
52
|
+
exports.meterData.set(name, observableGauge);
|
|
53
|
+
return observableGauge;
|
|
45
54
|
}
|
|
46
|
-
exports.
|
|
55
|
+
exports.getOrCreateObservableGauge = getOrCreateObservableGauge;
|
|
56
|
+
function getOrCreateObservableCounter(name, options) {
|
|
57
|
+
if (exports.meterData.has(name)) {
|
|
58
|
+
return exports.meterData.get(name);
|
|
59
|
+
}
|
|
60
|
+
const meter = api_metrics_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
|
|
61
|
+
const observableCounter = meter.createObservableCounter(name, options);
|
|
62
|
+
exports.meterData.set(name, observableCounter);
|
|
63
|
+
return observableCounter;
|
|
64
|
+
}
|
|
65
|
+
exports.getOrCreateObservableCounter = getOrCreateObservableCounter;
|
|
66
|
+
function getOrCreateObservableUpDownCounter(name, options) {
|
|
67
|
+
if (exports.meterData.has(name)) {
|
|
68
|
+
return exports.meterData.get(name);
|
|
69
|
+
}
|
|
70
|
+
const meter = api_metrics_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
|
|
71
|
+
const observableCounter = meter.createObservableCounter(name, options);
|
|
72
|
+
exports.meterData.set(name, observableCounter);
|
|
73
|
+
return observableCounter;
|
|
74
|
+
}
|
|
75
|
+
exports.getOrCreateObservableUpDownCounter = getOrCreateObservableUpDownCounter;
|
|
47
76
|
//# sourceMappingURL=metric-data.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric-data.js","sourceRoot":"","sources":["../../src/metrics/metric-data.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"metric-data.js","sourceRoot":"","sources":["../../src/metrics/metric-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MetricOptions } from '@opentelemetry/api-metrics';
|
|
2
2
|
export declare class MetricService {
|
|
3
|
-
getCounter(name: string, options?: MetricOptions): Counter
|
|
4
|
-
getUpDownCounter(name: string, options?: MetricOptions):
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
getCounter(name: string, options?: MetricOptions): import("@opentelemetry/api-metrics").Counter;
|
|
4
|
+
getUpDownCounter(name: string, options?: MetricOptions): import("@opentelemetry/api-metrics").UpDownCounter;
|
|
5
|
+
getHistogram(name: string, options?: MetricOptions): import("@opentelemetry/api-metrics").Histogram;
|
|
6
|
+
getObservableCounter(name: string, options?: MetricOptions): import("@opentelemetry/api-metrics").ObservableBase;
|
|
7
|
+
getObservableGauge(name: string, options?: MetricOptions): import("@opentelemetry/api-metrics").ObservableBase;
|
|
8
|
+
getObservableUpDownCounter(name: string, options?: MetricOptions): import("@opentelemetry/api-metrics").ObservableBase;
|
|
8
9
|
}
|
|
@@ -11,19 +11,22 @@ const common_1 = require("@nestjs/common");
|
|
|
11
11
|
const metric_data_1 = require("./metric-data");
|
|
12
12
|
let MetricService = class MetricService {
|
|
13
13
|
getCounter(name, options) {
|
|
14
|
-
return
|
|
14
|
+
return (0, metric_data_1.getOrCreateCounter)(name, options);
|
|
15
15
|
}
|
|
16
16
|
getUpDownCounter(name, options) {
|
|
17
|
-
return
|
|
17
|
+
return (0, metric_data_1.getOrCreateUpDownCounter)(name, options);
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
return
|
|
19
|
+
getHistogram(name, options) {
|
|
20
|
+
return (0, metric_data_1.getOrCreateHistogram)(name, options);
|
|
21
21
|
}
|
|
22
|
-
|
|
23
|
-
return (0, metric_data_1.
|
|
22
|
+
getObservableCounter(name, options) {
|
|
23
|
+
return (0, metric_data_1.getOrCreateObservableCounter)(name, options);
|
|
24
24
|
}
|
|
25
|
-
|
|
26
|
-
return (0, metric_data_1.
|
|
25
|
+
getObservableGauge(name, options) {
|
|
26
|
+
return (0, metric_data_1.getOrCreateObservableGauge)(name, options);
|
|
27
|
+
}
|
|
28
|
+
getObservableUpDownCounter(name, options) {
|
|
29
|
+
return (0, metric_data_1.getOrCreateObservableUpDownCounter)(name, options);
|
|
27
30
|
}
|
|
28
31
|
};
|
|
29
32
|
MetricService = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric.service.js","sourceRoot":"","sources":["../../src/metrics/metric.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAI5C,+
|
|
1
|
+
{"version":3,"file":"metric.service.js","sourceRoot":"","sources":["../../src/metrics/metric.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAI5C,+CAIuB;AAGvB,IAAa,aAAa,GAA1B,MAAa,aAAa;IACxB,UAAU,CAAC,IAAY,EAAE,OAAuB;QAC9C,OAAO,IAAA,gCAAkB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,IAAY,EAAE,OAAuB;QACpD,OAAO,IAAA,sCAAwB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,OAAuB;QAChD,OAAO,IAAA,kCAAoB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,oBAAoB,CAAC,IAAY,EAAE,OAAuB;QACxD,OAAO,IAAA,0CAA4B,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,kBAAkB,CAAC,IAAY,EAAE,OAAuB;QACtD,OAAO,IAAA,wCAA0B,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,0BAA0B,CAAC,IAAY,EAAE,OAAuB;QAC9D,OAAO,IAAA,gDAAkC,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;CACF,CAAA;AAxBY,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CAwBzB;AAxBY,sCAAa"}
|
|
@@ -5,8 +5,8 @@ export declare const DEFAULT_LONG_RUNNING_REQUEST_BUCKETS: number[];
|
|
|
5
5
|
export declare const DEFAULT_REQUEST_SIZE_BUCKETS: number[];
|
|
6
6
|
export declare const DEFAULT_RESPONSE_SIZE_BUCKETS: number[];
|
|
7
7
|
export declare class ApiMetricsMiddleware implements NestMiddleware {
|
|
8
|
-
private readonly options;
|
|
9
8
|
private readonly metricService;
|
|
9
|
+
private readonly options;
|
|
10
10
|
private readonly defaultLongRunningRequestBuckets;
|
|
11
11
|
private readonly defaultRequestSizeBuckets;
|
|
12
12
|
private readonly defaultResponseSizeBuckets;
|
|
@@ -18,11 +18,11 @@ export declare class ApiMetricsMiddleware implements NestMiddleware {
|
|
|
18
18
|
private responseServerErrorTotal;
|
|
19
19
|
private serverAbortsTotal;
|
|
20
20
|
private requestDuration;
|
|
21
|
-
private
|
|
22
|
-
private
|
|
23
|
-
private
|
|
21
|
+
private requestSizeHistogram;
|
|
22
|
+
private responseSizeHistogram;
|
|
23
|
+
private defaultAttributes;
|
|
24
24
|
private readonly ignoreUndefinedRoutes;
|
|
25
|
-
constructor(
|
|
25
|
+
constructor(metricService: MetricService, options?: OpenTelemetryModuleOptions);
|
|
26
26
|
use(req: any, res: any, next: any): void;
|
|
27
27
|
private getStatusCodeClass;
|
|
28
28
|
}
|
|
@@ -27,9 +27,9 @@ exports.DEFAULT_RESPONSE_SIZE_BUCKETS = [
|
|
|
27
27
|
5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000,
|
|
28
28
|
];
|
|
29
29
|
let ApiMetricsMiddleware = class ApiMetricsMiddleware {
|
|
30
|
-
constructor(options = {}
|
|
31
|
-
this.options = options;
|
|
30
|
+
constructor(metricService, options = {}) {
|
|
32
31
|
this.metricService = metricService;
|
|
32
|
+
this.options = options;
|
|
33
33
|
this.defaultLongRunningRequestBuckets = exports.DEFAULT_LONG_RUNNING_REQUEST_BUCKETS;
|
|
34
34
|
this.defaultRequestSizeBuckets = exports.DEFAULT_REQUEST_SIZE_BUCKETS;
|
|
35
35
|
this.defaultResponseSizeBuckets = exports.DEFAULT_RESPONSE_SIZE_BUCKETS;
|
|
@@ -54,18 +54,18 @@ let ApiMetricsMiddleware = class ApiMetricsMiddleware {
|
|
|
54
54
|
this.serverAbortsTotal = this.metricService.getCounter('http_server_aborts_total', {
|
|
55
55
|
description: 'Total number of data transfers aborted',
|
|
56
56
|
});
|
|
57
|
-
const { timeBuckets = [], requestSizeBuckets = [], responseSizeBuckets = [],
|
|
58
|
-
this.
|
|
57
|
+
const { timeBuckets = [], requestSizeBuckets = [], responseSizeBuckets = [], defaultAttributes = {}, ignoreUndefinedRoutes = false, } = options?.metrics?.apiMetrics;
|
|
58
|
+
this.defaultAttributes = defaultAttributes;
|
|
59
59
|
this.ignoreUndefinedRoutes = ignoreUndefinedRoutes;
|
|
60
|
-
this.requestDuration = this.metricService.
|
|
60
|
+
this.requestDuration = this.metricService.getHistogram('http_request_duration_seconds', {
|
|
61
61
|
boundaries: timeBuckets.length > 0 ? timeBuckets : this.defaultLongRunningRequestBuckets,
|
|
62
62
|
description: 'HTTP latency value recorder in seconds',
|
|
63
63
|
});
|
|
64
|
-
this.
|
|
64
|
+
this.requestSizeHistogram = this.metricService.getHistogram('http_request_size_bytes', {
|
|
65
65
|
boundaries: requestSizeBuckets.length > 0 ? requestSizeBuckets : this.defaultRequestSizeBuckets,
|
|
66
66
|
description: 'Current total of incoming bytes',
|
|
67
67
|
});
|
|
68
|
-
this.
|
|
68
|
+
this.responseSizeHistogram = this.metricService.getHistogram('http_response_size_bytes', {
|
|
69
69
|
boundaries: responseSizeBuckets.length > 0 ? responseSizeBuckets : this.defaultResponseSizeBuckets,
|
|
70
70
|
description: 'Current total of outgoing bytes',
|
|
71
71
|
});
|
|
@@ -83,17 +83,17 @@ let ApiMetricsMiddleware = class ApiMetricsMiddleware {
|
|
|
83
83
|
else {
|
|
84
84
|
path = urlParser.parse(url).pathname;
|
|
85
85
|
}
|
|
86
|
-
this.requestTotal.
|
|
86
|
+
this.requestTotal.add(1, { method, path });
|
|
87
87
|
const requestLength = parseInt(req.headers['content-length'], 10) || 0;
|
|
88
88
|
const responseLength = parseInt(res.getHeader('Content-Length'), 10) || 0;
|
|
89
89
|
const status = res.statusCode || 500;
|
|
90
|
-
const
|
|
91
|
-
method, status, path, ...this.
|
|
90
|
+
const attributes = {
|
|
91
|
+
method, status, path, ...this.defaultAttributes,
|
|
92
92
|
};
|
|
93
|
-
this.
|
|
94
|
-
this.
|
|
95
|
-
this.responseTotal.
|
|
96
|
-
this.requestDuration.
|
|
93
|
+
this.requestSizeHistogram.record(requestLength, attributes);
|
|
94
|
+
this.responseSizeHistogram.record(responseLength, attributes);
|
|
95
|
+
this.responseTotal.add(1, attributes);
|
|
96
|
+
this.requestDuration.record(time / 1000, attributes);
|
|
97
97
|
const codeClass = this.getStatusCodeClass(status);
|
|
98
98
|
switch (codeClass) {
|
|
99
99
|
case 'success':
|
|
@@ -132,9 +132,9 @@ let ApiMetricsMiddleware = class ApiMetricsMiddleware {
|
|
|
132
132
|
};
|
|
133
133
|
ApiMetricsMiddleware = __decorate([
|
|
134
134
|
(0, common_1.Injectable)(),
|
|
135
|
-
__param(0, (0, common_1.Inject)(
|
|
136
|
-
__param(1, (0, common_1.Inject)(
|
|
137
|
-
__metadata("design:paramtypes", [
|
|
135
|
+
__param(0, (0, common_1.Inject)(metric_service_1.MetricService)),
|
|
136
|
+
__param(1, (0, common_1.Inject)(opentelemetry_constants_1.OPENTELEMETRY_MODULE_OPTIONS)),
|
|
137
|
+
__metadata("design:paramtypes", [metric_service_1.MetricService, Object])
|
|
138
138
|
], ApiMetricsMiddleware);
|
|
139
139
|
exports.ApiMetricsMiddleware = ApiMetricsMiddleware;
|
|
140
140
|
//# sourceMappingURL=api-metrics.middleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-metrics.middleware.js","sourceRoot":"","sources":["../../src/middleware/api-metrics.middleware.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoE;AACpE,8CAA8C;AAC9C,iCAAiC;AAGjC,8DAA0D;AAC1D,wEAA0E;AAE7D,QAAA,oCAAoC,GAAG;IAClD,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;IACvD,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;CACtB,CAAC;AACW,QAAA,4BAA4B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACvF,QAAA,6BAA6B,GAAG;IAC3C,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;CACtD,CAAC;AAGF,IAAa,oBAAoB,GAAjC,MAAa,oBAAoB;IA+B/B,
|
|
1
|
+
{"version":3,"file":"api-metrics.middleware.js","sourceRoot":"","sources":["../../src/middleware/api-metrics.middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opentelemetry-core.module.js","sourceRoot":"","sources":["../src/opentelemetry-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAIwB;AACxB,8DAA0D;AAC1D,4DAAqD;AAErD,6DAAyD;AACzD,6CAAoD;AACpD,uEAEmC;AACnC,2DAAuD;AACvD,iEAA6D;AAU7D,IAAa,uBAAuB,+BAApC,MAAa,uBAAuB;IAGlC,YACyD,UAAsC,EAAE;QAAxC,YAAO,GAAP,OAAO,CAAiC;QAHhF,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAqB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"opentelemetry-core.module.js","sourceRoot":"","sources":["../src/opentelemetry-core.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,12 +10,14 @@ exports.TraceService = void 0;
|
|
|
10
10
|
const api_1 = require("@opentelemetry/api");
|
|
11
11
|
const common_1 = require("@nestjs/common");
|
|
12
12
|
let TraceService = class TraceService {
|
|
13
|
+
getTracer() {
|
|
14
|
+
return api_1.trace.getTracer('default');
|
|
15
|
+
}
|
|
13
16
|
getSpan() {
|
|
14
17
|
return api_1.trace.getSpan(api_1.context.active());
|
|
15
18
|
}
|
|
16
19
|
startSpan(name) {
|
|
17
|
-
|
|
18
|
-
return tracer.startSpan(name);
|
|
20
|
+
return this.getTracer().startSpan(name);
|
|
19
21
|
}
|
|
20
22
|
};
|
|
21
23
|
TraceService = __decorate([
|