nestjs-otel 6.0.0 → 6.1.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/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/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/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;
|
|
@@ -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) {
|