@application-kit/observability 0.2.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 (139) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +62 -18
  3. package/dist/cjs/cqrs/cqrs-logger.d.ts +1 -1
  4. package/dist/cjs/cqrs/cqrs-logger.js +1 -1
  5. package/dist/cjs/cqrs/index.d.ts +0 -2
  6. package/dist/cjs/cqrs/index.js +0 -2
  7. package/dist/cjs/health/cli/health-cli-options.interface.d.ts +3 -0
  8. package/dist/cjs/health/cli/health-cli.d.ts +13 -0
  9. package/dist/cjs/health/cli/health-cli.js +56 -0
  10. package/dist/cjs/health/cli/health-cli.module.d.ts +5 -0
  11. package/dist/cjs/health/cli/health-cli.module.js +23 -0
  12. package/dist/cjs/health/cli/index.d.ts +3 -0
  13. package/dist/cjs/health/cli/index.js +19 -0
  14. package/dist/cjs/health/graphql/health-check.type.d.ts +3 -0
  15. package/dist/cjs/health/graphql/health-check.type.js +24 -0
  16. package/dist/cjs/health/graphql/health-graphql.module.d.ts +5 -0
  17. package/dist/cjs/health/graphql/health-graphql.module.js +26 -0
  18. package/dist/cjs/health/graphql/health.resolver.d.ts +11 -0
  19. package/dist/cjs/health/graphql/health.resolver.js +55 -0
  20. package/dist/cjs/health/graphql/index.d.ts +3 -0
  21. package/dist/cjs/health/graphql/index.js +19 -0
  22. package/dist/cjs/health/health-checks.d.ts +10 -0
  23. package/dist/cjs/health/health-checks.js +53 -0
  24. package/dist/cjs/health/health-http.module.d.ts +5 -0
  25. package/dist/cjs/health/health-http.module.js +26 -0
  26. package/dist/cjs/health/health-module-options.interface.d.ts +9 -0
  27. package/dist/cjs/health/health-module-options.interface.js +2 -0
  28. package/dist/cjs/health/health.config.d.ts +8 -0
  29. package/dist/cjs/health/health.config.js +39 -0
  30. package/dist/cjs/health/health.controller.d.ts +14 -0
  31. package/dist/cjs/health/health.controller.js +78 -0
  32. package/dist/cjs/health/health.environment.d.ts +5 -0
  33. package/dist/cjs/health/health.environment.js +38 -0
  34. package/dist/cjs/health/health.module.d.ts +5 -0
  35. package/dist/cjs/health/health.module.js +28 -0
  36. package/dist/cjs/health/index.d.ts +8 -0
  37. package/dist/cjs/health/index.js +24 -0
  38. package/dist/cjs/health/migrations.health-indicator.d.ts +9 -0
  39. package/dist/cjs/health/migrations.health-indicator.js +40 -0
  40. package/dist/cjs/logging/index.d.ts +8 -0
  41. package/dist/cjs/logging/index.js +24 -0
  42. package/dist/cjs/logging/infrastructure-paths.d.ts +4 -0
  43. package/dist/cjs/logging/infrastructure-paths.js +9 -0
  44. package/dist/cjs/logging/logger.environment.d.ts +4 -0
  45. package/dist/cjs/logging/logger.environment.js +24 -0
  46. package/dist/cjs/logging/observability-logger.interface.js +2 -0
  47. package/dist/cjs/logging/pino-logger-options.interface.d.ts +5 -0
  48. package/dist/cjs/logging/pino-logger-options.interface.js +2 -0
  49. package/dist/cjs/logging/pino-logger.config.d.ts +15 -0
  50. package/dist/cjs/logging/pino-logger.config.js +104 -0
  51. package/dist/cjs/logging/resolve-request-id.d.ts +4 -0
  52. package/dist/cjs/logging/resolve-request-id.js +10 -0
  53. package/dist/cjs/logging/resolve-support-id.d.ts +3 -0
  54. package/dist/cjs/logging/resolve-support-id.js +8 -0
  55. package/dist/cjs/metrics/index.d.ts +3 -0
  56. package/dist/cjs/metrics/index.js +3 -0
  57. package/dist/cjs/metrics/metrics-hooks.d.ts +2 -0
  58. package/dist/cjs/metrics/metrics-hooks.js +37 -0
  59. package/dist/cjs/metrics/metrics-http.module.d.ts +5 -0
  60. package/dist/cjs/metrics/metrics-http.module.js +29 -0
  61. package/dist/cjs/metrics/metrics.controller.d.ts +7 -0
  62. package/dist/cjs/metrics/metrics.controller.js +42 -0
  63. package/dist/cjs/shared/active-span-context.d.ts +2 -0
  64. package/dist/cjs/shared/active-span-context.js +9 -0
  65. package/dist/cjs/shared/with-class-decorator.d.ts +2 -0
  66. package/dist/cjs/shared/with-class-decorator.js +14 -0
  67. package/dist/esm/cqrs/cqrs-logger.d.ts +1 -1
  68. package/dist/esm/cqrs/cqrs-logger.js +1 -1
  69. package/dist/esm/cqrs/index.d.ts +0 -2
  70. package/dist/esm/cqrs/index.js +0 -2
  71. package/dist/esm/health/cli/health-cli-options.interface.d.ts +3 -0
  72. package/dist/esm/health/cli/health-cli.d.ts +13 -0
  73. package/dist/esm/health/cli/health-cli.js +52 -0
  74. package/dist/esm/health/cli/health-cli.module.d.ts +5 -0
  75. package/dist/esm/health/cli/health-cli.module.js +20 -0
  76. package/dist/esm/health/cli/index.d.ts +3 -0
  77. package/dist/esm/health/cli/index.js +3 -0
  78. package/dist/esm/health/graphql/health-check.type.d.ts +3 -0
  79. package/dist/esm/health/graphql/health-check.type.js +21 -0
  80. package/dist/esm/health/graphql/health-graphql.module.d.ts +5 -0
  81. package/dist/esm/health/graphql/health-graphql.module.js +23 -0
  82. package/dist/esm/health/graphql/health.resolver.d.ts +11 -0
  83. package/dist/esm/health/graphql/health.resolver.js +52 -0
  84. package/dist/esm/health/graphql/index.d.ts +3 -0
  85. package/dist/esm/health/graphql/index.js +3 -0
  86. package/dist/esm/health/health-checks.d.ts +10 -0
  87. package/dist/esm/health/health-checks.js +50 -0
  88. package/dist/esm/health/health-http.module.d.ts +5 -0
  89. package/dist/esm/health/health-http.module.js +23 -0
  90. package/dist/esm/health/health-module-options.interface.d.ts +9 -0
  91. package/dist/esm/health/health-module-options.interface.js +1 -0
  92. package/dist/esm/health/health.config.d.ts +8 -0
  93. package/dist/esm/health/health.config.js +36 -0
  94. package/dist/esm/health/health.controller.d.ts +14 -0
  95. package/dist/esm/health/health.controller.js +75 -0
  96. package/dist/esm/health/health.environment.d.ts +5 -0
  97. package/dist/esm/health/health.environment.js +34 -0
  98. package/dist/esm/health/health.module.d.ts +5 -0
  99. package/dist/esm/health/health.module.js +25 -0
  100. package/dist/esm/health/index.d.ts +8 -0
  101. package/dist/esm/health/index.js +8 -0
  102. package/dist/esm/health/migrations.health-indicator.d.ts +9 -0
  103. package/dist/esm/health/migrations.health-indicator.js +37 -0
  104. package/dist/esm/logging/index.d.ts +8 -0
  105. package/dist/esm/logging/index.js +8 -0
  106. package/dist/esm/logging/infrastructure-paths.d.ts +4 -0
  107. package/dist/esm/logging/infrastructure-paths.js +5 -0
  108. package/dist/esm/logging/logger.environment.d.ts +4 -0
  109. package/dist/esm/logging/logger.environment.js +20 -0
  110. package/dist/esm/logging/observability-logger.interface.js +1 -0
  111. package/dist/esm/logging/pino-logger-options.interface.d.ts +5 -0
  112. package/dist/esm/logging/pino-logger-options.interface.js +1 -0
  113. package/dist/esm/logging/pino-logger.config.d.ts +15 -0
  114. package/dist/esm/logging/pino-logger.config.js +99 -0
  115. package/dist/esm/logging/resolve-request-id.d.ts +4 -0
  116. package/dist/esm/logging/resolve-request-id.js +6 -0
  117. package/dist/esm/logging/resolve-support-id.d.ts +3 -0
  118. package/dist/esm/logging/resolve-support-id.js +4 -0
  119. package/dist/esm/metrics/index.d.ts +3 -0
  120. package/dist/esm/metrics/index.js +3 -0
  121. package/dist/esm/metrics/metrics-hooks.d.ts +2 -0
  122. package/dist/esm/metrics/metrics-hooks.js +33 -0
  123. package/dist/esm/metrics/metrics-http.module.d.ts +5 -0
  124. package/dist/esm/metrics/metrics-http.module.js +26 -0
  125. package/dist/esm/metrics/metrics.controller.d.ts +7 -0
  126. package/dist/esm/metrics/metrics.controller.js +39 -0
  127. package/dist/esm/shared/active-span-context.d.ts +2 -0
  128. package/dist/esm/shared/active-span-context.js +5 -0
  129. package/dist/esm/shared/with-class-decorator.d.ts +2 -0
  130. package/dist/esm/shared/with-class-decorator.js +10 -0
  131. package/package.json +111 -5
  132. /package/dist/cjs/{cqrs/observability-logger.interface.js → health/cli/health-cli-options.interface.js} +0 -0
  133. /package/dist/cjs/{cqrs → logging}/constants.d.ts +0 -0
  134. /package/dist/cjs/{cqrs → logging}/constants.js +0 -0
  135. /package/dist/cjs/{cqrs → logging}/observability-logger.interface.d.ts +0 -0
  136. /package/dist/esm/{cqrs/observability-logger.interface.js → health/cli/health-cli-options.interface.js} +0 -0
  137. /package/dist/esm/{cqrs → logging}/constants.d.ts +0 -0
  138. /package/dist/esm/{cqrs → logging}/constants.js +0 -0
  139. /package/dist/esm/{cqrs → logging}/observability-logger.interface.d.ts +0 -0
@@ -0,0 +1,39 @@
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.HealthConfig = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const health_environment_js_1 = require("./health.environment.js");
18
+ const BYTES_IN_MEGABYTE = 1024 * 1024;
19
+ let HealthConfig = class HealthConfig {
20
+ environment;
21
+ get diskThresholdPercent() {
22
+ return this.environment.HEALTH_DISK_THRESHOLD_PERCENT;
23
+ }
24
+ get memoryHeapBytes() {
25
+ return this.environment.HEALTH_MEMORY_HEAP_MB * BYTES_IN_MEGABYTE;
26
+ }
27
+ get memoryRssBytes() {
28
+ return this.environment.HEALTH_MEMORY_RSS_MB * BYTES_IN_MEGABYTE;
29
+ }
30
+ constructor(environment) {
31
+ this.environment = environment;
32
+ }
33
+ };
34
+ exports.HealthConfig = HealthConfig;
35
+ exports.HealthConfig = HealthConfig = __decorate([
36
+ (0, common_1.Injectable)(),
37
+ __param(0, (0, common_1.Inject)(health_environment_js_1.HealthEnvironment)),
38
+ __metadata("design:paramtypes", [health_environment_js_1.HealthEnvironment])
39
+ ], HealthConfig);
@@ -0,0 +1,14 @@
1
+ import type { HealthCheckResult } from '@nestjs/terminus';
2
+ import { HealthCheckService, TypeOrmHealthIndicator } from '@nestjs/terminus';
3
+ import { HealthChecks } from './health-checks.js';
4
+ import { MigrationsHealthIndicator } from './migrations.health-indicator.js';
5
+ export declare class HealthController {
6
+ private readonly health;
7
+ private readonly database;
8
+ private readonly migrations;
9
+ private readonly healthChecks;
10
+ constructor(health: HealthCheckService, database: TypeOrmHealthIndicator, migrations: MigrationsHealthIndicator, healthChecks: HealthChecks);
11
+ check(): Promise<HealthCheckResult>;
12
+ live(): Promise<HealthCheckResult>;
13
+ ready(): Promise<HealthCheckResult>;
14
+ }
@@ -0,0 +1,78 @@
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.HealthController = void 0;
16
+ const logging_1 = require("@application-kit/typeorm/logging");
17
+ const common_1 = require("@nestjs/common");
18
+ const terminus_1 = require("@nestjs/terminus");
19
+ const infrastructure_paths_js_1 = require("../logging/infrastructure-paths.js");
20
+ const health_checks_js_1 = require("./health-checks.js");
21
+ const migrations_health_indicator_js_1 = require("./migrations.health-indicator.js");
22
+ let HealthController = class HealthController {
23
+ health;
24
+ database;
25
+ migrations;
26
+ healthChecks;
27
+ constructor(health, database, migrations, healthChecks) {
28
+ this.health = health;
29
+ this.database = database;
30
+ this.migrations = migrations;
31
+ this.healthChecks = healthChecks;
32
+ }
33
+ async check() {
34
+ return (0, logging_1.runAsInfrastructureQuery)(async () => this.health.check(this.healthChecks.build()));
35
+ }
36
+ async live() {
37
+ return this.health.check([]);
38
+ }
39
+ async ready() {
40
+ return (0, logging_1.runAsInfrastructureQuery)(async () => this.health.check([
41
+ async () => this.database.pingCheck('typeorm'),
42
+ async () => this.migrations.isUpToDate('migrations'),
43
+ ]));
44
+ }
45
+ };
46
+ exports.HealthController = HealthController;
47
+ __decorate([
48
+ (0, common_1.Get)(),
49
+ (0, terminus_1.HealthCheck)(),
50
+ __metadata("design:type", Function),
51
+ __metadata("design:paramtypes", []),
52
+ __metadata("design:returntype", Promise)
53
+ ], HealthController.prototype, "check", null);
54
+ __decorate([
55
+ (0, common_1.Get)('live'),
56
+ (0, terminus_1.HealthCheck)(),
57
+ __metadata("design:type", Function),
58
+ __metadata("design:paramtypes", []),
59
+ __metadata("design:returntype", Promise)
60
+ ], HealthController.prototype, "live", null);
61
+ __decorate([
62
+ (0, common_1.Get)('ready'),
63
+ (0, terminus_1.HealthCheck)(),
64
+ __metadata("design:type", Function),
65
+ __metadata("design:paramtypes", []),
66
+ __metadata("design:returntype", Promise)
67
+ ], HealthController.prototype, "ready", null);
68
+ exports.HealthController = HealthController = __decorate([
69
+ (0, common_1.Controller)(infrastructure_paths_js_1.HEALTH_ROUTE),
70
+ __param(0, (0, common_1.Inject)(terminus_1.HealthCheckService)),
71
+ __param(1, (0, common_1.Inject)(terminus_1.TypeOrmHealthIndicator)),
72
+ __param(2, (0, common_1.Inject)(migrations_health_indicator_js_1.MigrationsHealthIndicator)),
73
+ __param(3, (0, common_1.Inject)(health_checks_js_1.HealthChecks)),
74
+ __metadata("design:paramtypes", [terminus_1.HealthCheckService,
75
+ terminus_1.TypeOrmHealthIndicator,
76
+ migrations_health_indicator_js_1.MigrationsHealthIndicator,
77
+ health_checks_js_1.HealthChecks])
78
+ ], HealthController);
@@ -0,0 +1,5 @@
1
+ export declare class HealthEnvironment {
2
+ HEALTH_DISK_THRESHOLD_PERCENT: number;
3
+ HEALTH_MEMORY_HEAP_MB: number;
4
+ HEALTH_MEMORY_RSS_MB: number;
5
+ }
@@ -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
+ 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
+ exports.HealthEnvironment = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ class HealthEnvironment {
16
+ HEALTH_DISK_THRESHOLD_PERCENT = 0.8;
17
+ HEALTH_MEMORY_HEAP_MB = 500;
18
+ HEALTH_MEMORY_RSS_MB = 800;
19
+ }
20
+ exports.HealthEnvironment = HealthEnvironment;
21
+ __decorate([
22
+ (0, class_transformer_1.Expose)(),
23
+ (0, class_validator_1.IsNumber)(),
24
+ (0, class_transformer_1.Type)(() => Number),
25
+ __metadata("design:type", Object)
26
+ ], HealthEnvironment.prototype, "HEALTH_DISK_THRESHOLD_PERCENT", void 0);
27
+ __decorate([
28
+ (0, class_transformer_1.Expose)(),
29
+ (0, class_validator_1.IsNumber)(),
30
+ (0, class_transformer_1.Type)(() => Number),
31
+ __metadata("design:type", Object)
32
+ ], HealthEnvironment.prototype, "HEALTH_MEMORY_HEAP_MB", void 0);
33
+ __decorate([
34
+ (0, class_transformer_1.Expose)(),
35
+ (0, class_validator_1.IsNumber)(),
36
+ (0, class_transformer_1.Type)(() => Number),
37
+ __metadata("design:type", Object)
38
+ ], HealthEnvironment.prototype, "HEALTH_MEMORY_RSS_MB", void 0);
@@ -0,0 +1,5 @@
1
+ import type { DynamicModule } from '@nestjs/common';
2
+ import type { HealthModuleOptionsInterface } from './health-module-options.interface.js';
3
+ export declare class HealthModule {
4
+ static forRoot(options?: HealthModuleOptionsInterface): DynamicModule;
5
+ }
@@ -0,0 +1,28 @@
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.HealthModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const terminus_1 = require("@nestjs/terminus");
12
+ const health_checks_js_1 = require("./health-checks.js");
13
+ let HealthModule = class HealthModule {
14
+ static forRoot(options = {}) {
15
+ const terminus = terminus_1.TerminusModule.forRoot(options.terminus);
16
+ return {
17
+ exports: [health_checks_js_1.HealthChecks, terminus],
18
+ global: true,
19
+ imports: [...options.imports ?? [], terminus],
20
+ module: this,
21
+ providers: [health_checks_js_1.HealthChecks],
22
+ };
23
+ }
24
+ };
25
+ exports.HealthModule = HealthModule;
26
+ exports.HealthModule = HealthModule = __decorate([
27
+ (0, common_1.Module)({})
28
+ ], HealthModule);
@@ -0,0 +1,8 @@
1
+ export * from './health-checks.js';
2
+ export * from './health-http.module.js';
3
+ export * from './health-module-options.interface.js';
4
+ export * from './health.config.js';
5
+ export * from './health.controller.js';
6
+ export * from './health.environment.js';
7
+ export * from './health.module.js';
8
+ export * from './migrations.health-indicator.js';
@@ -0,0 +1,24 @@
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("./health-checks.js"), exports);
18
+ __exportStar(require("./health-http.module.js"), exports);
19
+ __exportStar(require("./health-module-options.interface.js"), exports);
20
+ __exportStar(require("./health.config.js"), exports);
21
+ __exportStar(require("./health.controller.js"), exports);
22
+ __exportStar(require("./health.environment.js"), exports);
23
+ __exportStar(require("./health.module.js"), exports);
24
+ __exportStar(require("./migrations.health-indicator.js"), exports);
@@ -0,0 +1,9 @@
1
+ import type { HealthIndicatorResult } from '@nestjs/terminus';
2
+ import { HealthIndicatorService } from '@nestjs/terminus';
3
+ import { DataSource } from 'typeorm';
4
+ export declare class MigrationsHealthIndicator {
5
+ private readonly healthIndicatorService;
6
+ private readonly dataSource;
7
+ constructor(healthIndicatorService: HealthIndicatorService, dataSource: DataSource);
8
+ isUpToDate(key: string): Promise<HealthIndicatorResult>;
9
+ }
@@ -0,0 +1,40 @@
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.MigrationsHealthIndicator = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const terminus_1 = require("@nestjs/terminus");
18
+ const typeorm_1 = require("@nestjs/typeorm");
19
+ const typeorm_2 = require("typeorm");
20
+ let MigrationsHealthIndicator = class MigrationsHealthIndicator {
21
+ healthIndicatorService;
22
+ dataSource;
23
+ constructor(healthIndicatorService, dataSource) {
24
+ this.healthIndicatorService = healthIndicatorService;
25
+ this.dataSource = dataSource;
26
+ }
27
+ async isUpToDate(key) {
28
+ const hasPendingMigrations = await this.dataSource.showMigrations();
29
+ const indicator = this.healthIndicatorService.check(key);
30
+ return hasPendingMigrations ? indicator.down({ pendingMigrations: true }) : indicator.up();
31
+ }
32
+ };
33
+ exports.MigrationsHealthIndicator = MigrationsHealthIndicator;
34
+ exports.MigrationsHealthIndicator = MigrationsHealthIndicator = __decorate([
35
+ (0, common_1.Injectable)(),
36
+ __param(0, (0, common_1.Inject)(terminus_1.HealthIndicatorService)),
37
+ __param(1, (0, typeorm_1.InjectDataSource)()),
38
+ __metadata("design:paramtypes", [terminus_1.HealthIndicatorService,
39
+ typeorm_2.DataSource])
40
+ ], MigrationsHealthIndicator);
@@ -0,0 +1,8 @@
1
+ export * from './constants.js';
2
+ export * from './infrastructure-paths.js';
3
+ export * from './logger.environment.js';
4
+ export * from './observability-logger.interface.js';
5
+ export * from './pino-logger-options.interface.js';
6
+ export * from './pino-logger.config.js';
7
+ export * from './resolve-request-id.js';
8
+ export * from './resolve-support-id.js';
@@ -0,0 +1,24 @@
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("./constants.js"), exports);
18
+ __exportStar(require("./infrastructure-paths.js"), exports);
19
+ __exportStar(require("./logger.environment.js"), exports);
20
+ __exportStar(require("./observability-logger.interface.js"), exports);
21
+ __exportStar(require("./pino-logger-options.interface.js"), exports);
22
+ __exportStar(require("./pino-logger.config.js"), exports);
23
+ __exportStar(require("./resolve-request-id.js"), exports);
24
+ __exportStar(require("./resolve-support-id.js"), exports);
@@ -0,0 +1,4 @@
1
+ export declare const HEALTH_ROUTE = "health";
2
+ export declare const METRICS_ROUTE = "metrics";
3
+ export declare const INFRASTRUCTURE_PATHS: readonly string[];
4
+ export declare const isInfrastructurePath: (path: string) => boolean;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isInfrastructurePath = exports.INFRASTRUCTURE_PATHS = exports.METRICS_ROUTE = exports.HEALTH_ROUTE = void 0;
4
+ exports.HEALTH_ROUTE = 'health';
5
+ exports.METRICS_ROUTE = 'metrics';
6
+ exports.INFRASTRUCTURE_PATHS = [`/${exports.HEALTH_ROUTE}`, `/${exports.METRICS_ROUTE}`];
7
+ const isInfrastructurePath = (path) => exports.INFRASTRUCTURE_PATHS
8
+ .some((prefix) => path === prefix || path.startsWith(`${prefix}/`));
9
+ exports.isInfrastructurePath = isInfrastructurePath;
@@ -0,0 +1,4 @@
1
+ import type { LevelWithSilent } from 'pino';
2
+ export declare class LoggerEnvironment {
3
+ LOG_LEVEL: LevelWithSilent;
4
+ }
@@ -0,0 +1,24 @@
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
+ exports.LoggerEnvironment = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent'];
16
+ class LoggerEnvironment {
17
+ LOG_LEVEL = 'warn';
18
+ }
19
+ exports.LoggerEnvironment = LoggerEnvironment;
20
+ __decorate([
21
+ (0, class_transformer_1.Expose)(),
22
+ (0, class_validator_1.IsIn)(LOG_LEVELS),
23
+ __metadata("design:type", String)
24
+ ], LoggerEnvironment.prototype, "LOG_LEVEL", void 0);
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ import type { ClientIpSourceInterface } from '../http/resolve-client-ip.js';
2
+ export type ClientIpResolver = (request: ClientIpSourceInterface) => string;
3
+ export interface PinoLoggerOptionsInterface {
4
+ readonly resolveClientIp?: ClientIpResolver;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,15 @@
1
+ import type { Params } from 'nestjs-pino';
2
+ import type { Level } from 'pino';
3
+ import type { PinoLoggerOptionsInterface } from './pino-logger-options.interface.js';
4
+ import { LoggerEnvironment } from './logger.environment.js';
5
+ export declare const responseLogLevel: (request: {
6
+ url?: string | undefined;
7
+ }, response: {
8
+ statusCode: number;
9
+ }, error?: Error) => Level;
10
+ export declare const traceContextMixin: () => Record<string, number | string>;
11
+ export declare class PinoLoggerConfig {
12
+ private readonly environment;
13
+ constructor(environment: LoggerEnvironment);
14
+ createOptions(options?: PinoLoggerOptionsInterface): Params;
15
+ }
@@ -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
+ }