@application-kit/observability 0.1.0 → 0.3.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.
Files changed (155) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +98 -17
  3. package/dist/cjs/cqrs/cqrs-logger.d.ts +12 -0
  4. package/dist/cjs/cqrs/cqrs-logger.js +72 -0
  5. package/dist/cjs/cqrs/cqrs-logger.module.d.ts +2 -0
  6. package/dist/cjs/cqrs/cqrs-logger.module.js +22 -0
  7. package/dist/cjs/cqrs/index.d.ts +2 -0
  8. package/dist/cjs/cqrs/index.js +18 -0
  9. package/dist/cjs/health/cli/health-cli-options.interface.d.ts +3 -0
  10. package/dist/cjs/health/cli/health-cli-options.interface.js +2 -0
  11. package/dist/cjs/health/cli/health-cli.d.ts +13 -0
  12. package/dist/cjs/health/cli/health-cli.js +56 -0
  13. package/dist/cjs/health/cli/health-cli.module.d.ts +5 -0
  14. package/dist/cjs/health/cli/health-cli.module.js +23 -0
  15. package/dist/cjs/health/cli/index.d.ts +3 -0
  16. package/dist/cjs/health/cli/index.js +19 -0
  17. package/dist/cjs/health/graphql/health-check.type.d.ts +3 -0
  18. package/dist/cjs/health/graphql/health-check.type.js +24 -0
  19. package/dist/cjs/health/graphql/health-graphql.module.d.ts +5 -0
  20. package/dist/cjs/health/graphql/health-graphql.module.js +26 -0
  21. package/dist/cjs/health/graphql/health.resolver.d.ts +11 -0
  22. package/dist/cjs/health/graphql/health.resolver.js +55 -0
  23. package/dist/cjs/health/graphql/index.d.ts +3 -0
  24. package/dist/cjs/health/graphql/index.js +19 -0
  25. package/dist/cjs/health/health-checks.d.ts +10 -0
  26. package/dist/cjs/health/health-checks.js +53 -0
  27. package/dist/cjs/health/health-http.module.d.ts +5 -0
  28. package/dist/cjs/health/health-http.module.js +26 -0
  29. package/dist/cjs/health/health-module-options.interface.d.ts +9 -0
  30. package/dist/cjs/health/health-module-options.interface.js +2 -0
  31. package/dist/cjs/health/health.config.d.ts +8 -0
  32. package/dist/cjs/health/health.config.js +39 -0
  33. package/dist/cjs/health/health.controller.d.ts +14 -0
  34. package/dist/cjs/health/health.controller.js +78 -0
  35. package/dist/cjs/health/health.environment.d.ts +5 -0
  36. package/dist/cjs/health/health.environment.js +38 -0
  37. package/dist/cjs/health/health.module.d.ts +5 -0
  38. package/dist/cjs/health/health.module.js +28 -0
  39. package/dist/cjs/health/index.d.ts +8 -0
  40. package/dist/cjs/health/index.js +24 -0
  41. package/dist/cjs/health/migrations.health-indicator.d.ts +9 -0
  42. package/dist/cjs/health/migrations.health-indicator.js +40 -0
  43. package/dist/cjs/http/client-ip-options.interface.d.ts +3 -0
  44. package/dist/cjs/http/client-ip-options.interface.js +2 -0
  45. package/dist/cjs/http/index.d.ts +2 -0
  46. package/dist/cjs/http/index.js +18 -0
  47. package/dist/cjs/http/resolve-client-ip.d.ts +14 -0
  48. package/dist/cjs/http/resolve-client-ip.js +22 -0
  49. package/dist/cjs/logging/constants.d.ts +1 -0
  50. package/dist/cjs/logging/constants.js +4 -0
  51. package/dist/cjs/logging/index.d.ts +8 -0
  52. package/dist/cjs/logging/index.js +24 -0
  53. package/dist/cjs/logging/infrastructure-paths.d.ts +4 -0
  54. package/dist/cjs/logging/infrastructure-paths.js +9 -0
  55. package/dist/cjs/logging/logger.environment.d.ts +4 -0
  56. package/dist/cjs/logging/logger.environment.js +24 -0
  57. package/dist/cjs/logging/observability-logger.interface.d.ts +4 -0
  58. package/dist/cjs/logging/observability-logger.interface.js +2 -0
  59. package/dist/cjs/logging/pino-logger-options.interface.d.ts +5 -0
  60. package/dist/cjs/logging/pino-logger-options.interface.js +2 -0
  61. package/dist/cjs/logging/pino-logger.config.d.ts +15 -0
  62. package/dist/cjs/logging/pino-logger.config.js +104 -0
  63. package/dist/cjs/logging/resolve-request-id.d.ts +4 -0
  64. package/dist/cjs/logging/resolve-request-id.js +10 -0
  65. package/dist/cjs/logging/resolve-support-id.d.ts +3 -0
  66. package/dist/cjs/logging/resolve-support-id.js +8 -0
  67. package/dist/cjs/metrics/index.d.ts +3 -0
  68. package/dist/cjs/metrics/index.js +3 -0
  69. package/dist/cjs/metrics/metrics-hooks.d.ts +2 -0
  70. package/dist/cjs/metrics/metrics-hooks.js +37 -0
  71. package/dist/cjs/metrics/metrics-http.module.d.ts +5 -0
  72. package/dist/cjs/metrics/metrics-http.module.js +29 -0
  73. package/dist/cjs/metrics/metrics.controller.d.ts +7 -0
  74. package/dist/cjs/metrics/metrics.controller.js +42 -0
  75. package/dist/cjs/shared/active-span-context.d.ts +2 -0
  76. package/dist/cjs/shared/active-span-context.js +9 -0
  77. package/dist/cjs/shared/with-class-decorator.d.ts +2 -0
  78. package/dist/cjs/shared/with-class-decorator.js +14 -0
  79. package/dist/esm/cqrs/cqrs-logger.d.ts +12 -0
  80. package/dist/esm/cqrs/cqrs-logger.js +69 -0
  81. package/dist/esm/cqrs/cqrs-logger.module.d.ts +2 -0
  82. package/dist/esm/cqrs/cqrs-logger.module.js +19 -0
  83. package/dist/esm/cqrs/index.d.ts +2 -0
  84. package/dist/esm/cqrs/index.js +2 -0
  85. package/dist/esm/health/cli/health-cli-options.interface.d.ts +3 -0
  86. package/dist/esm/health/cli/health-cli-options.interface.js +1 -0
  87. package/dist/esm/health/cli/health-cli.d.ts +13 -0
  88. package/dist/esm/health/cli/health-cli.js +52 -0
  89. package/dist/esm/health/cli/health-cli.module.d.ts +5 -0
  90. package/dist/esm/health/cli/health-cli.module.js +20 -0
  91. package/dist/esm/health/cli/index.d.ts +3 -0
  92. package/dist/esm/health/cli/index.js +3 -0
  93. package/dist/esm/health/graphql/health-check.type.d.ts +3 -0
  94. package/dist/esm/health/graphql/health-check.type.js +21 -0
  95. package/dist/esm/health/graphql/health-graphql.module.d.ts +5 -0
  96. package/dist/esm/health/graphql/health-graphql.module.js +23 -0
  97. package/dist/esm/health/graphql/health.resolver.d.ts +11 -0
  98. package/dist/esm/health/graphql/health.resolver.js +52 -0
  99. package/dist/esm/health/graphql/index.d.ts +3 -0
  100. package/dist/esm/health/graphql/index.js +3 -0
  101. package/dist/esm/health/health-checks.d.ts +10 -0
  102. package/dist/esm/health/health-checks.js +50 -0
  103. package/dist/esm/health/health-http.module.d.ts +5 -0
  104. package/dist/esm/health/health-http.module.js +23 -0
  105. package/dist/esm/health/health-module-options.interface.d.ts +9 -0
  106. package/dist/esm/health/health-module-options.interface.js +1 -0
  107. package/dist/esm/health/health.config.d.ts +8 -0
  108. package/dist/esm/health/health.config.js +36 -0
  109. package/dist/esm/health/health.controller.d.ts +14 -0
  110. package/dist/esm/health/health.controller.js +75 -0
  111. package/dist/esm/health/health.environment.d.ts +5 -0
  112. package/dist/esm/health/health.environment.js +34 -0
  113. package/dist/esm/health/health.module.d.ts +5 -0
  114. package/dist/esm/health/health.module.js +25 -0
  115. package/dist/esm/health/index.d.ts +8 -0
  116. package/dist/esm/health/index.js +8 -0
  117. package/dist/esm/health/migrations.health-indicator.d.ts +9 -0
  118. package/dist/esm/health/migrations.health-indicator.js +37 -0
  119. package/dist/esm/http/client-ip-options.interface.d.ts +3 -0
  120. package/dist/esm/http/client-ip-options.interface.js +1 -0
  121. package/dist/esm/http/index.d.ts +2 -0
  122. package/dist/esm/http/index.js +2 -0
  123. package/dist/esm/http/resolve-client-ip.d.ts +14 -0
  124. package/dist/esm/http/resolve-client-ip.js +18 -0
  125. package/dist/esm/logging/constants.d.ts +1 -0
  126. package/dist/esm/logging/constants.js +1 -0
  127. package/dist/esm/logging/index.d.ts +8 -0
  128. package/dist/esm/logging/index.js +8 -0
  129. package/dist/esm/logging/infrastructure-paths.d.ts +4 -0
  130. package/dist/esm/logging/infrastructure-paths.js +5 -0
  131. package/dist/esm/logging/logger.environment.d.ts +4 -0
  132. package/dist/esm/logging/logger.environment.js +20 -0
  133. package/dist/esm/logging/observability-logger.interface.d.ts +4 -0
  134. package/dist/esm/logging/observability-logger.interface.js +1 -0
  135. package/dist/esm/logging/pino-logger-options.interface.d.ts +5 -0
  136. package/dist/esm/logging/pino-logger-options.interface.js +1 -0
  137. package/dist/esm/logging/pino-logger.config.d.ts +15 -0
  138. package/dist/esm/logging/pino-logger.config.js +99 -0
  139. package/dist/esm/logging/resolve-request-id.d.ts +4 -0
  140. package/dist/esm/logging/resolve-request-id.js +6 -0
  141. package/dist/esm/logging/resolve-support-id.d.ts +3 -0
  142. package/dist/esm/logging/resolve-support-id.js +4 -0
  143. package/dist/esm/metrics/index.d.ts +3 -0
  144. package/dist/esm/metrics/index.js +3 -0
  145. package/dist/esm/metrics/metrics-hooks.d.ts +2 -0
  146. package/dist/esm/metrics/metrics-hooks.js +33 -0
  147. package/dist/esm/metrics/metrics-http.module.d.ts +5 -0
  148. package/dist/esm/metrics/metrics-http.module.js +26 -0
  149. package/dist/esm/metrics/metrics.controller.d.ts +7 -0
  150. package/dist/esm/metrics/metrics.controller.js +39 -0
  151. package/dist/esm/shared/active-span-context.d.ts +2 -0
  152. package/dist/esm/shared/active-span-context.js +5 -0
  153. package/dist/esm/shared/with-class-decorator.d.ts +2 -0
  154. package/dist/esm/shared/with-class-decorator.js +10 -0
  155. package/package.json +140 -5
@@ -0,0 +1,104 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.PinoLoggerConfig = exports.traceContextMixin = exports.responseLogLevel = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const resolve_client_ip_js_1 = require("../http/resolve-client-ip.js");
18
+ const active_span_context_js_1 = require("../shared/active-span-context.js");
19
+ const infrastructure_paths_js_1 = require("./infrastructure-paths.js");
20
+ const logger_environment_js_1 = require("./logger.environment.js");
21
+ const HTTP_STATUS_CLIENT_ERROR = 400;
22
+ const HTTP_STATUS_SERVER_ERROR = 500;
23
+ const isInfrastructureRequest = (url) => {
24
+ const path = url?.split('?', 1)[0];
25
+ return path !== undefined && (0, infrastructure_paths_js_1.isInfrastructurePath)(path);
26
+ };
27
+ const failureLevel = (statusCode, error) => {
28
+ if (error !== undefined || statusCode >= HTTP_STATUS_SERVER_ERROR) {
29
+ return 'error';
30
+ }
31
+ return statusCode >= HTTP_STATUS_CLIENT_ERROR ? 'warn' : undefined;
32
+ };
33
+ const responseLogLevel = (request, response, error) => failureLevel(response.statusCode, error)
34
+ ?? (isInfrastructureRequest(request.url) ? 'debug' : 'info');
35
+ exports.responseLogLevel = responseLogLevel;
36
+ const traceContextMixin = () => {
37
+ const spanContext = (0, active_span_context_js_1.activeSpanContext)();
38
+ if (spanContext === undefined) {
39
+ return {};
40
+ }
41
+ return { span_id: spanContext.spanId, trace_flags: spanContext.traceFlags, trace_id: spanContext.traceId };
42
+ };
43
+ exports.traceContextMixin = traceContextMixin;
44
+ const SEVERITY_BY_LEVEL = {
45
+ debug: 'DEBUG',
46
+ error: 'ERROR',
47
+ fatal: 'CRITICAL',
48
+ info: 'INFO',
49
+ trace: 'DEBUG',
50
+ warn: 'WARNING',
51
+ };
52
+ const REDACTED_LOG_PATHS = [
53
+ '*.*.password',
54
+ '*.password',
55
+ 'password',
56
+ 'req.headers.authorization',
57
+ 'req.headers.cookie',
58
+ ];
59
+ const rawSocketPort = (request) => request.raw?.socket?.remotePort;
60
+ const remotePort = (request) => request.socket?.remotePort
61
+ ?? rawSocketPort(request);
62
+ let PinoLoggerConfig = class PinoLoggerConfig {
63
+ environment;
64
+ constructor(environment) {
65
+ this.environment = environment;
66
+ }
67
+ createOptions(options = {}) {
68
+ const clientIp = options.resolveClientIp ?? resolve_client_ip_js_1.resolveClientIp;
69
+ return {
70
+ pinoHttp: {
71
+ autoLogging: true,
72
+ customLogLevel: exports.responseLogLevel,
73
+ formatters: {
74
+ level: (label, number) => ({
75
+ level: number,
76
+ severity: SEVERITY_BY_LEVEL[label] ?? SEVERITY_BY_LEVEL.info,
77
+ }),
78
+ },
79
+ level: this.environment.LOG_LEVEL,
80
+ mixin: exports.traceContextMixin,
81
+ quietReqLogger: true,
82
+ redact: [...REDACTED_LOG_PATHS],
83
+ serializers: {
84
+ req: (request) => ({
85
+ headers: request.headers,
86
+ id: request.id,
87
+ method: request.method,
88
+ params: request.raw?.params,
89
+ query: request.query,
90
+ remoteAddress: clientIp(request),
91
+ remotePort: remotePort(request),
92
+ url: request.url,
93
+ }),
94
+ },
95
+ },
96
+ };
97
+ }
98
+ };
99
+ exports.PinoLoggerConfig = PinoLoggerConfig;
100
+ exports.PinoLoggerConfig = PinoLoggerConfig = __decorate([
101
+ (0, common_1.Injectable)(),
102
+ __param(0, (0, common_1.Inject)(logger_environment_js_1.LoggerEnvironment)),
103
+ __metadata("design:paramtypes", [logger_environment_js_1.LoggerEnvironment])
104
+ ], PinoLoggerConfig);
@@ -0,0 +1,4 @@
1
+ export declare const REQUEST_ID_HEADER = "x-request-id";
2
+ export declare const resolveRequestId: (request: {
3
+ headers?: Record<string, string | string[] | undefined> | undefined;
4
+ }) => string;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveRequestId = exports.REQUEST_ID_HEADER = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ exports.REQUEST_ID_HEADER = 'x-request-id';
6
+ const resolveRequestId = (request) => {
7
+ const header = request.headers?.[exports.REQUEST_ID_HEADER];
8
+ return typeof header === 'string' && header !== '' ? header : (0, node_crypto_1.randomUUID)();
9
+ };
10
+ exports.resolveRequestId = resolveRequestId;
@@ -0,0 +1,3 @@
1
+ export declare const resolveSupportId: (request: {
2
+ id?: string | undefined;
3
+ }) => string;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveSupportId = void 0;
4
+ const active_span_context_js_1 = require("../shared/active-span-context.js");
5
+ const resolveSupportId = (request) => (0, active_span_context_js_1.activeSpanContext)()?.traceId
6
+ ?? request.id
7
+ ?? '';
8
+ exports.resolveSupportId = resolveSupportId;
@@ -1,4 +1,7 @@
1
1
  export * from './graphql-metrics.js';
2
2
  export * from './http-metrics.js';
3
+ export * from './metrics-hooks.js';
3
4
  export * from './metrics-http-server.js';
5
+ export * from './metrics-http.module.js';
6
+ export * from './metrics.controller.js';
4
7
  export * from './metrics.registry.js';
@@ -16,5 +16,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./graphql-metrics.js"), exports);
18
18
  __exportStar(require("./http-metrics.js"), exports);
19
+ __exportStar(require("./metrics-hooks.js"), exports);
19
20
  __exportStar(require("./metrics-http-server.js"), exports);
21
+ __exportStar(require("./metrics-http.module.js"), exports);
22
+ __exportStar(require("./metrics.controller.js"), exports);
20
23
  __exportStar(require("./metrics.registry.js"), exports);
@@ -0,0 +1,2 @@
1
+ import type { NestFastifyApplication } from '@nestjs/platform-fastify';
2
+ export declare const setupMetricsHooks: (app: NestFastifyApplication) => void;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupMetricsHooks = void 0;
4
+ const graphql_metrics_js_1 = require("./graphql-metrics.js");
5
+ const http_metrics_js_1 = require("./http-metrics.js");
6
+ const hasMercurius = (fastify) => 'graphql' in fastify;
7
+ const setupGraphqlHooks = (fastify, metrics) => {
8
+ fastify.addHook('onReady', (done) => {
9
+ if (hasMercurius(fastify)) {
10
+ fastify.graphql.addHook('preParsing', (0, graphql_metrics_js_1.asMercuriusHook)((_schema, _source, context) => {
11
+ metrics.start(context);
12
+ }));
13
+ fastify.graphql.addHook('preExecution', (0, graphql_metrics_js_1.asMercuriusHook)((_schema, document, context) => {
14
+ metrics.describe(context, document);
15
+ }));
16
+ fastify.graphql.addHook('onResolution', (0, graphql_metrics_js_1.asMercuriusHook)((result, context) => {
17
+ metrics.finish(context, (result.errors?.length ?? 0) > 0);
18
+ }));
19
+ }
20
+ done();
21
+ });
22
+ };
23
+ const setupMetricsHooks = (app) => {
24
+ const metrics = app.get(http_metrics_js_1.HttpMetrics);
25
+ const fastify = app.getHttpAdapter().getInstance();
26
+ fastify.addHook('onResponse', (request, reply, done) => {
27
+ metrics.observe({
28
+ durationSeconds: reply.elapsedTime / 1000,
29
+ method: request.method,
30
+ route: (0, http_metrics_js_1.resolveRouteLabel)(request.routeOptions.url),
31
+ status: reply.statusCode,
32
+ });
33
+ done();
34
+ });
35
+ setupGraphqlHooks(fastify, app.get(graphql_metrics_js_1.GraphqlMetrics));
36
+ };
37
+ exports.setupMetricsHooks = setupMetricsHooks;
@@ -0,0 +1,5 @@
1
+ import type { DynamicModule } from '@nestjs/common';
2
+ import type { HealthCarrierOptionsInterface } from '../health/health-module-options.interface.js';
3
+ export declare class MetricsHttpModule {
4
+ static forRoot(options?: HealthCarrierOptionsInterface): DynamicModule;
5
+ }
@@ -0,0 +1,29 @@
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.MetricsHttpModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const with_class_decorator_js_1 = require("../shared/with-class-decorator.js");
12
+ const graphql_metrics_js_1 = require("./graphql-metrics.js");
13
+ const http_metrics_js_1 = require("./http-metrics.js");
14
+ const metrics_controller_js_1 = require("./metrics.controller.js");
15
+ const metrics_registry_js_1 = require("./metrics.registry.js");
16
+ let MetricsHttpModule = class MetricsHttpModule {
17
+ static forRoot(options = {}) {
18
+ return {
19
+ controllers: [(0, with_class_decorator_js_1.withClassDecorator)(metrics_controller_js_1.MetricsController, options.publicRoute)],
20
+ exports: [graphql_metrics_js_1.GraphqlMetrics, http_metrics_js_1.HttpMetrics, metrics_registry_js_1.MetricsRegistry],
21
+ module: this,
22
+ providers: [graphql_metrics_js_1.GraphqlMetrics, http_metrics_js_1.HttpMetrics, metrics_registry_js_1.MetricsRegistry],
23
+ };
24
+ }
25
+ };
26
+ exports.MetricsHttpModule = MetricsHttpModule;
27
+ exports.MetricsHttpModule = MetricsHttpModule = __decorate([
28
+ (0, common_1.Module)({})
29
+ ], MetricsHttpModule);
@@ -0,0 +1,7 @@
1
+ import type { FastifyReply } from 'fastify';
2
+ import { MetricsRegistry } from './metrics.registry.js';
3
+ export declare class MetricsController {
4
+ private readonly metricsRegistry;
5
+ constructor(metricsRegistry: MetricsRegistry);
6
+ scrape(reply: FastifyReply): Promise<string>;
7
+ }
@@ -0,0 +1,42 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.MetricsController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const infrastructure_paths_js_1 = require("../logging/infrastructure-paths.js");
18
+ const metrics_registry_js_1 = require("./metrics.registry.js");
19
+ let MetricsController = class MetricsController {
20
+ metricsRegistry;
21
+ constructor(metricsRegistry) {
22
+ this.metricsRegistry = metricsRegistry;
23
+ }
24
+ async scrape(reply) {
25
+ void reply.header('Content-Type', this.metricsRegistry.contentType);
26
+ return this.metricsRegistry.render();
27
+ }
28
+ };
29
+ exports.MetricsController = MetricsController;
30
+ __decorate([
31
+ (0, common_1.Get)(),
32
+ (0, common_1.Header)('Cache-Control', 'no-store'),
33
+ __param(0, (0, common_1.Res)({ passthrough: true })),
34
+ __metadata("design:type", Function),
35
+ __metadata("design:paramtypes", [Object]),
36
+ __metadata("design:returntype", Promise)
37
+ ], MetricsController.prototype, "scrape", null);
38
+ exports.MetricsController = MetricsController = __decorate([
39
+ (0, common_1.Controller)(infrastructure_paths_js_1.METRICS_ROUTE),
40
+ __param(0, (0, common_1.Inject)(metrics_registry_js_1.MetricsRegistry)),
41
+ __metadata("design:paramtypes", [metrics_registry_js_1.MetricsRegistry])
42
+ ], MetricsController);
@@ -0,0 +1,2 @@
1
+ import type { SpanContext } from '@opentelemetry/api';
2
+ export declare const activeSpanContext: () => SpanContext | undefined;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.activeSpanContext = void 0;
4
+ const api_1 = require("@opentelemetry/api");
5
+ const activeSpanContext = () => {
6
+ const spanContext = api_1.trace.getActiveSpan()?.spanContext();
7
+ return spanContext !== undefined && (0, api_1.isSpanContextValid)(spanContext) ? spanContext : undefined;
8
+ };
9
+ exports.activeSpanContext = activeSpanContext;
@@ -0,0 +1,2 @@
1
+ import type { Type } from '@nestjs/common';
2
+ export declare const withClassDecorator: <T extends Type>(base: T, decorator: ClassDecorator | undefined) => T;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withClassDecorator = void 0;
4
+ const withClassDecorator = (base, decorator) => {
5
+ if (decorator === undefined) {
6
+ return base;
7
+ }
8
+ const decorated = class extends base {
9
+ };
10
+ Object.defineProperty(decorated, 'name', { value: base.name });
11
+ decorator(decorated);
12
+ return decorated;
13
+ };
14
+ exports.withClassDecorator = withClassDecorator;
@@ -0,0 +1,12 @@
1
+ import { OnApplicationBootstrap } from '@nestjs/common';
2
+ import { CommandBus, QueryBus } from '@nestjs/cqrs';
3
+ import type { ObservabilityLoggerInterface } from '../logging/observability-logger.interface.js';
4
+ export declare class CqrsLogger implements OnApplicationBootstrap {
5
+ private readonly commandBus;
6
+ private readonly queryBus;
7
+ private readonly logger;
8
+ private instrumented;
9
+ constructor(commandBus: CommandBus, queryBus: QueryBus, logger: ObservabilityLoggerInterface);
10
+ onApplicationBootstrap(): void;
11
+ private instrumentCompletion;
12
+ }
@@ -0,0 +1,69 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Inject, Injectable } from '@nestjs/common';
14
+ import { CommandBus, QueryBus } from '@nestjs/cqrs';
15
+ import { performance } from 'node:perf_hooks';
16
+ import { OBSERVABILITY_LOGGER } from '../logging/constants.js';
17
+ const KIND_COMMAND = 'command';
18
+ const KIND_QUERY = 'query';
19
+ let CqrsLogger = class CqrsLogger {
20
+ commandBus;
21
+ queryBus;
22
+ logger;
23
+ instrumented = false;
24
+ constructor(commandBus, queryBus, logger) {
25
+ this.commandBus = commandBus;
26
+ this.queryBus = queryBus;
27
+ this.logger = logger;
28
+ }
29
+ onApplicationBootstrap() {
30
+ if (this.instrumented) {
31
+ return;
32
+ }
33
+ this.instrumented = true;
34
+ this.commandBus.subscribe((command) => {
35
+ this.logger.info({ [KIND_COMMAND]: command.constructor.name }, 'command started');
36
+ });
37
+ this.queryBus.subscribe((query) => {
38
+ this.logger.info({ [KIND_QUERY]: query.constructor.name }, 'query started');
39
+ });
40
+ this.instrumentCompletion(this.commandBus, KIND_COMMAND);
41
+ this.instrumentCompletion(this.queryBus, KIND_QUERY);
42
+ }
43
+ instrumentCompletion(bus, kind) {
44
+ const target = bus;
45
+ const original = target.execute.bind(target);
46
+ target.execute = async (payload, context) => {
47
+ const startedAt = performance.now();
48
+ const { name } = payload.constructor;
49
+ try {
50
+ const result = await original(payload, context);
51
+ this.logger.info({ durationMs: performance.now() - startedAt, [kind]: name, outcome: 'ok' }, `${kind} finished`);
52
+ return result;
53
+ }
54
+ catch (error) {
55
+ this.logger.error({ durationMs: performance.now() - startedAt, err: error, [kind]: name, outcome: 'error' }, `${kind} failed`);
56
+ throw error;
57
+ }
58
+ };
59
+ }
60
+ };
61
+ CqrsLogger = __decorate([
62
+ Injectable(),
63
+ __param(0, Inject(CommandBus)),
64
+ __param(1, Inject(QueryBus)),
65
+ __param(2, Inject(OBSERVABILITY_LOGGER)),
66
+ __metadata("design:paramtypes", [CommandBus,
67
+ QueryBus, Object])
68
+ ], CqrsLogger);
69
+ export { CqrsLogger };
@@ -0,0 +1,2 @@
1
+ export declare class CqrsLoggerModule {
2
+ }
@@ -0,0 +1,19 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Module } from '@nestjs/common';
8
+ import { CqrsModule } from '@nestjs/cqrs';
9
+ import { CqrsLogger } from './cqrs-logger.js';
10
+ let CqrsLoggerModule = class CqrsLoggerModule {
11
+ };
12
+ CqrsLoggerModule = __decorate([
13
+ Module({
14
+ exports: [CqrsLogger],
15
+ imports: [CqrsModule],
16
+ providers: [CqrsLogger],
17
+ })
18
+ ], CqrsLoggerModule);
19
+ export { CqrsLoggerModule };
@@ -0,0 +1,2 @@
1
+ export * from './cqrs-logger.js';
2
+ export * from './cqrs-logger.module.js';
@@ -0,0 +1,2 @@
1
+ export * from './cqrs-logger.js';
2
+ export * from './cqrs-logger.module.js';
@@ -0,0 +1,3 @@
1
+ export interface HealthCliOptionsInterface {
2
+ readonly command: string;
3
+ }
@@ -0,0 +1,13 @@
1
+ import type { Type } from '@nestjs/common';
2
+ import { HealthCheckService } from '@nestjs/terminus';
3
+ import type { ObservabilityLoggerInterface } from '../../logging/observability-logger.interface.js';
4
+ import type { HealthCliOptionsInterface } from './health-cli-options.interface.js';
5
+ import { HealthChecks } from '../health-checks.js';
6
+ export declare class HealthCliCommands {
7
+ private readonly health;
8
+ private readonly logger;
9
+ private readonly healthChecks;
10
+ constructor(health: HealthCheckService, logger: ObservabilityLoggerInterface, healthChecks: HealthChecks);
11
+ getHealth(): Promise<void>;
12
+ }
13
+ export declare const createHealthCli: (options: HealthCliOptionsInterface) => Type<HealthCliCommands>;
@@ -0,0 +1,52 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Inject, ServiceUnavailableException } from '@nestjs/common';
14
+ import { HealthCheckService } from '@nestjs/terminus';
15
+ import { Command, Console } from 'nestjs-console';
16
+ import { OBSERVABILITY_LOGGER } from '../../logging/constants.js';
17
+ import { withClassDecorator } from '../../shared/with-class-decorator.js';
18
+ import { HealthChecks } from '../health-checks.js';
19
+ let HealthCliCommands = class HealthCliCommands {
20
+ health;
21
+ logger;
22
+ healthChecks;
23
+ constructor(health, logger, healthChecks) {
24
+ this.health = health;
25
+ this.logger = logger;
26
+ this.healthChecks = healthChecks;
27
+ }
28
+ async getHealth() {
29
+ try {
30
+ const healthResult = await this.health.check(this.healthChecks.build());
31
+ this.logger.info({ healthResult }, healthResult.status);
32
+ }
33
+ catch (error) {
34
+ const healthResult = error instanceof ServiceUnavailableException ? error.getResponse() : 'unknown';
35
+ this.logger.error({ healthResult }, 'error');
36
+ }
37
+ }
38
+ };
39
+ __decorate([
40
+ Command({ command: 'health' }),
41
+ __metadata("design:type", Function),
42
+ __metadata("design:paramtypes", []),
43
+ __metadata("design:returntype", Promise)
44
+ ], HealthCliCommands.prototype, "getHealth", null);
45
+ HealthCliCommands = __decorate([
46
+ __param(0, Inject(HealthCheckService)),
47
+ __param(1, Inject(OBSERVABILITY_LOGGER)),
48
+ __param(2, Inject(HealthChecks)),
49
+ __metadata("design:paramtypes", [HealthCheckService, Object, HealthChecks])
50
+ ], HealthCliCommands);
51
+ export { HealthCliCommands };
52
+ export const createHealthCli = (options) => withClassDecorator(HealthCliCommands, Console({ command: options.command }));
@@ -0,0 +1,5 @@
1
+ import type { DynamicModule } from '@nestjs/common';
2
+ import type { HealthCliOptionsInterface } from './health-cli-options.interface.js';
3
+ export declare class HealthCliModule {
4
+ static forRoot(options: HealthCliOptionsInterface): DynamicModule;
5
+ }
@@ -0,0 +1,20 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Module } from '@nestjs/common';
8
+ import { createHealthCli } from './health-cli.js';
9
+ let HealthCliModule = class HealthCliModule {
10
+ static forRoot(options) {
11
+ return {
12
+ module: this,
13
+ providers: [createHealthCli(options)],
14
+ };
15
+ }
16
+ };
17
+ HealthCliModule = __decorate([
18
+ Module({})
19
+ ], HealthCliModule);
20
+ export { HealthCliModule };
@@ -0,0 +1,3 @@
1
+ export * from './health-cli.js';
2
+ export * from './health-cli-options.interface.js';
3
+ export * from './health-cli.module.js';
@@ -0,0 +1,3 @@
1
+ export * from './health-cli.js';
2
+ export * from './health-cli-options.interface.js';
3
+ export * from './health-cli.module.js';
@@ -0,0 +1,3 @@
1
+ export declare class HealthCheckType {
2
+ status: string;
3
+ }
@@ -0,0 +1,21 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Field, ObjectType } from '@nestjs/graphql';
11
+ let HealthCheckType = class HealthCheckType {
12
+ status;
13
+ };
14
+ __decorate([
15
+ Field(() => String),
16
+ __metadata("design:type", String)
17
+ ], HealthCheckType.prototype, "status", void 0);
18
+ HealthCheckType = __decorate([
19
+ ObjectType('HealthCheck')
20
+ ], HealthCheckType);
21
+ export { HealthCheckType };
@@ -0,0 +1,5 @@
1
+ import type { DynamicModule } from '@nestjs/common';
2
+ import type { HealthCarrierOptionsInterface } from '../health-module-options.interface.js';
3
+ export declare class HealthGraphqlModule {
4
+ static forRoot(options?: HealthCarrierOptionsInterface): DynamicModule;
5
+ }
@@ -0,0 +1,23 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { applyDecorators, Module } from '@nestjs/common';
8
+ import { Resolver } from '@nestjs/graphql';
9
+ import { withClassDecorator } from '../../shared/with-class-decorator.js';
10
+ import { HealthResolver } from './health.resolver.js';
11
+ let HealthGraphqlModule = class HealthGraphqlModule {
12
+ static forRoot(options = {}) {
13
+ const consumerDecorators = options.publicRoute === undefined ? [] : [options.publicRoute];
14
+ return {
15
+ module: this,
16
+ providers: [withClassDecorator(HealthResolver, applyDecorators(Resolver(), ...consumerDecorators))],
17
+ };
18
+ }
19
+ };
20
+ HealthGraphqlModule = __decorate([
21
+ Module({})
22
+ ], HealthGraphqlModule);
23
+ export { HealthGraphqlModule };
@@ -0,0 +1,11 @@
1
+ import { HealthCheckService } from '@nestjs/terminus';
2
+ import type { ObservabilityLoggerInterface } from '../../logging/observability-logger.interface.js';
3
+ import { HealthChecks } from '../health-checks.js';
4
+ import { HealthCheckType } from './health-check.type.js';
5
+ export declare class HealthResolver {
6
+ private readonly healthCheck;
7
+ private readonly logger;
8
+ private readonly healthChecks;
9
+ constructor(healthCheck: HealthCheckService, logger: ObservabilityLoggerInterface, healthChecks: HealthChecks);
10
+ health(): Promise<HealthCheckType>;
11
+ }