@freshguard/freshguard-core 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +644 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +350 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/connectors/base-connector.d.ts +62 -0
  8. package/dist/connectors/base-connector.d.ts.map +1 -0
  9. package/dist/connectors/base-connector.js +549 -0
  10. package/dist/connectors/base-connector.js.map +1 -0
  11. package/dist/connectors/bigquery.d.ts +38 -0
  12. package/dist/connectors/bigquery.d.ts.map +1 -0
  13. package/dist/connectors/bigquery.js +406 -0
  14. package/dist/connectors/bigquery.js.map +1 -0
  15. package/dist/connectors/duckdb.d.ts +36 -0
  16. package/dist/connectors/duckdb.d.ts.map +1 -0
  17. package/dist/connectors/duckdb.js +364 -0
  18. package/dist/connectors/duckdb.js.map +1 -0
  19. package/dist/connectors/index.d.ts +7 -0
  20. package/dist/connectors/index.d.ts.map +1 -0
  21. package/dist/connectors/index.js +7 -0
  22. package/dist/connectors/index.js.map +1 -0
  23. package/dist/connectors/mysql.d.ts +32 -0
  24. package/dist/connectors/mysql.d.ts.map +1 -0
  25. package/dist/connectors/mysql.js +348 -0
  26. package/dist/connectors/mysql.js.map +1 -0
  27. package/dist/connectors/postgres.d.ts +31 -0
  28. package/dist/connectors/postgres.d.ts.map +1 -0
  29. package/dist/connectors/postgres.js +326 -0
  30. package/dist/connectors/postgres.js.map +1 -0
  31. package/dist/connectors/redshift.d.ts +32 -0
  32. package/dist/connectors/redshift.d.ts.map +1 -0
  33. package/dist/connectors/redshift.js +366 -0
  34. package/dist/connectors/redshift.js.map +1 -0
  35. package/dist/connectors/snowflake.d.ts +43 -0
  36. package/dist/connectors/snowflake.d.ts.map +1 -0
  37. package/dist/connectors/snowflake.js +442 -0
  38. package/dist/connectors/snowflake.js.map +1 -0
  39. package/dist/db/index.d.ts +9 -0
  40. package/dist/db/index.d.ts.map +1 -0
  41. package/dist/db/index.js +10 -0
  42. package/dist/db/index.js.map +1 -0
  43. package/dist/db/migrate.d.ts +12 -0
  44. package/dist/db/migrate.d.ts.map +1 -0
  45. package/dist/db/migrate.js +114 -0
  46. package/dist/db/migrate.js.map +1 -0
  47. package/dist/db/schema.d.ts +2053 -0
  48. package/dist/db/schema.d.ts.map +1 -0
  49. package/dist/db/schema.js +164 -0
  50. package/dist/db/schema.js.map +1 -0
  51. package/dist/errors/debug-factory.d.ts +23 -0
  52. package/dist/errors/debug-factory.d.ts.map +1 -0
  53. package/dist/errors/debug-factory.js +149 -0
  54. package/dist/errors/debug-factory.js.map +1 -0
  55. package/dist/errors/index.d.ts +119 -0
  56. package/dist/errors/index.d.ts.map +1 -0
  57. package/dist/errors/index.js +341 -0
  58. package/dist/errors/index.js.map +1 -0
  59. package/dist/index.d.ts +9 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +6 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/metadata/duckdb-storage.d.ts +31 -0
  64. package/dist/metadata/duckdb-storage.d.ts.map +1 -0
  65. package/dist/metadata/duckdb-storage.js +230 -0
  66. package/dist/metadata/duckdb-storage.js.map +1 -0
  67. package/dist/metadata/factory.d.ts +4 -0
  68. package/dist/metadata/factory.d.ts.map +1 -0
  69. package/dist/metadata/factory.js +23 -0
  70. package/dist/metadata/factory.js.map +1 -0
  71. package/dist/metadata/index.d.ts +6 -0
  72. package/dist/metadata/index.d.ts.map +1 -0
  73. package/dist/metadata/index.js +4 -0
  74. package/dist/metadata/index.js.map +1 -0
  75. package/dist/metadata/interface.d.ts +26 -0
  76. package/dist/metadata/interface.d.ts.map +1 -0
  77. package/dist/metadata/interface.js +2 -0
  78. package/dist/metadata/interface.js.map +1 -0
  79. package/dist/metadata/postgresql-storage.d.ts +32 -0
  80. package/dist/metadata/postgresql-storage.d.ts.map +1 -0
  81. package/dist/metadata/postgresql-storage.js +242 -0
  82. package/dist/metadata/postgresql-storage.js.map +1 -0
  83. package/dist/metadata/schema-config.d.ts +30 -0
  84. package/dist/metadata/schema-config.d.ts.map +1 -0
  85. package/dist/metadata/schema-config.js +94 -0
  86. package/dist/metadata/schema-config.js.map +1 -0
  87. package/dist/metadata/types.d.ts +35 -0
  88. package/dist/metadata/types.d.ts.map +1 -0
  89. package/dist/metadata/types.js +2 -0
  90. package/dist/metadata/types.js.map +1 -0
  91. package/dist/monitor/baseline-calculator.d.ts +30 -0
  92. package/dist/monitor/baseline-calculator.d.ts.map +1 -0
  93. package/dist/monitor/baseline-calculator.js +192 -0
  94. package/dist/monitor/baseline-calculator.js.map +1 -0
  95. package/dist/monitor/baseline-config.d.ts +37 -0
  96. package/dist/monitor/baseline-config.d.ts.map +1 -0
  97. package/dist/monitor/baseline-config.js +156 -0
  98. package/dist/monitor/baseline-config.js.map +1 -0
  99. package/dist/monitor/freshness.d.ts +5 -0
  100. package/dist/monitor/freshness.d.ts.map +1 -0
  101. package/dist/monitor/freshness.js +239 -0
  102. package/dist/monitor/freshness.js.map +1 -0
  103. package/dist/monitor/index.d.ts +5 -0
  104. package/dist/monitor/index.d.ts.map +1 -0
  105. package/dist/monitor/index.js +5 -0
  106. package/dist/monitor/index.js.map +1 -0
  107. package/dist/monitor/schema-baseline.d.ts +22 -0
  108. package/dist/monitor/schema-baseline.d.ts.map +1 -0
  109. package/dist/monitor/schema-baseline.js +211 -0
  110. package/dist/monitor/schema-baseline.js.map +1 -0
  111. package/dist/monitor/schema-changes.d.ts +5 -0
  112. package/dist/monitor/schema-changes.d.ts.map +1 -0
  113. package/dist/monitor/schema-changes.js +289 -0
  114. package/dist/monitor/schema-changes.js.map +1 -0
  115. package/dist/monitor/volume.d.ts +5 -0
  116. package/dist/monitor/volume.d.ts.map +1 -0
  117. package/dist/monitor/volume.js +262 -0
  118. package/dist/monitor/volume.js.map +1 -0
  119. package/dist/observability/logger.d.ts +63 -0
  120. package/dist/observability/logger.d.ts.map +1 -0
  121. package/dist/observability/logger.js +282 -0
  122. package/dist/observability/logger.js.map +1 -0
  123. package/dist/observability/metrics.d.ts +106 -0
  124. package/dist/observability/metrics.d.ts.map +1 -0
  125. package/dist/observability/metrics.js +441 -0
  126. package/dist/observability/metrics.js.map +1 -0
  127. package/dist/query-analyzer.js +526 -0
  128. package/dist/resilience/circuit-breaker.d.ts +94 -0
  129. package/dist/resilience/circuit-breaker.d.ts.map +1 -0
  130. package/dist/resilience/circuit-breaker.js +379 -0
  131. package/dist/resilience/circuit-breaker.js.map +1 -0
  132. package/dist/resilience/index.d.ts +7 -0
  133. package/dist/resilience/index.d.ts.map +1 -0
  134. package/dist/resilience/index.js +7 -0
  135. package/dist/resilience/index.js.map +1 -0
  136. package/dist/resilience/retry-policy.d.ts +87 -0
  137. package/dist/resilience/retry-policy.d.ts.map +1 -0
  138. package/dist/resilience/retry-policy.js +423 -0
  139. package/dist/resilience/retry-policy.js.map +1 -0
  140. package/dist/resilience/timeout-manager.d.ts +97 -0
  141. package/dist/resilience/timeout-manager.d.ts.map +1 -0
  142. package/dist/resilience/timeout-manager.js +339 -0
  143. package/dist/resilience/timeout-manager.js.map +1 -0
  144. package/dist/security/query-analyzer.d.ts +82 -0
  145. package/dist/security/query-analyzer.d.ts.map +1 -0
  146. package/dist/security/query-analyzer.js +381 -0
  147. package/dist/security/query-analyzer.js.map +1 -0
  148. package/dist/security/schema-cache.d.ts +95 -0
  149. package/dist/security/schema-cache.d.ts.map +1 -0
  150. package/dist/security/schema-cache.js +344 -0
  151. package/dist/security/schema-cache.js.map +1 -0
  152. package/dist/types/connector.d.ts +68 -0
  153. package/dist/types/connector.d.ts.map +1 -0
  154. package/dist/types/connector.js +26 -0
  155. package/dist/types/connector.js.map +1 -0
  156. package/dist/types.d.ts +244 -0
  157. package/dist/types.d.ts.map +1 -0
  158. package/dist/types.js +2 -0
  159. package/dist/types.js.map +1 -0
  160. package/dist/validation/index.d.ts +7 -0
  161. package/dist/validation/index.d.ts.map +1 -0
  162. package/dist/validation/index.js +5 -0
  163. package/dist/validation/index.js.map +1 -0
  164. package/dist/validation/runtime-validator.d.ts +70 -0
  165. package/dist/validation/runtime-validator.d.ts.map +1 -0
  166. package/dist/validation/runtime-validator.js +206 -0
  167. package/dist/validation/runtime-validator.js.map +1 -0
  168. package/dist/validation/sanitizers.d.ts +56 -0
  169. package/dist/validation/sanitizers.d.ts.map +1 -0
  170. package/dist/validation/sanitizers.js +264 -0
  171. package/dist/validation/sanitizers.js.map +1 -0
  172. package/dist/validation/schemas.d.ts +224 -0
  173. package/dist/validation/schemas.d.ts.map +1 -0
  174. package/dist/validation/schemas.js +263 -0
  175. package/dist/validation/schemas.js.map +1 -0
  176. package/dist/validators/index.d.ts +18 -0
  177. package/dist/validators/index.d.ts.map +1 -0
  178. package/dist/validators/index.js +209 -0
  179. package/dist/validators/index.js.map +1 -0
  180. package/package.json +91 -0
@@ -0,0 +1,106 @@
1
+ export declare enum MetricType {
2
+ COUNTER = "counter",
3
+ GAUGE = "gauge",
4
+ HISTOGRAM = "histogram",
5
+ SUMMARY = "summary"
6
+ }
7
+ export interface HistogramBuckets {
8
+ buckets: number[];
9
+ counts: number[];
10
+ count: number;
11
+ sum: number;
12
+ }
13
+ export interface SummaryQuantiles {
14
+ quantiles: number[];
15
+ values: number[];
16
+ count: number;
17
+ sum: number;
18
+ }
19
+ export interface MetricValue {
20
+ type: MetricType;
21
+ name: string;
22
+ help: string;
23
+ labels: Record<string, string>;
24
+ value: number | HistogramBuckets | SummaryQuantiles;
25
+ timestamp: Date;
26
+ }
27
+ export interface QueryMetrics {
28
+ totalQueries: number;
29
+ successfulQueries: number;
30
+ failedQueries: number;
31
+ averageDuration: number;
32
+ p50Duration: number;
33
+ p95Duration: number;
34
+ p99Duration: number;
35
+ maxDuration: number;
36
+ minDuration: number;
37
+ queriesPerSecond: number;
38
+ errorRate: number;
39
+ }
40
+ export interface CircuitBreakerMetrics {
41
+ state: string;
42
+ successCount: number;
43
+ failureCount: number;
44
+ openCount: number;
45
+ failureRate: number;
46
+ lastStateChangeTime: Date;
47
+ timeInCurrentState: number;
48
+ }
49
+ export interface RetryMetrics {
50
+ totalOperations: number;
51
+ firstTrySuccesses: number;
52
+ retriedSuccesses: number;
53
+ totalFailures: number;
54
+ averageAttempts: number;
55
+ totalRetryTime: number;
56
+ }
57
+ export interface SystemMetrics {
58
+ memoryUsage: number;
59
+ memoryUsagePercent: number;
60
+ cpuUsagePercent: number;
61
+ eventLoopLag: number;
62
+ activeConnections: number;
63
+ uptime: number;
64
+ }
65
+ export interface MetricsConfig {
66
+ enabled?: boolean;
67
+ collectionInterval?: number;
68
+ maxMetrics?: number;
69
+ defaultHistogramBuckets?: number[];
70
+ defaultSummaryQuantiles?: number[];
71
+ collectSystemMetrics?: boolean;
72
+ prefix?: string;
73
+ }
74
+ export declare class MetricsCollector {
75
+ private readonly config;
76
+ private readonly counters;
77
+ private readonly gauges;
78
+ private readonly histograms;
79
+ private queryWindow;
80
+ private systemMetricsInterval?;
81
+ private readonly startTime;
82
+ private readonly builtinCounters;
83
+ private readonly builtinGauges;
84
+ private readonly builtinHistograms;
85
+ constructor(config?: MetricsConfig);
86
+ recordQuery(operation: string, database: string, table: string | undefined, duration: number, success: boolean, error?: Error): void;
87
+ recordCircuitBreakerState(component: string, state: string, failureCount: number, successCount: number): void;
88
+ recordRetryAttempt(operation: string, attempt: number, duration: number, success: boolean, finalAttempt: boolean): void;
89
+ recordConnection(database: string, action: 'open' | 'close', success: boolean): void;
90
+ getQueryMetrics(): QueryMetrics;
91
+ getSystemMetrics(): SystemMetrics;
92
+ getAllMetrics(): MetricValue[];
93
+ reset(): void;
94
+ stop(): void;
95
+ private incrementCounter;
96
+ private setGauge;
97
+ private observeHistogram;
98
+ private getMetricKey;
99
+ private getDefaultHistogramBuckets;
100
+ private startSystemMetricsCollection;
101
+ private measureEventLoopLag;
102
+ }
103
+ export declare const defaultMetrics: MetricsCollector;
104
+ export declare function createComponentMetrics(component: string, config?: MetricsConfig): MetricsCollector;
105
+ export declare function timeOperation<T>(metricsCollector: MetricsCollector, operation: string, database: string, table: string | undefined, fn: () => Promise<T>): Promise<T>;
106
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,441 @@
1
+ export var MetricType;
2
+ (function (MetricType) {
3
+ MetricType["COUNTER"] = "counter";
4
+ MetricType["GAUGE"] = "gauge";
5
+ MetricType["HISTOGRAM"] = "histogram";
6
+ MetricType["SUMMARY"] = "summary";
7
+ })(MetricType || (MetricType = {}));
8
+ class SlidingWindow {
9
+ values = [];
10
+ windowSize;
11
+ maxAge;
12
+ constructor(windowSize = 1000, maxAge = 60000) {
13
+ this.windowSize = windowSize;
14
+ this.maxAge = maxAge;
15
+ }
16
+ add(value) {
17
+ const now = Date.now();
18
+ this.values.push({ value, timestamp: now });
19
+ this.cleanup(now);
20
+ if (this.values.length > this.windowSize) {
21
+ this.values.shift();
22
+ }
23
+ }
24
+ percentile(p) {
25
+ if (this.values.length === 0)
26
+ return 0;
27
+ const sorted = this.values.map(v => v.value).sort((a, b) => a - b);
28
+ const index = Math.ceil(p * sorted.length) - 1;
29
+ return sorted[Math.max(0, index)] ?? 0;
30
+ }
31
+ average() {
32
+ if (this.values.length === 0)
33
+ return 0;
34
+ const sum = this.values.reduce((acc, v) => acc + v.value, 0);
35
+ return sum / this.values.length;
36
+ }
37
+ min() {
38
+ if (this.values.length === 0)
39
+ return 0;
40
+ return Math.min(...this.values.map(v => v.value));
41
+ }
42
+ max() {
43
+ if (this.values.length === 0)
44
+ return 0;
45
+ return Math.max(...this.values.map(v => v.value));
46
+ }
47
+ count() {
48
+ return this.values.length;
49
+ }
50
+ rate() {
51
+ if (this.values.length === 0)
52
+ return 0;
53
+ const now = Date.now();
54
+ const windowStart = now - this.maxAge;
55
+ const recentValues = this.values.filter(v => v.timestamp > windowStart);
56
+ if (recentValues.length === 0)
57
+ return 0;
58
+ const timeSpan = (now - (recentValues[0]?.timestamp ?? now)) / 1000;
59
+ return timeSpan > 0 ? recentValues.length / timeSpan : 0;
60
+ }
61
+ cleanup(now) {
62
+ const cutoff = now - this.maxAge;
63
+ this.values = this.values.filter(v => v.timestamp > cutoff);
64
+ }
65
+ }
66
+ class Counter {
67
+ value = 0;
68
+ labels;
69
+ constructor(labels = {}) {
70
+ this.labels = labels;
71
+ }
72
+ inc(amount = 1) {
73
+ this.value += amount;
74
+ }
75
+ getValue() {
76
+ return this.value;
77
+ }
78
+ getLabels() {
79
+ return { ...this.labels };
80
+ }
81
+ reset() {
82
+ this.value = 0;
83
+ }
84
+ }
85
+ class Gauge {
86
+ value = 0;
87
+ labels;
88
+ constructor(labels = {}) {
89
+ this.labels = labels;
90
+ }
91
+ set(value) {
92
+ this.value = value;
93
+ }
94
+ inc(amount = 1) {
95
+ this.value += amount;
96
+ }
97
+ dec(amount = 1) {
98
+ this.value -= amount;
99
+ }
100
+ getValue() {
101
+ return this.value;
102
+ }
103
+ getLabels() {
104
+ return { ...this.labels };
105
+ }
106
+ }
107
+ class Histogram {
108
+ buckets;
109
+ counts;
110
+ totalCount = 0;
111
+ totalSum = 0;
112
+ labels;
113
+ constructor(buckets, labels = {}) {
114
+ this.buckets = [...buckets].sort((a, b) => a - b);
115
+ this.counts = new Array(buckets.length + 1).fill(0);
116
+ this.labels = labels;
117
+ }
118
+ observe(value) {
119
+ this.totalCount++;
120
+ this.totalSum += value;
121
+ for (let i = 0; i < this.buckets.length; i++) {
122
+ const bucket = this.buckets[i];
123
+ if (bucket !== undefined && value <= bucket) {
124
+ this.counts[i]++;
125
+ return;
126
+ }
127
+ }
128
+ const lastIndex = this.counts.length - 1;
129
+ this.counts[lastIndex]++;
130
+ }
131
+ getValue() {
132
+ return {
133
+ buckets: [...this.buckets],
134
+ counts: [...this.counts],
135
+ count: this.totalCount,
136
+ sum: this.totalSum,
137
+ };
138
+ }
139
+ getLabels() {
140
+ return { ...this.labels };
141
+ }
142
+ reset() {
143
+ this.counts.fill(0);
144
+ this.totalCount = 0;
145
+ this.totalSum = 0;
146
+ }
147
+ }
148
+ export class MetricsCollector {
149
+ config;
150
+ counters = new Map();
151
+ gauges = new Map();
152
+ histograms = new Map();
153
+ queryWindow = new SlidingWindow(10000, 300000);
154
+ systemMetricsInterval;
155
+ startTime = Date.now();
156
+ builtinCounters = {
157
+ queries_total: new Counter(),
158
+ queries_success_total: new Counter(),
159
+ queries_error_total: new Counter(),
160
+ circuit_breaker_opens_total: new Counter(),
161
+ retry_attempts_total: new Counter(),
162
+ };
163
+ builtinGauges = {
164
+ active_connections: new Gauge(),
165
+ circuit_breaker_state: new Gauge(),
166
+ memory_usage_bytes: new Gauge(),
167
+ cpu_usage_percent: new Gauge(),
168
+ };
169
+ builtinHistograms = {
170
+ query_duration_ms: new Histogram(this.getDefaultHistogramBuckets()),
171
+ retry_duration_ms: new Histogram(this.getDefaultHistogramBuckets()),
172
+ };
173
+ constructor(config = {}) {
174
+ this.config = {
175
+ enabled: config.enabled !== false,
176
+ collectionInterval: config.collectionInterval || 5000,
177
+ maxMetrics: config.maxMetrics || 10000,
178
+ defaultHistogramBuckets: config.defaultHistogramBuckets || this.getDefaultHistogramBuckets(),
179
+ defaultSummaryQuantiles: config.defaultSummaryQuantiles || [0.5, 0.95, 0.99],
180
+ collectSystemMetrics: config.collectSystemMetrics !== false,
181
+ prefix: config.prefix || 'freshguard_',
182
+ };
183
+ if (this.config.enabled && this.config.collectSystemMetrics) {
184
+ this.startSystemMetricsCollection();
185
+ }
186
+ }
187
+ recordQuery(operation, database, table, duration, success, error) {
188
+ if (!this.config.enabled)
189
+ return;
190
+ const labels = {
191
+ operation,
192
+ database,
193
+ table: table || 'unknown',
194
+ status: success ? 'success' : 'error',
195
+ };
196
+ this.builtinCounters.queries_total.inc();
197
+ this.builtinHistograms.query_duration_ms.observe(duration);
198
+ this.queryWindow.add(duration);
199
+ if (success) {
200
+ this.builtinCounters.queries_success_total.inc();
201
+ }
202
+ else {
203
+ this.builtinCounters.queries_error_total.inc();
204
+ }
205
+ this.incrementCounter('database_queries_total', 1, labels);
206
+ this.observeHistogram('database_query_duration_seconds', duration / 1000, labels);
207
+ if (error) {
208
+ this.incrementCounter('database_errors_total', 1, {
209
+ ...labels,
210
+ error_type: error.constructor.name,
211
+ });
212
+ }
213
+ }
214
+ recordCircuitBreakerState(component, state, failureCount, successCount) {
215
+ if (!this.config.enabled)
216
+ return;
217
+ const stateValue = state === 'CLOSED' ? 0 : state === 'OPEN' ? 1 : 2;
218
+ this.builtinGauges.circuit_breaker_state.set(stateValue);
219
+ const labels = { component, state };
220
+ this.setGauge('circuit_breaker_state', stateValue, labels);
221
+ this.setGauge('circuit_breaker_failures', failureCount, labels);
222
+ this.setGauge('circuit_breaker_successes', successCount, labels);
223
+ if (state === 'OPEN') {
224
+ this.builtinCounters.circuit_breaker_opens_total.inc();
225
+ this.incrementCounter('circuit_breaker_opens_total', 1, labels);
226
+ }
227
+ }
228
+ recordRetryAttempt(operation, attempt, duration, success, finalAttempt) {
229
+ if (!this.config.enabled)
230
+ return;
231
+ this.builtinCounters.retry_attempts_total.inc();
232
+ this.builtinHistograms.retry_duration_ms.observe(duration);
233
+ const labels = {
234
+ operation,
235
+ attempt: attempt.toString(),
236
+ success: success.toString(),
237
+ final: finalAttempt.toString(),
238
+ };
239
+ this.incrementCounter('retry_attempts_total', 1, labels);
240
+ this.observeHistogram('retry_duration_seconds', duration / 1000, labels);
241
+ }
242
+ recordConnection(database, action, success) {
243
+ if (!this.config.enabled)
244
+ return;
245
+ const labels = { database, action, status: success ? 'success' : 'error' };
246
+ this.incrementCounter('database_connections_total', 1, labels);
247
+ if (action === 'open' && success) {
248
+ this.builtinGauges.active_connections.inc();
249
+ }
250
+ else if (action === 'close') {
251
+ this.builtinGauges.active_connections.dec();
252
+ }
253
+ }
254
+ getQueryMetrics() {
255
+ const totalQueries = this.builtinCounters.queries_total.getValue();
256
+ const successfulQueries = this.builtinCounters.queries_success_total.getValue();
257
+ const failedQueries = this.builtinCounters.queries_error_total.getValue();
258
+ return {
259
+ totalQueries,
260
+ successfulQueries,
261
+ failedQueries,
262
+ averageDuration: this.queryWindow.average(),
263
+ p50Duration: this.queryWindow.percentile(0.5),
264
+ p95Duration: this.queryWindow.percentile(0.95),
265
+ p99Duration: this.queryWindow.percentile(0.99),
266
+ maxDuration: this.queryWindow.max(),
267
+ minDuration: this.queryWindow.min(),
268
+ queriesPerSecond: this.queryWindow.rate(),
269
+ errorRate: totalQueries > 0 ? (failedQueries / totalQueries) * 100 : 0,
270
+ };
271
+ }
272
+ getSystemMetrics() {
273
+ const memUsage = process.memoryUsage();
274
+ return {
275
+ memoryUsage: memUsage.heapUsed,
276
+ memoryUsagePercent: (memUsage.heapUsed / memUsage.heapTotal) * 100,
277
+ cpuUsagePercent: this.builtinGauges.cpu_usage_percent.getValue(),
278
+ eventLoopLag: this.measureEventLoopLag(),
279
+ activeConnections: this.builtinGauges.active_connections.getValue(),
280
+ uptime: (Date.now() - this.startTime) / 1000,
281
+ };
282
+ }
283
+ getAllMetrics() {
284
+ const metrics = [];
285
+ for (const [name, counter] of Object.entries(this.builtinCounters)) {
286
+ metrics.push({
287
+ type: MetricType.COUNTER,
288
+ name: this.config.prefix + name,
289
+ help: `Built-in counter: ${name}`,
290
+ labels: counter.getLabels(),
291
+ value: counter.getValue(),
292
+ timestamp: new Date(),
293
+ });
294
+ }
295
+ for (const [name, gauge] of Object.entries(this.builtinGauges)) {
296
+ metrics.push({
297
+ type: MetricType.GAUGE,
298
+ name: this.config.prefix + name,
299
+ help: `Built-in gauge: ${name}`,
300
+ labels: gauge.getLabels(),
301
+ value: gauge.getValue(),
302
+ timestamp: new Date(),
303
+ });
304
+ }
305
+ for (const [name, histogram] of Object.entries(this.builtinHistograms)) {
306
+ metrics.push({
307
+ type: MetricType.HISTOGRAM,
308
+ name: this.config.prefix + name,
309
+ help: `Built-in histogram: ${name}`,
310
+ labels: histogram.getLabels(),
311
+ value: histogram.getValue(),
312
+ timestamp: new Date(),
313
+ });
314
+ }
315
+ for (const [name, counter] of this.counters) {
316
+ metrics.push({
317
+ type: MetricType.COUNTER,
318
+ name,
319
+ help: `Custom counter: ${name}`,
320
+ labels: counter.getLabels(),
321
+ value: counter.getValue(),
322
+ timestamp: new Date(),
323
+ });
324
+ }
325
+ for (const [name, gauge] of this.gauges) {
326
+ metrics.push({
327
+ type: MetricType.GAUGE,
328
+ name,
329
+ help: `Custom gauge: ${name}`,
330
+ labels: gauge.getLabels(),
331
+ value: gauge.getValue(),
332
+ timestamp: new Date(),
333
+ });
334
+ }
335
+ for (const [name, histogram] of this.histograms) {
336
+ metrics.push({
337
+ type: MetricType.HISTOGRAM,
338
+ name,
339
+ help: `Custom histogram: ${name}`,
340
+ labels: histogram.getLabels(),
341
+ value: histogram.getValue(),
342
+ timestamp: new Date(),
343
+ });
344
+ }
345
+ return metrics;
346
+ }
347
+ reset() {
348
+ Object.values(this.builtinCounters).forEach(c => c.reset());
349
+ Object.values(this.builtinHistograms).forEach(h => h.reset());
350
+ this.counters.clear();
351
+ this.gauges.clear();
352
+ this.histograms.clear();
353
+ this.queryWindow = new SlidingWindow(10000, 300000);
354
+ }
355
+ stop() {
356
+ if (this.systemMetricsInterval) {
357
+ clearInterval(this.systemMetricsInterval);
358
+ this.systemMetricsInterval = undefined;
359
+ }
360
+ }
361
+ incrementCounter(name, amount = 1, labels = {}) {
362
+ const key = this.getMetricKey(name, labels);
363
+ let counter = this.counters.get(key);
364
+ if (!counter) {
365
+ counter = new Counter(labels);
366
+ this.counters.set(key, counter);
367
+ }
368
+ counter.inc(amount);
369
+ }
370
+ setGauge(name, value, labels = {}) {
371
+ const key = this.getMetricKey(name, labels);
372
+ let gauge = this.gauges.get(key);
373
+ if (!gauge) {
374
+ gauge = new Gauge(labels);
375
+ this.gauges.set(key, gauge);
376
+ }
377
+ gauge.set(value);
378
+ }
379
+ observeHistogram(name, value, labels = {}) {
380
+ const key = this.getMetricKey(name, labels);
381
+ let histogram = this.histograms.get(key);
382
+ if (!histogram) {
383
+ histogram = new Histogram(this.config.defaultHistogramBuckets, labels);
384
+ this.histograms.set(key, histogram);
385
+ }
386
+ histogram.observe(value);
387
+ }
388
+ getMetricKey(name, labels) {
389
+ const sortedLabels = Object.keys(labels)
390
+ .sort()
391
+ .map(key => `${key}="${labels[key]}"`)
392
+ .join(',');
393
+ return `${name}{${sortedLabels}}`;
394
+ }
395
+ getDefaultHistogramBuckets() {
396
+ return [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0];
397
+ }
398
+ startSystemMetricsCollection() {
399
+ this.systemMetricsInterval = setInterval(() => {
400
+ try {
401
+ const memUsage = process.memoryUsage();
402
+ this.builtinGauges.memory_usage_bytes.set(memUsage.heapUsed);
403
+ const usage = process.cpuUsage();
404
+ const cpuPercent = (usage.user + usage.system) / 1000;
405
+ this.builtinGauges.cpu_usage_percent.set(Math.min(cpuPercent, 100));
406
+ }
407
+ catch (error) {
408
+ }
409
+ }, this.config.collectionInterval);
410
+ }
411
+ measureEventLoopLag() {
412
+ const start = process.hrtime();
413
+ setImmediate(() => {
414
+ const delta = process.hrtime(start);
415
+ return (delta[0] * 1000) + (delta[1] * 1e-6);
416
+ });
417
+ return 0;
418
+ }
419
+ }
420
+ export const defaultMetrics = new MetricsCollector();
421
+ export function createComponentMetrics(component, config) {
422
+ return new MetricsCollector({
423
+ ...config,
424
+ prefix: `${config?.prefix || 'freshguard_'}${component}_`,
425
+ });
426
+ }
427
+ export async function timeOperation(metricsCollector, operation, database, table, fn) {
428
+ const start = Date.now();
429
+ try {
430
+ const result = await fn();
431
+ const duration = Date.now() - start;
432
+ metricsCollector.recordQuery(operation, database, table, duration, true);
433
+ return result;
434
+ }
435
+ catch (error) {
436
+ const duration = Date.now() - start;
437
+ metricsCollector.recordQuery(operation, database, table, duration, false, error);
438
+ throw error;
439
+ }
440
+ }
441
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"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"}