nestjs-otel 2.6.1 → 3.0.2
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 +28 -0
- package/README.md +50 -39
- package/examples/nestjs-prom-grafana-tempo/package.json +40 -37
- package/examples/nestjs-prom-grafana-tempo/src/tracing.ts +5 -5
- 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/decorators/span.js +2 -3
- package/lib/tracing/decorators/span.js.map +1 -1
- package/lib/tracing/decorators/span.spec.d.ts +1 -0
- package/lib/tracing/decorators/span.spec.js +58 -0
- package/lib/tracing/decorators/span.spec.js.map +1 -0
- 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 +31 -32
- 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 +89 -29
- package/src/metrics/metric.service.ts +28 -14
- package/src/middleware/api-metrics.middleware.ts +19 -19
- package/src/opentelemetry-core.module.ts +3 -3
- package/src/tracing/decorators/span.spec.ts +48 -0
- package/src/tracing/decorators/span.ts +4 -11
- 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,33 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
### [3.0.2](https://www.github.com/pragmaticivan/nestjs-otel/compare/v3.0.1...v3.0.2) (2022-03-24)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **tracing:** use startActiveSpan to ensure span in correct context ([d608b84](https://www.github.com/pragmaticivan/nestjs-otel/commit/d608b84e582b41105c6871ee2e7174f7a0116d96))
|
|
9
|
+
|
|
10
|
+
### [3.0.1](https://www.github.com/pragmaticivan/nestjs-otel/compare/v3.0.0...v3.0.1) (2022-01-03)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **#171:** fixes missing observation callback for observable metrics ([7d89c1f](https://www.github.com/pragmaticivan/nestjs-otel/commit/7d89c1f910b28d0661da6f2989ddea4b9bdcc643)), closes [#171](https://www.github.com/pragmaticivan/nestjs-otel/issues/171)
|
|
16
|
+
|
|
17
|
+
## [3.0.0](https://www.github.com/pragmaticivan/nestjs-otel/compare/v2.6.1...v3.0.0) (2021-12-30)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### ⚠ BREAKING CHANGES
|
|
21
|
+
|
|
22
|
+
* Anything related to metrics sdk has changed. OTEL now has a stable spec and all the projects are moving towards new interfaces.
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* ename value recorder on decorators and update readme ([646e2ea](https://www.github.com/pragmaticivan/nestjs-otel/commit/646e2eacd07127f9658b302c09d3056b3b2e1771))
|
|
27
|
+
* support all metric types from otel spec ([36a7c5f](https://www.github.com/pragmaticivan/nestjs-otel/commit/36a7c5f2f895157b3e675a7a6ff6693fea6cc8f2))
|
|
28
|
+
* update metric spec to the latest otel lib ([6ed63ae](https://www.github.com/pragmaticivan/nestjs-otel/commit/6ed63aefbc1e39da9659d6e232a4883f7ed93dac))
|
|
29
|
+
* update packages to compply with latest otel metric spec ([943ca06](https://www.github.com/pragmaticivan/nestjs-otel/commit/943ca06ea62e95d8a07af63030609f226b78c4b8))
|
|
30
|
+
|
|
3
31
|
### [2.6.1](https://www.github.com/pragmaticivan/nestjs-otel/compare/v2.6.0...v2.6.1) (2021-10-13)
|
|
4
32
|
|
|
5
33
|
|
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|

|
|
8
8
|
[](https://www.npmjs.com/package/nestjs-otel)
|
|
9
|
+
|
|
9
10
|
## Description
|
|
10
11
|
|
|
11
12
|
[OpenTelemetry](https://opentelemetry.io/) module for [Nest](https://github.com/nestjs/nest).
|
|
@@ -43,10 +44,10 @@ Some peers dependencies are required when some configurations are enabled.
|
|
|
43
44
|
```ts
|
|
44
45
|
import {
|
|
45
46
|
CompositePropagator,
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
W3CTraceContextPropagator,
|
|
48
|
+
W3CBaggagePropagator,
|
|
48
49
|
} from '@opentelemetry/core';
|
|
49
|
-
import { BatchSpanProcessor } from '@opentelemetry/
|
|
50
|
+
import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
50
51
|
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';
|
|
51
52
|
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
|
|
52
53
|
import { JaegerPropagator } from '@opentelemetry/propagator-jaeger';
|
|
@@ -66,8 +67,8 @@ const otelSDK = new NodeSDK({
|
|
|
66
67
|
textMapPropagator: new CompositePropagator({
|
|
67
68
|
propagators: [
|
|
68
69
|
new JaegerPropagator(),
|
|
69
|
-
new
|
|
70
|
-
new
|
|
70
|
+
new W3CTraceContextPropagator(),
|
|
71
|
+
new W3CBaggagePropagator(),
|
|
71
72
|
new B3Propagator(),
|
|
72
73
|
new B3Propagator({
|
|
73
74
|
injectEncoding: B3InjectEncoding.MULTI_HEADER,
|
|
@@ -78,6 +79,7 @@ const otelSDK = new NodeSDK({
|
|
|
78
79
|
});
|
|
79
80
|
|
|
80
81
|
export default otelSDK;
|
|
82
|
+
|
|
81
83
|
// You can also use the shutdown method to gracefully shut down the SDK before process shutdown
|
|
82
84
|
// or on some operating system signal.
|
|
83
85
|
process.on('SIGTERM', () => {
|
|
@@ -85,7 +87,7 @@ process.on('SIGTERM', () => {
|
|
|
85
87
|
.shutdown()
|
|
86
88
|
.then(
|
|
87
89
|
() => console.log('SDK shut down successfully'),
|
|
88
|
-
|
|
90
|
+
err => console.log('Error shutting down SDK', err)
|
|
89
91
|
)
|
|
90
92
|
.finally(() => process.exit(0));
|
|
91
93
|
});
|
|
@@ -120,8 +122,9 @@ const OpenTelemetryModuleConfig = OpenTelemetryModule.forRoot({
|
|
|
120
122
|
apiMetrics: {
|
|
121
123
|
enable: true, // Includes api metrics
|
|
122
124
|
timeBuckets: [], // You can change the default time buckets
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
defaultAttributes: {
|
|
126
|
+
// You can set default labels for api metrics
|
|
127
|
+
custom: 'label',
|
|
125
128
|
},
|
|
126
129
|
ignoreRoutes: ['/favicon.ico'], // You can ignore specific routes (See https://docs.nestjs.com/middleware#excluding-routes for options)
|
|
127
130
|
ignoreUndefinedRoutes: false, //Records metrics for all URLs, even undefined ones
|
|
@@ -130,9 +133,7 @@ const OpenTelemetryModuleConfig = OpenTelemetryModule.forRoot({
|
|
|
130
133
|
});
|
|
131
134
|
|
|
132
135
|
@Module({
|
|
133
|
-
imports: [
|
|
134
|
-
OpenTelemetryModuleConfig,
|
|
135
|
-
],
|
|
136
|
+
imports: [OpenTelemetryModuleConfig],
|
|
136
137
|
})
|
|
137
138
|
export class AppModule {}
|
|
138
139
|
```
|
|
@@ -179,7 +180,7 @@ export class BookService {
|
|
|
179
180
|
|
|
180
181
|
## Metric Service
|
|
181
182
|
|
|
182
|
-
[OpenTelemetry Metrics](https://www.npmjs.com/package/@opentelemetry/metrics) allow a user to collect data and export it to metrics backend like Prometheus.
|
|
183
|
+
[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
184
|
|
|
184
185
|
```ts
|
|
185
186
|
import { MetricService } from 'nestjs-otel';
|
|
@@ -210,9 +211,7 @@ If you want to count how many instance of a specific class has been created:
|
|
|
210
211
|
|
|
211
212
|
```ts
|
|
212
213
|
@OtelInstanceCounter() // It will generate a counter called: app_MyClass_instances_total.
|
|
213
|
-
export class MyClass {
|
|
214
|
-
|
|
215
|
-
}
|
|
214
|
+
export class MyClass {}
|
|
216
215
|
```
|
|
217
216
|
|
|
218
217
|
### Metric Class Method
|
|
@@ -223,9 +222,7 @@ If you want to increment a counter on each call of a specific method:
|
|
|
223
222
|
@Injectable()
|
|
224
223
|
export class MyService {
|
|
225
224
|
@OtelMethodCounter()
|
|
226
|
-
doSomething() {
|
|
227
|
-
|
|
228
|
-
}
|
|
225
|
+
doSomething() {}
|
|
229
226
|
}
|
|
230
227
|
@Controller()
|
|
231
228
|
export class AppController {
|
|
@@ -241,9 +238,12 @@ export class AppController {
|
|
|
241
238
|
|
|
242
239
|
You have the following decorators:
|
|
243
240
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
241
|
+
- `@OtelCounter()`
|
|
242
|
+
- `@OtelUpDownCounter()`
|
|
243
|
+
- `@OtelHistogram()`
|
|
244
|
+
- `@OtelObservableGauge()`
|
|
245
|
+
- `@OtelObservableCounter()`
|
|
246
|
+
- `@OtelObservableUpDownCounter()`
|
|
247
247
|
|
|
248
248
|
Example of usage:
|
|
249
249
|
|
|
@@ -253,31 +253,29 @@ import { Counter } from '@opentelemetry/api-metrics';
|
|
|
253
253
|
|
|
254
254
|
@Controller()
|
|
255
255
|
export class AppController {
|
|
256
|
-
|
|
257
256
|
@Get('/home')
|
|
258
257
|
home(
|
|
259
|
-
@OtelCounter('app_counter_1_inc', { description: 'counter 1 description' }) counter1: Counter
|
|
258
|
+
@OtelCounter('app_counter_1_inc', { description: 'counter 1 description' }) counter1: Counter
|
|
260
259
|
) {
|
|
261
|
-
counter1.
|
|
260
|
+
counter1.add(1);
|
|
262
261
|
}
|
|
263
262
|
}
|
|
264
|
-
|
|
265
263
|
```
|
|
266
264
|
|
|
267
265
|
## API Metrics with Middleware
|
|
268
266
|
|
|
269
|
-
Impl |Metric
|
|
270
|
-
|
|
271
|
-
| ✅
|
|
272
|
-
| ✅
|
|
273
|
-
| ✅
|
|
274
|
-
| ✅
|
|
275
|
-
| ✅
|
|
276
|
-
| ✅
|
|
277
|
-
| ✅
|
|
278
|
-
| ✅
|
|
279
|
-
| ✅
|
|
280
|
-
| ✅
|
|
267
|
+
| Impl | Metric | Description | Labels | Metric Type |
|
|
268
|
+
| ---- | ----------------------------- | ----------------------------------------- | -------------------- | ----------- |
|
|
269
|
+
| ✅ | http_request_total | Total number of HTTP requests. | method, path | Counter |
|
|
270
|
+
| ✅ | http_response_total | Total number of HTTP responses. | method, status, path | Counter |
|
|
271
|
+
| ✅ | http_response_success_total | Total number of all successful responses. | - | Counter |
|
|
272
|
+
| ✅ | http_response_error_total | Total number of all response errors. | - | Counter |
|
|
273
|
+
| ✅ | http_request_duration_seconds | HTTP latency value recorder in seconds. | method, status, path | Histogram |
|
|
274
|
+
| ✅ | http_client_error_total | Total number of client error requests. | - | Counter |
|
|
275
|
+
| ✅ | http_server_error_total | Total number of server error requests. | - | Counter |
|
|
276
|
+
| ✅ | http_server_aborts_total | Total number of data transfers aborted. | - | Counter |
|
|
277
|
+
| ✅ | http_request_size_bytes | Current total of incoming bytes. | - | Histogram |
|
|
278
|
+
| ✅ | http_response_size_bytes | Current total of outgoing bytes. | - | Histogram |
|
|
281
279
|
|
|
282
280
|
## Prometheus Metrics
|
|
283
281
|
|
|
@@ -285,7 +283,21 @@ When `metricExporter` is defined in otel SDK with a `PrometheusExporter`it will
|
|
|
285
283
|
|
|
286
284
|
## Using with a logger
|
|
287
285
|
|
|
288
|
-
### Pino
|
|
286
|
+
### Pino with instrumentation
|
|
287
|
+
|
|
288
|
+
This approach uses otel instrumentation to automatically inject spanId and traceId.
|
|
289
|
+
|
|
290
|
+
```ts
|
|
291
|
+
import { PinoInstrumentation } from '@opentelemetry/instrumentation-pino';
|
|
292
|
+
|
|
293
|
+
const otelSDK = new NodeSDK({
|
|
294
|
+
instrumentations: [new PinoInstrumentation()],
|
|
295
|
+
});
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Pino with custom formatter
|
|
299
|
+
|
|
300
|
+
This approach uses the global trace context for injecting SpanId and traceId as a property of your structured log.
|
|
289
301
|
|
|
290
302
|
```ts
|
|
291
303
|
import Pino, { Logger } from 'pino';
|
|
@@ -318,7 +330,6 @@ Logs are automatically associated with tracing (Loki + Tempo):
|
|
|
318
330
|
|
|
319
331
|

|
|
320
332
|
|
|
321
|
-
|
|
322
333
|
## Stargazers over time
|
|
323
334
|
|
|
324
335
|
[](https://starchart.cc/pragmaticivan/nestjs-otel)
|
|
@@ -21,50 +21,53 @@
|
|
|
21
21
|
"test:e2e": "jest --config ./test/jest-e2e.json"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@nestjs/common": "^8.
|
|
25
|
-
"@nestjs/core": "^8.
|
|
26
|
-
"@nestjs/platform-express": "^8.
|
|
27
|
-
"@nestjs/swagger": "^5.
|
|
28
|
-
"@opentelemetry/auto-instrumentations-node": "^0.
|
|
29
|
-
"@opentelemetry/core": "^0.
|
|
30
|
-
"@opentelemetry/exporter-jaeger": "^0.
|
|
31
|
-
"@opentelemetry/exporter-prometheus": "^0.
|
|
32
|
-
"@opentelemetry/host-metrics": "^0.
|
|
33
|
-
"@opentelemetry/
|
|
34
|
-
"@opentelemetry/propagator-b3": "^0.
|
|
35
|
-
"@opentelemetry/propagator-jaeger": "^0.
|
|
36
|
-
"@opentelemetry/sdk-node": "^0.
|
|
37
|
-
"@
|
|
38
|
-
"nestjs-otel": "^
|
|
39
|
-
"nestjs-pino": "^
|
|
40
|
-
"opentelemetry-node-metrics": "^1.0
|
|
41
|
-
"pino": "^6.
|
|
24
|
+
"@nestjs/common": "^8.2.4",
|
|
25
|
+
"@nestjs/core": "^8.2.4",
|
|
26
|
+
"@nestjs/platform-express": "^8.2.4",
|
|
27
|
+
"@nestjs/swagger": "^5.1.5",
|
|
28
|
+
"@opentelemetry/auto-instrumentations-node": "^0.27.1",
|
|
29
|
+
"@opentelemetry/core": "^1.0.1",
|
|
30
|
+
"@opentelemetry/exporter-jaeger": "^1.0.1",
|
|
31
|
+
"@opentelemetry/exporter-prometheus": "^0.27.0",
|
|
32
|
+
"@opentelemetry/host-metrics": "^0.27.0",
|
|
33
|
+
"@opentelemetry/instrumentation-graphql": "^0.27.1",
|
|
34
|
+
"@opentelemetry/propagator-b3": "^1.0.1",
|
|
35
|
+
"@opentelemetry/propagator-jaeger": "^1.0.1",
|
|
36
|
+
"@opentelemetry/sdk-node": "^0.27.0",
|
|
37
|
+
"@types/graphql": "^14.5.0",
|
|
38
|
+
"nestjs-otel": "^3.0.0",
|
|
39
|
+
"nestjs-pino": "^2.4.0",
|
|
40
|
+
"opentelemetry-node-metrics": "^1.1.0",
|
|
41
|
+
"pino": "^7.6.2",
|
|
42
|
+
"pino-http": "^6.5.0",
|
|
42
43
|
"reflect-metadata": "^0.1.13",
|
|
43
44
|
"rimraf": "^3.0.2",
|
|
44
|
-
"rxjs": "^7.
|
|
45
|
-
"swagger-ui-express": "^4.
|
|
45
|
+
"rxjs": "^7.5.1",
|
|
46
|
+
"swagger-ui-express": "^4.3.0"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|
|
48
|
-
"@nestjs/cli": "^8.1.
|
|
49
|
-
"@nestjs/schematics": "^8.0.
|
|
50
|
-
"@nestjs/testing": "^8.
|
|
49
|
+
"@nestjs/cli": "^8.1.6",
|
|
50
|
+
"@nestjs/schematics": "^8.0.5",
|
|
51
|
+
"@nestjs/testing": "^8.2.4",
|
|
52
|
+
"@opentelemetry/api-metrics": "^0.27.0",
|
|
51
53
|
"@types/express": "^4.17.13",
|
|
52
|
-
"@types/jest": "^
|
|
53
|
-
"@types/node": "^
|
|
54
|
+
"@types/jest": "^27.0.3",
|
|
55
|
+
"@types/node": "^17.0.5",
|
|
56
|
+
"@types/pino-http": "^5.8.1",
|
|
54
57
|
"@types/supertest": "^2.0.11",
|
|
55
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
56
|
-
"@typescript-eslint/parser": "^
|
|
57
|
-
"eslint": "^
|
|
58
|
+
"@typescript-eslint/eslint-plugin": "^5.8.1",
|
|
59
|
+
"@typescript-eslint/parser": "^5.8.1",
|
|
60
|
+
"eslint": "^8.5.0",
|
|
58
61
|
"eslint-config-prettier": "8.3.0",
|
|
59
|
-
"eslint-plugin-prettier": "^
|
|
60
|
-
"jest": "^27.
|
|
61
|
-
"prettier": "^2.
|
|
62
|
-
"supertest": "^6.1.
|
|
63
|
-
"ts-jest": "^27.
|
|
64
|
-
"ts-loader": "^9.2.
|
|
65
|
-
"ts-node": "^10.
|
|
66
|
-
"tsconfig-paths": "^3.
|
|
67
|
-
"typescript": "^4.
|
|
62
|
+
"eslint-plugin-prettier": "^4.0.0",
|
|
63
|
+
"jest": "^27.4.5",
|
|
64
|
+
"prettier": "^2.5.1",
|
|
65
|
+
"supertest": "^6.1.6",
|
|
66
|
+
"ts-jest": "^27.1.2",
|
|
67
|
+
"ts-loader": "^9.2.6",
|
|
68
|
+
"ts-node": "^10.4.0",
|
|
69
|
+
"tsconfig-paths": "^3.12.0",
|
|
70
|
+
"typescript": "^4.5.4"
|
|
68
71
|
},
|
|
69
72
|
"jest": {
|
|
70
73
|
"moduleFileExtensions": [
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CompositePropagator,
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
W3CTraceContextPropagator,
|
|
4
|
+
W3CBaggagePropagator,
|
|
5
5
|
} from '@opentelemetry/core';
|
|
6
|
-
import { BatchSpanProcessor } from '@opentelemetry/
|
|
6
|
+
import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
7
7
|
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';
|
|
8
8
|
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
|
|
9
9
|
import { JaegerPropagator } from '@opentelemetry/propagator-jaeger';
|
|
@@ -23,8 +23,8 @@ const otelSDK = new NodeSDK({
|
|
|
23
23
|
textMapPropagator: new CompositePropagator({
|
|
24
24
|
propagators: [
|
|
25
25
|
new JaegerPropagator(),
|
|
26
|
-
new
|
|
27
|
-
new
|
|
26
|
+
new W3CTraceContextPropagator(),
|
|
27
|
+
new W3CBaggagePropagator(),
|
|
28
28
|
new B3Propagator(),
|
|
29
29
|
new B3Propagator({
|
|
30
30
|
injectEncoding: B3InjectEncoding.MULTI_HEADER,
|
|
@@ -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, ObservableResult } 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, callback?: (observableResult: ObservableResult) => void): ObservableGauge;
|
|
16
|
+
export declare function getOrCreateObservableCounter(name: string, options: MetricOptions, callback?: (observableResult: ObservableResult) => void): ObservableCounter;
|
|
17
|
+
export declare function getOrCreateObservableUpDownCounter(name: string, options: MetricOptions, callback?: (observableResult: ObservableResult) => void): 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, callback) {
|
|
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, callback);
|
|
52
|
+
exports.meterData.set(name, observableGauge);
|
|
53
|
+
return observableGauge;
|
|
45
54
|
}
|
|
46
|
-
exports.
|
|
55
|
+
exports.getOrCreateObservableGauge = getOrCreateObservableGauge;
|
|
56
|
+
function getOrCreateObservableCounter(name, options, callback) {
|
|
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, callback);
|
|
62
|
+
exports.meterData.set(name, observableCounter);
|
|
63
|
+
return observableCounter;
|
|
64
|
+
}
|
|
65
|
+
exports.getOrCreateObservableCounter = getOrCreateObservableCounter;
|
|
66
|
+
function getOrCreateObservableUpDownCounter(name, options, callback) {
|
|
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, callback);
|
|
72
|
+
exports.meterData.set(name, observableCounter);
|
|
73
|
+
return observableCounter;
|
|
74
|
+
}
|
|
75
|
+
exports.getOrCreateObservableUpDownCounter = getOrCreateObservableUpDownCounter;
|
|
47
76
|
//# sourceMappingURL=metric-data.js.map
|