nestjs-otel 8.0.0 → 8.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/README.md +0 -1
  2. package/lib/index.d.ts +11 -0
  3. package/lib/index.js +27 -0
  4. package/lib/interfaces/index.d.ts +2 -0
  5. package/lib/interfaces/index.js +18 -0
  6. package/lib/interfaces/metric-options.interface.d.ts +7 -0
  7. package/lib/interfaces/metric-options.interface.js +2 -0
  8. package/lib/interfaces/opentelemetry-options.interface.d.ts +40 -0
  9. package/lib/interfaces/opentelemetry-options.interface.js +2 -0
  10. package/lib/metrics/decorators/common.d.ts +19 -0
  11. package/lib/metrics/decorators/common.js +55 -0
  12. package/lib/metrics/decorators/common.spec.d.ts +1 -0
  13. package/lib/metrics/decorators/common.spec.js +53 -0
  14. package/lib/metrics/decorators/index.d.ts +2 -0
  15. package/lib/metrics/decorators/index.js +18 -0
  16. package/lib/metrics/decorators/param.d.ts +9 -0
  17. package/lib/metrics/decorators/param.js +20 -0
  18. package/lib/metrics/injector.d.ts +1 -0
  19. package/lib/metrics/injector.js +9 -0
  20. package/lib/metrics/metric-data.d.ts +20 -0
  21. package/lib/metrics/metric-data.js +82 -0
  22. package/lib/metrics/metric.service.d.ts +10 -0
  23. package/lib/metrics/metric.service.js +38 -0
  24. package/lib/metrics/utils.d.ts +4 -0
  25. package/lib/metrics/utils.js +9 -0
  26. package/lib/metrics/utils.spec.d.ts +1 -0
  27. package/lib/metrics/utils.spec.js +10 -0
  28. package/lib/opentelemetry-core.module.d.ts +38 -0
  29. package/lib/opentelemetry-core.module.js +130 -0
  30. package/lib/opentelemetry.constants.d.ts +3 -0
  31. package/lib/opentelemetry.constants.js +6 -0
  32. package/lib/opentelemetry.module.d.ts +20 -0
  33. package/lib/opentelemetry.module.js +44 -0
  34. package/lib/opentelemetry.utils.d.ts +1 -0
  35. package/lib/opentelemetry.utils.js +12 -0
  36. package/lib/tracing/decorators/baggage.d.ts +10 -0
  37. package/lib/tracing/decorators/baggage.js +24 -0
  38. package/lib/tracing/decorators/baggage.spec.d.ts +1 -0
  39. package/lib/tracing/decorators/baggage.spec.js +42 -0
  40. package/lib/tracing/decorators/current-span.d.ts +8 -0
  41. package/lib/tracing/decorators/current-span.js +16 -0
  42. package/lib/tracing/decorators/current-span.spec.d.ts +1 -0
  43. package/lib/tracing/decorators/current-span.spec.js +21 -0
  44. package/lib/tracing/decorators/span.d.ts +14 -0
  45. package/lib/tracing/decorators/span.js +84 -0
  46. package/lib/tracing/decorators/span.spec.d.ts +1 -0
  47. package/lib/tracing/decorators/span.spec.js +252 -0
  48. package/lib/tracing/decorators/traceable.d.ts +7 -0
  49. package/lib/tracing/decorators/traceable.js +26 -0
  50. package/lib/tracing/decorators/traceable.spec.d.ts +1 -0
  51. package/lib/tracing/decorators/traceable.spec.js +106 -0
  52. package/lib/tracing/trace.service.d.ts +6 -0
  53. package/lib/tracing/trace.service.js +27 -0
  54. package/package.json +4 -4
package/README.md CHANGED
@@ -1,6 +1,5 @@
1
1
  ![nestjs-otel](https://github.com/pragmaticivan/nestjs-otel/assets/301291/40aaad82-82f9-48e5-b204-0e3cef532813)
2
2
 
3
-
4
3
  # NestJS OpenTelemetry (OTEL)
5
4
 
6
5
  ![Build Status](https://github.com/pragmaticivan/nestjs-otel/actions/workflows/nodejs.yml/badge.svg)
package/lib/index.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export * from "./interfaces";
2
+ export * from "./metrics/decorators";
3
+ export * from "./metrics/injector";
4
+ export * from "./metrics/metric.service";
5
+ export * from "./opentelemetry.constants";
6
+ export * from "./opentelemetry.module";
7
+ export * from "./tracing/decorators/baggage";
8
+ export * from "./tracing/decorators/current-span";
9
+ export * from "./tracing/decorators/span";
10
+ export * from "./tracing/decorators/traceable";
11
+ export * from "./tracing/trace.service";
package/lib/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./interfaces"), exports);
18
+ __exportStar(require("./metrics/decorators"), exports);
19
+ __exportStar(require("./metrics/injector"), exports);
20
+ __exportStar(require("./metrics/metric.service"), exports);
21
+ __exportStar(require("./opentelemetry.constants"), exports);
22
+ __exportStar(require("./opentelemetry.module"), exports);
23
+ __exportStar(require("./tracing/decorators/baggage"), exports);
24
+ __exportStar(require("./tracing/decorators/current-span"), exports);
25
+ __exportStar(require("./tracing/decorators/span"), exports);
26
+ __exportStar(require("./tracing/decorators/traceable"), exports);
27
+ __exportStar(require("./tracing/trace.service"), exports);
@@ -0,0 +1,2 @@
1
+ export * from "./metric-options.interface";
2
+ export * from "./opentelemetry-options.interface";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./metric-options.interface"), exports);
18
+ __exportStar(require("./opentelemetry-options.interface"), exports);
@@ -0,0 +1,7 @@
1
+ import type { 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 });
@@ -0,0 +1,40 @@
1
+ import type { Abstract, ModuleMetadata, Type } from "@nestjs/common";
2
+ export type OpenTelemetryModuleOptions = {
3
+ /**
4
+ * OpenTelemetry Metrics Setup
5
+ */
6
+ metrics?: OpenTelemetryMetrics;
7
+ };
8
+ export type OpenTelemetryOptionsFactory = {
9
+ createOpenTelemetryOptions(): Promise<OpenTelemetryModuleOptions> | OpenTelemetryModuleOptions;
10
+ };
11
+ /**
12
+ * The options for the asynchronous OpenTelemetry module creation
13
+ *
14
+ * @publicApi
15
+ */
16
+ export interface OpenTelemetryModuleAsyncOptions extends Pick<ModuleMetadata, "imports"> {
17
+ /**
18
+ * The name of the module
19
+ */
20
+ name?: string;
21
+ /**
22
+ * The class which should be used to provide the OpenTelemetry options
23
+ */
24
+ useClass?: Type<OpenTelemetryOptionsFactory>;
25
+ /**
26
+ * Import existing providers from other module
27
+ */
28
+ useExisting?: Type<OpenTelemetryOptionsFactory>;
29
+ /**
30
+ * The factory which should be used to provide the OpenTelemetry options
31
+ */
32
+ useFactory?: (...args: any[]) => Promise<OpenTelemetryModuleOptions> | OpenTelemetryModuleOptions;
33
+ /**
34
+ * The providers which should get injected
35
+ */
36
+ inject?: (string | symbol | Function | Type<any> | Abstract<any>)[];
37
+ }
38
+ export type OpenTelemetryMetrics = {
39
+ hostMetrics?: boolean;
40
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,19 @@
1
+ import type { OtelMetricOptions } from "../../interfaces/metric-options.interface";
2
+ /**
3
+ * Create and increment a counter when a new instance is created
4
+ *
5
+ * @param originalClass
6
+ */
7
+ export declare const OtelInstanceCounter: (options?: OtelMetricOptions & {
8
+ name?: string;
9
+ }) => <T extends {
10
+ new (...args: any[]): {};
11
+ }>(originalClass: T) => {
12
+ new (...args: any[]): {};
13
+ } & T;
14
+ /**
15
+ * Create and increment a counter when the method is called
16
+ */
17
+ export declare const OtelMethodCounter: (options?: OtelMetricOptions & {
18
+ name?: string;
19
+ }) => (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<(...args: any[]) => any>) => void;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OtelMethodCounter = exports.OtelInstanceCounter = void 0;
4
+ const opentelemetry_utils_1 = require("../../opentelemetry.utils");
5
+ const metric_data_1 = require("../metric-data");
6
+ /**
7
+ * Create and increment a counter when a new instance is created
8
+ *
9
+ * @param originalClass
10
+ */
11
+ const OtelInstanceCounter = (options) => (originalClass) => {
12
+ const name = options?.name || `app.${originalClass.name}.instances.total`;
13
+ const description = options?.description ||
14
+ `app.${originalClass.name} object instances total`;
15
+ let counterMetric;
16
+ const wrappedClass = class extends originalClass {
17
+ constructor(...args) {
18
+ if (!counterMetric) {
19
+ counterMetric = (0, metric_data_1.getOrCreateCounter)(name, { description, ...options });
20
+ }
21
+ counterMetric.add(1);
22
+ super(...args);
23
+ }
24
+ };
25
+ Object.defineProperty(wrappedClass, "name", { value: originalClass.name });
26
+ (0, opentelemetry_utils_1.copyMetadataFromFunctionToFunction)(originalClass, wrappedClass);
27
+ return wrappedClass;
28
+ };
29
+ exports.OtelInstanceCounter = OtelInstanceCounter;
30
+ /**
31
+ * Create and increment a counter when the method is called
32
+ */
33
+ const OtelMethodCounter = (options) => (target, propertyKey, descriptor) => {
34
+ const className = target.constructor.name;
35
+ const name = options?.name || `app.${className}.${propertyKey.toString()}.calls.total`;
36
+ const description = options?.description ||
37
+ `app.${className}#${propertyKey.toString()} called total`;
38
+ let counterMetric;
39
+ const originalFunction = descriptor.value;
40
+ if (!originalFunction) {
41
+ return;
42
+ }
43
+ const wrappedFunction = function PropertyDescriptor(...args) {
44
+ if (!counterMetric) {
45
+ counterMetric = (0, metric_data_1.getOrCreateCounter)(name, { description, ...options });
46
+ }
47
+ counterMetric.add(1);
48
+ return originalFunction.apply(this, args);
49
+ };
50
+ descriptor.value = new Proxy(originalFunction, {
51
+ apply: (_, thisArg, args) => wrappedFunction.apply(thisArg, args),
52
+ });
53
+ (0, opentelemetry_utils_1.copyMetadataFromFunctionToFunction)(originalFunction, descriptor.value);
54
+ };
55
+ exports.OtelMethodCounter = OtelMethodCounter;
@@ -0,0 +1 @@
1
+ import "reflect-metadata";
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ require("reflect-metadata");
13
+ const common_1 = require("@nestjs/common");
14
+ const common_2 = require("./common");
15
+ const TestDecoratorThatSetsMetadata = () => (0, common_1.SetMetadata)("some-metadata", true);
16
+ let TestClass = class TestClass {
17
+ method() { }
18
+ };
19
+ __decorate([
20
+ TestDecoratorThatSetsMetadata(),
21
+ (0, common_2.OtelMethodCounter)(),
22
+ __metadata("design:type", Function),
23
+ __metadata("design:paramtypes", []),
24
+ __metadata("design:returntype", void 0)
25
+ ], TestClass.prototype, "method", null);
26
+ TestClass = __decorate([
27
+ (0, common_2.OtelInstanceCounter)(),
28
+ TestDecoratorThatSetsMetadata()
29
+ ], TestClass);
30
+ describe("OtelInstanceCounter", () => {
31
+ let instance;
32
+ beforeEach(() => {
33
+ instance = new TestClass();
34
+ });
35
+ it("should maintain reflect metadata", async () => {
36
+ expect(Reflect.getMetadata("some-metadata", instance.constructor)).toEqual(true);
37
+ });
38
+ it("should preserve the original class name", async () => {
39
+ expect(instance.constructor.name).toEqual("TestClass");
40
+ });
41
+ });
42
+ describe("OtelMethodCounter", () => {
43
+ let instance;
44
+ beforeEach(() => {
45
+ instance = new TestClass();
46
+ });
47
+ it("should maintain reflect metadata", async () => {
48
+ expect(Reflect.getMetadata("some-metadata", instance.method)).toEqual(true);
49
+ });
50
+ it("should preserve the original method name", async () => {
51
+ expect(instance.method.name).toEqual("method");
52
+ });
53
+ });
@@ -0,0 +1,2 @@
1
+ export * from "./common";
2
+ export * from "./param";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./common"), exports);
18
+ __exportStar(require("./param"), exports);
@@ -0,0 +1,9 @@
1
+ import type { OtelMetricOptions } from "../../interfaces/metric-options.interface";
2
+ export type MetricParamDecorator = (name: string, options?: OtelMetricOptions) => ParameterDecorator;
3
+ export declare const OtelCounter: MetricParamDecorator;
4
+ export declare const OtelUpDownCounter: MetricParamDecorator;
5
+ export declare const OtelGauge: MetricParamDecorator;
6
+ export declare const OtelHistogram: MetricParamDecorator;
7
+ export declare const OtelObservableGauge: MetricParamDecorator;
8
+ export declare const OtelObservableCounter: MetricParamDecorator;
9
+ export declare const OtelObservableUpDownCounter: MetricParamDecorator;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OtelObservableUpDownCounter = exports.OtelObservableCounter = exports.OtelObservableGauge = exports.OtelHistogram = exports.OtelGauge = exports.OtelUpDownCounter = exports.OtelCounter = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const metric_data_1 = require("../metric-data");
6
+ function createMetricParamDecorator(type, getOrCreateMetric) {
7
+ return (name, options) => (0, common_1.createParamDecorator)(() => {
8
+ if (!name || name.length === 0) {
9
+ throw new Error(`${type} need a name argument`);
10
+ }
11
+ return getOrCreateMetric(name, options);
12
+ })();
13
+ }
14
+ exports.OtelCounter = createMetricParamDecorator("OtelCounter", metric_data_1.getOrCreateCounter);
15
+ exports.OtelUpDownCounter = createMetricParamDecorator("OtelUpDownCounter", metric_data_1.getOrCreateUpDownCounter);
16
+ exports.OtelGauge = createMetricParamDecorator("OtelGauge", metric_data_1.getOrCreateGauge);
17
+ exports.OtelHistogram = createMetricParamDecorator("OtelHistogram", metric_data_1.getOrCreateHistogram);
18
+ exports.OtelObservableGauge = createMetricParamDecorator("OtelObservableGauge", metric_data_1.getOrCreateObservableGauge);
19
+ exports.OtelObservableCounter = createMetricParamDecorator("OtelObservableCounter", metric_data_1.getOrCreateObservableCounter);
20
+ exports.OtelObservableUpDownCounter = createMetricParamDecorator("OtelObservableUpDownCounter", metric_data_1.getOrCreateObservableUpDownCounter);
@@ -0,0 +1 @@
1
+ export declare function InjectMetric(name: string): (target: Record<string, unknown>, key: string | symbol, index?: number | undefined) => void;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectMetric = InjectMetric;
4
+ const common_1 = require("@nestjs/common");
5
+ const utils_1 = require("./utils");
6
+ function InjectMetric(name) {
7
+ const token = (0, utils_1.getToken)(name);
8
+ return (0, common_1.Inject)(token);
9
+ }
@@ -0,0 +1,20 @@
1
+ import { type Counter, type Gauge, type Histogram, type ObservableCounter, type ObservableGauge, type ObservableUpDownCounter, type UpDownCounter } from "@opentelemetry/api";
2
+ import type { OtelMetricOptions } from "../interfaces/metric-options.interface";
3
+ export type GenericMetric = Counter | UpDownCounter | Histogram | Gauge | ObservableGauge | ObservableCounter | ObservableUpDownCounter;
4
+ export declare enum MetricType {
5
+ Counter = "Counter",
6
+ UpDownCounter = "UpDownCounter",
7
+ Histogram = "Histogram",
8
+ Gauge = "Gauge",
9
+ ObservableGauge = "ObservableGauge",
10
+ ObservableCounter = "ObservableCounter",
11
+ ObservableUpDownCounter = "ObservableUpDownCounter"
12
+ }
13
+ export declare const meterData: Map<string, GenericMetric>;
14
+ export declare function getOrCreateHistogram(name: string, options?: OtelMetricOptions): Histogram;
15
+ export declare function getOrCreateCounter(name: string, options?: OtelMetricOptions): Counter;
16
+ export declare function getOrCreateGauge(name: string, options?: OtelMetricOptions): Gauge;
17
+ export declare function getOrCreateUpDownCounter(name: string, options?: OtelMetricOptions): UpDownCounter;
18
+ export declare function getOrCreateObservableGauge(name: string, options?: OtelMetricOptions): ObservableGauge;
19
+ export declare function getOrCreateObservableCounter(name: string, options?: OtelMetricOptions): ObservableCounter;
20
+ export declare function getOrCreateObservableUpDownCounter(name: string, options?: OtelMetricOptions): ObservableUpDownCounter;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.meterData = exports.MetricType = void 0;
4
+ exports.getOrCreateHistogram = getOrCreateHistogram;
5
+ exports.getOrCreateCounter = getOrCreateCounter;
6
+ exports.getOrCreateGauge = getOrCreateGauge;
7
+ exports.getOrCreateUpDownCounter = getOrCreateUpDownCounter;
8
+ exports.getOrCreateObservableGauge = getOrCreateObservableGauge;
9
+ exports.getOrCreateObservableCounter = getOrCreateObservableCounter;
10
+ exports.getOrCreateObservableUpDownCounter = getOrCreateObservableUpDownCounter;
11
+ const api_1 = require("@opentelemetry/api");
12
+ const opentelemetry_constants_1 = require("../opentelemetry.constants");
13
+ var MetricType;
14
+ (function (MetricType) {
15
+ MetricType["Counter"] = "Counter";
16
+ MetricType["UpDownCounter"] = "UpDownCounter";
17
+ MetricType["Histogram"] = "Histogram";
18
+ MetricType["Gauge"] = "Gauge";
19
+ MetricType["ObservableGauge"] = "ObservableGauge";
20
+ MetricType["ObservableCounter"] = "ObservableCounter";
21
+ MetricType["ObservableUpDownCounter"] = "ObservableUpDownCounter";
22
+ })(MetricType || (exports.MetricType = MetricType = {}));
23
+ exports.meterData = new Map();
24
+ function getOrCreate(name,
25
+ // biome-ignore lint/style/useDefaultParameterLast: backward compatibility
26
+ options = {}, type) {
27
+ const nameWithPrefix = options.prefix ? `${options.prefix}.${name}` : name;
28
+ let metric = exports.meterData.get(nameWithPrefix);
29
+ if (metric === undefined) {
30
+ const meter = api_1.metrics.getMeterProvider().getMeter(opentelemetry_constants_1.OTEL_METER_NAME);
31
+ switch (type) {
32
+ case MetricType.Counter:
33
+ metric = meter.createCounter(nameWithPrefix, options);
34
+ break;
35
+ case MetricType.UpDownCounter:
36
+ metric = meter.createUpDownCounter(nameWithPrefix, options);
37
+ break;
38
+ case MetricType.Histogram:
39
+ metric = meter.createHistogram(nameWithPrefix, options);
40
+ break;
41
+ case MetricType.Gauge:
42
+ metric = meter.createGauge(nameWithPrefix, options);
43
+ break;
44
+ case MetricType.ObservableGauge:
45
+ metric = meter.createObservableGauge(nameWithPrefix, options);
46
+ break;
47
+ case MetricType.ObservableCounter:
48
+ metric = meter.createObservableCounter(nameWithPrefix, options);
49
+ break;
50
+ case MetricType.ObservableUpDownCounter:
51
+ metric = meter.createObservableUpDownCounter(nameWithPrefix, options);
52
+ break;
53
+ default:
54
+ break;
55
+ }
56
+ if (metric) {
57
+ exports.meterData.set(nameWithPrefix, metric);
58
+ }
59
+ }
60
+ return metric;
61
+ }
62
+ function getOrCreateHistogram(name, options = {}) {
63
+ return getOrCreate(name, options, MetricType.Histogram);
64
+ }
65
+ function getOrCreateCounter(name, options = {}) {
66
+ return getOrCreate(name, options, MetricType.Counter);
67
+ }
68
+ function getOrCreateGauge(name, options = {}) {
69
+ return getOrCreate(name, options, MetricType.Gauge);
70
+ }
71
+ function getOrCreateUpDownCounter(name, options = {}) {
72
+ return getOrCreate(name, options, MetricType.UpDownCounter);
73
+ }
74
+ function getOrCreateObservableGauge(name, options = {}) {
75
+ return getOrCreate(name, options, MetricType.ObservableGauge);
76
+ }
77
+ function getOrCreateObservableCounter(name, options = {}) {
78
+ return getOrCreate(name, options, MetricType.ObservableCounter);
79
+ }
80
+ function getOrCreateObservableUpDownCounter(name, options = {}) {
81
+ return getOrCreate(name, options, MetricType.ObservableUpDownCounter);
82
+ }
@@ -0,0 +1,10 @@
1
+ import type { OtelMetricOptions } from "../interfaces/metric-options.interface";
2
+ export declare class MetricService {
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
+ getGauge(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").Gauge<import("@opentelemetry/api").Attributes>;
7
+ getObservableCounter(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").ObservableCounter;
8
+ getObservableGauge(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").ObservableGauge;
9
+ getObservableUpDownCounter(name: string, options?: OtelMetricOptions): import("@opentelemetry/api").ObservableUpDownCounter;
10
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MetricService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const metric_data_1 = require("./metric-data");
12
+ let MetricService = class MetricService {
13
+ getCounter(name, options) {
14
+ return (0, metric_data_1.getOrCreateCounter)(name, options);
15
+ }
16
+ getUpDownCounter(name, options) {
17
+ return (0, metric_data_1.getOrCreateUpDownCounter)(name, options);
18
+ }
19
+ getHistogram(name, options) {
20
+ return (0, metric_data_1.getOrCreateHistogram)(name, options);
21
+ }
22
+ getGauge(name, options) {
23
+ return (0, metric_data_1.getOrCreateGauge)(name, options);
24
+ }
25
+ getObservableCounter(name, options) {
26
+ return (0, metric_data_1.getOrCreateObservableCounter)(name, options);
27
+ }
28
+ getObservableGauge(name, options) {
29
+ return (0, metric_data_1.getOrCreateObservableGauge)(name, options);
30
+ }
31
+ getObservableUpDownCounter(name, options) {
32
+ return (0, metric_data_1.getOrCreateObservableUpDownCounter)(name, options);
33
+ }
34
+ };
35
+ exports.MetricService = MetricService;
36
+ exports.MetricService = MetricService = __decorate([
37
+ (0, common_1.Injectable)()
38
+ ], MetricService);
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @public
3
+ */
4
+ export declare function getToken(name: string): string;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getToken = getToken;
4
+ /**
5
+ * @public
6
+ */
7
+ function getToken(name) {
8
+ return `OTEL_METRIC_${name.toUpperCase()}`;
9
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("./utils");
4
+ describe("metrics - Utils", () => {
5
+ describe("getToken", () => {
6
+ it("returns uppercase token", () => {
7
+ expect((0, utils_1.getToken)("foo")).toBe("OTEL_METRIC_FOO");
8
+ });
9
+ });
10
+ });
@@ -0,0 +1,38 @@
1
+ /** biome-ignore-all lint/style/useImportType: backward compatibility */
2
+ import { DynamicModule, OnApplicationBootstrap } from "@nestjs/common";
3
+ import { OpenTelemetryModuleAsyncOptions, OpenTelemetryModuleOptions } from "./interfaces";
4
+ /**
5
+ * The internal OpenTelemetry Module which handles the integration
6
+ * with the third party OpenTelemetry library and Nest
7
+ *
8
+ * @internal
9
+ */
10
+ export declare class OpenTelemetryCoreModule implements OnApplicationBootstrap {
11
+ private readonly options;
12
+ constructor(options?: OpenTelemetryModuleOptions);
13
+ /**
14
+ * Bootstraps the internal OpenTelemetry Module with the given options
15
+ * synchronously and sets the correct providers
16
+ * @param options The options to bootstrap the module synchronously
17
+ */
18
+ static forRoot(options?: OpenTelemetryModuleOptions): DynamicModule;
19
+ /**
20
+ * Bootstraps the internal OpenTelemetry Module with the given
21
+ * options asynchronously and sets the correct providers
22
+ * @param options The options to bootstrap the module
23
+ */
24
+ static forRootAsync(options: OpenTelemetryModuleAsyncOptions): DynamicModule;
25
+ onApplicationBootstrap(): Promise<void>;
26
+ /**
27
+ * Returns the asynchrnous OpenTelemetry options providers depending on the
28
+ * given module options
29
+ * @param options Options for the asynchrnous OpenTelemetry module
30
+ */
31
+ private static createAsyncOptionsProvider;
32
+ /**
33
+ * Returns the asynchrnous providers depending on the given module
34
+ * options
35
+ * @param options Options for the asynchrnous OpenTelemetry module
36
+ */
37
+ private static createAsyncProviders;
38
+ }