Get ahead of incidents

Reliability agents that catch and resolve production issues before your customers notice

Trusted every day by

BrevoPlanityBooksyBlast
ewake · production6 signals today
Triaged · noise

search-indexer disk usage above 85%

87.4% used · 12.6% free · 30 min

Datadog Alert · env:production service:search-indexer

Prior firings11 in 30 daysBack under 70%9 minCustomer impactnone

What ewake did

  • Matched 11 prior firings
  • Checked the 4:00 AM merge job
  • Compared the threshold to staging
  • Closed it without paging
ewakeapp#prod-reliability

Marked as noise

Nobody paged. This monitor has never once caught a real problem.

Open investigation in ewakeTune this monitor
Was this noise?👍👎42

Ewake in action

End-to-end reliability by agents that know your production

Investigate

Find out what's actually happening.

As soon as an alert fires or ewake catches a faulty release, it starts investigating autonomously: pulling and enriching context, reasoning across signals, and determining the root cause, impact, and recommended next steps.

Learn more about on-call agents
ewakeagent11:06
Investigation complete

Spike of 5xx errors in payment-api

Snapshot

Error rate on payment-api rose from 0.3% to 6.8% for tenant 4471pmqx, with every failure raised from acquireConnection() in services/payment-api/db.py:41. Most likely cause: connection pool exhaustion after #4821 lowered max_size from 32 to 8. Deploy landed 4 minutes before the first error. p99 unchanged on every service that does not call this handler.

checkout 5xx rate · 2% monitor threshold

11:00↑ #4821 deployed 11:0211:12

Hypotheses

Hypothesis 1 (High confidence)

The pool size change in #4821 is exhausting connections under normal afternoon load

Evidence:

  • All 1,204 failures raise PoolTimeout at db.py:41, none elsewhere [ref]
  • Errors begin 11:03:40, 90s after #4821 reached the last canary [ref]
  • Only payment-api and checkout-api degrade; both call the changed handler [ref]

Hypothesis 2 (Low confidence)

Database saturation on postgres-main is the underlying cause

Evidence:

  • Pool utilisation held at 34% and query p99 was flat through the window [ref]
  • Six other services share the instance and none of them slowed [ref]
M
Maya11:07

How sure are you it isn't the database? It bit us last month.

e
ewakeagent11:07

Hypothesis 2 above. postgres-main pool utilisation was 34% and query p99 flat for the whole window, and the six other services on that instance were unaffected. If it were the database they would have degraded too.

Resolve

Work toward the safest fix.

ewake validates its hypotheses against live production, maps the blast radius, and prepares a scoped fix within the boundaries you have set.

Learn more about incident agents
ewakeagent11:08
Fix prepared — awaiting review

Connection pool exhaustion on payment-api

Snapshot

p99 on payment-api rose to 2.31s after #4821 lowered max_size from 32 to 8 in services/payment-api/db.py:41. Reverting the two values clears the waits when replayed against the last hour of traffic. Change is one file, one service; nothing else reads this pool and no migration is involved.

Proposed change

services/payment-api/db.py

def get_pool():
- return Pool(max_size=8, timeout=2.0)
+ return Pool(max_size=32, timeout=5.0)
# reverts #4821: pool waits accounted for the p99 rise
unit412 passedbuild2m 14spolicywithin remit

Validation

Hypothesis 1 (High confidence)

Restoring max_size=32 removes the p99 regression without other effects

Evidence:

  • Replaying 11:00-12:00 traffic at the old pool size clears every wait; at the current size 11% still queue [ref]
  • Callers of get_pool() are limited to payment-api; no other service imports the module [ref]
  • Value matches the one in production for 14 months before #4821 [ref]
Not mergedauto-merge is off for payment-api; opened as #291 for one approval.

Detect

Catch a bad release before it becomes an incident.

ewake watches every release, catching regressions while they are still small, before they turn into customer-facing outages, so engineers don't have to watch monitors after every deploy.

Learn more about background agents
ewakeagent06:41
Watching release #4821 — day 3 of 5

Error rate drifting on checkout-api since deploy #4821

Snapshot

Error rate on checkout-api has run at 0.41% to 1.94% since 03:10, about four times the trailing baseline, with every failure on the code path #4821 changed. Nothing has crossed a threshold, so no monitor has fired and nobody has been paged. At the current slope it reaches the 2% alert threshold some time tomorrow afternoon, during peak.

deploy #4821 · watched since Monday

Day 1
Day 2
Day 3
Day 4
Day 5

Hypotheses

Hypothesis 1 (Medium confidence)

The drift is a regression in #4821 rather than a change in traffic

Evidence:

  • Compared against the two releases either side: same request volume, same hosts, same hour of day; only this one drifts [ref]
  • Every failing request enters the handler #4821 modified [ref]
  • Confidence is medium because 18 hours is short for a seasonality claim; the watch continues to day 5 [ref]

Nothing has been changed. Re-checking every five minutes.

Escalate

Only ping a human when one is needed.

When human judgment is required or there is customer impact, ewake wakes the on-call, with the investigation, the evidence, and the recommended action already attached.

ewakeagent11:12
Investigation complete — handed to on-call

Potential incident — review now and consider paging on-call

Checkout is returning 5xx to real traffic and the remaining fix needs a schema migration, which is outside what this agent is permitted to run.

5xx on checkout-api after schema change in #4818

Snapshot

6.8% of requests to checkout-api have failed for 14 minutes. Root cause is confirmed: #4818 added a non-null column to orders and the writer was deployed before the backfill completed. Reverting the config alone leaves the rows written since 10:58 in a state the new schema cannot read, so the revert is not sufficient on its own.

Why this stopped here

Hypothesis 1 (High confidence)

Repair requires an ALTER TABLE on orders, which is on the deny list for this environment

Evidence:

  • 1,847 rows written between 10:58 and 11:12 fail the new constraint on read [ref]
  • Migration policy for env:production lists DDL as human-only; no override is configured [ref]
  • Rollback of #4818 alone reproduces the read failures in staging [ref]

Paged

MMaya Chenon-call · paymentsacknowledged 40s
M
Maya11:13

Got it — running the backfill now. Nothing to re-investigate.

faster time to root cause

90%

accuracy

5 min

from alert to fix

Point ewake at your own production

Thirty minutes to connect it, one perimeter, your real alerts. You will know inside a week whether it holds, on your stack, not in a sandbox.

Trusted by engineers

Built for real production environments

Brevo
90%
of investigations named the right cause

ewake proved extremely useful during production investigations, consistently pointing us to the right root cause and saving precious time, especially during on-call.

PS

Piyush S.

Lead Software Engineer, Brevo

Live production map

Powered by a live production map, built and maintained by ewake

ewake continuously maps your services, deploys and dependencies from the signals already flowing through your stack, so every investigation starts from what actually changed, not a stale diagram.

Integrations

Able to work with your tools

Connect your stack in minutes. Use MCP, APIs, or webhooks to connect observability, alerting, code, chat, or your own custom MCP server.

DatadogDatadog
GrafanaGrafana
PagerDutyPagerDuty
NotionNotion
JiraJira
LinearLinear
KubernetesKubernetes
GitHubGitHub
GitLabGitLab
Custom MCPCustom MCP
incident.io
Rootly
FireHydrant
ElasticElastic
ClickHouseClickHouse
DatadogDatadog
GrafanaGrafana
PagerDutyPagerDuty
NotionNotion
JiraJira
LinearLinear
KubernetesKubernetes
GitHubGitHub
GitLabGitLab
Custom MCPCustom MCP
incident.io
Rootly
FireHydrant
ElasticElastic
ClickHouseClickHouse
DatadogDatadog
GrafanaGrafana
PagerDutyPagerDuty
NotionNotion
JiraJira
LinearLinear
KubernetesKubernetes
GitHubGitHub
GitLabGitLab
Custom MCPCustom MCP
incident.io
Rootly
FireHydrant
ElasticElastic
ClickHouseClickHouse
DatadogDatadog
GrafanaGrafana
PagerDutyPagerDuty
NotionNotion
JiraJira
LinearLinear
KubernetesKubernetes
GitHubGitHub
GitLabGitLab
Custom MCPCustom MCP
incident.io
Rootly
FireHydrant
ElasticElastic
ClickHouseClickHouse

Frequently asked questions

You've got questions, we've got answers

Still have questions?

Book a quick call with the team.

Talk to us

It shows its work. Every conclusion arrives with a confidence score, the evidence behind it, and what it ruled out along the way. Your engineers can challenge it in the thread and get the reasoning back. This is identical in every deployment.

It acts inside limits you set. You decide what it can do on its own, what needs an approving human, and what it should only ever suggest. Write access is off until you turn it on, per service. Auto-merge is off by default. Once a pattern has been resolved with your team and your rules allow it, ewake can handle a repeat on its own and tell you what it did. Your rules are the same rules whichever way you deploy.

Never. Your telemetry, your code, and your incidents are never used to train or fine-tune any model, in any deployment model, at any tier. There is no exception and no opt-out to manage.

It stays in Europe, always. Nothing crosses the Atlantic. On SaaS, telemetry is processed on EU infrastructure and raw data is discarded after analysis. On BYOC and on self-hosted, raw telemetry never leaves your own environment at all. Full breakdown of what crosses which boundary on our security page.

Yes. Three models: our EU SaaS, BYOC inside your own cloud account, and a gateway inside your own network perimeter for on-premise and hybrid estates.

Read-only by default, in every deployment. It reads metrics, logs, traces, and code to investigate, and it changes nothing in your infrastructure unless you grant write access. Write access is scoped per service, revocable, and gated behind your approval rules. The full permission list is published in our docs.

Your existing stack. Observability (Datadog, Grafana, Prometheus and others), alerting (PagerDuty, OpsGenie), code (GitHub, GitLab), and chat (Slack). No new tooling, no custom instrumentation, no code changes. The integration list is the same whichever way you deploy.

On SaaS, minutes. Connect your tools, pick your Slack channel, and ewake starts analysing. BYOC and self-hosted add one infrastructure step, which we run with your platform team. After that first step, day-to-day operation is identical across all three.

SOC 2 Type II certified, GDPR compliant with EU data residency, ISO 27001 controls aligned. The same controls apply to every deployment model. DPA, sub-processor list, pen-test report, data-flow diagram, and our contract annex covering data location, audit rights and exit are available on request. Visit trust.ewake.ai.