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,218 @@
1
+ // ─────────────────────────────────────────────────────────────
2
+ // flow-debugger — Anomaly Detection System
3
+ // Statistical and ML-based anomaly detection for metrics
4
+ // ─────────────────────────────────────────────────────────────
5
+ /**
6
+ * Anomaly Detector - Uses statistical methods to detect anomalies
7
+ */
8
+ export class AnomalyDetector {
9
+ constructor(sensitivity = 2) {
10
+ this.baseline = new Map();
11
+ this.minSamples = 30;
12
+ this.decayFactor = 0.1; // For exponential moving average
13
+ this.sensitivity = sensitivity;
14
+ }
15
+ /**
16
+ * Record a data point for a metric
17
+ */
18
+ record(metric, value, timestamp = new Date()) {
19
+ const stats = this.baseline.get(metric);
20
+ if (!stats) {
21
+ this.baseline.set(metric, {
22
+ count: 1,
23
+ mean: value,
24
+ m2: 0,
25
+ min: value,
26
+ max: value,
27
+ lastUpdated: timestamp,
28
+ values: [value],
29
+ });
30
+ }
31
+ else {
32
+ // Welford's online algorithm for variance
33
+ stats.count++;
34
+ const delta = value - stats.mean;
35
+ stats.mean += delta / stats.count;
36
+ const delta2 = value - stats.mean;
37
+ stats.m2 += delta * delta2;
38
+ stats.min = Math.min(stats.min, value);
39
+ stats.max = Math.max(stats.max, value);
40
+ stats.lastUpdated = timestamp;
41
+ // Keep recent values for percentile calculations
42
+ stats.values.push(value);
43
+ if (stats.values.length > 1000) {
44
+ stats.values.shift();
45
+ }
46
+ // Exponential moving average for recent behavior
47
+ stats.ema = stats.ema ? stats.ema * (1 - this.decayFactor) + value * this.decayFactor : value;
48
+ }
49
+ }
50
+ /**
51
+ * Check if a value is anomalous
52
+ */
53
+ detect(metric, value, timestamp = new Date()) {
54
+ const stats = this.baseline.get(metric);
55
+ if (!stats || stats.count < this.minSamples) {
56
+ // Not enough data for detection
57
+ return null;
58
+ }
59
+ const variance = stats.m2 / (stats.count - 1);
60
+ const stdDev = Math.sqrt(variance);
61
+ if (stdDev === 0) {
62
+ // No variance - any difference is anomalous
63
+ return {
64
+ isAnomaly: value !== stats.mean,
65
+ score: value !== stats.mean ? 1 : 0,
66
+ expectedValue: stats.mean,
67
+ actualValue: value,
68
+ deviation: value !== stats.mean ? Infinity : 0,
69
+ metric,
70
+ timestamp,
71
+ confidence: 50,
72
+ };
73
+ }
74
+ const deviation = Math.abs(value - stats.mean) / stdDev;
75
+ const isAnomaly = deviation > this.sensitivity;
76
+ const score = Math.min(1, deviation / (this.sensitivity * 2));
77
+ // Calculate confidence based on sample size
78
+ const confidence = Math.min(100, (stats.count / this.minSamples) * 100);
79
+ return {
80
+ isAnomaly,
81
+ score,
82
+ expectedValue: stats.mean,
83
+ actualValue: value,
84
+ deviation,
85
+ metric,
86
+ timestamp,
87
+ confidence,
88
+ };
89
+ }
90
+ /**
91
+ * Analyze a trace for anomalies
92
+ */
93
+ analyzeTrace(trace) {
94
+ const results = [];
95
+ // Check total duration
96
+ const durationResult = this.detect('request_duration', trace.totalDuration, trace.timestamp);
97
+ if (durationResult) {
98
+ results.push(durationResult);
99
+ }
100
+ // Check each step duration
101
+ trace.steps.forEach((step, index) => {
102
+ const stepMetric = `step_duration_${step.service}_${step.name.replace(/\s+/g, '_')}`;
103
+ const stepResult = this.detect(stepMetric, step.duration, trace.timestamp);
104
+ if (stepResult && stepResult.isAnomaly) {
105
+ results.push(stepResult);
106
+ }
107
+ });
108
+ return results;
109
+ }
110
+ /**
111
+ * Get baseline statistics for a metric
112
+ */
113
+ getBaseline(metric) {
114
+ return this.baseline.get(metric) || null;
115
+ }
116
+ /**
117
+ * Get all baselines
118
+ */
119
+ getAllBaselines() {
120
+ return new Map(this.baseline);
121
+ }
122
+ /**
123
+ * Reset baseline for a metric
124
+ */
125
+ reset(metric) {
126
+ this.baseline.delete(metric);
127
+ }
128
+ /**
129
+ * Clear all baselines
130
+ */
131
+ clear() {
132
+ this.baseline.clear();
133
+ }
134
+ /**
135
+ * Get percentiles for a metric
136
+ */
137
+ getPercentiles(metric) {
138
+ const stats = this.baseline.get(metric);
139
+ if (!stats || stats.values.length < 10)
140
+ return null;
141
+ const sorted = [...stats.values].sort((a, b) => a - b);
142
+ const length = sorted.length;
143
+ return {
144
+ p50: sorted[Math.floor(length * 0.5)],
145
+ p90: sorted[Math.floor(length * 0.9)],
146
+ p95: sorted[Math.floor(length * 0.95)],
147
+ p99: sorted[Math.floor(length * 0.99)],
148
+ };
149
+ }
150
+ /**
151
+ * Detect seasonal patterns (simplified)
152
+ */
153
+ detectSeasonality(metric, points, periodMs) {
154
+ if (points.length < periodMs * 2)
155
+ return false;
156
+ // Autocorrelation-based seasonality detection
157
+ const values = points.map(p => p.value);
158
+ const mean = values.reduce((a, b) => a + b, 0) / values.length;
159
+ const variance = values.reduce((sum, v) => sum + Math.pow(v - mean, 2), 0) / values.length;
160
+ if (variance === 0)
161
+ return false;
162
+ // Calculate autocorrelation at lag = period
163
+ const lag = Math.min(periodMs, values.length / 2);
164
+ let autocorr = 0;
165
+ for (let i = 0; i < values.length - lag; i++) {
166
+ autocorr += (values[i] - mean) * (values[i + lag] - mean);
167
+ }
168
+ autocorr /= (values.length - lag) * variance;
169
+ // Strong autocorrelation indicates seasonality
170
+ return Math.abs(autocorr) > 0.5;
171
+ }
172
+ }
173
+ /**
174
+ * CUSUM algorithm for change point detection
175
+ */
176
+ export class CUSUMDetector {
177
+ constructor(threshold = 5, drift = 0.5) {
178
+ this.sum = 0;
179
+ this.target = 0;
180
+ this.changePoints = [];
181
+ this.threshold = threshold;
182
+ this.drift = drift;
183
+ }
184
+ /**
185
+ * Process a new value and detect change points
186
+ */
187
+ update(value, timestamp = new Date()) {
188
+ if (this.target === 0) {
189
+ this.target = value;
190
+ return false;
191
+ }
192
+ // Update target with moving average
193
+ this.target = this.target * 0.9 + value * 0.1;
194
+ // CUSUM calculation
195
+ this.sum = Math.max(0, this.sum + (value - this.target) - this.drift);
196
+ if (this.sum > this.threshold) {
197
+ this.changePoints.push({ timestamp, value });
198
+ this.sum = 0;
199
+ return true; // Change point detected
200
+ }
201
+ return false;
202
+ }
203
+ /**
204
+ * Get detected change points
205
+ */
206
+ getChangePoints() {
207
+ return [...this.changePoints];
208
+ }
209
+ /**
210
+ * Reset detector
211
+ */
212
+ reset() {
213
+ this.sum = 0;
214
+ this.target = 0;
215
+ this.changePoints = [];
216
+ }
217
+ }
218
+ //# sourceMappingURL=AnomalyDetection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnomalyDetection.js","sourceRoot":"","sources":["../../../src/core/AnomalyDetection.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,2CAA2C;AAC3C,yDAAyD;AACzD,gEAAgE;AAIhE;;GAEG;AACH,MAAM,OAAO,eAAe;IAMxB,YAAY,cAAsB,CAAC;QAL3B,aAAQ,GAA+B,IAAI,GAAG,EAAE,CAAC;QAExC,eAAU,GAAW,EAAE,CAAC;QACxB,gBAAW,GAAW,GAAG,CAAC,CAAC,iCAAiC;QAGzE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAc,EAAE,KAAa,EAAE,YAAkB,IAAI,IAAI,EAAE;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;gBACtB,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,KAAK;gBACX,EAAE,EAAE,CAAC;gBACL,GAAG,EAAE,KAAK;gBACV,GAAG,EAAE,KAAK;gBACV,WAAW,EAAE,SAAS;gBACtB,MAAM,EAAE,CAAC,KAAK,CAAC;aAClB,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,0CAA0C;YAC1C,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;YACjC,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAClC,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;YAClC,KAAK,CAAC,EAAE,IAAI,KAAK,GAAG,MAAM,CAAC;YAE3B,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;YAE9B,iDAAiD;YACjD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;gBAC7B,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;YAED,iDAAiD;YACjD,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QAClG,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAc,EAAE,KAAa,EAAE,YAAkB,IAAI,IAAI,EAAE;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,gCAAgC;YAChC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACf,4CAA4C;YAC5C,OAAO;gBACH,SAAS,EAAE,KAAK,KAAK,KAAK,CAAC,IAAI;gBAC/B,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,aAAa,EAAE,KAAK,CAAC,IAAI;gBACzB,WAAW,EAAE,KAAK;gBAClB,SAAS,EAAE,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM;gBACN,SAAS;gBACT,UAAU,EAAE,EAAE;aACjB,CAAC;QACN,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACxD,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;QAE9D,4CAA4C;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;QAExE,OAAO;YACH,SAAS;YACT,KAAK;YACL,aAAa,EAAE,KAAK,CAAC,IAAI;YACzB,WAAW,EAAE,KAAK;YAClB,SAAS;YACT,MAAM;YACN,SAAS;YACT,UAAU;SACb,CAAC;IACN,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAY;QACrB,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,uBAAuB;QACvB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7F,IAAI,cAAc,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjC,CAAC;QAED,2BAA2B;QAC3B,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,UAAU,GAAG,iBAAiB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YACrF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC3E,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,eAAe;QACX,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAc;QAChB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAc;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QAEpD,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAE7B,OAAO;YACH,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;YACrC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;YACrC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YACtC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;SACzC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAAc,EAAE,MAAyB,EAAE,QAAgB;QACzE,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAE/C,8CAA8C;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAE3F,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjC,4CAA4C;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,CAAC;QACD,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC;QAE7C,+CAA+C;QAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IACpC,CAAC;CACJ;AAgBD;;GAEG;AACH,MAAM,OAAO,aAAa;IAOtB,YAAY,YAAoB,CAAC,EAAE,QAAgB,GAAG;QAN9C,QAAG,GAAW,CAAC,CAAC;QAChB,WAAM,GAAW,CAAC,CAAC;QAGnB,iBAAY,GAAyC,EAAE,CAAC;QAG5D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAa,EAAE,YAAkB,IAAI,IAAI,EAAE;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;QAE9C,oBAAoB;QACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtE,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;YACb,OAAO,IAAI,CAAC,CAAC,wBAAwB;QACzC,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,eAAe;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IAC3B,CAAC;CACJ"}
@@ -0,0 +1,246 @@
1
+ // ─────────────────────────────────────────────────────────────
2
+ // flow-debugger — Dependency Graph System
3
+ // Maps service dependencies and their health
4
+ // ─────────────────────────────────────────────────────────────
5
+ /**
6
+ * Dependency Graph Manager - Tracks service dependencies and relationships
7
+ */
8
+ export class DependencyGraphManager {
9
+ constructor() {
10
+ this.nodes = new Map();
11
+ this.edges = new Map();
12
+ this.lastUpdated = new Date();
13
+ }
14
+ /**
15
+ * Process a trace and update dependency graph
16
+ */
17
+ processTrace(trace) {
18
+ // Create/update endpoint node
19
+ const endpointId = `${trace.method}:${trace.endpoint}`;
20
+ this.updateNode(endpointId, trace.endpoint, 'internal', {
21
+ avgLatency: trace.totalDuration,
22
+ errorRate: trace.classification === 'ERROR' || trace.classification === 'CRITICAL' ? 1 : 0,
23
+ requestCount: 1,
24
+ });
25
+ // Process each step
26
+ trace.steps.forEach(step => {
27
+ if (step.service !== 'internal') {
28
+ const serviceId = step.service;
29
+ this.updateNode(serviceId, this.getServiceName(step.service), step.service, {
30
+ avgLatency: step.duration,
31
+ errorRate: step.status === 'error' || step.status === 'timeout' ? 1 : 0,
32
+ requestCount: 1,
33
+ });
34
+ // Create/update edge from endpoint to service
35
+ this.updateEdge(endpointId, serviceId, {
36
+ callCount: 1,
37
+ avgLatency: step.duration,
38
+ errorCount: step.status === 'error' || step.status === 'timeout' ? 1 : 0,
39
+ });
40
+ }
41
+ });
42
+ this.lastUpdated = new Date();
43
+ }
44
+ /**
45
+ * Get the complete dependency graph
46
+ */
47
+ getGraph() {
48
+ return {
49
+ nodes: Array.from(this.nodes.values()),
50
+ edges: this.getAllEdges(),
51
+ updatedAt: this.lastUpdated,
52
+ };
53
+ }
54
+ /**
55
+ * Get node by ID
56
+ */
57
+ getNode(id) {
58
+ return this.nodes.get(id);
59
+ }
60
+ /**
61
+ * Get all nodes
62
+ */
63
+ getNodes() {
64
+ return Array.from(this.nodes.values());
65
+ }
66
+ /**
67
+ * Get edges for a node
68
+ */
69
+ getEdges(nodeId) {
70
+ const nodeEdges = this.edges.get(nodeId);
71
+ if (!nodeEdges)
72
+ return [];
73
+ return Array.from(nodeEdges.values());
74
+ }
75
+ /**
76
+ * Get all edges
77
+ */
78
+ getAllEdges() {
79
+ const allEdges = [];
80
+ this.edges.forEach((targetMap, sourceId) => {
81
+ targetMap.forEach(edge => {
82
+ allEdges.push({ ...edge, from: sourceId });
83
+ });
84
+ });
85
+ return allEdges;
86
+ }
87
+ /**
88
+ * Get critical path (highest latency chain)
89
+ */
90
+ getCriticalPath() {
91
+ const edges = this.getAllEdges();
92
+ if (edges.length === 0)
93
+ return null;
94
+ // Find root nodes (no incoming edges)
95
+ const targets = new Set(edges.map(e => e.to));
96
+ const roots = Array.from(this.nodes.keys()).filter(id => !targets.has(id));
97
+ if (roots.length === 0)
98
+ return null;
99
+ // DFS to find longest path
100
+ let maxPath = [];
101
+ let maxLatency = 0;
102
+ const dfs = (nodeId, path, latency) => {
103
+ path.push(nodeId);
104
+ latency += this.nodes.get(nodeId)?.avgLatency || 0;
105
+ const outgoing = this.getEdges(nodeId);
106
+ if (outgoing.length === 0) {
107
+ if (latency > maxLatency) {
108
+ maxLatency = latency;
109
+ maxPath = [...path];
110
+ }
111
+ }
112
+ else {
113
+ outgoing.forEach(edge => {
114
+ dfs(edge.to, path, latency + edge.avgLatency);
115
+ });
116
+ }
117
+ path.pop();
118
+ };
119
+ roots.forEach(root => dfs(root, [], 0));
120
+ return maxPath.length > 0 ? { path: maxPath, totalLatency: maxLatency } : null;
121
+ }
122
+ /**
123
+ * Get unhealthy dependencies
124
+ */
125
+ getUnhealthyDependencies() {
126
+ return Array.from(this.nodes.values()).filter(n => n.status !== 'healthy');
127
+ }
128
+ /**
129
+ * Get top slow dependencies
130
+ */
131
+ getTopSlowDependencies(limit = 10) {
132
+ return Array.from(this.nodes.values())
133
+ .sort((a, b) => b.avgLatency - a.avgLatency)
134
+ .slice(0, limit);
135
+ }
136
+ /**
137
+ * Get top error-prone dependencies
138
+ */
139
+ getTopErrorProneDependencies(limit = 10) {
140
+ return Array.from(this.nodes.values())
141
+ .filter(n => n.requestCount > 0)
142
+ .sort((a, b) => b.errorRate - a.errorRate)
143
+ .slice(0, limit);
144
+ }
145
+ /**
146
+ * Clear graph
147
+ */
148
+ clear() {
149
+ this.nodes.clear();
150
+ this.edges.clear();
151
+ }
152
+ updateNode(id, name, type, delta) {
153
+ const existing = this.nodes.get(id);
154
+ if (!existing) {
155
+ this.nodes.set(id, {
156
+ id,
157
+ name,
158
+ type,
159
+ status: 'healthy',
160
+ avgLatency: delta.avgLatency,
161
+ errorRate: delta.errorRate / delta.requestCount,
162
+ requestCount: delta.requestCount,
163
+ });
164
+ }
165
+ else {
166
+ // Exponential moving average
167
+ const alpha = 0.3;
168
+ existing.avgLatency = existing.avgLatency * (1 - alpha) + delta.avgLatency * alpha;
169
+ existing.requestCount += delta.requestCount;
170
+ const totalErrors = existing.errorRate * (existing.requestCount - delta.requestCount) + delta.errorRate;
171
+ existing.errorRate = totalErrors / existing.requestCount;
172
+ // Update status based on error rate
173
+ existing.status = this.calculateStatus(existing.errorRate);
174
+ }
175
+ }
176
+ updateEdge(from, to, delta) {
177
+ if (!this.edges.has(from)) {
178
+ this.edges.set(from, new Map());
179
+ }
180
+ const targetMap = this.edges.get(from);
181
+ const existing = targetMap.get(to);
182
+ if (!existing) {
183
+ targetMap.set(to, {
184
+ from,
185
+ to,
186
+ callCount: delta.callCount,
187
+ avgLatency: delta.avgLatency,
188
+ errorCount: delta.errorCount,
189
+ });
190
+ }
191
+ else {
192
+ // Exponential moving average
193
+ const alpha = 0.3;
194
+ existing.callCount += delta.callCount;
195
+ existing.avgLatency = existing.avgLatency * (1 - alpha) + delta.avgLatency * alpha;
196
+ existing.errorCount += delta.errorCount;
197
+ }
198
+ }
199
+ calculateStatus(errorRate) {
200
+ if (errorRate >= 0.5)
201
+ return 'down';
202
+ if (errorRate >= 0.1)
203
+ return 'degraded';
204
+ return 'healthy';
205
+ }
206
+ getServiceName(service) {
207
+ const names = {
208
+ mongo: 'MongoDB',
209
+ mysql: 'MySQL',
210
+ postgres: 'PostgreSQL',
211
+ redis: 'Redis',
212
+ axios: 'HTTP Client',
213
+ fetch: 'Fetch API',
214
+ stripe: 'Stripe',
215
+ razorpay: 'Razorpay',
216
+ sendgrid: 'SendGrid',
217
+ twilio: 'Twilio',
218
+ external: 'External API',
219
+ internal: 'Internal',
220
+ unknown: 'Unknown',
221
+ };
222
+ return names[service] || service;
223
+ }
224
+ }
225
+ /**
226
+ * Visualize dependency graph as ASCII (for console)
227
+ */
228
+ export function visualizeDependencyGraph(graph) {
229
+ const lines = [];
230
+ lines.push('┌─ Dependency Graph ────────────────────────────┐');
231
+ graph.nodes.forEach(node => {
232
+ const statusIcon = node.status === 'healthy' ? '✔' : node.status === 'degraded' ? '⚠' : '✖';
233
+ lines.push(`│ ${statusIcon} ${node.name.padEnd(20)} ${node.avgLatency.toFixed(0)}ms ${(node.errorRate * 100).toFixed(1)}% errors`);
234
+ // Show outgoing edges
235
+ const edges = graph.edges.filter(e => e.from === node.id);
236
+ edges.forEach(edge => {
237
+ const targetNode = graph.nodes.find(n => n.id === edge.to);
238
+ if (targetNode) {
239
+ lines.push(`│ └─→ ${targetNode.name} (${edge.callCount} calls)`);
240
+ }
241
+ });
242
+ });
243
+ lines.push('└─────────────────────────────────────────────────┘');
244
+ return lines.join('\n');
245
+ }
246
+ //# sourceMappingURL=DependencyGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependencyGraph.js","sourceRoot":"","sources":["../../../src/core/DependencyGraph.ts"],"names":[],"mappings":"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"}