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.
- package/ENHANCED_OBSERVABILITY.md +835 -0
- package/IMPLEMENTATION_SUMMARY.md +466 -0
- package/README.md +147 -8
- package/bin/cli.js +1 -1
- package/dist/cjs/core/Alerting.js +310 -0
- package/dist/cjs/core/Alerting.js.map +1 -0
- package/dist/cjs/core/AnomalyDetection.js +223 -0
- package/dist/cjs/core/AnomalyDetection.js.map +1 -0
- package/dist/cjs/core/DependencyGraph.js +251 -0
- package/dist/cjs/core/DependencyGraph.js.map +1 -0
- package/dist/cjs/core/DistributedTracing.js +245 -0
- package/dist/cjs/core/DistributedTracing.js.map +1 -0
- package/dist/cjs/core/ErrorClustering.js +257 -0
- package/dist/cjs/core/ErrorClustering.js.map +1 -0
- package/dist/cjs/core/LogCorrelation.js +242 -0
- package/dist/cjs/core/LogCorrelation.js.map +1 -0
- package/dist/cjs/core/Metrics.js +301 -0
- package/dist/cjs/core/Metrics.js.map +1 -0
- package/dist/cjs/core/RootCause.js +107 -9
- package/dist/cjs/core/RootCause.js.map +1 -1
- package/dist/cjs/core/TrendAnalysis.js +254 -0
- package/dist/cjs/core/TrendAnalysis.js.map +1 -0
- package/dist/cjs/core/types.js +14 -0
- package/dist/cjs/core/types.js.map +1 -1
- package/dist/cjs/index.js +27 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/middleware/express.js +105 -4
- package/dist/cjs/middleware/express.js.map +1 -1
- package/dist/esm/core/Alerting.js +305 -0
- package/dist/esm/core/Alerting.js.map +1 -0
- package/dist/esm/core/AnomalyDetection.js +218 -0
- package/dist/esm/core/AnomalyDetection.js.map +1 -0
- package/dist/esm/core/DependencyGraph.js +246 -0
- package/dist/esm/core/DependencyGraph.js.map +1 -0
- package/dist/esm/core/DistributedTracing.js +240 -0
- package/dist/esm/core/DistributedTracing.js.map +1 -0
- package/dist/esm/core/ErrorClustering.js +252 -0
- package/dist/esm/core/ErrorClustering.js.map +1 -0
- package/dist/esm/core/LogCorrelation.js +236 -0
- package/dist/esm/core/LogCorrelation.js.map +1 -0
- package/dist/esm/core/Metrics.js +297 -0
- package/dist/esm/core/Metrics.js.map +1 -0
- package/dist/esm/core/RootCause.js +107 -9
- package/dist/esm/core/RootCause.js.map +1 -1
- package/dist/esm/core/TrendAnalysis.js +250 -0
- package/dist/esm/core/TrendAnalysis.js.map +1 -0
- package/dist/esm/core/types.js +14 -0
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/middleware/express.js +105 -4
- package/dist/esm/middleware/express.js.map +1 -1
- package/dist/types/core/Alerting.d.ts +82 -0
- package/dist/types/core/Alerting.d.ts.map +1 -0
- package/dist/types/core/AnomalyDetection.d.ts +93 -0
- package/dist/types/core/AnomalyDetection.d.ts.map +1 -0
- package/dist/types/core/DependencyGraph.d.ts +65 -0
- package/dist/types/core/DependencyGraph.d.ts.map +1 -0
- package/dist/types/core/DistributedTracing.d.ts +92 -0
- package/dist/types/core/DistributedTracing.d.ts.map +1 -0
- package/dist/types/core/ErrorClustering.d.ts +70 -0
- package/dist/types/core/ErrorClustering.d.ts.map +1 -0
- package/dist/types/core/LogCorrelation.d.ts +73 -0
- package/dist/types/core/LogCorrelation.d.ts.map +1 -0
- package/dist/types/core/Metrics.d.ts +73 -0
- package/dist/types/core/Metrics.d.ts.map +1 -0
- package/dist/types/core/RootCause.d.ts +9 -5
- package/dist/types/core/RootCause.d.ts.map +1 -1
- package/dist/types/core/TrendAnalysis.d.ts +63 -0
- package/dist/types/core/TrendAnalysis.d.ts.map +1 -0
- package/dist/types/core/types.d.ts +200 -0
- package/dist/types/core/types.d.ts.map +1 -1
- package/dist/types/index.d.ts +9 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/middleware/express.d.ts +12 -0
- package/dist/types/middleware/express.d.ts.map +1 -1
- package/package.json +3 -3
- package/test-results.json +1 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ─────────────────────────────────────────────────────────────
|
|
3
|
+
// flow-debugger — Metrics & Gauges System
|
|
4
|
+
// Custom metrics for business and performance tracking
|
|
5
|
+
// ─────────────────────────────────────────────────────────────
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.globalMetrics = exports.MetricsRegistry = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Metrics Registry - Central storage for all metrics
|
|
10
|
+
*/
|
|
11
|
+
class MetricsRegistry {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.metrics = new Map();
|
|
14
|
+
this.timeSeries = new Map();
|
|
15
|
+
this.maxTimeSeriesPoints = 1000;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create or get a counter metric
|
|
19
|
+
*/
|
|
20
|
+
counter(name, description, labels) {
|
|
21
|
+
const key = this.makeKey(name, labels);
|
|
22
|
+
const existing = this.metrics.get(key);
|
|
23
|
+
if (existing)
|
|
24
|
+
return existing;
|
|
25
|
+
const metric = {
|
|
26
|
+
name,
|
|
27
|
+
type: 'counter',
|
|
28
|
+
description,
|
|
29
|
+
labels,
|
|
30
|
+
value: 0,
|
|
31
|
+
createdAt: Date.now(),
|
|
32
|
+
updatedAt: Date.now(),
|
|
33
|
+
};
|
|
34
|
+
this.metrics.set(key, metric);
|
|
35
|
+
return metric;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create or get a gauge metric
|
|
39
|
+
*/
|
|
40
|
+
gauge(name, description, labels) {
|
|
41
|
+
const key = this.makeKey(name, labels);
|
|
42
|
+
const existing = this.metrics.get(key);
|
|
43
|
+
if (existing)
|
|
44
|
+
return existing;
|
|
45
|
+
const metric = {
|
|
46
|
+
name,
|
|
47
|
+
type: 'gauge',
|
|
48
|
+
description,
|
|
49
|
+
labels,
|
|
50
|
+
value: 0,
|
|
51
|
+
createdAt: Date.now(),
|
|
52
|
+
updatedAt: Date.now(),
|
|
53
|
+
};
|
|
54
|
+
this.metrics.set(key, metric);
|
|
55
|
+
return metric;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create or get a histogram metric
|
|
59
|
+
*/
|
|
60
|
+
histogram(name, buckets = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10], description, labels) {
|
|
61
|
+
const key = this.makeKey(name, labels);
|
|
62
|
+
const existing = this.metrics.get(key);
|
|
63
|
+
if (existing)
|
|
64
|
+
return existing;
|
|
65
|
+
const metric = {
|
|
66
|
+
name,
|
|
67
|
+
type: 'histogram',
|
|
68
|
+
description,
|
|
69
|
+
labels,
|
|
70
|
+
buckets: buckets.map(b => ({ upperBound: b, count: 0 })),
|
|
71
|
+
sum: 0,
|
|
72
|
+
count: 0,
|
|
73
|
+
createdAt: Date.now(),
|
|
74
|
+
updatedAt: Date.now(),
|
|
75
|
+
};
|
|
76
|
+
this.metrics.set(key, metric);
|
|
77
|
+
return metric;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create or get a summary metric
|
|
81
|
+
*/
|
|
82
|
+
summary(name, quantiles = [0.5, 0.9, 0.95, 0.99], description, labels) {
|
|
83
|
+
const key = this.makeKey(name, labels);
|
|
84
|
+
const existing = this.metrics.get(key);
|
|
85
|
+
if (existing)
|
|
86
|
+
return existing;
|
|
87
|
+
const metric = {
|
|
88
|
+
name,
|
|
89
|
+
type: 'summary',
|
|
90
|
+
description,
|
|
91
|
+
labels,
|
|
92
|
+
quantiles: quantiles.map(q => ({ quantile: q, value: 0 })),
|
|
93
|
+
sum: 0,
|
|
94
|
+
count: 0,
|
|
95
|
+
createdAt: Date.now(),
|
|
96
|
+
updatedAt: Date.now(),
|
|
97
|
+
};
|
|
98
|
+
this.metrics.set(key, metric);
|
|
99
|
+
return metric;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Increment a counter
|
|
103
|
+
*/
|
|
104
|
+
inc(name, value = 1, labels) {
|
|
105
|
+
const key = this.makeKey(name, labels);
|
|
106
|
+
const metric = this.metrics.get(key);
|
|
107
|
+
if (metric && metric.type === 'counter') {
|
|
108
|
+
metric.value += value;
|
|
109
|
+
metric.updatedAt = Date.now();
|
|
110
|
+
this.recordTimeSeries(name, metric.value, labels);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Set a gauge value
|
|
115
|
+
*/
|
|
116
|
+
set(name, value, labels) {
|
|
117
|
+
const key = this.makeKey(name, labels);
|
|
118
|
+
const metric = this.metrics.get(key);
|
|
119
|
+
if (metric && metric.type === 'gauge') {
|
|
120
|
+
metric.value = value;
|
|
121
|
+
metric.min = metric.min === undefined ? value : Math.min(metric.min, value);
|
|
122
|
+
metric.max = metric.max === undefined ? value : Math.max(metric.max, value);
|
|
123
|
+
metric.updatedAt = Date.now();
|
|
124
|
+
this.recordTimeSeries(name, value, labels);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Observe a value for histogram/summary
|
|
129
|
+
*/
|
|
130
|
+
observe(name, value, labels) {
|
|
131
|
+
const key = this.makeKey(name, labels);
|
|
132
|
+
const metric = this.metrics.get(key);
|
|
133
|
+
if (!metric)
|
|
134
|
+
return;
|
|
135
|
+
metric.updatedAt = Date.now();
|
|
136
|
+
if (metric.type === 'histogram') {
|
|
137
|
+
const h = metric;
|
|
138
|
+
h.count++;
|
|
139
|
+
h.sum += value;
|
|
140
|
+
h.buckets.forEach(bucket => {
|
|
141
|
+
if (value <= bucket.upperBound) {
|
|
142
|
+
bucket.count++;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else if (metric.type === 'summary') {
|
|
147
|
+
const s = metric;
|
|
148
|
+
s.count++;
|
|
149
|
+
s.sum += value;
|
|
150
|
+
// Update quantiles (simplified - uses reservoir sampling)
|
|
151
|
+
this.updateQuantiles(s, value);
|
|
152
|
+
}
|
|
153
|
+
this.recordTimeSeries(name, value, labels);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get metric by name
|
|
157
|
+
*/
|
|
158
|
+
get(name, labels) {
|
|
159
|
+
const key = this.makeKey(name, labels);
|
|
160
|
+
return this.metrics.get(key);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get all metrics
|
|
164
|
+
*/
|
|
165
|
+
getAll() {
|
|
166
|
+
return Array.from(this.metrics.values());
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get metrics by type
|
|
170
|
+
*/
|
|
171
|
+
getByType(type) {
|
|
172
|
+
return Array.from(this.metrics.values()).filter(m => m.type === type);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Reset a metric
|
|
176
|
+
*/
|
|
177
|
+
reset(name, labels) {
|
|
178
|
+
const key = this.makeKey(name, labels);
|
|
179
|
+
const metric = this.metrics.get(key);
|
|
180
|
+
if (!metric)
|
|
181
|
+
return;
|
|
182
|
+
if (metric.type === 'counter') {
|
|
183
|
+
const c = metric;
|
|
184
|
+
c.value = 0;
|
|
185
|
+
}
|
|
186
|
+
else if (metric.type === 'gauge') {
|
|
187
|
+
const g = metric;
|
|
188
|
+
g.value = 0;
|
|
189
|
+
g.min = undefined;
|
|
190
|
+
g.max = undefined;
|
|
191
|
+
}
|
|
192
|
+
else if (metric.type === 'histogram') {
|
|
193
|
+
const h = metric;
|
|
194
|
+
h.buckets.forEach((b) => (b.count = 0));
|
|
195
|
+
h.sum = 0;
|
|
196
|
+
h.count = 0;
|
|
197
|
+
}
|
|
198
|
+
else if (metric.type === 'summary') {
|
|
199
|
+
const s = metric;
|
|
200
|
+
s.quantiles.forEach((q) => (q.value = 0));
|
|
201
|
+
s.sum = 0;
|
|
202
|
+
s.count = 0;
|
|
203
|
+
}
|
|
204
|
+
metric.updatedAt = Date.now();
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Clear all metrics
|
|
208
|
+
*/
|
|
209
|
+
clear() {
|
|
210
|
+
this.metrics.clear();
|
|
211
|
+
this.timeSeries.clear();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get time series data for a metric
|
|
215
|
+
*/
|
|
216
|
+
getTimeSeries(name, labels) {
|
|
217
|
+
const key = this.makeKey(name, labels);
|
|
218
|
+
return this.timeSeries.get(key) || [];
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Export metrics in Prometheus format
|
|
222
|
+
*/
|
|
223
|
+
exportPrometheus() {
|
|
224
|
+
const lines = [];
|
|
225
|
+
this.metrics.forEach(metric => {
|
|
226
|
+
const labelStr = metric.labels
|
|
227
|
+
? `{${Object.entries(metric.labels).map(([k, v]) => `${k}="${v}"`).join(', ')}}`
|
|
228
|
+
: '';
|
|
229
|
+
if (metric.type === 'counter') {
|
|
230
|
+
const c = metric;
|
|
231
|
+
lines.push(`# HELP ${metric.name} ${metric.description || ''}`);
|
|
232
|
+
lines.push(`# TYPE ${metric.name} counter`);
|
|
233
|
+
lines.push(`${metric.name}${labelStr} ${c.value}`);
|
|
234
|
+
}
|
|
235
|
+
else if (metric.type === 'gauge') {
|
|
236
|
+
const g = metric;
|
|
237
|
+
lines.push(`# HELP ${metric.name} ${metric.description || ''}`);
|
|
238
|
+
lines.push(`# TYPE ${metric.name} gauge`);
|
|
239
|
+
lines.push(`${metric.name}${labelStr} ${g.value}`);
|
|
240
|
+
}
|
|
241
|
+
else if (metric.type === 'histogram') {
|
|
242
|
+
const h = metric;
|
|
243
|
+
lines.push(`# HELP ${metric.name}_bucket ${metric.description || ''}`);
|
|
244
|
+
lines.push(`# TYPE ${metric.name}_bucket histogram`);
|
|
245
|
+
h.buckets.forEach(bucket => {
|
|
246
|
+
lines.push(`${metric.name}_bucket${labelStr}{le="${bucket.upperBound}"} ${bucket.count}`);
|
|
247
|
+
});
|
|
248
|
+
lines.push(`${metric.name}_bucket${labelStr}{le="+Inf"} ${h.count}`);
|
|
249
|
+
lines.push(`# HELP ${metric.name}_sum ${metric.description || ''}`);
|
|
250
|
+
lines.push(`# TYPE ${metric.name}_sum summary`);
|
|
251
|
+
lines.push(`${metric.name}_sum${labelStr} ${h.sum}`);
|
|
252
|
+
lines.push(`# HELP ${metric.name}_count ${metric.description || ''}`);
|
|
253
|
+
lines.push(`# TYPE ${metric.name}_count summary`);
|
|
254
|
+
lines.push(`${metric.name}_count${labelStr} ${h.count}`);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
return lines.join('\n');
|
|
258
|
+
}
|
|
259
|
+
makeKey(name, labels) {
|
|
260
|
+
if (!labels)
|
|
261
|
+
return name;
|
|
262
|
+
const labelStr = Object.entries(labels)
|
|
263
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
264
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
265
|
+
.join('|');
|
|
266
|
+
return `${name}|${labelStr}`;
|
|
267
|
+
}
|
|
268
|
+
recordTimeSeries(name, value, labels) {
|
|
269
|
+
const key = this.makeKey(name, labels);
|
|
270
|
+
let series = this.timeSeries.get(key);
|
|
271
|
+
if (!series) {
|
|
272
|
+
series = [];
|
|
273
|
+
this.timeSeries.set(key, series);
|
|
274
|
+
}
|
|
275
|
+
series.push({
|
|
276
|
+
timestamp: new Date(),
|
|
277
|
+
value,
|
|
278
|
+
labels,
|
|
279
|
+
});
|
|
280
|
+
// Limit time series points
|
|
281
|
+
if (series.length > this.maxTimeSeriesPoints) {
|
|
282
|
+
series.shift();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
updateQuantiles(metric, value) {
|
|
286
|
+
// Simplified quantile estimation using sorted array
|
|
287
|
+
const values = metric.quantiles.map(q => q.value);
|
|
288
|
+
values.push(value);
|
|
289
|
+
values.sort((a, b) => a - b);
|
|
290
|
+
metric.quantiles.forEach((q, i) => {
|
|
291
|
+
const index = Math.floor(q.quantile * (values.length - 1));
|
|
292
|
+
q.value = values[index] || 0;
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
exports.MetricsRegistry = MetricsRegistry;
|
|
297
|
+
/**
|
|
298
|
+
* Global metrics registry instance
|
|
299
|
+
*/
|
|
300
|
+
exports.globalMetrics = new MetricsRegistry();
|
|
301
|
+
//# 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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"}
|
|
@@ -2,17 +2,22 @@
|
|
|
2
2
|
// ─────────────────────────────────────────────────────────────
|
|
3
3
|
// flow-debugger — Root Cause Detection
|
|
4
4
|
// Analyzes trace steps to identify the most likely failure origin
|
|
5
|
+
// INCLUDING SILENT FAILURES (no console error)
|
|
5
6
|
// ─────────────────────────────────────────────────────────────
|
|
6
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
8
|
exports.detectRootCause = detectRootCause;
|
|
8
9
|
/**
|
|
9
10
|
* Enhanced root cause detection with suggestions and detailed analysis.
|
|
10
11
|
*
|
|
11
|
-
*
|
|
12
|
-
* 1.
|
|
13
|
-
* 2.
|
|
14
|
-
* 3.
|
|
15
|
-
* 4.
|
|
12
|
+
* DETECTS:
|
|
13
|
+
* 1. Error patterns (timeout, connection, validation, etc.)
|
|
14
|
+
* 2. Slow queries and bottlenecks
|
|
15
|
+
* 3. Memory/performance issues
|
|
16
|
+
* 4. SILENT FAILURES (no console error but status codes indicate problems)
|
|
17
|
+
* 5. Empty/null database results without errors
|
|
18
|
+
* 6. Performance degradation trends
|
|
19
|
+
*
|
|
20
|
+
* Provides actionable suggestions for each issue type.
|
|
16
21
|
*/
|
|
17
22
|
function detectRootCause(steps, statusCode, config) {
|
|
18
23
|
if (steps.length === 0)
|
|
@@ -27,7 +32,83 @@ function detectRootCause(steps, statusCode, config) {
|
|
|
27
32
|
suggestions: [],
|
|
28
33
|
contributingFactors: []
|
|
29
34
|
};
|
|
30
|
-
// 1.
|
|
35
|
+
// ✅ 1. SILENT FAILURE DETECTION - No console error but status indicates problem
|
|
36
|
+
if (statusCode && statusCode >= 400 && statusCode < 500) {
|
|
37
|
+
// Client errors - might not throw but indicate problems
|
|
38
|
+
if (statusCode === 404) {
|
|
39
|
+
result.cause = 'Resource not found (silent failure - no exception thrown)';
|
|
40
|
+
result.step = 'Request handling';
|
|
41
|
+
result.service = 'internal';
|
|
42
|
+
result.confidence = 90;
|
|
43
|
+
result.suggestions = [
|
|
44
|
+
'Check if the requested resource exists',
|
|
45
|
+
'Verify route parameters and IDs',
|
|
46
|
+
'Review database for missing records',
|
|
47
|
+
'Check if file/blob exists before accessing'
|
|
48
|
+
];
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
52
|
+
result.cause = 'Authentication/Authorization failed (silent rejection)';
|
|
53
|
+
result.step = 'Auth middleware';
|
|
54
|
+
result.service = 'internal';
|
|
55
|
+
result.confidence = 95;
|
|
56
|
+
result.suggestions = [
|
|
57
|
+
'Verify user token/credentials',
|
|
58
|
+
'Check session expiration',
|
|
59
|
+
'Review permission/role configuration',
|
|
60
|
+
'Ensure CORS policy allows the request'
|
|
61
|
+
];
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
if (statusCode === 429) {
|
|
65
|
+
result.cause = 'Rate limit exceeded (throttled silently)';
|
|
66
|
+
result.step = 'Rate limiter';
|
|
67
|
+
result.service = 'internal';
|
|
68
|
+
result.confidence = 100;
|
|
69
|
+
result.suggestions = [
|
|
70
|
+
'Implement request throttling on client',
|
|
71
|
+
'Add exponential backoff',
|
|
72
|
+
'Cache frequently accessed data',
|
|
73
|
+
'Consider upgrading API plan'
|
|
74
|
+
];
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ✅ 2. SILENT DATABASE ISSUES - Returns empty/null without error
|
|
79
|
+
const dbSteps = steps.filter(s => ['mongo', 'mysql', 'postgres', 'redis'].includes(s.service));
|
|
80
|
+
for (const dbStep of dbSteps) {
|
|
81
|
+
const metadata = dbStep.metadata;
|
|
82
|
+
// Check for empty results (might indicate problem)
|
|
83
|
+
if (metadata?.resultCount === 0 && dbStep.name.toLowerCase().includes('find')) {
|
|
84
|
+
result.cause = 'Database query returned empty result (no error thrown)';
|
|
85
|
+
result.step = dbStep.name;
|
|
86
|
+
result.service = dbStep.service;
|
|
87
|
+
result.confidence = 70;
|
|
88
|
+
result.suggestions = [
|
|
89
|
+
'Verify query conditions are correct',
|
|
90
|
+
'Check if data exists in database',
|
|
91
|
+
'Review filter/criteria logic',
|
|
92
|
+
'Consider if empty result is expected behavior'
|
|
93
|
+
];
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
// Check for null/undefined returns
|
|
97
|
+
if (metadata?.result === null || metadata?.result === undefined) {
|
|
98
|
+
result.cause = 'Database operation returned null (silent failure)';
|
|
99
|
+
result.step = dbStep.name;
|
|
100
|
+
result.service = dbStep.service;
|
|
101
|
+
result.confidence = 75;
|
|
102
|
+
result.suggestions = [
|
|
103
|
+
'Check if document/record exists',
|
|
104
|
+
'Verify query syntax and collection name',
|
|
105
|
+
'Review connection pool status',
|
|
106
|
+
'Check database logs for warnings'
|
|
107
|
+
];
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// 3. Look for timed-out steps (highest priority)
|
|
31
112
|
const timedOut = steps.find(s => s.status === 'timeout');
|
|
32
113
|
if (timedOut) {
|
|
33
114
|
result.cause = `${timedOut.name} timed out`;
|
|
@@ -36,13 +117,13 @@ function detectRootCause(steps, statusCode, config) {
|
|
|
36
117
|
result.confidence = 100;
|
|
37
118
|
result.suggestions = [
|
|
38
119
|
`Increase timeout for ${getServiceLabel(timedOut.service)} operations`,
|
|
39
|
-
|
|
120
|
+
'Check service health and load',
|
|
40
121
|
'Add retry logic with exponential backoff',
|
|
41
122
|
'Consider implementing circuit breaker pattern'
|
|
42
123
|
];
|
|
43
124
|
return result;
|
|
44
125
|
}
|
|
45
|
-
//
|
|
126
|
+
// 4. Analyze failed steps with detailed error detection
|
|
46
127
|
const failedSteps = steps.filter(s => s.status === 'error');
|
|
47
128
|
if (failedSteps.length > 0) {
|
|
48
129
|
const firstFailed = failedSteps[0];
|
|
@@ -158,7 +239,7 @@ function detectRootCause(steps, statusCode, config) {
|
|
|
158
239
|
];
|
|
159
240
|
return result;
|
|
160
241
|
}
|
|
161
|
-
//
|
|
242
|
+
// 5. Analyze slow requests (performance degradation)
|
|
162
243
|
const slowSteps = steps.filter(s => s.duration > slowThreshold);
|
|
163
244
|
if (slowSteps.length > 0) {
|
|
164
245
|
// Find the slowest step
|
|
@@ -233,6 +314,23 @@ function detectRootCause(steps, statusCode, config) {
|
|
|
233
314
|
}
|
|
234
315
|
return result;
|
|
235
316
|
}
|
|
317
|
+
// ✅ 6. PERFORMANCE DEGRADATION DETECTION (no specific slow step but overall slow)
|
|
318
|
+
const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);
|
|
319
|
+
const avgDuration = totalDuration / steps.length;
|
|
320
|
+
if (avgDuration > slowThreshold * 0.8) {
|
|
321
|
+
result.cause = `Overall performance degradation (avg: ${Math.round(avgDuration)}ms per step)`;
|
|
322
|
+
result.step = 'Multiple steps';
|
|
323
|
+
result.service = 'internal';
|
|
324
|
+
result.confidence = 60;
|
|
325
|
+
result.suggestions = [
|
|
326
|
+
'Review overall request flow',
|
|
327
|
+
'Check server resource utilization (CPU, memory)',
|
|
328
|
+
'Monitor database connection pool',
|
|
329
|
+
'Consider horizontal scaling',
|
|
330
|
+
'Implement caching strategy'
|
|
331
|
+
];
|
|
332
|
+
return result;
|
|
333
|
+
}
|
|
236
334
|
return null;
|
|
237
335
|
}
|
|
238
336
|
function getServiceLabel(service) {
|
|
@@ -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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"}
|