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,240 @@
1
+ // ─────────────────────────────────────────────────────────────
2
+ // flow-debugger — Distributed Tracing (W3C Trace Context)
3
+ // Enables multi-service tracing with standard propagation
4
+ // ─────────────────────────────────────────────────────────────
5
+ /**
6
+ * W3C Trace Context implementation
7
+ * Format: traceparent: 00-{traceId}-{spanId}-{traceFlags}
8
+ * https://www.w3.org/TR/trace-context/
9
+ */
10
+ export class DistributedTracer {
11
+ /**
12
+ * Generate a 128-bit trace ID (32 hex chars)
13
+ */
14
+ static generateTraceId() {
15
+ const high = this.randomHex(16);
16
+ const low = this.randomHex(16);
17
+ return high + low;
18
+ }
19
+ /**
20
+ * Generate a 64-bit span ID (16 hex chars)
21
+ */
22
+ static generateSpanId() {
23
+ return this.randomHex(16);
24
+ }
25
+ static randomHex(length) {
26
+ const bytes = new Uint8Array(length / 2);
27
+ crypto.getRandomValues(bytes);
28
+ return Array.from(bytes)
29
+ .map(b => b.toString(16).padStart(2, '0'))
30
+ .join('');
31
+ }
32
+ /**
33
+ * Create traceparent header from context
34
+ */
35
+ static createTraceparent(context) {
36
+ const traceFlags = context.sampled ? this.TRACE_FLAG_SAMPLED : this.TRACE_FLAG_NOT_SAMPLED;
37
+ return `${this.TRACEPARENT_VERSION}-${context.traceId}-${context.spanId}-${traceFlags}`;
38
+ }
39
+ /**
40
+ * Parse traceparent header into context
41
+ */
42
+ static parseTraceparent(traceparent) {
43
+ try {
44
+ const parts = traceparent.split('-');
45
+ if (parts.length !== 4)
46
+ return null;
47
+ const [version, traceId, spanId, traceFlags] = parts;
48
+ if (version !== '00')
49
+ return null;
50
+ return {
51
+ traceId,
52
+ spanId,
53
+ parentSpanId: undefined,
54
+ sampled: traceFlags === '01',
55
+ };
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * Create tracestate header for vendor-specific data
63
+ */
64
+ static createTracestate(vendorData) {
65
+ return Object.entries(vendorData)
66
+ .map(([key, value]) => `${key}=${value}`)
67
+ .join(',');
68
+ }
69
+ /**
70
+ * Parse tracestate header
71
+ */
72
+ static parseTracestate(tracestate) {
73
+ try {
74
+ return tracestate.split(',').reduce((acc, pair) => {
75
+ const [key, value] = pair.split('=');
76
+ if (key && value) {
77
+ acc[key.trim()] = value.trim();
78
+ }
79
+ return acc;
80
+ }, {});
81
+ }
82
+ catch {
83
+ return {};
84
+ }
85
+ }
86
+ /**
87
+ * Extract context from incoming headers
88
+ */
89
+ static extractContext(headers) {
90
+ const traceparent = headers['traceparent'] || headers['Traceparent'] || headers['TRACEPARENT'];
91
+ if (!traceparent || typeof traceparent !== 'string')
92
+ return null;
93
+ const context = this.parseTraceparent(traceparent);
94
+ if (!context)
95
+ return null;
96
+ // Extract tracestate if present
97
+ const tracestate = headers['tracestate'] || headers['Tracestate'] || headers['TRACESTATE'];
98
+ if (tracestate && typeof tracestate === 'string') {
99
+ context.tracestate = this.parseTracestate(tracestate);
100
+ }
101
+ return context;
102
+ }
103
+ /**
104
+ * Inject context into outgoing headers
105
+ */
106
+ static injectContext(context, headers) {
107
+ headers['traceparent'] = this.createTraceparent(context);
108
+ if (context.tracestate && Object.keys(context.tracestate).length > 0) {
109
+ headers['tracestate'] = this.createTracestate(context.tracestate);
110
+ }
111
+ }
112
+ /**
113
+ * Create a new span context for child operations
114
+ */
115
+ static createChildContext(parent) {
116
+ return {
117
+ traceId: parent.traceId,
118
+ spanId: this.generateSpanId(),
119
+ parentSpanId: parent.spanId,
120
+ sampled: parent.sampled,
121
+ tracestate: parent.tracestate ? { ...parent.tracestate } : undefined,
122
+ };
123
+ }
124
+ /**
125
+ * Create a root context for new traces
126
+ */
127
+ static createRootContext(sampled = true) {
128
+ return {
129
+ traceId: this.generateTraceId(),
130
+ spanId: this.generateSpanId(),
131
+ parentSpanId: undefined,
132
+ sampled,
133
+ };
134
+ }
135
+ }
136
+ DistributedTracer.TRACEPARENT_VERSION = '00';
137
+ DistributedTracer.TRACE_FLAG_SAMPLED = '01';
138
+ DistributedTracer.TRACE_FLAG_NOT_SAMPLED = '00';
139
+ /**
140
+ * Span manager for nested span tracking
141
+ */
142
+ export class SpanManager {
143
+ constructor() {
144
+ this.spans = new Map();
145
+ }
146
+ /**
147
+ * Start a new span
148
+ */
149
+ startSpan(name, context, parentSpanId) {
150
+ const span = {
151
+ id: context.spanId,
152
+ traceId: context.traceId,
153
+ parentSpanId: parentSpanId || context.parentSpanId,
154
+ name,
155
+ startTime: performance.now(),
156
+ endTime: undefined,
157
+ duration: undefined,
158
+ status: 'pending',
159
+ attributes: {},
160
+ events: [],
161
+ context,
162
+ };
163
+ this.spans.set(span.id, span);
164
+ if (!this.rootSpanId && !parentSpanId) {
165
+ this.rootSpanId = span.id;
166
+ }
167
+ return span;
168
+ }
169
+ /**
170
+ * End a span
171
+ */
172
+ endSpan(spanId, status = 'success') {
173
+ const span = this.spans.get(spanId);
174
+ if (!span)
175
+ return null;
176
+ span.endTime = performance.now();
177
+ span.duration = span.endTime - span.startTime;
178
+ span.status = status;
179
+ return span;
180
+ }
181
+ /**
182
+ * Add attribute to a span
183
+ */
184
+ setAttribute(spanId, key, value) {
185
+ const span = this.spans.get(spanId);
186
+ if (span) {
187
+ span.attributes[key] = value;
188
+ }
189
+ }
190
+ /**
191
+ * Add event to a span
192
+ */
193
+ addEvent(spanId, name, attributes) {
194
+ const span = this.spans.get(spanId);
195
+ if (span) {
196
+ span.events.push({
197
+ name,
198
+ timestamp: performance.now(),
199
+ attributes,
200
+ });
201
+ }
202
+ }
203
+ /**
204
+ * Get span by ID
205
+ */
206
+ getSpan(spanId) {
207
+ return this.spans.get(spanId);
208
+ }
209
+ /**
210
+ * Get all spans in this trace
211
+ */
212
+ getAllSpans() {
213
+ return Array.from(this.spans.values());
214
+ }
215
+ /**
216
+ * Get span hierarchy (tree structure)
217
+ */
218
+ getSpanTree() {
219
+ const spans = this.getAllSpans();
220
+ const rootSpans = spans.filter(s => !s.parentSpanId);
221
+ const spanMap = new Map(spans.map(s => [s.id, { ...s, children: [] }]));
222
+ spans.forEach(span => {
223
+ if (span.parentSpanId) {
224
+ const parent = spanMap.get(span.parentSpanId);
225
+ if (parent) {
226
+ parent.children.push(spanMap.get(span.id));
227
+ }
228
+ }
229
+ });
230
+ return rootSpans.map(s => spanMap.get(s.id));
231
+ }
232
+ /**
233
+ * Clear all spans
234
+ */
235
+ clear() {
236
+ this.spans.clear();
237
+ this.rootSpanId = undefined;
238
+ }
239
+ }
240
+ //# sourceMappingURL=DistributedTracing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DistributedTracing.js","sourceRoot":"","sources":["../../../src/core/DistributedTracing.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}