flow-debugger 1.9.6 → 1.9.8
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/bin/cli.js +1 -1
- package/dashboard/app.js +505 -415
- package/dist/cjs/core/RootCause.js +299 -44
- package/dist/cjs/core/RootCause.js.map +1 -1
- package/dist/cjs/core/Timeline.js +56 -3
- package/dist/cjs/core/Timeline.js.map +1 -1
- package/dist/cjs/core/TraceEngine.js +22 -1
- package/dist/cjs/core/TraceEngine.js.map +1 -1
- package/dist/cjs/core/types.js +1 -0
- package/dist/cjs/core/types.js.map +1 -1
- package/dist/cjs/middleware/express.js +44 -19
- package/dist/cjs/middleware/express.js.map +1 -1
- package/dist/esm/core/RootCause.js +299 -44
- package/dist/esm/core/RootCause.js.map +1 -1
- package/dist/esm/core/Timeline.js +56 -3
- package/dist/esm/core/Timeline.js.map +1 -1
- package/dist/esm/core/TraceEngine.js +22 -1
- package/dist/esm/core/TraceEngine.js.map +1 -1
- package/dist/esm/core/types.js +1 -0
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/middleware/express.js +44 -19
- package/dist/esm/middleware/express.js.map +1 -1
- package/dist/types/core/RootCause.d.ts +26 -8
- package/dist/types/core/RootCause.d.ts.map +1 -1
- package/dist/types/core/Timeline.d.ts +6 -1
- package/dist/types/core/Timeline.d.ts.map +1 -1
- package/dist/types/core/TraceEngine.d.ts +7 -0
- package/dist/types/core/TraceEngine.d.ts.map +1 -1
- package/dist/types/core/types.d.ts +7 -0
- package/dist/types/core/types.d.ts.map +1 -1
- package/dist/types/middleware/express.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -126,6 +126,31 @@ function flowDebugger(config) {
|
|
|
126
126
|
}
|
|
127
127
|
catch (_) { }
|
|
128
128
|
}
|
|
129
|
+
// ✅ CAPTURE RESPONSE BODY (NEW - Phase 1)
|
|
130
|
+
const originalJson = res.json;
|
|
131
|
+
const originalSend = res.send;
|
|
132
|
+
// Capture JSON responses
|
|
133
|
+
res.json = function (body) {
|
|
134
|
+
if (tracer && mergedConfig.captureResponseData) {
|
|
135
|
+
tracer.setResponseData({
|
|
136
|
+
body: body,
|
|
137
|
+
statusCode: res.statusCode,
|
|
138
|
+
size: JSON.stringify(body).length
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return originalJson.call(this, body);
|
|
142
|
+
};
|
|
143
|
+
// Capture text responses
|
|
144
|
+
res.send = function (body) {
|
|
145
|
+
if (tracer && mergedConfig.captureResponseData && typeof body === 'string') {
|
|
146
|
+
tracer.setResponseData({
|
|
147
|
+
body: body,
|
|
148
|
+
statusCode: res.statusCode,
|
|
149
|
+
size: body.length
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return originalSend.call(this, body);
|
|
153
|
+
};
|
|
129
154
|
// Hook into response finish
|
|
130
155
|
const originalEnd = res.end;
|
|
131
156
|
res.end = function (...args) {
|
|
@@ -322,25 +347,25 @@ function handleDebuggerRoute(req, res, next, analytics, config) {
|
|
|
322
347
|
}
|
|
323
348
|
/** Inline fallback dashboard if files aren't found */
|
|
324
349
|
function getInlineDashboard() {
|
|
325
|
-
return `<!DOCTYPE html>
|
|
326
|
-
<html lang="en">
|
|
327
|
-
<head>
|
|
328
|
-
<meta charset="UTF-8">
|
|
329
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
330
|
-
<title>Flow Debugger Dashboard</title>
|
|
331
|
-
<style>body{font-family:system-ui;background:#0a0a1a;color:#e0e0e0;padding:20px}
|
|
332
|
-
h1{color:#7c3aed}.card{background:#1a1a2e;border-radius:12px;padding:20px;margin:10px 0;border:1px solid #2a2a4a}</style>
|
|
333
|
-
</head>
|
|
334
|
-
<body>
|
|
335
|
-
<h1>🔍 Flow Debugger</h1>
|
|
336
|
-
<p>Dashboard files not found. API available at <a href="/__debugger" style="color:#7c3aed">/__debugger</a></p>
|
|
337
|
-
<div class="card" id="data">Loading...</div>
|
|
338
|
-
<script>
|
|
339
|
-
fetch('/__debugger').then(r=>r.json()).then(d=>{
|
|
340
|
-
document.getElementById('data').innerHTML='<pre>'+JSON.stringify(d,null,2)+'</pre>';
|
|
341
|
-
});
|
|
342
|
-
</script>
|
|
343
|
-
</body>
|
|
350
|
+
return `<!DOCTYPE html>
|
|
351
|
+
<html lang="en">
|
|
352
|
+
<head>
|
|
353
|
+
<meta charset="UTF-8">
|
|
354
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
355
|
+
<title>Flow Debugger Dashboard</title>
|
|
356
|
+
<style>body{font-family:system-ui;background:#0a0a1a;color:#e0e0e0;padding:20px}
|
|
357
|
+
h1{color:#7c3aed}.card{background:#1a1a2e;border-radius:12px;padding:20px;margin:10px 0;border:1px solid #2a2a4a}</style>
|
|
358
|
+
</head>
|
|
359
|
+
<body>
|
|
360
|
+
<h1>🔍 Flow Debugger</h1>
|
|
361
|
+
<p>Dashboard files not found. API available at <a href="/__debugger" style="color:#7c3aed">/__debugger</a></p>
|
|
362
|
+
<div class="card" id="data">Loading...</div>
|
|
363
|
+
<script>
|
|
364
|
+
fetch('/__debugger').then(r=>r.json()).then(d=>{
|
|
365
|
+
document.getElementById('data').innerHTML='<pre>'+JSON.stringify(d,null,2)+'</pre>';
|
|
366
|
+
});
|
|
367
|
+
</script>
|
|
368
|
+
</body>
|
|
344
369
|
</html>`;
|
|
345
370
|
}
|
|
346
371
|
//# sourceMappingURL=express.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../../src/middleware/express.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,qCAAqC;AACrC,kEAAkE;AAClE,gEAAgE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDhE,
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../../src/middleware/express.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,63 +1,256 @@
|
|
|
1
1
|
// ─────────────────────────────────────────────────────────────
|
|
2
2
|
// flow-debugger — Root Cause Detection
|
|
3
3
|
// Analyzes trace steps to identify the most likely failure origin
|
|
4
|
+
// INCLUDING SILENT FAILURES (no console error)
|
|
4
5
|
// ─────────────────────────────────────────────────────────────
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
+
* Enhanced root cause detection with suggestions and detailed analysis.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
* 1.
|
|
10
|
-
* 2.
|
|
11
|
-
* 3.
|
|
12
|
-
* 4.
|
|
9
|
+
* DETECTS:
|
|
10
|
+
* 1. Error patterns (timeout, connection, validation, etc.)
|
|
11
|
+
* 2. Slow queries and bottlenecks
|
|
12
|
+
* 3. Memory/performance issues
|
|
13
|
+
* 4. SILENT FAILURES (no console error but status codes indicate problems)
|
|
14
|
+
* 5. Empty/null database results without errors
|
|
15
|
+
* 6. Performance degradation trends
|
|
16
|
+
*
|
|
17
|
+
* Provides actionable suggestions for each issue type.
|
|
13
18
|
*/
|
|
14
19
|
export function detectRootCause(steps, statusCode, config) {
|
|
15
20
|
if (steps.length === 0)
|
|
16
21
|
return null;
|
|
17
22
|
const slowThreshold = config.slowThreshold ?? 300;
|
|
18
|
-
|
|
23
|
+
const slowQueryThreshold = config.slowQueryThreshold ?? 300;
|
|
24
|
+
const result = {
|
|
25
|
+
cause: '',
|
|
26
|
+
step: '',
|
|
27
|
+
service: 'unknown',
|
|
28
|
+
confidence: 0,
|
|
29
|
+
suggestions: [],
|
|
30
|
+
contributingFactors: []
|
|
31
|
+
};
|
|
32
|
+
// ✅ 1. SILENT FAILURE DETECTION - No console error but status indicates problem
|
|
33
|
+
if (statusCode && statusCode >= 400 && statusCode < 500) {
|
|
34
|
+
// Client errors - might not throw but indicate problems
|
|
35
|
+
if (statusCode === 404) {
|
|
36
|
+
result.cause = 'Resource not found (silent failure - no exception thrown)';
|
|
37
|
+
result.step = 'Request handling';
|
|
38
|
+
result.service = 'internal';
|
|
39
|
+
result.confidence = 90;
|
|
40
|
+
result.suggestions = [
|
|
41
|
+
'Check if the requested resource exists',
|
|
42
|
+
'Verify route parameters and IDs',
|
|
43
|
+
'Review database for missing records',
|
|
44
|
+
'Check if file/blob exists before accessing'
|
|
45
|
+
];
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
49
|
+
result.cause = 'Authentication/Authorization failed (silent rejection)';
|
|
50
|
+
result.step = 'Auth middleware';
|
|
51
|
+
result.service = 'internal';
|
|
52
|
+
result.confidence = 95;
|
|
53
|
+
result.suggestions = [
|
|
54
|
+
'Verify user token/credentials',
|
|
55
|
+
'Check session expiration',
|
|
56
|
+
'Review permission/role configuration',
|
|
57
|
+
'Ensure CORS policy allows the request'
|
|
58
|
+
];
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
if (statusCode === 429) {
|
|
62
|
+
result.cause = 'Rate limit exceeded (throttled silently)';
|
|
63
|
+
result.step = 'Rate limiter';
|
|
64
|
+
result.service = 'internal';
|
|
65
|
+
result.confidence = 100;
|
|
66
|
+
result.suggestions = [
|
|
67
|
+
'Implement request throttling on client',
|
|
68
|
+
'Add exponential backoff',
|
|
69
|
+
'Cache frequently accessed data',
|
|
70
|
+
'Consider upgrading API plan'
|
|
71
|
+
];
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ✅ 2. SILENT DATABASE ISSUES - Returns empty/null without error
|
|
76
|
+
const dbSteps = steps.filter(s => ['mongo', 'mysql', 'postgres', 'redis'].includes(s.service));
|
|
77
|
+
for (const dbStep of dbSteps) {
|
|
78
|
+
const metadata = dbStep.metadata;
|
|
79
|
+
// Check for empty results (might indicate problem)
|
|
80
|
+
if (metadata?.resultCount === 0 && dbStep.name.toLowerCase().includes('find')) {
|
|
81
|
+
result.cause = 'Database query returned empty result (no error thrown)';
|
|
82
|
+
result.step = dbStep.name;
|
|
83
|
+
result.service = dbStep.service;
|
|
84
|
+
result.confidence = 70;
|
|
85
|
+
result.suggestions = [
|
|
86
|
+
'Verify query conditions are correct',
|
|
87
|
+
'Check if data exists in database',
|
|
88
|
+
'Review filter/criteria logic',
|
|
89
|
+
'Consider if empty result is expected behavior'
|
|
90
|
+
];
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
// Check for null/undefined returns
|
|
94
|
+
if (metadata?.result === null || metadata?.result === undefined) {
|
|
95
|
+
result.cause = 'Database operation returned null (silent failure)';
|
|
96
|
+
result.step = dbStep.name;
|
|
97
|
+
result.service = dbStep.service;
|
|
98
|
+
result.confidence = 75;
|
|
99
|
+
result.suggestions = [
|
|
100
|
+
'Check if document/record exists',
|
|
101
|
+
'Verify query syntax and collection name',
|
|
102
|
+
'Review connection pool status',
|
|
103
|
+
'Check database logs for warnings'
|
|
104
|
+
];
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// 3. Look for timed-out steps (highest priority)
|
|
19
109
|
const timedOut = steps.find(s => s.status === 'timeout');
|
|
20
110
|
if (timedOut) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
111
|
+
result.cause = `${timedOut.name} timed out`;
|
|
112
|
+
result.step = timedOut.name;
|
|
113
|
+
result.service = timedOut.service;
|
|
114
|
+
result.confidence = 100;
|
|
115
|
+
result.suggestions = [
|
|
116
|
+
`Increase timeout for ${getServiceLabel(timedOut.service)} operations`,
|
|
117
|
+
'Check service health and load',
|
|
118
|
+
'Add retry logic with exponential backoff',
|
|
119
|
+
'Consider implementing circuit breaker pattern'
|
|
120
|
+
];
|
|
121
|
+
return result;
|
|
27
122
|
}
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
123
|
+
// 4. Analyze failed steps with detailed error detection
|
|
124
|
+
const failedSteps = steps.filter(s => s.status === 'error');
|
|
125
|
+
if (failedSteps.length > 0) {
|
|
126
|
+
const firstFailed = failedSteps[0];
|
|
127
|
+
const errorDetails = firstFailed.metadata?.errorDetails;
|
|
128
|
+
// ✅ Enhanced error pattern detection
|
|
129
|
+
if (errorDetails) {
|
|
130
|
+
const errorMessage = errorDetails.message?.toLowerCase() || '';
|
|
131
|
+
const errorCode = errorDetails.code;
|
|
132
|
+
// Database timeout
|
|
133
|
+
if (errorMessage.includes('timeout') || errorCode === 'ETIMEDOUT') {
|
|
134
|
+
result.cause = `Database timeout in ${firstFailed.name}`;
|
|
135
|
+
result.step = firstFailed.name;
|
|
136
|
+
result.service = firstFailed.service;
|
|
137
|
+
result.confidence = 90;
|
|
138
|
+
result.errorDetails = errorDetails;
|
|
139
|
+
result.suggestions = [
|
|
140
|
+
'Increase connection pool size',
|
|
141
|
+
'Add query timeout configuration',
|
|
142
|
+
'Check database server load and slow query logs',
|
|
143
|
+
'Add indexes to improve query performance',
|
|
144
|
+
'Consider query optimization or caching'
|
|
145
|
+
];
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
// Connection refused
|
|
149
|
+
if (errorCode === 'ECONNREFUSED') {
|
|
150
|
+
result.cause = `Service unavailable: ${getServiceLabel(firstFailed.service)} connection refused`;
|
|
151
|
+
result.step = firstFailed.name;
|
|
152
|
+
result.service = firstFailed.service;
|
|
153
|
+
result.confidence = 95;
|
|
154
|
+
result.errorDetails = errorDetails;
|
|
155
|
+
result.suggestions = [
|
|
156
|
+
`Check if ${getServiceLabel(firstFailed.service)} service is running`,
|
|
157
|
+
'Verify connection string and port configuration',
|
|
158
|
+
'Check firewall rules and network connectivity',
|
|
159
|
+
'Review service health and restart if necessary'
|
|
160
|
+
];
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
// Authentication/Authorization errors
|
|
164
|
+
if (errorCode === 'EAUTH' || errorCode === 'UNAUTHORIZED' || errorDetails.name === 'UnauthorizedError') {
|
|
165
|
+
result.cause = 'Authentication/Authorization failed';
|
|
166
|
+
result.step = firstFailed.name;
|
|
167
|
+
result.service = firstFailed.service;
|
|
168
|
+
result.confidence = 100;
|
|
169
|
+
result.errorDetails = errorDetails;
|
|
170
|
+
result.suggestions = [
|
|
171
|
+
'Verify API keys/tokens are valid and not expired',
|
|
172
|
+
'Check authentication middleware configuration',
|
|
173
|
+
'Review user permissions and roles',
|
|
174
|
+
'Ensure CORS policy allows the request origin'
|
|
175
|
+
];
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
// Validation errors
|
|
179
|
+
if (errorDetails.name === 'ValidationError' || errorCode === 'VALIDATION_ERROR') {
|
|
180
|
+
result.cause = 'Input validation failed';
|
|
181
|
+
result.step = firstFailed.name;
|
|
182
|
+
result.service = firstFailed.service;
|
|
183
|
+
result.confidence = 100;
|
|
184
|
+
result.errorDetails = errorDetails;
|
|
185
|
+
result.suggestions = [
|
|
186
|
+
`Fix validation error: ${errorDetails.message}`,
|
|
187
|
+
'Validate input data before sending to API',
|
|
188
|
+
'Check required fields and data types',
|
|
189
|
+
'Review schema validation rules'
|
|
190
|
+
];
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
// Memory issues
|
|
194
|
+
if (errorMessage.includes('memory') || errorCode === 'ENOMEM') {
|
|
195
|
+
result.cause = 'Memory exhausted';
|
|
196
|
+
result.step = firstFailed.name;
|
|
197
|
+
result.service = firstFailed.service;
|
|
198
|
+
result.confidence = 85;
|
|
199
|
+
result.errorDetails = errorDetails;
|
|
200
|
+
result.suggestions = [
|
|
201
|
+
'Increase Node.js memory limit (--max-old-space-size)',
|
|
202
|
+
'Check for memory leaks in application code',
|
|
203
|
+
'Optimize large data processing (use streams)',
|
|
204
|
+
'Implement pagination for large datasets',
|
|
205
|
+
'Monitor memory usage with profiling tools'
|
|
206
|
+
];
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
// Rate limiting
|
|
210
|
+
if (errorCode === 'ERATELIMIT' || statusCode === 429) {
|
|
211
|
+
result.cause = 'Rate limit exceeded';
|
|
212
|
+
result.step = firstFailed.name;
|
|
213
|
+
result.service = firstFailed.service;
|
|
214
|
+
result.confidence = 100;
|
|
215
|
+
result.errorDetails = errorDetails;
|
|
216
|
+
result.suggestions = [
|
|
217
|
+
'Implement request throttling',
|
|
218
|
+
'Add exponential backoff for retries',
|
|
219
|
+
'Cache frequently accessed data',
|
|
220
|
+
'Consider upgrading API plan for higher limits'
|
|
221
|
+
];
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
40
224
|
}
|
|
225
|
+
// Generic error fallback
|
|
226
|
+
result.cause = `${firstFailed.name} failed: ${firstFailed.error || 'unknown error'}`;
|
|
227
|
+
result.step = firstFailed.name;
|
|
228
|
+
result.service = firstFailed.service;
|
|
229
|
+
result.confidence = statusCode && statusCode >= 500 ? 90 : 80;
|
|
230
|
+
result.errorDetails = errorDetails;
|
|
231
|
+
result.suggestions = [
|
|
232
|
+
'Check error logs for more details',
|
|
233
|
+
'Review recent code changes',
|
|
234
|
+
'Verify external service status',
|
|
235
|
+
'Test with simplified input data'
|
|
236
|
+
];
|
|
237
|
+
return result;
|
|
41
238
|
}
|
|
42
|
-
//
|
|
43
|
-
const failedStep = steps.find(s => s.status === 'error');
|
|
44
|
-
if (failedStep) {
|
|
45
|
-
return {
|
|
46
|
-
cause: `${failedStep.name} failed: ${failedStep.error || 'unknown error'}`,
|
|
47
|
-
step: failedStep.name,
|
|
48
|
-
service: failedStep.service,
|
|
49
|
-
confidence: statusCode && statusCode >= 400 ? 90 : 80,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
// 4. Look for slow steps
|
|
239
|
+
// 5. Analyze slow requests (performance degradation)
|
|
53
240
|
const slowSteps = steps.filter(s => s.duration > slowThreshold);
|
|
54
241
|
if (slowSteps.length > 0) {
|
|
55
|
-
//
|
|
242
|
+
// Find the slowest step
|
|
56
243
|
const slowest = slowSteps.reduce((a, b) => (a.duration > b.duration ? a : b));
|
|
57
244
|
const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);
|
|
58
245
|
const ratio = slowest.duration / totalDuration;
|
|
246
|
+
// Add contributing factors
|
|
247
|
+
result.contributingFactors = slowSteps.map(s => ({
|
|
248
|
+
step: s.name,
|
|
249
|
+
duration: s.duration,
|
|
250
|
+
service: s.service
|
|
251
|
+
}));
|
|
59
252
|
// Confidence scales with how much the step dominates total time
|
|
60
|
-
let confidence = 50;
|
|
253
|
+
let confidence = 50;
|
|
61
254
|
if (ratio > 0.8)
|
|
62
255
|
confidence = 95;
|
|
63
256
|
else if (ratio > 0.6)
|
|
@@ -66,12 +259,74 @@ export function detectRootCause(steps, statusCode, config) {
|
|
|
66
259
|
confidence = 70;
|
|
67
260
|
else if (ratio > 0.2)
|
|
68
261
|
confidence = 60;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
262
|
+
result.cause = `Slow ${getServiceLabel(slowest.service)} query: ${slowest.name} (${Math.round(slowest.duration)}ms)`;
|
|
263
|
+
result.step = slowest.name;
|
|
264
|
+
result.service = slowest.service;
|
|
265
|
+
result.confidence = confidence;
|
|
266
|
+
// Generate suggestions based on service type
|
|
267
|
+
if (slowest.service === 'mongo') {
|
|
268
|
+
result.suggestions = [
|
|
269
|
+
`Add index to improve MongoDB query: ${slowest.name}`,
|
|
270
|
+
'Review query with MongoDB profiler',
|
|
271
|
+
'Consider covering indexes for frequently queried fields',
|
|
272
|
+
'Use projection to limit returned fields',
|
|
273
|
+
'Check for collection scans (COLLSCAN) in explain plan'
|
|
274
|
+
];
|
|
275
|
+
}
|
|
276
|
+
else if (slowest.service === 'mysql' || slowest.service === 'postgres') {
|
|
277
|
+
result.suggestions = [
|
|
278
|
+
`Add index to improve SQL query: ${slowest.name}`,
|
|
279
|
+
'Run EXPLAIN ANALYZE on the query',
|
|
280
|
+
'Check for full table scans',
|
|
281
|
+
'Consider query optimization or denormalization',
|
|
282
|
+
'Review connection pool configuration'
|
|
283
|
+
];
|
|
284
|
+
}
|
|
285
|
+
else if (slowest.service === 'redis') {
|
|
286
|
+
result.suggestions = [
|
|
287
|
+
`Optimize Redis operation: ${slowest.name}`,
|
|
288
|
+
'Check Redis memory usage and eviction policy',
|
|
289
|
+
'Use pipelining for multiple operations',
|
|
290
|
+
'Consider using Redis clusters for high load',
|
|
291
|
+
'Review key expiration policies'
|
|
292
|
+
];
|
|
293
|
+
}
|
|
294
|
+
else if (slowest.service === 'axios' || slowest.service === 'fetch') {
|
|
295
|
+
result.suggestions = [
|
|
296
|
+
`Optimize HTTP request: ${slowest.name}`,
|
|
297
|
+
'Add timeout configuration',
|
|
298
|
+
'Implement request caching',
|
|
299
|
+
'Use connection pooling',
|
|
300
|
+
'Check external API response times'
|
|
301
|
+
];
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
result.suggestions = [
|
|
305
|
+
`Optimize slow operation: ${slowest.name}`,
|
|
306
|
+
'Profile the code to identify bottlenecks',
|
|
307
|
+
'Consider caching results',
|
|
308
|
+
'Review algorithm complexity',
|
|
309
|
+
'Add performance monitoring'
|
|
310
|
+
];
|
|
311
|
+
}
|
|
312
|
+
return result;
|
|
313
|
+
}
|
|
314
|
+
// ✅ 6. PERFORMANCE DEGRADATION DETECTION (no specific slow step but overall slow)
|
|
315
|
+
const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);
|
|
316
|
+
const avgDuration = totalDuration / steps.length;
|
|
317
|
+
if (avgDuration > slowThreshold * 0.8) {
|
|
318
|
+
result.cause = `Overall performance degradation (avg: ${Math.round(avgDuration)}ms per step)`;
|
|
319
|
+
result.step = 'Multiple steps';
|
|
320
|
+
result.service = 'internal';
|
|
321
|
+
result.confidence = 60;
|
|
322
|
+
result.suggestions = [
|
|
323
|
+
'Review overall request flow',
|
|
324
|
+
'Check server resource utilization (CPU, memory)',
|
|
325
|
+
'Monitor database connection pool',
|
|
326
|
+
'Consider horizontal scaling',
|
|
327
|
+
'Implement caching strategy'
|
|
328
|
+
];
|
|
329
|
+
return result;
|
|
75
330
|
}
|
|
76
331
|
return null;
|
|
77
332
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RootCause.js","sourceRoot":"","sources":["../../../src/core/RootCause.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,uCAAuC;AACvC,kEAAkE;AAClE,gEAAgE;
|
|
1
|
+
{"version":3,"file":"RootCause.js","sourceRoot":"","sources":["../../../src/core/RootCause.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,9 +25,14 @@ const CYAN = '\x1b[36m';
|
|
|
25
25
|
* │ [0ms] Request start
|
|
26
26
|
* │ [2ms] DB find user ✔ (14ms) [mongo]
|
|
27
27
|
* │ [16ms] Redis cache ❌ (3ms) [redis]
|
|
28
|
+
* │ └─ Connection refused
|
|
28
29
|
* │ [20ms] Response 200
|
|
29
30
|
* │
|
|
30
|
-
* │
|
|
31
|
+
* │ 🔍 Root cause: Redis cache failed: connection refused
|
|
32
|
+
* │ Service: redis | Confidence: 95%
|
|
33
|
+
* │ 💡 Suggestions:
|
|
34
|
+
* │ 1. Check if Redis service is running
|
|
35
|
+
* │ 2. Verify connection string and port
|
|
31
36
|
* │ Classification: ERROR
|
|
32
37
|
* │ Total: 20ms
|
|
33
38
|
* └────────────────────────────────────────────────────
|
|
@@ -37,6 +42,10 @@ export function renderTimeline(trace, logger = console.log) {
|
|
|
37
42
|
const divider = '─'.repeat(50);
|
|
38
43
|
lines.push('');
|
|
39
44
|
lines.push(`${CYAN}┌─── flow-debugger ── ${trace.traceId} ── ${trace.method} ${trace.endpoint} ───${RESET}`);
|
|
45
|
+
// Status line with emoji
|
|
46
|
+
const statusIcon = trace.classification === 'ERROR' || trace.classification === 'CRITICAL' ? '🔴' :
|
|
47
|
+
trace.classification === 'WARN' ? '🟡' : '🟢';
|
|
48
|
+
lines.push(`${DIM}│ ${statusIcon} Status: ${trace.statusCode || '—'} | Duration: ${Math.round(trace.totalDuration)}ms | Classification: ${trace.classification}${RESET}`);
|
|
40
49
|
lines.push(`${DIM}│ [0ms] Request start${RESET}`);
|
|
41
50
|
for (const step of trace.steps) {
|
|
42
51
|
const offset = Math.round(step.startTime);
|
|
@@ -47,8 +56,34 @@ export function renderTimeline(trace, logger = console.log) {
|
|
|
47
56
|
const line = `│ [${offset}ms]${' '.repeat(Math.max(1, 5 - String(offset).length))}` +
|
|
48
57
|
`${levelColor}${step.name} ${icon} (${dur}ms)${RESET}${serviceTag}`;
|
|
49
58
|
lines.push(line);
|
|
59
|
+
// ✅ Enhanced error display with full details
|
|
50
60
|
if (step.error) {
|
|
51
61
|
lines.push(`│ ${DIM}└─ ${step.error}${RESET}`);
|
|
62
|
+
// Show error stack trace (first line only)
|
|
63
|
+
if (step.stackTrace) {
|
|
64
|
+
const stackLine = step.stackTrace.split('\n')[1]?.trim();
|
|
65
|
+
if (stackLine) {
|
|
66
|
+
lines.push(`│ ${DIM} at ${stackLine}${RESET}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Show error details from metadata
|
|
70
|
+
const errorDetails = step.metadata?.errorDetails;
|
|
71
|
+
if (errorDetails) {
|
|
72
|
+
if (errorDetails.code) {
|
|
73
|
+
lines.push(`│ ${DIM} Code: ${errorDetails.code}${RESET}`);
|
|
74
|
+
}
|
|
75
|
+
if (errorDetails.type) {
|
|
76
|
+
lines.push(`│ ${DIM} Type: ${errorDetails.type}${RESET}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// ✅ Show response body preview
|
|
81
|
+
if (step.name === 'Response Body' && step.metadata?.body) {
|
|
82
|
+
const bodyPreview = JSON.stringify(step.metadata.body).substring(0, 150);
|
|
83
|
+
lines.push(`│ ${LEVEL_COLORS.INFO}└─ Body: ${bodyPreview}...${RESET}`);
|
|
84
|
+
if (step.metadata.size) {
|
|
85
|
+
lines.push(`│ ${DIM} Size: ${step.metadata.size} bytes${RESET}`);
|
|
86
|
+
}
|
|
52
87
|
}
|
|
53
88
|
// Slow query warning
|
|
54
89
|
if (step.classification === 'WARN' && step.duration > 300) {
|
|
@@ -58,8 +93,26 @@ export function renderTimeline(trace, logger = console.log) {
|
|
|
58
93
|
// Response line
|
|
59
94
|
lines.push(`${DIM}│ [${Math.round(trace.totalDuration)}ms]${' '.repeat(Math.max(1, 5 - String(Math.round(trace.totalDuration)).length))}Response ${trace.statusCode || '—'}${RESET}`);
|
|
60
95
|
lines.push('│');
|
|
61
|
-
// Root cause
|
|
62
|
-
if (trace.rootCause) {
|
|
96
|
+
// ✅ Enhanced Root cause with suggestions
|
|
97
|
+
if (trace.rootCause && 'suggestions' in trace.rootCause) {
|
|
98
|
+
const enhancedRc = trace.rootCause;
|
|
99
|
+
const rcColor = LEVEL_COLORS.ERROR;
|
|
100
|
+
lines.push(`${rcColor}│ 🔍 Root cause: ${enhancedRc.cause}${RESET}`);
|
|
101
|
+
lines.push(`${DIM}│ Service: ${enhancedRc.service} | Confidence: ${enhancedRc.confidence}%${RESET}`);
|
|
102
|
+
if (enhancedRc.suggestions && enhancedRc.suggestions.length > 0) {
|
|
103
|
+
lines.push(`${DIM}│ 💡 Suggestions:${RESET}`);
|
|
104
|
+
enhancedRc.suggestions.forEach((s, i) => {
|
|
105
|
+
lines.push(`${DIM}│ ${i + 1}. ${s}${RESET}`);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (enhancedRc.contributingFactors && enhancedRc.contributingFactors.length > 0) {
|
|
109
|
+
lines.push(`${DIM}│ Contributing factors:${RESET}`);
|
|
110
|
+
enhancedRc.contributingFactors.forEach((f) => {
|
|
111
|
+
lines.push(`${DIM}│ - ${f.step} (${f.duration}ms) [${f.service}]${RESET}`);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (trace.rootCause) {
|
|
63
116
|
const rcColor = LEVEL_COLORS.ERROR;
|
|
64
117
|
lines.push(`${rcColor}│ 🔍 Root cause: ${trace.rootCause.cause}${RESET}`);
|
|
65
118
|
lines.push(`${DIM}│ Service: ${trace.rootCause.service} | Confidence: ${trace.rootCause.confidence}%${RESET}`);
|