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 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
  });
@@ -0,0 +1,7 @@
1
+ import { MetricOptions } from '@opentelemetry/api';
2
+ export interface OtelMetricOptions extends MetricOptions {
3
+ /**
4
+ * A prefix to add to the name of the metric.
5
+ */
6
+ prefix?: string;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -44,5 +44,6 @@ export type OpenTelemetryMetrics = {
44
44
  defaultAttributes?: Attributes;
45
45
  ignoreRoutes?: (string | RouteInfo)[];
46
46
  ignoreUndefinedRoutes?: boolean;
47
+ prefix?: string;
47
48
  };
48
49
  };
@@ -1,13 +1,13 @@
1
- import { MetricOptions } from '@opentelemetry/api';
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?: MetricOptions) => <T extends new (...args: any[]) => {}>(originalClass: T) => {
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?: MetricOptions) => (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<(...args: any[]) => any>) => void;
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, MetricOptions, UpDownCounter, Histogram, ObservableGauge, ObservableCounter, ObservableUpDownCounter } from '@opentelemetry/api';
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?: MetricOptions): Histogram;
13
- export declare function getOrCreateCounter(name: string, options?: MetricOptions): Counter;
14
- export declare function getOrCreateUpDownCounter(name: string, options?: MetricOptions): UpDownCounter;
15
- export declare function getOrCreateObservableGauge(name: string, options?: MetricOptions): ObservableGauge;
16
- export declare function getOrCreateObservableCounter(name: string, options?: MetricOptions): ObservableCounter;
17
- export declare function getOrCreateObservableUpDownCounter(name: string, options?: MetricOptions): ObservableUpDownCounter;
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 getOrCreateHistogram(name, options = {}) {
17
- if (exports.meterData.has(name)) {
18
- return exports.meterData.get(name);
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
- const meter = api_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
21
- const histogram = meter.createHistogram(name, options);
22
- exports.meterData.set(name, histogram);
23
- return histogram;
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
- if (exports.meterData.has(name)) {
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
- if (exports.meterData.has(name)) {
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
- if (exports.meterData.has(name)) {
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
- if (exports.meterData.has(name)) {
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
- if (exports.meterData.has(name)) {
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 { MetricOptions } from '@opentelemetry/api';
1
+ import { OtelMetricOptions } from '../interfaces/metric-options.interface';
2
2
  export declare class MetricService {
3
- getCounter(name: string, options?: MetricOptions): import("@opentelemetry/api").Counter<import("@opentelemetry/api").Attributes>;
4
- getUpDownCounter(name: string, options?: MetricOptions): import("@opentelemetry/api").UpDownCounter<import("@opentelemetry/api").Attributes>;
5
- getHistogram(name: string, options?: MetricOptions): import("@opentelemetry/api").Histogram<import("@opentelemetry/api").Attributes>;
6
- getObservableCounter(name: string, options?: MetricOptions): import("@opentelemetry/api").ObservableCounter;
7
- getObservableGauge(name: string, options?: MetricOptions): import("@opentelemetry/api").ObservableGauge;
8
- getObservableUpDownCounter(name: string, options?: MetricOptions): import("@opentelemetry/api").ObservableUpDownCounter;
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,6 +1,6 @@
1
1
  {
2
2
  "name": "nestjs-otel",
3
- "version": "6.0.0",
3
+ "version": "6.1.0",
4
4
  "description": "NestJS OpenTelemetry Library",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index",