Root Cause Analysis
Stripe webhook signature verification failing
2 min ago · payment-svc · 7 occurrences
Root cause: Stripe webhook signature verification fails because the raw request body is being parsed by middleware before reaching the verification handler. Stripe's signature is computed against the raw body, so parsing it as JSON breaks the HMAC comparison.
Suggested fix
- app.use(express.json());
- app.post('/webhook', handleStripeWebhook);
+ app.post('/webhook',
+ express.raw({ type: 'application/json' }),
+ handleStripeWebhook
+ );
+ app.use(express.json());Database connection pool exhausted
12 min ago · user-service · 14 occurrences
Root cause: A long-running analytics query holds a connection for ~45s while an async retry loop in the request handler keeps requesting new connections from the same pool. With pool_size=20 and avg query time of 50ms, the pool empties in under 2 seconds during traffic spikes.
Suggested fix
- pool = create_pool(size=20) + pool = create_pool(size=20, timeout=5) + + # Move analytics queries to a dedicated pool + analytics_pool = create_pool(size=5) + - result = await pool.fetch(analytics_query) + result = await analytics_pool.fetch(analytics_query)
Rate-limit middleware reading wrong client IP
1 hr ago · api-gateway · 5 occurrences
Root cause: The rate-limit middleware reads the client IP from req.connection.remoteAddress, but the service runs behind a load balancer that terminates TLS. Every request appears to come from the same upstream proxy IP, so per-user rate limits never trigger correctly.
Suggested fix
- const ip = req.connection.remoteAddress;
+ const forwarded = req.headers['x-forwarded-for'];
+ const ip = (typeof forwarded === 'string'
+ ? forwarded.split(',')[0].trim()
+ : req.connection.remoteAddress);
+ // Ensure 'trust proxy' is set:
+ app.set('trust proxy', 1);Debug in minutes, not hours
Pattern detection
Errors are grouped by fingerprint. Once a pattern hits 5+ occurrences, Claude analyzes it automatically.
Plain-English explanations
No more cryptic stack traces. Get a clear narrative of what failed, where, and why — written in human language.
Actionable code fixes
Suggested fixes come as real code diffs you can copy-paste, not vague advice. Built for engineers in a hurry.
Confidence scoring
Every insight ships with a 0–100% confidence score so you know when to trust the AI and when to dig deeper.
Language-agnostic
Works with Python, Node.js, Go, Ruby, Java — anything that produces logs. The model reasons about the failure, not syntax.
Cached for cost
Repeated patterns reuse cached analyses. You pay for the first occurrence, not the next 100.