nestjs-otel 6.0.0 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/lib/interfaces/metric-options.interface.d.ts +7 -0
- package/lib/interfaces/metric-options.interface.js +2 -0
- package/lib/interfaces/opentelemetry-options.interface.d.ts +1 -0
- package/lib/metrics/decorators/common.d.ts +3 -3
- package/lib/metrics/decorators/index.d.ts +1 -3
- package/lib/metrics/decorators/index.js +1 -3
- package/lib/metrics/decorators/param.d.ts +8 -0
- package/lib/metrics/decorators/param.js +21 -0
- package/lib/metrics/metric-data.d.ts +8 -7
- package/lib/metrics/metric-data.js +16 -42
- package/lib/metrics/metric.service.d.ts +7 -7
- package/lib/middleware/api-metrics.middleware.js +10 -1
- package/package.json +1 -1
- package/lib/metrics/decorators/counter.d.ts +0 -2
- package/lib/metrics/decorators/counter.js +0 -17
- package/lib/metrics/decorators/histogram.d.ts +0 -1
- package/lib/metrics/decorators/histogram.js +0 -11
- package/lib/metrics/decorators/observable.d.ts +0 -3
- package/lib/metrics/decorators/observable.js +0 -23
package/README.md
CHANGED
|
@@ -133,6 +133,7 @@ const OpenTelemetryModuleConfig = OpenTelemetryModule.forRoot({
|
|
|
133
133
|
},
|
|
134
134
|
ignoreRoutes: ['/favicon.ico'], // You can ignore specific routes (See https://docs.nestjs.com/middleware#excluding-routes for options)
|
|
135
135
|
ignoreUndefinedRoutes: false, //Records metrics for all URLs, even undefined ones
|
|
136
|
+
prefix: 'my_prefix', // Add a custom prefix to all API metrics
|
|
136
137
|
},
|
|
137
138
|
},
|
|
138
139
|
});
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OtelMetricOptions } from '../../interfaces/metric-options.interface';
|
|
2
2
|
/**
|
|
3
3
|
* Create and increment a counter when a new instance is created
|
|
4
4
|
*
|
|
5
5
|
* @param originalClass
|
|
6
6
|
*/
|
|
7
|
-
export declare const OtelInstanceCounter: (options?:
|
|
7
|
+
export declare const OtelInstanceCounter: (options?: OtelMetricOptions) => <T extends new (...args: any[]) => {}>(originalClass: T) => {
|
|
8
8
|
new (...args: any[]): {};
|
|
9
9
|
} & T;
|
|
10
10
|
/**
|
|
11
11
|
* Create and increment a counter when the method is called
|
|
12
12
|
*/
|
|
13
|
-
export declare const OtelMethodCounter: (options?:
|
|
13
|
+
export declare const OtelMethodCounter: (options?: OtelMetricOptions) => (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<(...args: any[]) => any>) => void;
|
|
@@ -2,6 +2,4 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./common"), exports);
|
|
5
|
-
tslib_1.__exportStar(require("./
|
|
6
|
-
tslib_1.__exportStar(require("./histogram"), exports);
|
|
7
|
-
tslib_1.__exportStar(require("./observable"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./param"), exports);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { OtelMetricOptions } from '../../interfaces/metric-options.interface';
|
|
2
|
+
export type MetricParamDecorator = (name: string, options?: OtelMetricOptions) => ParameterDecorator;
|
|
3
|
+
export declare const OtelCounter: MetricParamDecorator;
|
|
4
|
+
export declare const OtelUpDownCounter: MetricParamDecorator;
|
|
5
|
+
export declare const OtelHistogram: MetricParamDecorator;
|
|
6
|
+
export declare const OtelObservableGauge: MetricParamDecorator;
|
|
7
|
+
export declare const OtelObservableCounter: MetricParamDecorator;
|
|
8
|
+
export declare const OtelObservableUpDownCounter: MetricParamDecorator;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OtelObservableUpDownCounter = exports.OtelObservableCounter = exports.OtelObservableGauge = exports.OtelHistogram = exports.OtelUpDownCounter = exports.OtelCounter = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const metric_data_1 = require("../metric-data");
|
|
6
|
+
function createMetricParamDecorator(type, getOrCreateMetric) {
|
|
7
|
+
return (name, options) => {
|
|
8
|
+
return (0, common_1.createParamDecorator)(() => {
|
|
9
|
+
if (!name || name.length === 0) {
|
|
10
|
+
throw new Error(`${type} need a name argument`);
|
|
11
|
+
}
|
|
12
|
+
return getOrCreateMetric(name, options);
|
|
13
|
+
})();
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
exports.OtelCounter = createMetricParamDecorator('OtelCounter', metric_data_1.getOrCreateCounter);
|
|
17
|
+
exports.OtelUpDownCounter = createMetricParamDecorator('OtelUpDownCounter', metric_data_1.getOrCreateCounter);
|
|
18
|
+
exports.OtelHistogram = createMetricParamDecorator('OtelHistogram', metric_data_1.getOrCreateHistogram);
|
|
19
|
+
exports.OtelObservableGauge = createMetricParamDecorator('OtelObservableGauge', metric_data_1.getOrCreateObservableGauge);
|
|
20
|
+
exports.OtelObservableCounter = createMetricParamDecorator('OtelObservableCounter', metric_data_1.getOrCreateObservableCounter);
|
|
21
|
+
exports.OtelObservableUpDownCounter = createMetricParamDecorator('OtelObservableUpDownCounter', metric_data_1.getOrCreateObservableUpDownCounter);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Counter,
|
|
1
|
+
import { Counter, UpDownCounter, Histogram, ObservableGauge, ObservableCounter, ObservableUpDownCounter } from '@opentelemetry/api';
|
|
2
|
+
import { OtelMetricOptions } from '../interfaces/metric-options.interface';
|
|
2
3
|
export type GenericMetric = Counter | UpDownCounter | Histogram | ObservableGauge | ObservableCounter | ObservableUpDownCounter;
|
|
3
4
|
export declare enum MetricType {
|
|
4
5
|
'Counter' = "Counter",
|
|
@@ -9,9 +10,9 @@ export declare enum MetricType {
|
|
|
9
10
|
'ObservableUpDownCounter' = "ObservableUpDownCounter"
|
|
10
11
|
}
|
|
11
12
|
export declare const meterData: Map<string, GenericMetric>;
|
|
12
|
-
export declare function getOrCreateHistogram(name: string, options?:
|
|
13
|
-
export declare function getOrCreateCounter(name: string, options?:
|
|
14
|
-
export declare function getOrCreateUpDownCounter(name: string, options?:
|
|
15
|
-
export declare function getOrCreateObservableGauge(name: string, options?:
|
|
16
|
-
export declare function getOrCreateObservableCounter(name: string, options?:
|
|
17
|
-
export declare function getOrCreateObservableUpDownCounter(name: string, options?:
|
|
13
|
+
export declare function getOrCreateHistogram(name: string, options?: OtelMetricOptions): Histogram;
|
|
14
|
+
export declare function getOrCreateCounter(name: string, options?: OtelMetricOptions): Counter;
|
|
15
|
+
export declare function getOrCreateUpDownCounter(name: string, options?: OtelMetricOptions): UpDownCounter;
|
|
16
|
+
export declare function getOrCreateObservableGauge(name: string, options?: OtelMetricOptions): ObservableGauge;
|
|
17
|
+
export declare function getOrCreateObservableCounter(name: string, options?: OtelMetricOptions): ObservableCounter;
|
|
18
|
+
export declare function getOrCreateObservableUpDownCounter(name: string, options?: OtelMetricOptions): ObservableUpDownCounter;
|
|
@@ -13,63 +13,37 @@ var MetricType;
|
|
|
13
13
|
MetricType["ObservableUpDownCounter"] = "ObservableUpDownCounter";
|
|
14
14
|
})(MetricType || (exports.MetricType = MetricType = {}));
|
|
15
15
|
exports.meterData = new Map();
|
|
16
|
-
function
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
function getOrCreate(name, options = {}, type) {
|
|
17
|
+
const nameWithPrefix = options.prefix ? `${options.prefix}.${name}` : name;
|
|
18
|
+
let metric = exports.meterData.get(nameWithPrefix);
|
|
19
|
+
if (metric === undefined) {
|
|
20
|
+
const meter = api_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
|
|
21
|
+
metric = meter[`create${type}`](nameWithPrefix, options);
|
|
22
|
+
exports.meterData.set(nameWithPrefix, metric);
|
|
19
23
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return
|
|
24
|
+
return metric;
|
|
25
|
+
}
|
|
26
|
+
function getOrCreateHistogram(name, options = {}) {
|
|
27
|
+
return getOrCreate(name, options, MetricType.Histogram);
|
|
24
28
|
}
|
|
25
29
|
exports.getOrCreateHistogram = getOrCreateHistogram;
|
|
26
30
|
function getOrCreateCounter(name, options = {}) {
|
|
27
|
-
|
|
28
|
-
return exports.meterData.get(name);
|
|
29
|
-
}
|
|
30
|
-
const meter = api_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;
|
|
31
|
+
return getOrCreate(name, options, MetricType.Counter);
|
|
34
32
|
}
|
|
35
33
|
exports.getOrCreateCounter = getOrCreateCounter;
|
|
36
34
|
function getOrCreateUpDownCounter(name, options = {}) {
|
|
37
|
-
|
|
38
|
-
return exports.meterData.get(name);
|
|
39
|
-
}
|
|
40
|
-
const meter = api_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
|
|
41
|
-
const upDownCounter = meter.createUpDownCounter(name, options);
|
|
42
|
-
exports.meterData.set(name, upDownCounter);
|
|
43
|
-
return upDownCounter;
|
|
35
|
+
return getOrCreate(name, options, MetricType.UpDownCounter);
|
|
44
36
|
}
|
|
45
37
|
exports.getOrCreateUpDownCounter = getOrCreateUpDownCounter;
|
|
46
38
|
function getOrCreateObservableGauge(name, options = {}) {
|
|
47
|
-
|
|
48
|
-
return exports.meterData.get(name);
|
|
49
|
-
}
|
|
50
|
-
const meter = api_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;
|
|
39
|
+
return getOrCreate(name, options, MetricType.ObservableGauge);
|
|
54
40
|
}
|
|
55
41
|
exports.getOrCreateObservableGauge = getOrCreateObservableGauge;
|
|
56
42
|
function getOrCreateObservableCounter(name, options = {}) {
|
|
57
|
-
|
|
58
|
-
return exports.meterData.get(name);
|
|
59
|
-
}
|
|
60
|
-
const meter = api_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;
|
|
43
|
+
return getOrCreate(name, options, MetricType.ObservableCounter);
|
|
64
44
|
}
|
|
65
45
|
exports.getOrCreateObservableCounter = getOrCreateObservableCounter;
|
|
66
46
|
function getOrCreateObservableUpDownCounter(name, options = {}) {
|
|
67
|
-
|
|
68
|
-
return exports.meterData.get(name);
|
|
69
|
-
}
|
|
70
|
-
const meter = api_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;
|
|
47
|
+
return getOrCreate(name, options, MetricType.ObservableUpDownCounter);
|
|
74
48
|
}
|
|
75
49
|
exports.getOrCreateObservableUpDownCounter = getOrCreateObservableUpDownCounter;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OtelMetricOptions } from '../interfaces/metric-options.interface';
|
|
2
2
|
export declare class MetricService {
|
|
3
|
-
getCounter(name: string, options?:
|
|
4
|
-
getUpDownCounter(name: string, options?:
|
|
5
|
-
getHistogram(name: string, options?:
|
|
6
|
-
getObservableCounter(name: string, options?:
|
|
7
|
-
getObservableGauge(name: string, options?:
|
|
8
|
-
getObservableUpDownCounter(name: string, options?:
|
|
3
|
+
getCounter(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").Counter<import("@opentelemetry/api").Attributes>;
|
|
4
|
+
getUpDownCounter(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").UpDownCounter<import("@opentelemetry/api").Attributes>;
|
|
5
|
+
getHistogram(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").Histogram<import("@opentelemetry/api").Attributes>;
|
|
6
|
+
getObservableCounter(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").ObservableCounter;
|
|
7
|
+
getObservableGauge(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").ObservableGauge;
|
|
8
|
+
getObservableUpDownCounter(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").ObservableUpDownCounter;
|
|
9
9
|
}
|
|
@@ -11,44 +11,53 @@ let ApiMetricsMiddleware = class ApiMetricsMiddleware {
|
|
|
11
11
|
constructor(metricService, options = {}) {
|
|
12
12
|
this.metricService = metricService;
|
|
13
13
|
this.options = options;
|
|
14
|
-
const { defaultAttributes = {}, ignoreUndefinedRoutes = false } = options?.metrics?.apiMetrics ?? {};
|
|
14
|
+
const { defaultAttributes = {}, ignoreUndefinedRoutes = false, prefix, } = options?.metrics?.apiMetrics ?? {};
|
|
15
15
|
this.defaultAttributes = defaultAttributes;
|
|
16
16
|
this.ignoreUndefinedRoutes = ignoreUndefinedRoutes;
|
|
17
17
|
// Semantic Convention
|
|
18
18
|
this.httpServerRequestCount = this.metricService.getCounter('http.server.request.count', {
|
|
19
19
|
description: 'Total number of HTTP requests',
|
|
20
20
|
unit: 'requests',
|
|
21
|
+
prefix,
|
|
21
22
|
});
|
|
22
23
|
this.httpServerResponseCount = this.metricService.getCounter('http.server.response.count', {
|
|
23
24
|
description: 'Total number of HTTP responses',
|
|
24
25
|
unit: 'responses',
|
|
26
|
+
prefix,
|
|
25
27
|
});
|
|
26
28
|
this.httpServerAbortCount = this.metricService.getCounter('http.server.abort.count', {
|
|
27
29
|
description: 'Total number of data transfers aborted',
|
|
28
30
|
unit: 'requests',
|
|
31
|
+
prefix,
|
|
29
32
|
});
|
|
30
33
|
this.httpServerDuration = this.metricService.getHistogram('http.server.duration', {
|
|
31
34
|
description: 'The duration of the inbound HTTP request',
|
|
32
35
|
unit: 'ms',
|
|
36
|
+
prefix,
|
|
33
37
|
});
|
|
34
38
|
this.httpServerRequestSize = this.metricService.getHistogram('http.server.request.size', {
|
|
35
39
|
description: 'Size of incoming bytes',
|
|
36
40
|
unit: 'By',
|
|
41
|
+
prefix,
|
|
37
42
|
});
|
|
38
43
|
this.httpServerResponseSize = this.metricService.getHistogram('http.server.response.size', {
|
|
39
44
|
description: 'Size of outgoing bytes',
|
|
40
45
|
unit: 'By',
|
|
46
|
+
prefix,
|
|
41
47
|
});
|
|
42
48
|
// Helpers
|
|
43
49
|
this.httpServerResponseSuccessCount = this.metricService.getCounter('http.server.response.success.count', {
|
|
44
50
|
description: 'Total number of all successful responses',
|
|
45
51
|
unit: 'responses',
|
|
52
|
+
prefix,
|
|
46
53
|
});
|
|
47
54
|
this.httpServerResponseErrorCount = this.metricService.getCounter('http.server.response.error.count', {
|
|
48
55
|
description: 'Total number of all response errors',
|
|
56
|
+
prefix,
|
|
49
57
|
});
|
|
50
58
|
this.httpClientRequestErrorCount = this.metricService.getCounter('http.client.request.error.count', {
|
|
51
59
|
description: 'Total number of client error requests',
|
|
60
|
+
prefix,
|
|
52
61
|
});
|
|
53
62
|
}
|
|
54
63
|
use(req, res, next) {
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export declare const OtelCounter: (...dataOrPipes: (string | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>>)[]) => ParameterDecorator;
|
|
2
|
-
export declare const OtelUpDownCounter: (...dataOrPipes: (string | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>>)[]) => ParameterDecorator;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OtelUpDownCounter = exports.OtelCounter = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
const metric_data_1 = require("../metric-data");
|
|
6
|
-
exports.OtelCounter = (0, common_1.createParamDecorator)((name, options) => {
|
|
7
|
-
if (!name || name.length === 0) {
|
|
8
|
-
throw new Error('OtelCounter need a name argument');
|
|
9
|
-
}
|
|
10
|
-
return (0, metric_data_1.getOrCreateCounter)(name, options);
|
|
11
|
-
});
|
|
12
|
-
exports.OtelUpDownCounter = (0, common_1.createParamDecorator)((name, options) => {
|
|
13
|
-
if (!name || name.length === 0) {
|
|
14
|
-
throw new Error('OtelUpDownCounter need a name argument');
|
|
15
|
-
}
|
|
16
|
-
return (0, metric_data_1.getOrCreateCounter)(name, options);
|
|
17
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const OtelHistogram: (...dataOrPipes: (string | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>>)[]) => ParameterDecorator;
|
|
@@ -1,11 +0,0 @@
|
|
|
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
|
-
});
|
|
@@ -1,3 +0,0 @@
|
|
|
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;
|
|
@@ -1,23 +0,0 @@
|
|
|
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
|
-
});
|