@takentrade/takentrade-libs 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/auth/auth.interface.d.ts +8 -0
- package/dist/auth/auth.interface.js +2 -0
- package/dist/auth/decorators/get-user.decorator.d.ts +2 -0
- package/dist/auth/decorators/get-user.decorator.js +26 -0
- package/dist/auth/decorators/index.d.ts +1 -0
- package/dist/auth/decorators/index.js +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.js +1 -0
- package/dist/common/utils/string.utils.d.ts +10 -2
- package/dist/common/utils/string.utils.js +30 -13
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/metrics/metrics.interface.d.ts +0 -53
- package/dist/metrics/metrics.interface.js +0 -12
- package/dist/monitoring/alerting.service.d.ts +82 -0
- package/dist/monitoring/alerting.service.js +290 -0
- package/dist/monitoring/index.d.ts +5 -0
- package/dist/monitoring/index.js +21 -0
- package/dist/monitoring/monitoring.interface.d.ts +102 -0
- package/dist/monitoring/monitoring.interface.js +10 -0
- package/dist/monitoring/monitoring.module.d.ts +8 -0
- package/dist/monitoring/monitoring.module.js +44 -0
- package/dist/monitoring/sentry.service.d.ts +65 -0
- package/dist/monitoring/sentry.service.js +218 -0
- package/dist/monitoring/uptime.service.d.ts +59 -0
- package/dist/monitoring/uptime.service.js +213 -0
- package/dist/resilience/circuit-breaker.interface.d.ts +0 -75
- package/dist/resilience/circuit-breaker.interface.js +0 -6
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/helpers/date.util.d.ts +8 -0
- package/dist/utils/helpers/date.util.js +30 -0
- package/dist/utils/helpers/decimal.util.d.ts +9 -0
- package/dist/utils/helpers/decimal.util.js +31 -0
- package/dist/utils/helpers/format.util.d.ts +64 -0
- package/dist/utils/helpers/format.util.js +162 -0
- package/dist/utils/helpers/penalty.util.d.ts +25 -0
- package/dist/utils/helpers/penalty.util.js +40 -0
- package/dist/utils/helpers/referral.util.d.ts +4 -0
- package/dist/utils/helpers/referral.util.js +53 -0
- package/dist/utils/helpers/role.util.d.ts +8 -0
- package/dist/utils/helpers/role.util.js +18 -0
- package/dist/utils/helpers/validation.util.d.ts +62 -0
- package/dist/utils/helpers/validation.util.js +138 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.js +7 -0
- package/package.json +4 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export interface MonitoringModuleOptions {
|
|
2
|
+
sentry?: SentryConfig;
|
|
3
|
+
alerting?: AlertingConfig;
|
|
4
|
+
uptime?: UptimeConfig;
|
|
5
|
+
}
|
|
6
|
+
export interface SentryConfig {
|
|
7
|
+
dsn: string;
|
|
8
|
+
environment?: string;
|
|
9
|
+
release?: string;
|
|
10
|
+
sampleRate?: number;
|
|
11
|
+
tracesSampleRate?: number;
|
|
12
|
+
debug?: boolean;
|
|
13
|
+
beforeSend?: (event: any) => any;
|
|
14
|
+
integrations?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface AlertingConfig {
|
|
17
|
+
channels: AlertChannel[];
|
|
18
|
+
rules?: AlertRule[];
|
|
19
|
+
defaultSeverity?: AlertSeverity;
|
|
20
|
+
}
|
|
21
|
+
export interface AlertChannel {
|
|
22
|
+
type: 'slack' | 'email' | 'webhook' | 'pagerduty';
|
|
23
|
+
name?: string;
|
|
24
|
+
webhookUrl?: string;
|
|
25
|
+
recipients?: string[];
|
|
26
|
+
enabled?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface AlertRule {
|
|
29
|
+
name: string;
|
|
30
|
+
condition: string | ((metrics: any) => boolean);
|
|
31
|
+
severity: AlertSeverity;
|
|
32
|
+
message: string;
|
|
33
|
+
channels: string[];
|
|
34
|
+
throttle?: number;
|
|
35
|
+
enabled?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare enum AlertSeverity {
|
|
38
|
+
INFO = "info",
|
|
39
|
+
WARNING = "warning",
|
|
40
|
+
ERROR = "error",
|
|
41
|
+
CRITICAL = "critical"
|
|
42
|
+
}
|
|
43
|
+
export interface Alert {
|
|
44
|
+
id?: string;
|
|
45
|
+
title: string;
|
|
46
|
+
message: string;
|
|
47
|
+
severity: AlertSeverity;
|
|
48
|
+
source?: string;
|
|
49
|
+
metadata?: Record<string, any>;
|
|
50
|
+
timestamp?: Date;
|
|
51
|
+
}
|
|
52
|
+
export interface UptimeConfig {
|
|
53
|
+
enabled: boolean;
|
|
54
|
+
checkInterval?: number;
|
|
55
|
+
slaThreshold?: number;
|
|
56
|
+
alertOnDowntime?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface HealthCheck {
|
|
59
|
+
name: string;
|
|
60
|
+
check: () => Promise<void>;
|
|
61
|
+
interval?: number;
|
|
62
|
+
timeout?: number;
|
|
63
|
+
critical?: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface HealthCheckResult {
|
|
66
|
+
name: string;
|
|
67
|
+
status: 'healthy' | 'unhealthy' | 'degraded';
|
|
68
|
+
responseTime: number;
|
|
69
|
+
error?: string;
|
|
70
|
+
timestamp: Date;
|
|
71
|
+
}
|
|
72
|
+
export interface UptimeReport {
|
|
73
|
+
service: string;
|
|
74
|
+
uptime: number;
|
|
75
|
+
downtime: number;
|
|
76
|
+
incidents: number;
|
|
77
|
+
period: string;
|
|
78
|
+
startTime: Date;
|
|
79
|
+
endTime: Date;
|
|
80
|
+
}
|
|
81
|
+
export interface SentryBreadcrumb {
|
|
82
|
+
type?: string;
|
|
83
|
+
level?: 'fatal' | 'error' | 'warning' | 'log' | 'info' | 'debug';
|
|
84
|
+
message?: string;
|
|
85
|
+
category?: string;
|
|
86
|
+
data?: Record<string, any>;
|
|
87
|
+
timestamp?: number;
|
|
88
|
+
}
|
|
89
|
+
export interface SentryUser {
|
|
90
|
+
id?: string;
|
|
91
|
+
email?: string;
|
|
92
|
+
username?: string;
|
|
93
|
+
ip_address?: string;
|
|
94
|
+
[key: string]: any;
|
|
95
|
+
}
|
|
96
|
+
export interface ErrorContext {
|
|
97
|
+
tags?: Record<string, string>;
|
|
98
|
+
user?: SentryUser;
|
|
99
|
+
extra?: Record<string, any>;
|
|
100
|
+
breadcrumbs?: SentryBreadcrumb[];
|
|
101
|
+
level?: 'fatal' | 'error' | 'warning' | 'log' | 'info' | 'debug';
|
|
102
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AlertSeverity = void 0;
|
|
4
|
+
var AlertSeverity;
|
|
5
|
+
(function (AlertSeverity) {
|
|
6
|
+
AlertSeverity["INFO"] = "info";
|
|
7
|
+
AlertSeverity["WARNING"] = "warning";
|
|
8
|
+
AlertSeverity["ERROR"] = "error";
|
|
9
|
+
AlertSeverity["CRITICAL"] = "critical";
|
|
10
|
+
})(AlertSeverity || (exports.AlertSeverity = AlertSeverity = {}));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { MonitoringModuleOptions } from './monitoring.interface';
|
|
3
|
+
export declare class MonitoringModule {
|
|
4
|
+
/**
|
|
5
|
+
* Register the monitoring module with options
|
|
6
|
+
*/
|
|
7
|
+
static register(options?: MonitoringModuleOptions): DynamicModule;
|
|
8
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
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 MonitoringModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.MonitoringModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const sentry_service_1 = require("./sentry.service");
|
|
13
|
+
const alerting_service_1 = require("./alerting.service");
|
|
14
|
+
const uptime_service_1 = require("./uptime.service");
|
|
15
|
+
let MonitoringModule = MonitoringModule_1 = class MonitoringModule {
|
|
16
|
+
/**
|
|
17
|
+
* Register the monitoring module with options
|
|
18
|
+
*/
|
|
19
|
+
static register(options = {}) {
|
|
20
|
+
return {
|
|
21
|
+
module: MonitoringModule_1,
|
|
22
|
+
providers: [
|
|
23
|
+
{
|
|
24
|
+
provide: sentry_service_1.SentryService,
|
|
25
|
+
useValue: new sentry_service_1.SentryService(options.sentry),
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
provide: alerting_service_1.AlertingService,
|
|
29
|
+
useValue: new alerting_service_1.AlertingService(options.alerting),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
provide: uptime_service_1.UptimeService,
|
|
33
|
+
useValue: new uptime_service_1.UptimeService(options.uptime),
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
exports: [sentry_service_1.SentryService, alerting_service_1.AlertingService, uptime_service_1.UptimeService],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
exports.MonitoringModule = MonitoringModule;
|
|
41
|
+
exports.MonitoringModule = MonitoringModule = MonitoringModule_1 = __decorate([
|
|
42
|
+
(0, common_1.Global)(),
|
|
43
|
+
(0, common_1.Module)({})
|
|
44
|
+
], MonitoringModule);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import '@sentry/tracing';
|
|
3
|
+
import { SentryConfig, SentryBreadcrumb, SentryUser, ErrorContext } from './monitoring.interface';
|
|
4
|
+
export declare class SentryService implements OnModuleDestroy {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private initialized;
|
|
7
|
+
constructor(config?: SentryConfig);
|
|
8
|
+
/**
|
|
9
|
+
* Initialize Sentry
|
|
10
|
+
*/
|
|
11
|
+
private initialize;
|
|
12
|
+
/**
|
|
13
|
+
* Capture an exception
|
|
14
|
+
*/
|
|
15
|
+
captureException(error: Error, context?: ErrorContext): string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Capture a message
|
|
18
|
+
*/
|
|
19
|
+
captureMessage(message: string, level?: 'fatal' | 'error' | 'warning' | 'log' | 'info' | 'debug', context?: ErrorContext): string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Add a breadcrumb
|
|
22
|
+
*/
|
|
23
|
+
addBreadcrumb(breadcrumb: SentryBreadcrumb): void;
|
|
24
|
+
/**
|
|
25
|
+
* Set user context
|
|
26
|
+
*/
|
|
27
|
+
setUser(user: SentryUser | null): void;
|
|
28
|
+
/**
|
|
29
|
+
* Set a tag
|
|
30
|
+
*/
|
|
31
|
+
setTag(key: string, value: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Set multiple tags
|
|
34
|
+
*/
|
|
35
|
+
setTags(tags: Record<string, string>): void;
|
|
36
|
+
/**
|
|
37
|
+
* Set context
|
|
38
|
+
*/
|
|
39
|
+
setContext(name: string, context: Record<string, any>): void;
|
|
40
|
+
/**
|
|
41
|
+
* Start a transaction for performance monitoring
|
|
42
|
+
* Note: Use Sentry.startTransaction directly in newer versions
|
|
43
|
+
*/
|
|
44
|
+
startTransaction(name: string, op: string): any;
|
|
45
|
+
/**
|
|
46
|
+
* Configure scope (use withScope in newer versions)
|
|
47
|
+
*/
|
|
48
|
+
configureScope(callback: (scope: any) => void): void;
|
|
49
|
+
/**
|
|
50
|
+
* Flush events
|
|
51
|
+
*/
|
|
52
|
+
flush(timeout?: number): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* Close Sentry client
|
|
55
|
+
*/
|
|
56
|
+
close(timeout?: number): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Check if Sentry is initialized
|
|
59
|
+
*/
|
|
60
|
+
isInitialized(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Cleanup on module destroy
|
|
63
|
+
*/
|
|
64
|
+
onModuleDestroy(): Promise<void>;
|
|
65
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
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;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var SentryService_1;
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.SentryService = void 0;
|
|
44
|
+
const common_1 = require("@nestjs/common");
|
|
45
|
+
const Sentry = __importStar(require("@sentry/node"));
|
|
46
|
+
require("@sentry/tracing");
|
|
47
|
+
let SentryService = SentryService_1 = class SentryService {
|
|
48
|
+
logger = new common_1.Logger(SentryService_1.name);
|
|
49
|
+
initialized = false;
|
|
50
|
+
constructor(config) {
|
|
51
|
+
if (config?.dsn) {
|
|
52
|
+
this.initialize(config);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Initialize Sentry
|
|
57
|
+
*/
|
|
58
|
+
initialize(config) {
|
|
59
|
+
try {
|
|
60
|
+
Sentry.init({
|
|
61
|
+
dsn: config.dsn,
|
|
62
|
+
environment: config.environment || process.env.NODE_ENV || 'development',
|
|
63
|
+
release: config.release,
|
|
64
|
+
sampleRate: config.sampleRate ?? 1.0,
|
|
65
|
+
tracesSampleRate: config.tracesSampleRate ?? 0.1,
|
|
66
|
+
debug: config.debug ?? false,
|
|
67
|
+
beforeSend: config.beforeSend,
|
|
68
|
+
});
|
|
69
|
+
this.initialized = true;
|
|
70
|
+
this.logger.log('Sentry initialized successfully');
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
this.logger.error('Failed to initialize Sentry:', error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Capture an exception
|
|
78
|
+
*/
|
|
79
|
+
captureException(error, context) {
|
|
80
|
+
if (!this.initialized) {
|
|
81
|
+
this.logger.warn('Sentry not initialized, error not captured');
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
return Sentry.captureException(error, {
|
|
85
|
+
tags: context?.tags,
|
|
86
|
+
user: context?.user,
|
|
87
|
+
extra: context?.extra,
|
|
88
|
+
level: context?.level,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Capture a message
|
|
93
|
+
*/
|
|
94
|
+
captureMessage(message, level = 'info', context) {
|
|
95
|
+
if (!this.initialized) {
|
|
96
|
+
this.logger.warn('Sentry not initialized, message not captured');
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
return Sentry.captureMessage(message, {
|
|
100
|
+
level,
|
|
101
|
+
tags: context?.tags,
|
|
102
|
+
user: context?.user,
|
|
103
|
+
extra: context?.extra,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Add a breadcrumb
|
|
108
|
+
*/
|
|
109
|
+
addBreadcrumb(breadcrumb) {
|
|
110
|
+
if (!this.initialized) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
Sentry.addBreadcrumb({
|
|
114
|
+
type: breadcrumb.type,
|
|
115
|
+
level: breadcrumb.level,
|
|
116
|
+
message: breadcrumb.message,
|
|
117
|
+
category: breadcrumb.category,
|
|
118
|
+
data: breadcrumb.data,
|
|
119
|
+
timestamp: breadcrumb.timestamp,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Set user context
|
|
124
|
+
*/
|
|
125
|
+
setUser(user) {
|
|
126
|
+
if (!this.initialized) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
Sentry.setUser(user);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Set a tag
|
|
133
|
+
*/
|
|
134
|
+
setTag(key, value) {
|
|
135
|
+
if (!this.initialized) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
Sentry.setTag(key, value);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Set multiple tags
|
|
142
|
+
*/
|
|
143
|
+
setTags(tags) {
|
|
144
|
+
if (!this.initialized) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
Sentry.setTags(tags);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Set context
|
|
151
|
+
*/
|
|
152
|
+
setContext(name, context) {
|
|
153
|
+
if (!this.initialized) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
Sentry.setContext(name, context);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Start a transaction for performance monitoring
|
|
160
|
+
* Note: Use Sentry.startTransaction directly in newer versions
|
|
161
|
+
*/
|
|
162
|
+
startTransaction(name, op) {
|
|
163
|
+
if (!this.initialized) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
// In Sentry v7+, use withScope instead
|
|
167
|
+
return { name, op };
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Configure scope (use withScope in newer versions)
|
|
171
|
+
*/
|
|
172
|
+
configureScope(callback) {
|
|
173
|
+
if (!this.initialized) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// In Sentry v7+, use withScope
|
|
177
|
+
Sentry.withScope(callback);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Flush events
|
|
181
|
+
*/
|
|
182
|
+
async flush(timeout = 2000) {
|
|
183
|
+
if (!this.initialized) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
return await Sentry.flush(timeout);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Close Sentry client
|
|
190
|
+
*/
|
|
191
|
+
async close(timeout = 2000) {
|
|
192
|
+
if (!this.initialized) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
return await Sentry.close(timeout);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Check if Sentry is initialized
|
|
199
|
+
*/
|
|
200
|
+
isInitialized() {
|
|
201
|
+
return this.initialized;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Cleanup on module destroy
|
|
205
|
+
*/
|
|
206
|
+
async onModuleDestroy() {
|
|
207
|
+
if (this.initialized) {
|
|
208
|
+
this.logger.log('Flushing Sentry events...');
|
|
209
|
+
await this.flush();
|
|
210
|
+
await this.close();
|
|
211
|
+
this.logger.log('Sentry service shut down');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
exports.SentryService = SentryService;
|
|
216
|
+
exports.SentryService = SentryService = SentryService_1 = __decorate([
|
|
217
|
+
(0, common_1.Injectable)()
|
|
218
|
+
], SentryService);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { HealthCheck, HealthCheckResult, UptimeConfig, UptimeReport } from './monitoring.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Uptime Monitoring Service
|
|
4
|
+
*
|
|
5
|
+
* Tracks service availability and generates SLA reports
|
|
6
|
+
*/
|
|
7
|
+
export declare class UptimeService {
|
|
8
|
+
private readonly logger;
|
|
9
|
+
private healthChecks;
|
|
10
|
+
private healthResults;
|
|
11
|
+
private downtimeTracking;
|
|
12
|
+
private config;
|
|
13
|
+
private checkIntervals;
|
|
14
|
+
constructor(config?: UptimeConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Register a health check
|
|
17
|
+
*/
|
|
18
|
+
registerHealthCheck(check: HealthCheck): void;
|
|
19
|
+
/**
|
|
20
|
+
* Start periodic health check
|
|
21
|
+
*/
|
|
22
|
+
private startHealthCheck;
|
|
23
|
+
/**
|
|
24
|
+
* Run a health check
|
|
25
|
+
*/
|
|
26
|
+
runHealthCheck(name: string): Promise<HealthCheckResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Get current health status
|
|
29
|
+
*/
|
|
30
|
+
getHealthStatus(name?: string): Promise<HealthCheckResult[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Get uptime percentage
|
|
33
|
+
*/
|
|
34
|
+
getUptime(name: string, periodMs?: number): number;
|
|
35
|
+
/**
|
|
36
|
+
* Get SLA report
|
|
37
|
+
*/
|
|
38
|
+
getSLAReport(name: string, period?: string): UptimeReport;
|
|
39
|
+
/**
|
|
40
|
+
* Parse period string to milliseconds
|
|
41
|
+
*/
|
|
42
|
+
private parsePeriod;
|
|
43
|
+
/**
|
|
44
|
+
* Stop all health checks
|
|
45
|
+
*/
|
|
46
|
+
stopAllHealthChecks(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Stop specific health check
|
|
49
|
+
*/
|
|
50
|
+
stopHealthCheck(name: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Get all registered health checks
|
|
53
|
+
*/
|
|
54
|
+
getHealthChecks(): string[];
|
|
55
|
+
/**
|
|
56
|
+
* Cleanup on destroy
|
|
57
|
+
*/
|
|
58
|
+
onModuleDestroy(): void;
|
|
59
|
+
}
|