@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.
- package/LICENSE +21 -0
- package/README.md +644 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +350 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/connectors/base-connector.d.ts +62 -0
- package/dist/connectors/base-connector.d.ts.map +1 -0
- package/dist/connectors/base-connector.js +549 -0
- package/dist/connectors/base-connector.js.map +1 -0
- package/dist/connectors/bigquery.d.ts +38 -0
- package/dist/connectors/bigquery.d.ts.map +1 -0
- package/dist/connectors/bigquery.js +406 -0
- package/dist/connectors/bigquery.js.map +1 -0
- package/dist/connectors/duckdb.d.ts +36 -0
- package/dist/connectors/duckdb.d.ts.map +1 -0
- package/dist/connectors/duckdb.js +364 -0
- package/dist/connectors/duckdb.js.map +1 -0
- package/dist/connectors/index.d.ts +7 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +7 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/mysql.d.ts +32 -0
- package/dist/connectors/mysql.d.ts.map +1 -0
- package/dist/connectors/mysql.js +348 -0
- package/dist/connectors/mysql.js.map +1 -0
- package/dist/connectors/postgres.d.ts +31 -0
- package/dist/connectors/postgres.d.ts.map +1 -0
- package/dist/connectors/postgres.js +326 -0
- package/dist/connectors/postgres.js.map +1 -0
- package/dist/connectors/redshift.d.ts +32 -0
- package/dist/connectors/redshift.d.ts.map +1 -0
- package/dist/connectors/redshift.js +366 -0
- package/dist/connectors/redshift.js.map +1 -0
- package/dist/connectors/snowflake.d.ts +43 -0
- package/dist/connectors/snowflake.d.ts.map +1 -0
- package/dist/connectors/snowflake.js +442 -0
- package/dist/connectors/snowflake.js.map +1 -0
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +10 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +12 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +114 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema.d.ts +2053 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +164 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/errors/debug-factory.d.ts +23 -0
- package/dist/errors/debug-factory.d.ts.map +1 -0
- package/dist/errors/debug-factory.js +149 -0
- package/dist/errors/debug-factory.js.map +1 -0
- package/dist/errors/index.d.ts +119 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +341 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata/duckdb-storage.d.ts +31 -0
- package/dist/metadata/duckdb-storage.d.ts.map +1 -0
- package/dist/metadata/duckdb-storage.js +230 -0
- package/dist/metadata/duckdb-storage.js.map +1 -0
- package/dist/metadata/factory.d.ts +4 -0
- package/dist/metadata/factory.d.ts.map +1 -0
- package/dist/metadata/factory.js +23 -0
- package/dist/metadata/factory.js.map +1 -0
- package/dist/metadata/index.d.ts +6 -0
- package/dist/metadata/index.d.ts.map +1 -0
- package/dist/metadata/index.js +4 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/interface.d.ts +26 -0
- package/dist/metadata/interface.d.ts.map +1 -0
- package/dist/metadata/interface.js +2 -0
- package/dist/metadata/interface.js.map +1 -0
- package/dist/metadata/postgresql-storage.d.ts +32 -0
- package/dist/metadata/postgresql-storage.d.ts.map +1 -0
- package/dist/metadata/postgresql-storage.js +242 -0
- package/dist/metadata/postgresql-storage.js.map +1 -0
- package/dist/metadata/schema-config.d.ts +30 -0
- package/dist/metadata/schema-config.d.ts.map +1 -0
- package/dist/metadata/schema-config.js +94 -0
- package/dist/metadata/schema-config.js.map +1 -0
- package/dist/metadata/types.d.ts +35 -0
- package/dist/metadata/types.d.ts.map +1 -0
- package/dist/metadata/types.js +2 -0
- package/dist/metadata/types.js.map +1 -0
- package/dist/monitor/baseline-calculator.d.ts +30 -0
- package/dist/monitor/baseline-calculator.d.ts.map +1 -0
- package/dist/monitor/baseline-calculator.js +192 -0
- package/dist/monitor/baseline-calculator.js.map +1 -0
- package/dist/monitor/baseline-config.d.ts +37 -0
- package/dist/monitor/baseline-config.d.ts.map +1 -0
- package/dist/monitor/baseline-config.js +156 -0
- package/dist/monitor/baseline-config.js.map +1 -0
- package/dist/monitor/freshness.d.ts +5 -0
- package/dist/monitor/freshness.d.ts.map +1 -0
- package/dist/monitor/freshness.js +239 -0
- package/dist/monitor/freshness.js.map +1 -0
- package/dist/monitor/index.d.ts +5 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +5 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/schema-baseline.d.ts +22 -0
- package/dist/monitor/schema-baseline.d.ts.map +1 -0
- package/dist/monitor/schema-baseline.js +211 -0
- package/dist/monitor/schema-baseline.js.map +1 -0
- package/dist/monitor/schema-changes.d.ts +5 -0
- package/dist/monitor/schema-changes.d.ts.map +1 -0
- package/dist/monitor/schema-changes.js +289 -0
- package/dist/monitor/schema-changes.js.map +1 -0
- package/dist/monitor/volume.d.ts +5 -0
- package/dist/monitor/volume.d.ts.map +1 -0
- package/dist/monitor/volume.js +262 -0
- package/dist/monitor/volume.js.map +1 -0
- package/dist/observability/logger.d.ts +63 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +282 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +106 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +441 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/query-analyzer.js +526 -0
- package/dist/resilience/circuit-breaker.d.ts +94 -0
- package/dist/resilience/circuit-breaker.d.ts.map +1 -0
- package/dist/resilience/circuit-breaker.js +379 -0
- package/dist/resilience/circuit-breaker.js.map +1 -0
- package/dist/resilience/index.d.ts +7 -0
- package/dist/resilience/index.d.ts.map +1 -0
- package/dist/resilience/index.js +7 -0
- package/dist/resilience/index.js.map +1 -0
- package/dist/resilience/retry-policy.d.ts +87 -0
- package/dist/resilience/retry-policy.d.ts.map +1 -0
- package/dist/resilience/retry-policy.js +423 -0
- package/dist/resilience/retry-policy.js.map +1 -0
- package/dist/resilience/timeout-manager.d.ts +97 -0
- package/dist/resilience/timeout-manager.d.ts.map +1 -0
- package/dist/resilience/timeout-manager.js +339 -0
- package/dist/resilience/timeout-manager.js.map +1 -0
- package/dist/security/query-analyzer.d.ts +82 -0
- package/dist/security/query-analyzer.d.ts.map +1 -0
- package/dist/security/query-analyzer.js +381 -0
- package/dist/security/query-analyzer.js.map +1 -0
- package/dist/security/schema-cache.d.ts +95 -0
- package/dist/security/schema-cache.d.ts.map +1 -0
- package/dist/security/schema-cache.js +344 -0
- package/dist/security/schema-cache.js.map +1 -0
- package/dist/types/connector.d.ts +68 -0
- package/dist/types/connector.d.ts.map +1 -0
- package/dist/types/connector.js +26 -0
- package/dist/types/connector.js.map +1 -0
- package/dist/types.d.ts +244 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation/index.d.ts +7 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +5 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/runtime-validator.d.ts +70 -0
- package/dist/validation/runtime-validator.d.ts.map +1 -0
- package/dist/validation/runtime-validator.js +206 -0
- package/dist/validation/runtime-validator.js.map +1 -0
- package/dist/validation/sanitizers.d.ts +56 -0
- package/dist/validation/sanitizers.d.ts.map +1 -0
- package/dist/validation/sanitizers.js +264 -0
- package/dist/validation/sanitizers.js.map +1 -0
- package/dist/validation/schemas.d.ts +224 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +263 -0
- package/dist/validation/schemas.js.map +1 -0
- package/dist/validators/index.d.ts +18 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +209 -0
- package/dist/validators/index.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { validateTableName } from '../validators/index.js';
|
|
2
|
+
import { TimeoutError, ConfigurationError, ErrorHandler } from '../errors/index.js';
|
|
3
|
+
import { DebugErrorFactory, mergeDebugConfig } from '../errors/debug-factory.js';
|
|
4
|
+
import { BaselineConfigResolver } from './baseline-config.js';
|
|
5
|
+
import { BaselineCalculator } from './baseline-calculator.js';
|
|
6
|
+
export async function checkVolumeAnomaly(connector, rule, metadataStorage, config) {
|
|
7
|
+
const startTime = process.hrtime.bigint();
|
|
8
|
+
const debugConfig = mergeDebugConfig(config?.debug);
|
|
9
|
+
const debugFactory = new DebugErrorFactory(debugConfig);
|
|
10
|
+
const debugId = `fg-${Date.now().toString(36)}-${Math.random().toString(36).substr(2, 5)}`;
|
|
11
|
+
try {
|
|
12
|
+
if (debugConfig.enabled) {
|
|
13
|
+
console.log(`[DEBUG-${debugId}] Starting volume anomaly check:`, {
|
|
14
|
+
table: rule.tableName,
|
|
15
|
+
ruleId: rule.id,
|
|
16
|
+
timestamp: new Date().toISOString()
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
validateVolumeRule(rule);
|
|
20
|
+
const baselineConfigResolver = new BaselineConfigResolver(rule);
|
|
21
|
+
const baselineConfig = baselineConfigResolver.getConfig();
|
|
22
|
+
const baselineWindowDays = baselineConfig.windowDays;
|
|
23
|
+
const deviationThresholdPercent = baselineConfig.deviationThresholdPercent;
|
|
24
|
+
const minimumRowCount = baselineConfig.minimumRowCount;
|
|
25
|
+
const timeoutMs = baselineConfig.timeoutSeconds * 1000;
|
|
26
|
+
validateTableName(rule.tableName);
|
|
27
|
+
validateVolumeParameters(baselineWindowDays, deviationThresholdPercent, minimumRowCount);
|
|
28
|
+
const currentRowCount = await executeWithTimeout(() => getCurrentRowCount(connector, rule.tableName, debugConfig, debugFactory), config?.timeoutMs || timeoutMs, 'Volume check row count query timeout');
|
|
29
|
+
if (currentRowCount < minimumRowCount) {
|
|
30
|
+
const executedAt = new Date();
|
|
31
|
+
const executionDurationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
|
|
32
|
+
await saveExecutionResult(metadataStorage, {
|
|
33
|
+
ruleId: rule.id,
|
|
34
|
+
status: 'ok',
|
|
35
|
+
rowCount: currentRowCount,
|
|
36
|
+
deviation: 0,
|
|
37
|
+
baselineAverage: currentRowCount,
|
|
38
|
+
executionDurationMs,
|
|
39
|
+
executedAt,
|
|
40
|
+
}, debugConfig);
|
|
41
|
+
return createSecureCheckResult('ok', {
|
|
42
|
+
rowCount: currentRowCount,
|
|
43
|
+
deviation: 0,
|
|
44
|
+
baselineAverage: currentRowCount,
|
|
45
|
+
executionDurationMs,
|
|
46
|
+
executedAt,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
let historicalExecutions = [];
|
|
50
|
+
if (metadataStorage) {
|
|
51
|
+
try {
|
|
52
|
+
historicalExecutions = await executeWithTimeout(() => metadataStorage.getHistoricalData(rule.id, baselineWindowDays), timeoutMs, 'Volume check historical data query timeout');
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
56
|
+
if (debugConfig.enabled) {
|
|
57
|
+
console.error(`[DEBUG-${debugId}] Metadata storage unavailable:`, {
|
|
58
|
+
ruleId: rule.id,
|
|
59
|
+
error: errorMessage,
|
|
60
|
+
rawError: debugConfig.exposeRawErrors ? errorMessage : undefined,
|
|
61
|
+
fallback: 'treating as fresh installation'
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.warn(`Metadata storage unavailable, treating as fresh installation: ${errorMessage}`);
|
|
66
|
+
}
|
|
67
|
+
historicalExecutions = [];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const baselineCalculator = new BaselineCalculator(baselineConfig);
|
|
71
|
+
const baselineResult = baselineCalculator.calculateBaseline(historicalExecutions, currentRowCount);
|
|
72
|
+
if (baselineResult.dataPointsUsed < baselineConfig.minimumDataPoints) {
|
|
73
|
+
const executedAt = new Date();
|
|
74
|
+
const executionDurationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
|
|
75
|
+
await saveExecutionResult(metadataStorage, {
|
|
76
|
+
ruleId: rule.id,
|
|
77
|
+
status: 'ok',
|
|
78
|
+
rowCount: currentRowCount,
|
|
79
|
+
deviation: 0,
|
|
80
|
+
baselineAverage: currentRowCount,
|
|
81
|
+
executionDurationMs,
|
|
82
|
+
executedAt,
|
|
83
|
+
}, debugConfig);
|
|
84
|
+
return createSecureCheckResult('ok', {
|
|
85
|
+
rowCount: currentRowCount,
|
|
86
|
+
deviation: 0,
|
|
87
|
+
baselineAverage: currentRowCount,
|
|
88
|
+
executionDurationMs,
|
|
89
|
+
executedAt,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const isAnomaly = baselineResult.deviationPercent > deviationThresholdPercent;
|
|
93
|
+
const status = isAnomaly ? 'alert' : 'ok';
|
|
94
|
+
const executedAt = new Date();
|
|
95
|
+
const executionDurationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
|
|
96
|
+
await saveExecutionResult(metadataStorage, {
|
|
97
|
+
ruleId: rule.id,
|
|
98
|
+
status,
|
|
99
|
+
rowCount: currentRowCount,
|
|
100
|
+
deviation: baselineResult.deviationPercent,
|
|
101
|
+
baselineAverage: baselineResult.mean,
|
|
102
|
+
executionDurationMs,
|
|
103
|
+
executedAt,
|
|
104
|
+
}, debugConfig);
|
|
105
|
+
return createSecureCheckResult(status, {
|
|
106
|
+
rowCount: currentRowCount,
|
|
107
|
+
deviation: baselineResult.deviationPercent,
|
|
108
|
+
baselineAverage: baselineResult.mean,
|
|
109
|
+
executionDurationMs,
|
|
110
|
+
executedAt,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const userMessage = ErrorHandler.getUserMessage(error);
|
|
115
|
+
const executedAt = new Date();
|
|
116
|
+
const executionDurationMs = Number(process.hrtime.bigint() - startTime) / 1000000;
|
|
117
|
+
if (debugConfig.enabled) {
|
|
118
|
+
console.error(`[DEBUG-${debugId}] Volume anomaly check failed:`, {
|
|
119
|
+
table: rule.tableName,
|
|
120
|
+
ruleId: rule.id,
|
|
121
|
+
error: userMessage,
|
|
122
|
+
rawError: debugConfig.exposeRawErrors && error instanceof Error ? error.message : undefined,
|
|
123
|
+
duration: executionDurationMs
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (rule?.id) {
|
|
127
|
+
await saveExecutionResult(metadataStorage, {
|
|
128
|
+
ruleId: rule.id,
|
|
129
|
+
status: 'failed',
|
|
130
|
+
executionDurationMs,
|
|
131
|
+
executedAt,
|
|
132
|
+
error: userMessage,
|
|
133
|
+
}, debugConfig);
|
|
134
|
+
}
|
|
135
|
+
const result = createSecureCheckResult('failed', {
|
|
136
|
+
error: userMessage,
|
|
137
|
+
executionDurationMs,
|
|
138
|
+
executedAt,
|
|
139
|
+
debugId,
|
|
140
|
+
});
|
|
141
|
+
if (debugConfig.enabled && error instanceof Error && 'debug' in error) {
|
|
142
|
+
result.debug = error.debug;
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function saveExecutionResult(metadataStorage, execution, debugConfig) {
|
|
148
|
+
if (!metadataStorage)
|
|
149
|
+
return;
|
|
150
|
+
try {
|
|
151
|
+
await metadataStorage.saveExecution({
|
|
152
|
+
ruleId: execution.ruleId,
|
|
153
|
+
status: execution.status,
|
|
154
|
+
rowCount: execution.rowCount,
|
|
155
|
+
deviation: execution.deviation,
|
|
156
|
+
baselineAverage: execution.baselineAverage,
|
|
157
|
+
executionDurationMs: execution.executionDurationMs,
|
|
158
|
+
executedAt: execution.executedAt,
|
|
159
|
+
error: execution.error,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
164
|
+
if (debugConfig?.enabled) {
|
|
165
|
+
console.error('[DEBUG] Failed to save volume execution history:', {
|
|
166
|
+
ruleId: execution.ruleId,
|
|
167
|
+
error: errorMessage,
|
|
168
|
+
rawError: debugConfig.exposeRawErrors ? errorMessage : undefined
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
console.warn(`Failed to save execution history for rule ${execution.ruleId}: ${errorMessage}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function validateVolumeRule(rule) {
|
|
177
|
+
if (!rule) {
|
|
178
|
+
throw new ConfigurationError('Monitoring rule is required');
|
|
179
|
+
}
|
|
180
|
+
if (!rule.tableName || typeof rule.tableName !== 'string') {
|
|
181
|
+
throw new ConfigurationError('Table name is required and must be a string');
|
|
182
|
+
}
|
|
183
|
+
if (rule.tableName.length > 256) {
|
|
184
|
+
throw new ConfigurationError('Table name too long (max 256 characters)');
|
|
185
|
+
}
|
|
186
|
+
if (rule.ruleType !== 'volume_anomaly') {
|
|
187
|
+
throw new ConfigurationError('Rule type must be "volume_anomaly" for volume anomaly checks');
|
|
188
|
+
}
|
|
189
|
+
if (!rule.id || typeof rule.id !== 'string') {
|
|
190
|
+
throw new ConfigurationError('Rule ID is required and must be a string');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function validateVolumeParameters(baselineWindowDays, deviationThresholdPercent, minimumRowCount) {
|
|
194
|
+
if (typeof baselineWindowDays !== 'number' || !Number.isInteger(baselineWindowDays)) {
|
|
195
|
+
throw new ConfigurationError('Baseline window days must be an integer');
|
|
196
|
+
}
|
|
197
|
+
if (baselineWindowDays < 1 || baselineWindowDays > 365) {
|
|
198
|
+
throw new ConfigurationError('Baseline window days must be between 1 and 365');
|
|
199
|
+
}
|
|
200
|
+
if (typeof deviationThresholdPercent !== 'number' || deviationThresholdPercent < 0) {
|
|
201
|
+
throw new ConfigurationError('Deviation threshold percent must be a positive number');
|
|
202
|
+
}
|
|
203
|
+
if (deviationThresholdPercent > 1000) {
|
|
204
|
+
throw new ConfigurationError('Deviation threshold percent cannot exceed 1000%');
|
|
205
|
+
}
|
|
206
|
+
if (typeof minimumRowCount !== 'number' || !Number.isInteger(minimumRowCount)) {
|
|
207
|
+
throw new ConfigurationError('Minimum row count must be an integer');
|
|
208
|
+
}
|
|
209
|
+
if (minimumRowCount < 0) {
|
|
210
|
+
throw new ConfigurationError('Minimum row count cannot be negative');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async function getCurrentRowCount(connector, tableName, debugConfig, debugFactory) {
|
|
214
|
+
const startTime = performance.now();
|
|
215
|
+
const queryContext = {
|
|
216
|
+
sql: `connector.getRowCount('${tableName}')`,
|
|
217
|
+
params: [],
|
|
218
|
+
table: tableName,
|
|
219
|
+
operation: 'volume_count'
|
|
220
|
+
};
|
|
221
|
+
try {
|
|
222
|
+
if (debugConfig.enabled) {
|
|
223
|
+
console.log(`[DEBUG] Executing volume count via connector:`, {
|
|
224
|
+
table: tableName,
|
|
225
|
+
operation: debugConfig.exposeQueries ? `getRowCount('${tableName}')` : '[Connector operation hidden]'
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
const rowCount = await connector.getRowCount(tableName);
|
|
229
|
+
queryContext.duration = performance.now() - startTime;
|
|
230
|
+
if (isNaN(rowCount) || rowCount < 0) {
|
|
231
|
+
throw debugFactory.createQueryError('Invalid row count returned from connector', undefined, queryContext);
|
|
232
|
+
}
|
|
233
|
+
if (rowCount > Number.MAX_SAFE_INTEGER) {
|
|
234
|
+
throw debugFactory.createQueryError('Row count exceeds safe integer limit', undefined, queryContext);
|
|
235
|
+
}
|
|
236
|
+
return rowCount;
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
queryContext.duration = performance.now() - startTime;
|
|
240
|
+
throw debugFactory.createQueryError('Failed to get current row count via connector', error instanceof Error ? error : undefined, queryContext);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function executeWithTimeout(operation, timeoutMs, timeoutMessage) {
|
|
244
|
+
return new Promise((resolve, reject) => {
|
|
245
|
+
const timer = setTimeout(() => {
|
|
246
|
+
reject(new TimeoutError(timeoutMessage, 'volume_check', timeoutMs));
|
|
247
|
+
}, timeoutMs);
|
|
248
|
+
operation()
|
|
249
|
+
.then(resolve)
|
|
250
|
+
.catch(reject)
|
|
251
|
+
.finally(() => clearTimeout(timer));
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function createSecureCheckResult(status, data) {
|
|
255
|
+
return {
|
|
256
|
+
...data,
|
|
257
|
+
status,
|
|
258
|
+
executedAt: data.executedAt || new Date(),
|
|
259
|
+
executionDurationMs: data.executionDurationMs
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=volume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume.js","sourceRoot":"","sources":["../../src/monitor/volume.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type Logger as PinoLogger, type LoggerOptions } from 'pino';
|
|
2
|
+
export declare enum LogLevel {
|
|
3
|
+
TRACE = "trace",
|
|
4
|
+
DEBUG = "debug",
|
|
5
|
+
INFO = "info",
|
|
6
|
+
WARN = "warn",
|
|
7
|
+
ERROR = "error",
|
|
8
|
+
FATAL = "fatal"
|
|
9
|
+
}
|
|
10
|
+
export interface LogContext {
|
|
11
|
+
operation?: string;
|
|
12
|
+
table?: string;
|
|
13
|
+
database?: string;
|
|
14
|
+
duration?: number;
|
|
15
|
+
component?: string;
|
|
16
|
+
connectionId?: string;
|
|
17
|
+
queryComplexity?: number;
|
|
18
|
+
retryAttempt?: number;
|
|
19
|
+
circuitBreakerState?: string;
|
|
20
|
+
[key: string]: any;
|
|
21
|
+
}
|
|
22
|
+
export interface LoggerConfig {
|
|
23
|
+
level?: LogLevel;
|
|
24
|
+
prettyPrint?: boolean;
|
|
25
|
+
serviceName?: string;
|
|
26
|
+
environment?: string;
|
|
27
|
+
sanitizeSensitiveData?: boolean;
|
|
28
|
+
baseContext?: Record<string, any>;
|
|
29
|
+
pinoOptions?: Partial<LoggerOptions>;
|
|
30
|
+
}
|
|
31
|
+
export interface TimingInfo {
|
|
32
|
+
startTime: Date;
|
|
33
|
+
endTime: Date | null;
|
|
34
|
+
duration: number;
|
|
35
|
+
}
|
|
36
|
+
export declare class StructuredLogger {
|
|
37
|
+
private readonly logger;
|
|
38
|
+
private readonly config;
|
|
39
|
+
private readonly baseContext;
|
|
40
|
+
constructor(config?: LoggerConfig);
|
|
41
|
+
child(context: LogContext): StructuredLogger;
|
|
42
|
+
createTimer(): {
|
|
43
|
+
start(): void;
|
|
44
|
+
end(message?: string, context?: LogContext): TimingInfo;
|
|
45
|
+
getDuration(): number;
|
|
46
|
+
};
|
|
47
|
+
trace(message: string, context?: LogContext): void;
|
|
48
|
+
debug(message: string, context?: LogContext): void;
|
|
49
|
+
info(message: string, context?: LogContext): void;
|
|
50
|
+
warn(message: string, context?: LogContext): void;
|
|
51
|
+
error(message: string, error?: Error | unknown, context?: LogContext): void;
|
|
52
|
+
fatal(message: string, error?: Error | unknown, context?: LogContext): void;
|
|
53
|
+
private log;
|
|
54
|
+
getPinoLogger(): PinoLogger;
|
|
55
|
+
isLevelEnabled(level: LogLevel): boolean;
|
|
56
|
+
getConfig(): Required<LoggerConfig>;
|
|
57
|
+
flush(): void;
|
|
58
|
+
}
|
|
59
|
+
export declare const defaultLogger: StructuredLogger;
|
|
60
|
+
export declare function createComponentLogger(component: string, config?: LoggerConfig): StructuredLogger;
|
|
61
|
+
export declare function createDatabaseLogger(database: string, config?: LoggerConfig): StructuredLogger;
|
|
62
|
+
export declare function logTimedOperation<T>(logger: StructuredLogger, operation: string, fn: () => Promise<T>, context?: LogContext): Promise<T>;
|
|
63
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/observability/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import pino, {} from 'pino';
|
|
2
|
+
export var LogLevel;
|
|
3
|
+
(function (LogLevel) {
|
|
4
|
+
LogLevel["TRACE"] = "trace";
|
|
5
|
+
LogLevel["DEBUG"] = "debug";
|
|
6
|
+
LogLevel["INFO"] = "info";
|
|
7
|
+
LogLevel["WARN"] = "warn";
|
|
8
|
+
LogLevel["ERROR"] = "error";
|
|
9
|
+
LogLevel["FATAL"] = "fatal";
|
|
10
|
+
})(LogLevel || (LogLevel = {}));
|
|
11
|
+
const SENSITIVE_PATTERNS = [
|
|
12
|
+
/password/i,
|
|
13
|
+
/secret/i,
|
|
14
|
+
/token/i,
|
|
15
|
+
/key/i,
|
|
16
|
+
/credential/i,
|
|
17
|
+
/auth/i,
|
|
18
|
+
/connection.*string/i,
|
|
19
|
+
/database.*url/i,
|
|
20
|
+
/email/i,
|
|
21
|
+
/phone/i,
|
|
22
|
+
/address/i,
|
|
23
|
+
/ssn/i,
|
|
24
|
+
/credit.*card/i,
|
|
25
|
+
/api.*key/i,
|
|
26
|
+
/access.*token/i,
|
|
27
|
+
/refresh.*token/i,
|
|
28
|
+
/bearer.*token/i,
|
|
29
|
+
];
|
|
30
|
+
const SENSITIVE_FIELDS = new Set([
|
|
31
|
+
'password',
|
|
32
|
+
'secret',
|
|
33
|
+
'token',
|
|
34
|
+
'apiKey',
|
|
35
|
+
'accessToken',
|
|
36
|
+
'refreshToken',
|
|
37
|
+
'connectionString',
|
|
38
|
+
'credentials',
|
|
39
|
+
'authorization',
|
|
40
|
+
'cookie',
|
|
41
|
+
'session',
|
|
42
|
+
]);
|
|
43
|
+
function sanitizeObject(obj, depth = 0) {
|
|
44
|
+
if (depth > 10) {
|
|
45
|
+
return '[Maximum depth reached]';
|
|
46
|
+
}
|
|
47
|
+
if (obj === null || obj === undefined) {
|
|
48
|
+
return obj;
|
|
49
|
+
}
|
|
50
|
+
if (typeof obj === 'string') {
|
|
51
|
+
return sanitizeString(obj);
|
|
52
|
+
}
|
|
53
|
+
if (typeof obj === 'number' || typeof obj === 'boolean') {
|
|
54
|
+
return obj;
|
|
55
|
+
}
|
|
56
|
+
if (obj instanceof Date) {
|
|
57
|
+
return obj.toISOString();
|
|
58
|
+
}
|
|
59
|
+
if (obj instanceof Error) {
|
|
60
|
+
return {
|
|
61
|
+
name: obj.name,
|
|
62
|
+
message: sanitizeString(obj.message),
|
|
63
|
+
stack: process.env.NODE_ENV === 'development' ? obj.stack : undefined,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (Array.isArray(obj)) {
|
|
67
|
+
return obj.map(item => sanitizeObject(item, depth + 1));
|
|
68
|
+
}
|
|
69
|
+
if (typeof obj === 'object') {
|
|
70
|
+
const sanitized = {};
|
|
71
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
72
|
+
const sanitizedKey = key.toLowerCase();
|
|
73
|
+
if (SENSITIVE_FIELDS.has(sanitizedKey) || SENSITIVE_PATTERNS.some(pattern => pattern.test(key))) {
|
|
74
|
+
sanitized[key] = '[REDACTED]';
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
sanitized[key] = sanitizeObject(value, depth + 1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return sanitized;
|
|
81
|
+
}
|
|
82
|
+
return obj;
|
|
83
|
+
}
|
|
84
|
+
function sanitizeString(str) {
|
|
85
|
+
return str
|
|
86
|
+
.replace(/(?:password|pwd|secret|token|key)=[\w\-\.]+/gi, '$&=[REDACTED]')
|
|
87
|
+
.replace(/(?:mongodb|postgres|mysql):\/\/[^:]+:[^@]+@/gi, (match) => match.replace(/:[^:@]+@/, ':***@'));
|
|
88
|
+
}
|
|
89
|
+
function createTimingTracker() {
|
|
90
|
+
let startTime = null;
|
|
91
|
+
let endTime = null;
|
|
92
|
+
return {
|
|
93
|
+
start() {
|
|
94
|
+
startTime = new Date();
|
|
95
|
+
endTime = null;
|
|
96
|
+
},
|
|
97
|
+
end() {
|
|
98
|
+
if (!startTime) {
|
|
99
|
+
throw new Error('Timer not started. Call start() first.');
|
|
100
|
+
}
|
|
101
|
+
endTime = new Date();
|
|
102
|
+
const duration = endTime.getTime() - startTime.getTime();
|
|
103
|
+
return {
|
|
104
|
+
startTime,
|
|
105
|
+
endTime,
|
|
106
|
+
duration,
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
getDuration() {
|
|
110
|
+
if (!startTime) {
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
const now = endTime || new Date();
|
|
114
|
+
return now.getTime() - startTime.getTime();
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
export class StructuredLogger {
|
|
119
|
+
logger;
|
|
120
|
+
config;
|
|
121
|
+
baseContext;
|
|
122
|
+
constructor(config = {}) {
|
|
123
|
+
this.config = {
|
|
124
|
+
level: config.level || LogLevel.INFO,
|
|
125
|
+
prettyPrint: config.prettyPrint || process.env.NODE_ENV === 'development',
|
|
126
|
+
serviceName: config.serviceName || 'freshguard-core',
|
|
127
|
+
environment: config.environment || process.env.NODE_ENV || 'development',
|
|
128
|
+
sanitizeSensitiveData: config.sanitizeSensitiveData !== false,
|
|
129
|
+
baseContext: config.baseContext || {},
|
|
130
|
+
pinoOptions: config.pinoOptions || {},
|
|
131
|
+
};
|
|
132
|
+
this.baseContext = {
|
|
133
|
+
service: this.config.serviceName,
|
|
134
|
+
environment: this.config.environment,
|
|
135
|
+
pid: process.pid,
|
|
136
|
+
hostname: process.env.HOSTNAME || 'unknown',
|
|
137
|
+
version: process.env.npm_package_version || '0.0.0',
|
|
138
|
+
...this.config.baseContext,
|
|
139
|
+
};
|
|
140
|
+
const pinoConfig = {
|
|
141
|
+
level: this.config.level,
|
|
142
|
+
base: this.baseContext,
|
|
143
|
+
timestamp: pino.stdTimeFunctions.isoTime,
|
|
144
|
+
formatters: {
|
|
145
|
+
level: (label, _number) => ({ level: label }),
|
|
146
|
+
},
|
|
147
|
+
...this.config.pinoOptions,
|
|
148
|
+
};
|
|
149
|
+
if (this.config.prettyPrint) {
|
|
150
|
+
pinoConfig.transport = {
|
|
151
|
+
target: 'pino-pretty',
|
|
152
|
+
options: {
|
|
153
|
+
colorize: true,
|
|
154
|
+
ignore: 'pid,hostname',
|
|
155
|
+
translateTime: 'HH:MM:ss.l',
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
this.logger = pino(pinoConfig);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (this.config.prettyPrint && error instanceof Error && error.message.includes('pino-pretty')) {
|
|
164
|
+
console.warn('pino-pretty not available, using default formatting');
|
|
165
|
+
const fallbackConfig = { ...pinoConfig };
|
|
166
|
+
delete fallbackConfig.transport;
|
|
167
|
+
this.logger = pino(fallbackConfig);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
child(context) {
|
|
175
|
+
const sanitizedContext = this.config.sanitizeSensitiveData
|
|
176
|
+
? sanitizeObject(context)
|
|
177
|
+
: context;
|
|
178
|
+
const childLogger = new StructuredLogger({
|
|
179
|
+
...this.config,
|
|
180
|
+
pinoOptions: {
|
|
181
|
+
...this.config.pinoOptions,
|
|
182
|
+
base: {
|
|
183
|
+
...this.baseContext,
|
|
184
|
+
...sanitizedContext,
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
return childLogger;
|
|
189
|
+
}
|
|
190
|
+
createTimer() {
|
|
191
|
+
const tracker = createTimingTracker();
|
|
192
|
+
return {
|
|
193
|
+
start: tracker.start.bind(tracker),
|
|
194
|
+
getDuration: tracker.getDuration.bind(tracker),
|
|
195
|
+
end: (message, context) => {
|
|
196
|
+
const timing = tracker.end();
|
|
197
|
+
if (message) {
|
|
198
|
+
this.info(message, {
|
|
199
|
+
...context,
|
|
200
|
+
duration: timing.duration,
|
|
201
|
+
startTime: timing.startTime.toISOString(),
|
|
202
|
+
endTime: timing.endTime?.toISOString(),
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return timing;
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
trace(message, context) {
|
|
210
|
+
this.log(LogLevel.TRACE, message, context);
|
|
211
|
+
}
|
|
212
|
+
debug(message, context) {
|
|
213
|
+
this.log(LogLevel.DEBUG, message, context);
|
|
214
|
+
}
|
|
215
|
+
info(message, context) {
|
|
216
|
+
this.log(LogLevel.INFO, message, context);
|
|
217
|
+
}
|
|
218
|
+
warn(message, context) {
|
|
219
|
+
this.log(LogLevel.WARN, message, context);
|
|
220
|
+
}
|
|
221
|
+
error(message, error, context) {
|
|
222
|
+
const errorContext = error ? { error } : {};
|
|
223
|
+
this.log(LogLevel.ERROR, message, { ...errorContext, ...context });
|
|
224
|
+
}
|
|
225
|
+
fatal(message, error, context) {
|
|
226
|
+
const errorContext = error ? { error } : {};
|
|
227
|
+
this.log(LogLevel.FATAL, message, { ...errorContext, ...context });
|
|
228
|
+
}
|
|
229
|
+
log(level, message, context) {
|
|
230
|
+
const sanitizedContext = context && this.config.sanitizeSensitiveData
|
|
231
|
+
? sanitizeObject(context)
|
|
232
|
+
: context;
|
|
233
|
+
this.logger[level](sanitizedContext || {}, message);
|
|
234
|
+
}
|
|
235
|
+
getPinoLogger() {
|
|
236
|
+
return this.logger;
|
|
237
|
+
}
|
|
238
|
+
isLevelEnabled(level) {
|
|
239
|
+
return this.logger.isLevelEnabled(level);
|
|
240
|
+
}
|
|
241
|
+
getConfig() {
|
|
242
|
+
return { ...this.config };
|
|
243
|
+
}
|
|
244
|
+
flush() {
|
|
245
|
+
this.logger.flush();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
export const defaultLogger = new StructuredLogger();
|
|
249
|
+
export function createComponentLogger(component, config) {
|
|
250
|
+
return new StructuredLogger({
|
|
251
|
+
...config,
|
|
252
|
+
baseContext: {
|
|
253
|
+
component,
|
|
254
|
+
...(config?.baseContext || {}),
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
export function createDatabaseLogger(database, config) {
|
|
259
|
+
return createComponentLogger('database', {
|
|
260
|
+
...config,
|
|
261
|
+
baseContext: {
|
|
262
|
+
database,
|
|
263
|
+
...(config?.baseContext || {}),
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
export async function logTimedOperation(logger, operation, fn, context) {
|
|
268
|
+
const timer = logger.createTimer();
|
|
269
|
+
timer.start();
|
|
270
|
+
try {
|
|
271
|
+
logger.debug(`Starting ${operation}`, context);
|
|
272
|
+
const result = await fn();
|
|
273
|
+
timer.end(`Completed ${operation}`, { ...context, success: true });
|
|
274
|
+
return result;
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
timer.end(`Failed ${operation}`, { ...context, success: false });
|
|
278
|
+
logger.error(`Operation failed: ${operation}`, error, context);
|
|
279
|
+
throw error;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/observability/logger.ts"],"names":[],"mappings":"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"}
|