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.
Files changed (54) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +50 -39
  3. package/examples/nestjs-prom-grafana-tempo/package.json +40 -37
  4. package/examples/nestjs-prom-grafana-tempo/src/tracing.ts +5 -5
  5. package/lib/interfaces/opentelemetry-options.interface.d.ts +2 -2
  6. package/lib/metrics/decorators/common.js +2 -2
  7. package/lib/metrics/decorators/common.js.map +1 -1
  8. package/lib/metrics/decorators/counter.js +2 -2
  9. package/lib/metrics/decorators/counter.js.map +1 -1
  10. package/lib/metrics/decorators/histogram.d.ts +1 -0
  11. package/lib/metrics/decorators/histogram.js +12 -0
  12. package/lib/metrics/decorators/histogram.js.map +1 -0
  13. package/lib/metrics/decorators/index.d.ts +2 -1
  14. package/lib/metrics/decorators/index.js +2 -1
  15. package/lib/metrics/decorators/index.js.map +1 -1
  16. package/lib/metrics/decorators/observable.d.ts +3 -0
  17. package/lib/metrics/decorators/observable.js +24 -0
  18. package/lib/metrics/decorators/observable.js.map +1 -0
  19. package/lib/metrics/metric-data.d.ts +12 -5
  20. package/lib/metrics/metric-data.js +53 -24
  21. package/lib/metrics/metric-data.js.map +1 -1
  22. package/lib/metrics/metric.service.d.ts +7 -6
  23. package/lib/metrics/metric.service.js +11 -8
  24. package/lib/metrics/metric.service.js.map +1 -1
  25. package/lib/middleware/api-metrics.middleware.d.ts +5 -5
  26. package/lib/middleware/api-metrics.middleware.js +17 -17
  27. package/lib/middleware/api-metrics.middleware.js.map +1 -1
  28. package/lib/opentelemetry-core.module.js.map +1 -1
  29. package/lib/tracing/decorators/span.js +2 -3
  30. package/lib/tracing/decorators/span.js.map +1 -1
  31. package/lib/tracing/decorators/span.spec.d.ts +1 -0
  32. package/lib/tracing/decorators/span.spec.js +58 -0
  33. package/lib/tracing/decorators/span.spec.js.map +1 -0
  34. package/lib/tracing/trace.service.d.ts +1 -0
  35. package/lib/tracing/trace.service.js +4 -2
  36. package/lib/tracing/trace.service.js.map +1 -1
  37. package/lib/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +31 -32
  39. package/src/interfaces/opentelemetry-options.interface.ts +3 -3
  40. package/src/metrics/decorators/common.ts +6 -4
  41. package/src/metrics/decorators/counter.ts +5 -9
  42. package/src/metrics/decorators/histogram.ts +10 -0
  43. package/src/metrics/decorators/observable.ts +28 -0
  44. package/src/metrics/metric-data.ts +89 -29
  45. package/src/metrics/metric.service.ts +28 -14
  46. package/src/middleware/api-metrics.middleware.ts +19 -19
  47. package/src/opentelemetry-core.module.ts +3 -3
  48. package/src/tracing/decorators/span.spec.ts +48 -0
  49. package/src/tracing/decorators/span.ts +4 -11
  50. package/src/tracing/trace.service.ts +5 -2
  51. package/lib/metrics/decorators/value-recorder.d.ts +0 -1
  52. package/lib/metrics/decorators/value-recorder.js +0 -12
  53. package/lib/metrics/decorators/value-recorder.js.map +0 -1
  54. 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
  ![Build Status](https://github.com/pragmaticivan/nestjs-otel/actions/workflows/nodejs.yml/badge.svg)
8
8
  [![NPM](https://img.shields.io/npm/v/nestjs-otel.svg)](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
- HttpTraceContextPropagator,
47
- HttpBaggagePropagator,
47
+ W3CTraceContextPropagator,
48
+ W3CBaggagePropagator,
48
49
  } from '@opentelemetry/core';
49
- import { BatchSpanProcessor } from '@opentelemetry/tracing';
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 HttpTraceContextPropagator(),
70
- new HttpBaggagePropagator(),
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
- (err) => console.log('Error shutting down SDK', err),
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
- defaultLabels: { // You can set default labels for api metrics
124
- custom: 'label'
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
- * `@OtelCounter()`
245
- * `@OtelUpDownCounter()`
246
- * `@OtelValueRecorder()`
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.inc(1);
260
+ counter1.add(1);
262
261
  }
263
262
  }
264
-
265
263
  ```
266
264
 
267
265
  ## API Metrics with Middleware
268
266
 
269
- Impl |Metric |Description| Labels | Metric Type
270
- --- | --- | --- | --- | ---
271
- | ✅ | http_request_total | Total number of HTTP requests.| method, path | Counter |
272
- | ✅ | http_response_total| Total number of HTTP responses.| method, status, path | Counter |
273
- | ✅ | http_response_success_total| Total number of all successful responses.| - | Counter |
274
- | ✅ | 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 | ValueRecorder |
276
- | ✅ | http_client_error_total | Total number of client error requests. | - | Counter |
277
- | ✅ | http_server_error_total | Total number of server error requests. | - | Counter |
278
- | ✅ | http_server_aborts_total | Total number of data transfers aborted. | - | Counter |
279
- | ✅ | http_request_size_bytes | Current total of incoming bytes. | - | ValueRecorder|
280
- | ✅ | http_response_size_bytes | Current total of outgoing bytes. | - | ValueRecorder |
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
  ![Loki](./examples/nestjs-prom-grafana-tempo/loki-logs.png)
320
332
 
321
-
322
333
  ## Stargazers over time
323
334
 
324
335
  [![Stargazers over time](https://starchart.cc/pragmaticivan/nestjs-otel.svg)](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.0.5",
25
- "@nestjs/core": "^8.0.5",
26
- "@nestjs/platform-express": "^8.0.5",
27
- "@nestjs/swagger": "^5.0.9",
28
- "@opentelemetry/auto-instrumentations-node": "^0.24.0",
29
- "@opentelemetry/core": "^0.24.0",
30
- "@opentelemetry/exporter-jaeger": "^0.24.0",
31
- "@opentelemetry/exporter-prometheus": "^0.24.0",
32
- "@opentelemetry/host-metrics": "^0.24.0",
33
- "@opentelemetry/metrics": "^0.24.0",
34
- "@opentelemetry/propagator-b3": "^0.24.0",
35
- "@opentelemetry/propagator-jaeger": "^0.24.0",
36
- "@opentelemetry/sdk-node": "^0.24.0",
37
- "@opentelemetry/tracing": "^0.24.0",
38
- "nestjs-otel": "^2.1.0",
39
- "nestjs-pino": "^1.4.0",
40
- "opentelemetry-node-metrics": "^1.0.2",
41
- "pino": "^6.13.0",
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.3.0",
45
- "swagger-ui-express": "^4.1.6"
45
+ "rxjs": "^7.5.1",
46
+ "swagger-ui-express": "^4.3.0"
46
47
  },
47
48
  "devDependencies": {
48
- "@nestjs/cli": "^8.1.1",
49
- "@nestjs/schematics": "^8.0.2",
50
- "@nestjs/testing": "^8.0.5",
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": "^26.0.24",
53
- "@types/node": "^16.4.10",
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": "^4.29.0",
56
- "@typescript-eslint/parser": "^4.29.0",
57
- "eslint": "^7.32.0",
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": "^3.4.0",
60
- "jest": "^27.0.6",
61
- "prettier": "^2.3.2",
62
- "supertest": "^6.1.4",
63
- "ts-jest": "^27.0.4",
64
- "ts-loader": "^9.2.4",
65
- "ts-node": "^10.1.0",
66
- "tsconfig-paths": "^3.10.1",
67
- "typescript": "^4.3.5"
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
- HttpTraceContextPropagator,
4
- HttpBaggagePropagator,
3
+ W3CTraceContextPropagator,
4
+ W3CBaggagePropagator,
5
5
  } from '@opentelemetry/core';
6
- import { BatchSpanProcessor } from '@opentelemetry/tracing';
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 HttpTraceContextPropagator(),
27
- new HttpBaggagePropagator(),
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 { Labels } from '@opentelemetry/api-metrics';
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
- defaultLabels?: Labels;
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, metric_data_1.MetricType.Counter, { description, ...options });
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, metric_data_1.MetricType.Counter, { description, ...options });
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,gDAA0F;AAOnF,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,wBAAU,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;aAC3F;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,EAAE,WAA4B,EAAE,UACrC,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,wBAAU,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;SAC3F;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;AAnBW,QAAA,iBAAiB,qBAmB5B"}
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, metric_data_1.MetricType.Counter, options);
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, metric_data_1.MetricType.UpDownCounter, options);
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,gDAA0F;AAE7E,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAAC,CAC9C,IAAY,EAAE,OAAuB,EACrC,EAAE;IACF,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,wBAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEU,QAAA,iBAAiB,GAAG,IAAA,6BAAoB,EAAC,CACpD,IAAY,EAAE,OAAuB,EACrC,EAAE;IACF,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,wBAAU,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC"}
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"}
@@ -1,3 +1,4 @@
1
1
  export * from './common';
2
2
  export * from './counter';
3
- export * from './value-recorder';
3
+ export * from './histogram';
4
+ export * from './observable';
@@ -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("./value-recorder"), exports);
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,mDAAiC"}
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, ValueRecorder } from '@opentelemetry/api-metrics';
2
- export declare type GenericMetric = Counter | UpDownCounter | ValueRecorder;
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
- 'ValueRecorder' = "ValueRecorder"
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 getOrCreateValueRecorder(name: string, type: MetricType, options: MetricOptions): ValueRecorder;
10
- export declare function getOrCreateCounter(name: string, type: MetricType, options: MetricOptions): Counter | UpDownCounter;
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.getOrCreateValueRecorder = exports.meterData = exports.MetricType = void 0;
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["ValueRecorder"] = "ValueRecorder";
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 getOrCreateValueRecorder(name, type, options) {
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
- switch (type) {
19
- case MetricType.ValueRecorder:
20
- const valueRecorder = meter.createValueRecorder(name, options);
21
- exports.meterData.set(name, valueRecorder);
22
- return valueRecorder;
23
- default:
24
- throw new Error(`Unknown type: ${type}`);
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.getOrCreateValueRecorder = getOrCreateValueRecorder;
28
- function getOrCreateCounter(name, type, options) {
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
- switch (type) {
34
- case MetricType.Counter:
35
- const counter = meter.createCounter(name, options);
36
- exports.meterData.set(name, counter);
37
- return counter;
38
- case MetricType.UpDownCounter:
39
- const upDownCounter = meter.createUpDownCounter(name, options);
40
- exports.meterData.set(name, upDownCounter);
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.getOrCreateCounter = getOrCreateCounter;
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