flow-debugger 1.9.8 → 1.9.9

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 (71) hide show
  1. package/ENHANCED_OBSERVABILITY.md +835 -0
  2. package/IMPLEMENTATION_SUMMARY.md +466 -0
  3. package/README.md +147 -8
  4. package/dist/cjs/core/Alerting.js +310 -0
  5. package/dist/cjs/core/Alerting.js.map +1 -0
  6. package/dist/cjs/core/AnomalyDetection.js +223 -0
  7. package/dist/cjs/core/AnomalyDetection.js.map +1 -0
  8. package/dist/cjs/core/DependencyGraph.js +251 -0
  9. package/dist/cjs/core/DependencyGraph.js.map +1 -0
  10. package/dist/cjs/core/DistributedTracing.js +245 -0
  11. package/dist/cjs/core/DistributedTracing.js.map +1 -0
  12. package/dist/cjs/core/ErrorClustering.js +257 -0
  13. package/dist/cjs/core/ErrorClustering.js.map +1 -0
  14. package/dist/cjs/core/LogCorrelation.js +242 -0
  15. package/dist/cjs/core/LogCorrelation.js.map +1 -0
  16. package/dist/cjs/core/Metrics.js +301 -0
  17. package/dist/cjs/core/Metrics.js.map +1 -0
  18. package/dist/cjs/core/TrendAnalysis.js +254 -0
  19. package/dist/cjs/core/TrendAnalysis.js.map +1 -0
  20. package/dist/cjs/core/types.js +14 -0
  21. package/dist/cjs/core/types.js.map +1 -1
  22. package/dist/cjs/index.js +27 -1
  23. package/dist/cjs/index.js.map +1 -1
  24. package/dist/cjs/middleware/express.js +105 -4
  25. package/dist/cjs/middleware/express.js.map +1 -1
  26. package/dist/esm/core/Alerting.js +305 -0
  27. package/dist/esm/core/Alerting.js.map +1 -0
  28. package/dist/esm/core/AnomalyDetection.js +218 -0
  29. package/dist/esm/core/AnomalyDetection.js.map +1 -0
  30. package/dist/esm/core/DependencyGraph.js +246 -0
  31. package/dist/esm/core/DependencyGraph.js.map +1 -0
  32. package/dist/esm/core/DistributedTracing.js +240 -0
  33. package/dist/esm/core/DistributedTracing.js.map +1 -0
  34. package/dist/esm/core/ErrorClustering.js +252 -0
  35. package/dist/esm/core/ErrorClustering.js.map +1 -0
  36. package/dist/esm/core/LogCorrelation.js +236 -0
  37. package/dist/esm/core/LogCorrelation.js.map +1 -0
  38. package/dist/esm/core/Metrics.js +297 -0
  39. package/dist/esm/core/Metrics.js.map +1 -0
  40. package/dist/esm/core/TrendAnalysis.js +250 -0
  41. package/dist/esm/core/TrendAnalysis.js.map +1 -0
  42. package/dist/esm/core/types.js +14 -0
  43. package/dist/esm/core/types.js.map +1 -1
  44. package/dist/esm/index.js +10 -0
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/middleware/express.js +105 -4
  47. package/dist/esm/middleware/express.js.map +1 -1
  48. package/dist/types/core/Alerting.d.ts +82 -0
  49. package/dist/types/core/Alerting.d.ts.map +1 -0
  50. package/dist/types/core/AnomalyDetection.d.ts +93 -0
  51. package/dist/types/core/AnomalyDetection.d.ts.map +1 -0
  52. package/dist/types/core/DependencyGraph.d.ts +65 -0
  53. package/dist/types/core/DependencyGraph.d.ts.map +1 -0
  54. package/dist/types/core/DistributedTracing.d.ts +92 -0
  55. package/dist/types/core/DistributedTracing.d.ts.map +1 -0
  56. package/dist/types/core/ErrorClustering.d.ts +70 -0
  57. package/dist/types/core/ErrorClustering.d.ts.map +1 -0
  58. package/dist/types/core/LogCorrelation.d.ts +73 -0
  59. package/dist/types/core/LogCorrelation.d.ts.map +1 -0
  60. package/dist/types/core/Metrics.d.ts +73 -0
  61. package/dist/types/core/Metrics.d.ts.map +1 -0
  62. package/dist/types/core/TrendAnalysis.d.ts +63 -0
  63. package/dist/types/core/TrendAnalysis.d.ts.map +1 -0
  64. package/dist/types/core/types.d.ts +200 -0
  65. package/dist/types/core/types.d.ts.map +1 -1
  66. package/dist/types/index.d.ts +9 -1
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/middleware/express.d.ts +12 -0
  69. package/dist/types/middleware/express.d.ts.map +1 -1
  70. package/package.json +1 -1
  71. package/test-results.json +1 -0
@@ -0,0 +1,236 @@
1
+ // ─────────────────────────────────────────────────────────────
2
+ // flow-debugger — Log Correlation System
3
+ // Injects traceId into logs for unified debugging
4
+ // ─────────────────────────────────────────────────────────────
5
+ /**
6
+ * Log Correlation - Links logs to traces via traceId injection
7
+ */
8
+ export class LogCorrelator {
9
+ constructor(enabled = false) {
10
+ this.enabled = false;
11
+ this.currentContext = new Map();
12
+ this.originalConsole = {};
13
+ this.includeTimestamp = true;
14
+ this.includeLevel = true;
15
+ this.customFields = {};
16
+ this.enabled = enabled;
17
+ if (enabled) {
18
+ this.patchConsole();
19
+ }
20
+ }
21
+ /**
22
+ * Enable log correlation
23
+ */
24
+ enable() {
25
+ if (!this.enabled) {
26
+ this.enabled = true;
27
+ this.patchConsole();
28
+ }
29
+ }
30
+ /**
31
+ * Disable log correlation
32
+ */
33
+ disable() {
34
+ if (this.enabled) {
35
+ this.enabled = false;
36
+ this.restoreConsole();
37
+ }
38
+ }
39
+ /**
40
+ * Set current trace context for logging
41
+ */
42
+ setContext(context) {
43
+ const requestId = this.getRequestId();
44
+ if (requestId) {
45
+ this.currentContext.set(requestId, context);
46
+ }
47
+ }
48
+ /**
49
+ * Clear current trace context
50
+ */
51
+ clearContext() {
52
+ const requestId = this.getRequestId();
53
+ if (requestId) {
54
+ this.currentContext.delete(requestId);
55
+ }
56
+ }
57
+ /**
58
+ * Add custom fields to all log messages
59
+ */
60
+ addCustomFields(fields) {
61
+ this.customFields = { ...this.customFields, ...fields };
62
+ }
63
+ /**
64
+ * Clear custom fields
65
+ */
66
+ clearCustomFields() {
67
+ this.customFields = {};
68
+ }
69
+ /**
70
+ * Create a logger with automatic trace context
71
+ */
72
+ createLogger(name) {
73
+ return new CorrelatedLogger(name, this);
74
+ }
75
+ /**
76
+ * Format log message with correlation data
77
+ */
78
+ formatMessage(message, level = 'INFO') {
79
+ const context = this.getCurrentContext();
80
+ const parts = [];
81
+ // Timestamp
82
+ if (this.includeTimestamp) {
83
+ parts.push(`[${new Date().toISOString()}]`);
84
+ }
85
+ // Level
86
+ if (this.includeLevel) {
87
+ parts.push(`[${level}]`);
88
+ }
89
+ // Trace context
90
+ if (context) {
91
+ parts.push(`[trace:${context.traceId.substring(0, 8)}]`);
92
+ parts.push(`[span:${context.spanId.substring(0, 8)}]`);
93
+ }
94
+ // Custom fields
95
+ if (Object.keys(this.customFields).length > 0) {
96
+ parts.push(`[${JSON.stringify(this.customFields)}]`);
97
+ }
98
+ // Message
99
+ parts.push(message);
100
+ return parts.join(' ');
101
+ }
102
+ /**
103
+ * Format log as JSON for structured logging
104
+ */
105
+ formatJSON(message, metadata) {
106
+ const context = this.getCurrentContext();
107
+ const logEntry = {
108
+ timestamp: new Date().toISOString(),
109
+ level: 'INFO',
110
+ message,
111
+ ...metadata,
112
+ };
113
+ if (context) {
114
+ logEntry.traceId = context.traceId;
115
+ logEntry.spanId = context.spanId;
116
+ if (context.parentSpanId) {
117
+ logEntry.parentSpanId = context.parentSpanId;
118
+ }
119
+ }
120
+ if (Object.keys(this.customFields).length > 0) {
121
+ Object.assign(logEntry, this.customFields);
122
+ }
123
+ return JSON.stringify(logEntry);
124
+ }
125
+ patchConsole() {
126
+ // Store original methods
127
+ this.originalConsole = {
128
+ log: console.log,
129
+ info: console.info,
130
+ warn: console.warn,
131
+ error: console.error,
132
+ debug: console.debug,
133
+ };
134
+ // Patch with correlation
135
+ console.log = (...args) => this.intercept('INFO', args);
136
+ console.info = (...args) => this.intercept('INFO', args);
137
+ console.warn = (...args) => this.intercept('WARN', args);
138
+ console.error = (...args) => this.intercept('ERROR', args);
139
+ console.debug = (...args) => this.intercept('DEBUG', args);
140
+ }
141
+ restoreConsole() {
142
+ if (this.originalConsole.log)
143
+ console.log = this.originalConsole.log;
144
+ if (this.originalConsole.info)
145
+ console.info = this.originalConsole.info;
146
+ if (this.originalConsole.warn)
147
+ console.warn = this.originalConsole.warn;
148
+ if (this.originalConsole.error)
149
+ console.error = this.originalConsole.error;
150
+ if (this.originalConsole.debug)
151
+ console.debug = this.originalConsole.debug;
152
+ }
153
+ intercept(level, args) {
154
+ const message = args.map(arg => (typeof arg === 'object' ? JSON.stringify(arg) : String(arg))).join(' ');
155
+ const formattedMessage = this.formatMessage(message, level);
156
+ const originalMethod = this.originalConsole[level.toLowerCase()];
157
+ if (originalMethod) {
158
+ originalMethod.call(console, formattedMessage);
159
+ }
160
+ else {
161
+ console.log(formattedMessage);
162
+ }
163
+ }
164
+ getCurrentContext() {
165
+ const requestId = this.getRequestId();
166
+ return (requestId && this.currentContext.get(requestId)) || null;
167
+ }
168
+ getRequestId() {
169
+ // Try to get request ID from async local storage
170
+ // In Node.js 16+, we can use AsyncLocalStorage
171
+ try {
172
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
173
+ const als = global.__flow_debugger_als;
174
+ if (als && typeof als.getStore === 'function') {
175
+ const store = als.getStore();
176
+ return store?.requestId || null;
177
+ }
178
+ }
179
+ catch {
180
+ // AsyncLocalStorage not available
181
+ }
182
+ return null;
183
+ }
184
+ }
185
+ /**
186
+ * Correlated Logger - Logger instance with automatic trace context
187
+ */
188
+ export class CorrelatedLogger {
189
+ constructor(name, correlator) {
190
+ this.name = name;
191
+ this.correlator = correlator;
192
+ }
193
+ info(message, metadata) {
194
+ this.log('INFO', message, metadata);
195
+ }
196
+ warn(message, metadata) {
197
+ this.log('WARN', message, metadata);
198
+ }
199
+ error(message, metadata) {
200
+ this.log('ERROR', message, metadata);
201
+ }
202
+ debug(message, metadata) {
203
+ this.log('DEBUG', message, metadata);
204
+ }
205
+ child(fields) {
206
+ this.correlator.addCustomFields(fields);
207
+ return new CorrelatedLogger(`${this.name}:${Object.keys(fields).join(',')}`, this.correlator);
208
+ }
209
+ log(level, message, metadata) {
210
+ const fullMessage = `[${this.name}] ${message}`;
211
+ const formattedMessage = this.correlator.formatMessage(fullMessage, level);
212
+ const originalMethod = console[level.toLowerCase()];
213
+ if (originalMethod) {
214
+ originalMethod.call(console, formattedMessage);
215
+ }
216
+ else {
217
+ console.log(formattedMessage);
218
+ }
219
+ }
220
+ }
221
+ /**
222
+ * Express middleware to set trace context for logging
223
+ */
224
+ export function logCorrelationMiddleware(correlator) {
225
+ return (req, res, next) => {
226
+ const tracer = req.tracer;
227
+ if (tracer && correlator['enabled']) {
228
+ const traceId = tracer.getTraceId();
229
+ // Set context for this request
230
+ // Note: This requires AsyncLocalStorage for proper async context
231
+ console.log(`[LogCorrelation] Request ${req.method} ${req.path} traced with ID: ${traceId}`);
232
+ }
233
+ next();
234
+ };
235
+ }
236
+ //# sourceMappingURL=LogCorrelation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogCorrelation.js","sourceRoot":"","sources":["../../../src/core/LogCorrelation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,297 @@
1
+ // ─────────────────────────────────────────────────────────────
2
+ // flow-debugger — Metrics & Gauges System
3
+ // Custom metrics for business and performance tracking
4
+ // ─────────────────────────────────────────────────────────────
5
+ /**
6
+ * Metrics Registry - Central storage for all metrics
7
+ */
8
+ export class MetricsRegistry {
9
+ constructor() {
10
+ this.metrics = new Map();
11
+ this.timeSeries = new Map();
12
+ this.maxTimeSeriesPoints = 1000;
13
+ }
14
+ /**
15
+ * Create or get a counter metric
16
+ */
17
+ counter(name, description, labels) {
18
+ const key = this.makeKey(name, labels);
19
+ const existing = this.metrics.get(key);
20
+ if (existing)
21
+ return existing;
22
+ const metric = {
23
+ name,
24
+ type: 'counter',
25
+ description,
26
+ labels,
27
+ value: 0,
28
+ createdAt: Date.now(),
29
+ updatedAt: Date.now(),
30
+ };
31
+ this.metrics.set(key, metric);
32
+ return metric;
33
+ }
34
+ /**
35
+ * Create or get a gauge metric
36
+ */
37
+ gauge(name, description, labels) {
38
+ const key = this.makeKey(name, labels);
39
+ const existing = this.metrics.get(key);
40
+ if (existing)
41
+ return existing;
42
+ const metric = {
43
+ name,
44
+ type: 'gauge',
45
+ description,
46
+ labels,
47
+ value: 0,
48
+ createdAt: Date.now(),
49
+ updatedAt: Date.now(),
50
+ };
51
+ this.metrics.set(key, metric);
52
+ return metric;
53
+ }
54
+ /**
55
+ * Create or get a histogram metric
56
+ */
57
+ histogram(name, buckets = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10], description, labels) {
58
+ const key = this.makeKey(name, labels);
59
+ const existing = this.metrics.get(key);
60
+ if (existing)
61
+ return existing;
62
+ const metric = {
63
+ name,
64
+ type: 'histogram',
65
+ description,
66
+ labels,
67
+ buckets: buckets.map(b => ({ upperBound: b, count: 0 })),
68
+ sum: 0,
69
+ count: 0,
70
+ createdAt: Date.now(),
71
+ updatedAt: Date.now(),
72
+ };
73
+ this.metrics.set(key, metric);
74
+ return metric;
75
+ }
76
+ /**
77
+ * Create or get a summary metric
78
+ */
79
+ summary(name, quantiles = [0.5, 0.9, 0.95, 0.99], description, labels) {
80
+ const key = this.makeKey(name, labels);
81
+ const existing = this.metrics.get(key);
82
+ if (existing)
83
+ return existing;
84
+ const metric = {
85
+ name,
86
+ type: 'summary',
87
+ description,
88
+ labels,
89
+ quantiles: quantiles.map(q => ({ quantile: q, value: 0 })),
90
+ sum: 0,
91
+ count: 0,
92
+ createdAt: Date.now(),
93
+ updatedAt: Date.now(),
94
+ };
95
+ this.metrics.set(key, metric);
96
+ return metric;
97
+ }
98
+ /**
99
+ * Increment a counter
100
+ */
101
+ inc(name, value = 1, labels) {
102
+ const key = this.makeKey(name, labels);
103
+ const metric = this.metrics.get(key);
104
+ if (metric && metric.type === 'counter') {
105
+ metric.value += value;
106
+ metric.updatedAt = Date.now();
107
+ this.recordTimeSeries(name, metric.value, labels);
108
+ }
109
+ }
110
+ /**
111
+ * Set a gauge value
112
+ */
113
+ set(name, value, labels) {
114
+ const key = this.makeKey(name, labels);
115
+ const metric = this.metrics.get(key);
116
+ if (metric && metric.type === 'gauge') {
117
+ metric.value = value;
118
+ metric.min = metric.min === undefined ? value : Math.min(metric.min, value);
119
+ metric.max = metric.max === undefined ? value : Math.max(metric.max, value);
120
+ metric.updatedAt = Date.now();
121
+ this.recordTimeSeries(name, value, labels);
122
+ }
123
+ }
124
+ /**
125
+ * Observe a value for histogram/summary
126
+ */
127
+ observe(name, value, labels) {
128
+ const key = this.makeKey(name, labels);
129
+ const metric = this.metrics.get(key);
130
+ if (!metric)
131
+ return;
132
+ metric.updatedAt = Date.now();
133
+ if (metric.type === 'histogram') {
134
+ const h = metric;
135
+ h.count++;
136
+ h.sum += value;
137
+ h.buckets.forEach(bucket => {
138
+ if (value <= bucket.upperBound) {
139
+ bucket.count++;
140
+ }
141
+ });
142
+ }
143
+ else if (metric.type === 'summary') {
144
+ const s = metric;
145
+ s.count++;
146
+ s.sum += value;
147
+ // Update quantiles (simplified - uses reservoir sampling)
148
+ this.updateQuantiles(s, value);
149
+ }
150
+ this.recordTimeSeries(name, value, labels);
151
+ }
152
+ /**
153
+ * Get metric by name
154
+ */
155
+ get(name, labels) {
156
+ const key = this.makeKey(name, labels);
157
+ return this.metrics.get(key);
158
+ }
159
+ /**
160
+ * Get all metrics
161
+ */
162
+ getAll() {
163
+ return Array.from(this.metrics.values());
164
+ }
165
+ /**
166
+ * Get metrics by type
167
+ */
168
+ getByType(type) {
169
+ return Array.from(this.metrics.values()).filter(m => m.type === type);
170
+ }
171
+ /**
172
+ * Reset a metric
173
+ */
174
+ reset(name, labels) {
175
+ const key = this.makeKey(name, labels);
176
+ const metric = this.metrics.get(key);
177
+ if (!metric)
178
+ return;
179
+ if (metric.type === 'counter') {
180
+ const c = metric;
181
+ c.value = 0;
182
+ }
183
+ else if (metric.type === 'gauge') {
184
+ const g = metric;
185
+ g.value = 0;
186
+ g.min = undefined;
187
+ g.max = undefined;
188
+ }
189
+ else if (metric.type === 'histogram') {
190
+ const h = metric;
191
+ h.buckets.forEach((b) => (b.count = 0));
192
+ h.sum = 0;
193
+ h.count = 0;
194
+ }
195
+ else if (metric.type === 'summary') {
196
+ const s = metric;
197
+ s.quantiles.forEach((q) => (q.value = 0));
198
+ s.sum = 0;
199
+ s.count = 0;
200
+ }
201
+ metric.updatedAt = Date.now();
202
+ }
203
+ /**
204
+ * Clear all metrics
205
+ */
206
+ clear() {
207
+ this.metrics.clear();
208
+ this.timeSeries.clear();
209
+ }
210
+ /**
211
+ * Get time series data for a metric
212
+ */
213
+ getTimeSeries(name, labels) {
214
+ const key = this.makeKey(name, labels);
215
+ return this.timeSeries.get(key) || [];
216
+ }
217
+ /**
218
+ * Export metrics in Prometheus format
219
+ */
220
+ exportPrometheus() {
221
+ const lines = [];
222
+ this.metrics.forEach(metric => {
223
+ const labelStr = metric.labels
224
+ ? `{${Object.entries(metric.labels).map(([k, v]) => `${k}="${v}"`).join(', ')}}`
225
+ : '';
226
+ if (metric.type === 'counter') {
227
+ const c = metric;
228
+ lines.push(`# HELP ${metric.name} ${metric.description || ''}`);
229
+ lines.push(`# TYPE ${metric.name} counter`);
230
+ lines.push(`${metric.name}${labelStr} ${c.value}`);
231
+ }
232
+ else if (metric.type === 'gauge') {
233
+ const g = metric;
234
+ lines.push(`# HELP ${metric.name} ${metric.description || ''}`);
235
+ lines.push(`# TYPE ${metric.name} gauge`);
236
+ lines.push(`${metric.name}${labelStr} ${g.value}`);
237
+ }
238
+ else if (metric.type === 'histogram') {
239
+ const h = metric;
240
+ lines.push(`# HELP ${metric.name}_bucket ${metric.description || ''}`);
241
+ lines.push(`# TYPE ${metric.name}_bucket histogram`);
242
+ h.buckets.forEach(bucket => {
243
+ lines.push(`${metric.name}_bucket${labelStr}{le="${bucket.upperBound}"} ${bucket.count}`);
244
+ });
245
+ lines.push(`${metric.name}_bucket${labelStr}{le="+Inf"} ${h.count}`);
246
+ lines.push(`# HELP ${metric.name}_sum ${metric.description || ''}`);
247
+ lines.push(`# TYPE ${metric.name}_sum summary`);
248
+ lines.push(`${metric.name}_sum${labelStr} ${h.sum}`);
249
+ lines.push(`# HELP ${metric.name}_count ${metric.description || ''}`);
250
+ lines.push(`# TYPE ${metric.name}_count summary`);
251
+ lines.push(`${metric.name}_count${labelStr} ${h.count}`);
252
+ }
253
+ });
254
+ return lines.join('\n');
255
+ }
256
+ makeKey(name, labels) {
257
+ if (!labels)
258
+ return name;
259
+ const labelStr = Object.entries(labels)
260
+ .sort(([a], [b]) => a.localeCompare(b))
261
+ .map(([k, v]) => `${k}=${v}`)
262
+ .join('|');
263
+ return `${name}|${labelStr}`;
264
+ }
265
+ recordTimeSeries(name, value, labels) {
266
+ const key = this.makeKey(name, labels);
267
+ let series = this.timeSeries.get(key);
268
+ if (!series) {
269
+ series = [];
270
+ this.timeSeries.set(key, series);
271
+ }
272
+ series.push({
273
+ timestamp: new Date(),
274
+ value,
275
+ labels,
276
+ });
277
+ // Limit time series points
278
+ if (series.length > this.maxTimeSeriesPoints) {
279
+ series.shift();
280
+ }
281
+ }
282
+ updateQuantiles(metric, value) {
283
+ // Simplified quantile estimation using sorted array
284
+ const values = metric.quantiles.map(q => q.value);
285
+ values.push(value);
286
+ values.sort((a, b) => a - b);
287
+ metric.quantiles.forEach((q, i) => {
288
+ const index = Math.floor(q.quantile * (values.length - 1));
289
+ q.value = values[index] || 0;
290
+ });
291
+ }
292
+ }
293
+ /**
294
+ * Global metrics registry instance
295
+ */
296
+ export const globalMetrics = new MetricsRegistry();
297
+ //# sourceMappingURL=Metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Metrics.js","sourceRoot":"","sources":["../../../src/core/Metrics.ts"],"names":[],"mappings":"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"}