flow-debugger 1.9.7 → 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 (78) hide show
  1. package/ENHANCED_OBSERVABILITY.md +835 -0
  2. package/IMPLEMENTATION_SUMMARY.md +466 -0
  3. package/README.md +147 -8
  4. package/bin/cli.js +1 -1
  5. package/dist/cjs/core/Alerting.js +310 -0
  6. package/dist/cjs/core/Alerting.js.map +1 -0
  7. package/dist/cjs/core/AnomalyDetection.js +223 -0
  8. package/dist/cjs/core/AnomalyDetection.js.map +1 -0
  9. package/dist/cjs/core/DependencyGraph.js +251 -0
  10. package/dist/cjs/core/DependencyGraph.js.map +1 -0
  11. package/dist/cjs/core/DistributedTracing.js +245 -0
  12. package/dist/cjs/core/DistributedTracing.js.map +1 -0
  13. package/dist/cjs/core/ErrorClustering.js +257 -0
  14. package/dist/cjs/core/ErrorClustering.js.map +1 -0
  15. package/dist/cjs/core/LogCorrelation.js +242 -0
  16. package/dist/cjs/core/LogCorrelation.js.map +1 -0
  17. package/dist/cjs/core/Metrics.js +301 -0
  18. package/dist/cjs/core/Metrics.js.map +1 -0
  19. package/dist/cjs/core/RootCause.js +107 -9
  20. package/dist/cjs/core/RootCause.js.map +1 -1
  21. package/dist/cjs/core/TrendAnalysis.js +254 -0
  22. package/dist/cjs/core/TrendAnalysis.js.map +1 -0
  23. package/dist/cjs/core/types.js +14 -0
  24. package/dist/cjs/core/types.js.map +1 -1
  25. package/dist/cjs/index.js +27 -1
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/middleware/express.js +105 -4
  28. package/dist/cjs/middleware/express.js.map +1 -1
  29. package/dist/esm/core/Alerting.js +305 -0
  30. package/dist/esm/core/Alerting.js.map +1 -0
  31. package/dist/esm/core/AnomalyDetection.js +218 -0
  32. package/dist/esm/core/AnomalyDetection.js.map +1 -0
  33. package/dist/esm/core/DependencyGraph.js +246 -0
  34. package/dist/esm/core/DependencyGraph.js.map +1 -0
  35. package/dist/esm/core/DistributedTracing.js +240 -0
  36. package/dist/esm/core/DistributedTracing.js.map +1 -0
  37. package/dist/esm/core/ErrorClustering.js +252 -0
  38. package/dist/esm/core/ErrorClustering.js.map +1 -0
  39. package/dist/esm/core/LogCorrelation.js +236 -0
  40. package/dist/esm/core/LogCorrelation.js.map +1 -0
  41. package/dist/esm/core/Metrics.js +297 -0
  42. package/dist/esm/core/Metrics.js.map +1 -0
  43. package/dist/esm/core/RootCause.js +107 -9
  44. package/dist/esm/core/RootCause.js.map +1 -1
  45. package/dist/esm/core/TrendAnalysis.js +250 -0
  46. package/dist/esm/core/TrendAnalysis.js.map +1 -0
  47. package/dist/esm/core/types.js +14 -0
  48. package/dist/esm/core/types.js.map +1 -1
  49. package/dist/esm/index.js +10 -0
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/middleware/express.js +105 -4
  52. package/dist/esm/middleware/express.js.map +1 -1
  53. package/dist/types/core/Alerting.d.ts +82 -0
  54. package/dist/types/core/Alerting.d.ts.map +1 -0
  55. package/dist/types/core/AnomalyDetection.d.ts +93 -0
  56. package/dist/types/core/AnomalyDetection.d.ts.map +1 -0
  57. package/dist/types/core/DependencyGraph.d.ts +65 -0
  58. package/dist/types/core/DependencyGraph.d.ts.map +1 -0
  59. package/dist/types/core/DistributedTracing.d.ts +92 -0
  60. package/dist/types/core/DistributedTracing.d.ts.map +1 -0
  61. package/dist/types/core/ErrorClustering.d.ts +70 -0
  62. package/dist/types/core/ErrorClustering.d.ts.map +1 -0
  63. package/dist/types/core/LogCorrelation.d.ts +73 -0
  64. package/dist/types/core/LogCorrelation.d.ts.map +1 -0
  65. package/dist/types/core/Metrics.d.ts +73 -0
  66. package/dist/types/core/Metrics.d.ts.map +1 -0
  67. package/dist/types/core/RootCause.d.ts +9 -5
  68. package/dist/types/core/RootCause.d.ts.map +1 -1
  69. package/dist/types/core/TrendAnalysis.d.ts +63 -0
  70. package/dist/types/core/TrendAnalysis.d.ts.map +1 -0
  71. package/dist/types/core/types.d.ts +200 -0
  72. package/dist/types/core/types.d.ts.map +1 -1
  73. package/dist/types/index.d.ts +9 -1
  74. package/dist/types/index.d.ts.map +1 -1
  75. package/dist/types/middleware/express.d.ts +12 -0
  76. package/dist/types/middleware/express.d.ts.map +1 -1
  77. package/package.json +3 -3
  78. package/test-results.json +1 -0
@@ -0,0 +1,252 @@
1
+ // ─────────────────────────────────────────────────────────────
2
+ // flow-debugger — Error Clustering System
3
+ // Groups similar errors using fingerprinting
4
+ // ─────────────────────────────────────────────────────────────
5
+ import { createHash } from 'crypto';
6
+ /**
7
+ * Error Cluster Manager - Groups similar errors for easier debugging
8
+ */
9
+ export class ErrorClusterManager {
10
+ constructor(maxClusters = 50) {
11
+ this.clusters = new Map();
12
+ this.maxClusters = 50;
13
+ this.maxClusters = maxClusters;
14
+ }
15
+ /**
16
+ * Process a trace and cluster any errors
17
+ */
18
+ processTrace(trace) {
19
+ // Only cluster error/critical traces
20
+ if (trace.classification !== 'ERROR' && trace.classification !== 'CRITICAL') {
21
+ return null;
22
+ }
23
+ // Find error steps
24
+ const errorSteps = trace.steps.filter(s => s.status === 'error' || s.status === 'timeout');
25
+ if (errorSteps.length === 0 && trace.classification !== 'CRITICAL') {
26
+ return null;
27
+ }
28
+ // Create fingerprint from error pattern
29
+ const fingerprint = this.createFingerprint(trace, errorSteps);
30
+ // Get or create cluster
31
+ let cluster = this.clusters.get(fingerprint);
32
+ if (!cluster) {
33
+ cluster = {
34
+ id: this.generateClusterId(),
35
+ fingerprint,
36
+ message: this.getErrorMessage(trace, errorSteps),
37
+ stackTrace: errorSteps[0]?.stackTrace,
38
+ count: 0,
39
+ firstSeen: trace.timestamp,
40
+ lastSeen: trace.timestamp,
41
+ traces: [],
42
+ endpoints: [],
43
+ services: [],
44
+ severity: trace.classification,
45
+ };
46
+ this.clusters.set(fingerprint, cluster);
47
+ // Trim old clusters if needed
48
+ if (this.clusters.size > this.maxClusters) {
49
+ this.trimOldestCluster();
50
+ }
51
+ }
52
+ // Update cluster
53
+ cluster.count++;
54
+ cluster.lastSeen = trace.timestamp;
55
+ cluster.severity = this.getWorstSeverity(cluster.severity, trace.classification);
56
+ if (!cluster.traces.includes(trace.traceId) && cluster.traces.length < 100) {
57
+ cluster.traces.push(trace.traceId);
58
+ }
59
+ if (!cluster.endpoints.includes(trace.endpoint)) {
60
+ cluster.endpoints.push(trace.endpoint);
61
+ }
62
+ errorSteps.forEach(step => {
63
+ if (step.service !== 'internal' && !cluster.services.includes(step.service)) {
64
+ cluster.services.push(step.service);
65
+ }
66
+ });
67
+ return cluster;
68
+ }
69
+ /**
70
+ * Get all clusters
71
+ */
72
+ getClusters() {
73
+ return Array.from(this.clusters.values()).sort((a, b) => {
74
+ // Sort by count (most frequent first)
75
+ return b.count - a.count;
76
+ });
77
+ }
78
+ /**
79
+ * Get cluster by fingerprint
80
+ */
81
+ getCluster(fingerprint) {
82
+ return this.clusters.get(fingerprint);
83
+ }
84
+ /**
85
+ * Get cluster by ID
86
+ */
87
+ getClusterById(id) {
88
+ return Array.from(this.clusters.values()).find(c => c.id === id);
89
+ }
90
+ /**
91
+ * Get top N clusters
92
+ */
93
+ getTopClusters(limit = 10) {
94
+ return this.getClusters().slice(0, limit);
95
+ }
96
+ /**
97
+ * Get new clusters (first seen in last hour)
98
+ */
99
+ getNewClusters() {
100
+ const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);
101
+ return Array.from(this.clusters.values()).filter(c => c.firstSeen > oneHourAgo);
102
+ }
103
+ /**
104
+ * Get recurring clusters (more than 10 occurrences)
105
+ */
106
+ getRecurringClusters() {
107
+ return Array.from(this.clusters.values()).filter(c => c.count > 10);
108
+ }
109
+ /**
110
+ * Clear a cluster
111
+ */
112
+ clearCluster(fingerprint) {
113
+ this.clusters.delete(fingerprint);
114
+ }
115
+ /**
116
+ * Clear all clusters
117
+ */
118
+ clear() {
119
+ this.clusters.clear();
120
+ }
121
+ /**
122
+ * Get cluster statistics
123
+ */
124
+ getStats() {
125
+ const clusters = this.getClusters();
126
+ const totalErrors = clusters.reduce((sum, c) => sum + c.count, 0);
127
+ // Count services
128
+ const serviceCounts = new Map();
129
+ clusters.forEach(cluster => {
130
+ cluster.services.forEach(service => {
131
+ serviceCounts.set(service, (serviceCounts.get(service) || 0) + cluster.count);
132
+ });
133
+ });
134
+ const topServices = Array.from(serviceCounts.entries())
135
+ .map(([service, count]) => ({ service, count }))
136
+ .sort((a, b) => b.count - a.count)
137
+ .slice(0, 10);
138
+ return {
139
+ totalClusters: clusters.length,
140
+ totalErrors,
141
+ avgClusterSize: totalErrors / clusters.length || 0,
142
+ topServices,
143
+ };
144
+ }
145
+ createFingerprint(trace, errorSteps) {
146
+ // Create fingerprint from error pattern
147
+ const components = [];
148
+ // Error messages
149
+ errorSteps.forEach(step => {
150
+ if (step.error) {
151
+ // Normalize error message (remove dynamic parts)
152
+ const normalizedError = this.normalizeError(step.error);
153
+ components.push(`${step.name}:${normalizedError}`);
154
+ }
155
+ });
156
+ // Stack trace (first few lines)
157
+ const firstError = errorSteps.find(s => s.stackTrace);
158
+ if (firstError?.stackTrace) {
159
+ const stackLines = firstError.stackTrace.split('\n').slice(0, 5).join('\n');
160
+ const normalizedStack = this.normalizeStackTrace(stackLines);
161
+ components.push(normalizedStack);
162
+ }
163
+ // Endpoint pattern
164
+ components.push(this.normalizeEndpoint(trace.endpoint));
165
+ // Create hash
166
+ const input = components.join('|');
167
+ return createHash('md5').update(input).digest('hex');
168
+ }
169
+ getErrorMessage(trace, errorSteps) {
170
+ if (errorSteps.length > 0 && errorSteps[0].error) {
171
+ return errorSteps[0].error.split('\n')[0]; // First line only
172
+ }
173
+ if (trace.rootCause?.cause) {
174
+ return trace.rootCause.cause.split('\n')[0];
175
+ }
176
+ return `${trace.classification} on ${trace.method} ${trace.endpoint}`;
177
+ }
178
+ normalizeError(error) {
179
+ return error
180
+ .replace(/\b[0-9a-f]{24}\b/g, '<ID>') // MongoDB IDs
181
+ .replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/g, '<UUID>') // UUIDs
182
+ .replace(/\b\d+\b/g, '<NUM>') // Numbers
183
+ .replace(/at\s+.*?\(.*?\)/g, 'at <LOCATION>'); // Stack locations
184
+ }
185
+ normalizeStackTrace(stack) {
186
+ return stack
187
+ .replace(/\b[0-9a-f]{24}\b/g, '<ID>')
188
+ .replace(/\b\d+\b/g, '<NUM>')
189
+ .replace(/at\s+.*?\(.*?\)/g, 'at <LOCATION>');
190
+ }
191
+ normalizeEndpoint(endpoint) {
192
+ return endpoint
193
+ .replace(/\/[0-9a-f]{24}\b/g, '/<ID>')
194
+ .replace(/\/\d+/g, '/<NUM>');
195
+ }
196
+ getWorstSeverity(a, b) {
197
+ const order = ['INFO', 'WARN', 'ERROR', 'CRITICAL'];
198
+ return order.indexOf(a) > order.indexOf(b) ? a : b;
199
+ }
200
+ trimOldestCluster() {
201
+ // Find cluster with oldest lastSeen
202
+ let oldest = null;
203
+ for (const [fingerprint, cluster] of this.clusters.entries()) {
204
+ if (!oldest || cluster.lastSeen < oldest.lastSeen) {
205
+ oldest = { fingerprint, lastSeen: cluster.lastSeen };
206
+ }
207
+ }
208
+ if (oldest) {
209
+ this.clusters.delete(oldest.fingerprint);
210
+ }
211
+ }
212
+ generateClusterId() {
213
+ return `cluster_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
214
+ }
215
+ }
216
+ /**
217
+ * Get similarity score between two error messages
218
+ */
219
+ export function getErrorSimilarity(error1, error2) {
220
+ // Levenshtein distance-based similarity
221
+ const normalized1 = error1.toLowerCase();
222
+ const normalized2 = error2.toLowerCase();
223
+ if (normalized1 === normalized2)
224
+ return 1;
225
+ const distance = levenshteinDistance(normalized1, normalized2);
226
+ const maxLength = Math.max(normalized1.length, normalized2.length);
227
+ return 1 - distance / maxLength;
228
+ }
229
+ /**
230
+ * Calculate Levenshtein distance between two strings
231
+ */
232
+ function levenshteinDistance(str1, str2) {
233
+ const matrix = [];
234
+ for (let i = 0; i <= str2.length; i++) {
235
+ matrix[i] = [i];
236
+ }
237
+ for (let j = 0; j <= str1.length; j++) {
238
+ matrix[0][j] = j;
239
+ }
240
+ for (let i = 1; i <= str2.length; i++) {
241
+ for (let j = 1; j <= str1.length; j++) {
242
+ if (str2.charAt(i - 1) === str1.charAt(j - 1)) {
243
+ matrix[i][j] = matrix[i - 1][j - 1];
244
+ }
245
+ else {
246
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
247
+ }
248
+ }
249
+ }
250
+ return matrix[str2.length][str1.length];
251
+ }
252
+ //# sourceMappingURL=ErrorClustering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorClustering.js","sourceRoot":"","sources":["../../../src/core/ErrorClustering.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,0CAA0C;AAC1C,6CAA6C;AAC7C,gEAAgE;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAI5B,YAAY,cAAsB,EAAE;QAH5B,aAAQ,GAA8B,IAAI,GAAG,EAAE,CAAC;QAChD,gBAAW,GAAW,EAAE,CAAC;QAG7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAY;QACrB,qCAAqC;QACrC,IAAI,KAAK,CAAC,cAAc,KAAK,OAAO,IAAI,KAAK,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,mBAAmB;QACnB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC3F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,wCAAwC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAE9D,wBAAwB;QACxB,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,GAAG;gBACN,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE;gBAC5B,WAAW;gBACX,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC;gBAChD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU;gBACrC,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS;gBACzB,MAAM,EAAE,EAAE;gBACV,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,KAAK,CAAC,cAAc;aACjC,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAExC,8BAA8B;YAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,iBAAiB;QACjB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;QACnC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QAEjF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACzE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACtB,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,WAAW;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpD,sCAAsC;YACtC,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,WAAmB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,EAAU;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAgB,EAAE;QAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,cAAc;QACV,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;IACpF,CAAC;IAED;;OAEG;IACH,oBAAoB;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,WAAmB;QAC5B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,QAAQ;QAMJ,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAElE,iBAAiB;QACjB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsB,CAAC;QACpD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC/B,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;aAClD,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;aAC/C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAElB,OAAO;YACH,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,WAAW;YACX,cAAc,EAAE,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC;YAClD,WAAW;SACd,CAAC;IACN,CAAC;IAEO,iBAAiB,CAAC,KAAY,EAAE,UAA0B;QAC9D,wCAAwC;QACxC,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,iBAAiB;QACjB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,iDAAiD;gBACjD,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxD,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC,CAAC;YACvD,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,gCAAgC;QAChC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,UAAU,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5E,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC7D,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACrC,CAAC;QAED,mBAAmB;QACnB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAExD,cAAc;QACd,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAEO,eAAe,CAAC,KAAY,EAAE,UAA0B;QAC5D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAC/C,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB;QACjE,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,GAAG,KAAK,CAAC,cAAc,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1E,CAAC;IAEO,cAAc,CAAC,KAAa;QAChC,OAAO,KAAK;aACP,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,cAAc;aACnD,OAAO,CAAC,mEAAmE,EAAE,QAAQ,CAAC,CAAC,QAAQ;aAC/F,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,UAAU;aACvC,OAAO,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC,CAAC,kBAAkB;IACzE,CAAC;IAEO,mBAAmB,CAAC,KAAa;QACrC,OAAO,KAAK;aACP,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;aACpC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC;aAC5B,OAAO,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IACtD,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACtC,OAAO,QAAQ;aACV,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC;aACrC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAEO,gBAAgB,CAAC,CAAsB,EAAE,CAAsB;QACnE,MAAM,KAAK,GAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAEO,iBAAiB;QACrB,oCAAoC;QACpC,IAAI,MAAM,GAAmD,IAAI,CAAC;QAElE,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChD,MAAM,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzD,CAAC;QACL,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAEO,iBAAiB;QACrB,OAAO,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACjF,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAc;IAC7D,wCAAwC;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEzC,IAAI,WAAW,KAAK,WAAW;QAAE,OAAO,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAEnE,OAAO,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACnB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EACxB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EACpB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CACvB,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -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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"}