The only agent that thinks for itself

Autonomous Monitoring with self-learning AI built-in, operating independently across your entire stack.

Unlimited Metrics & Logs
Machine learning & MCP
5% CPU, 150MB RAM
3GB disk, >1 year retention
800+ integrations, zero config
Dashboards, alerts out of the box
> Discover Netdata Agents

Centralized metrics streaming and storage

Aggregate metrics from multiple agents into centralized Parent nodes for unified monitoring across your infrastructure.

Stream from unlimited agents
Long-term data retention
High availability clustering
Data replication & backup
Scalable architecture
Enterprise-grade security
> Learn about Parents

Fully managed cloud platform

Access your monitoring data from anywhere with our SaaS platform. No infrastructure to manage, automatic updates, and global availability.

Zero infrastructure management
99.9% uptime SLA
Global data centers
Automatic updates & patches
Enterprise SSO & RBAC
SOC2 & ISO certified
> Explore Netdata Cloud

Deploy Netdata Cloud in your infrastructure

Run the full Netdata Cloud platform on-premises for complete data sovereignty and compliance with your security policies.

Complete data sovereignty
Air-gapped deployment
Custom compliance controls
Private network integration
Dedicated support team
Kubernetes & Docker support
> Learn about Cloud On-Premises

Powerful, intuitive monitoring interface

Modern, responsive UI built for real-time troubleshooting with customizable dashboards and advanced visualization capabilities.

Real-time chart updates
Customizable dashboards
Dark & light themes
Advanced filtering & search
Responsive on all devices
Collaboration features
> Explore Netdata UI

Monitor on the go

Native iOS and Android apps bring full monitoring capabilities to your mobile device with real-time alerts and notifications.

iOS & Android apps
Push notifications
Touch-optimized interface
Offline data access
Biometric authentication
Widget support
> Download apps

The future of infrastructure observability

See our strategic direction across AI-native observability, full-stack signals, operational intelligence, and enterprise platform maturity.

AI-native observability
Full-stack signal coverage
Operational intelligence
Enterprise platform maturity
Agent releases every 6 weeks
Cloud continuous delivery
> Explore Product Roadmap

Best energy efficiency

True real-time per-second

100% automated zero config

Centralized observability

Multi-year retention

High availability built-in

Zero maintenance

Always up-to-date

Enterprise security

Complete data control

Air-gap ready

Compliance certified

Millisecond responsiveness

Infinite zoom & pan

Works on any device

Native performance

Instant alerts

Monitor anywhere

AI-native observability

Continuous delivery

Open source foundation

80% Faster Incident Resolution

AI-powered troubleshooting from detection, to root cause and blast radius identification, to reporting.

True Real-Time and Simple, even at Scale

Linearly and infinitely scalable full-stack observability, that can be deployed even mid-crisis.

90% Cost Reduction, Full Fidelity

Instead of centralizing the data, Netdata distributes the code, eliminating pipelines and complexity.

See and Map Your Entire Network

Live topology, flow analytics, and SNMP device and trap monitoring — unified with your full-stack observability.

Control Without Surrender

SOC 2 Type 2 certified with every metric kept on your infrastructure.

Integrations

800+ collectors and notification channels, auto-discovered and ready out of the box.

800+ data collectors
Auto-discovery & zero config
Cloud, infra, app protocols
Notifications out of the box
> Explore integrations
Real Results
46% Cost Reduction

Reduced monitoring costs by 46% while cutting staff overhead by 67%.

— Leonardo Antunez, Codyas

Zero Pipeline

No data shipping. No central storage costs. Query at the edge.

From Our Users
"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

No Query Language

Point-and-click troubleshooting. No PromQL, no LogQL, no learning curve.

Enterprise Ready
67% Less Staff, 46% Cost Cut

Enterprise efficiency without enterprise complexity—real ROI from day one.

— Leonardo Antunez, Codyas

SOC 2 Type 2 Certified

Zero data egress. Only metadata reaches the cloud. Your metrics stay on your infrastructure.

Full Coverage
800+ Collectors

Auto-discovered and configured. No manual setup required.

Any Notification Channel

Slack, PagerDuty, Teams, email, webhooks—all built-in.

Built for the People Who Get Paged

Because 3am alerts deserve instant answers, not hour-long hunts.

Every Industry Has Rules. We Master Them.

See how healthcare, finance, and government teams cut monitoring costs 90% while staying audit-ready.

Monitor Any Technology. Configure Nothing.

Install the agent. It already knows your stack.
From Our Users
"A Rare Unicorn"

Netdata gives more than you invest in it. A rare unicorn that obeys the Pareto rule.

— Eduard Porquet Mateu, TMB Barcelona

99% Downtime Reduction

Reduced website downtime by 99% and cloud bill by 30% using Netdata alerts.

— Falkland Islands Government

Real Savings
30% Cloud Cost Reduction

Optimized resource allocation based on Netdata alerts cut cloud spending by 30%.

— Falkland Islands Government

46% Cost Cut

Reduced monitoring staff by 67% while cutting operational costs by 46%.

— Codyas

Real Coverage
"Plugin for Everything"

Netdata has agent capacity or a plugin for everything, including Windows and Kubernetes.

— Eduard Porquet Mateu, TMB Barcelona

"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

Real Speed
Troubleshooting in 30 Seconds

From 2-3 minutes to 30 seconds—instant visibility into any node issue.

— Matthew Artist, Nodecraft

20% Downtime Reduction

20% less downtime and 40% budget optimization from out-of-the-box monitoring.

— Simon Beginn, LANCOM Systems

Pay per Node. Unlimited Everything Else.

One price per node. Unlimited metrics, logs, users, and retention. No per-GB surprises.

Free tier—forever
No metric limits or caps
Retention you control
Cancel anytime
> See pricing plans

What's Your Monitoring Really Costing You?

Most teams overpay by 40-60%. Let's find out why.

Expose hidden metric charges
Calculate tool consolidation
Customers report 30-67% savings
Results in under 60 seconds
> See what you're really paying

Your Infrastructure Is Unique. Let's Talk.

Because monitoring 10 nodes is different from monitoring 10,000.

On-prem & air-gapped deployment
Volume pricing & agreements
Architecture review for your scale
Compliance & security support
> Start a conversation

Monitoring That Sells Itself

Deploy in minutes. Impress clients in hours. Earn recurring revenue for years.

30-second live demos close deals
Zero config = zero support burden
Competitive margins & deal protection
Response in 48 hours
> Apply to partner

Per-Second Metrics at Homelab Prices

Same engine, same dashboards, same ML. Just priced for tinkerers.

Community: Free forever · 5 nodes · non-commercial
Homelab: $90/yr · unlimited nodes · fair usage
> Get the Homelab Plan

$1,000 Per Referral. Unlimited Referrals.

Your colleagues get 10% off. You get 10% commission. Everyone wins.

10% of subscriptions, up to $1,000 each
Track earnings inside Netdata Cloud
PayPal/Venmo payouts in 3-4 weeks
No caps, no complexity
> Get your referral link
Cost Proof
40% Budget Optimization

"Netdata's significant positive impact" — LANCOM Systems

Calculate Your Savings

Compare vs Datadog, Grafana, Dynatrace

Savings Proof
46% Cost Reduction

"Cut costs by 46%, staff by 67%" — Codyas

30% Cloud Bill Savings

"Reduced cloud bill by 30%" — Falkland Islands Gov

Enterprise Proof
"Better Than Combined Alternatives"

"Better observability with Netdata than combining other tools." — TMB Barcelona

Real Engineers, <24h Response

DPA, SLAs, on-prem, volume pricing

Why Partners Win
Demo Live Infrastructure

One command, 30 seconds, real data—no sandbox needed

Zero Tickets, High Margins

Auto-config + per-node pricing = predictable profit

Homelab Ready
Free Video Course

8-episode Netdata tutorial by LearnLinux.tv

76k+ GitHub Stars

3rd most starred monitoring project

Worth Recommending
Product That Delivers

Customers report 40-67% cost cuts, 99% downtime reduction

Zero Risk to Your Rep

Free tier lets them try before they buy

AI Support Assistant, Available 24/7

Nedi has access to all official documentation, source code, and resources. Ask any question about Netdata—responds in your language.

Deployment & configuration
Troubleshooting & sizing
Alerts & notifications
Evidence-based answers
> Ask Nedi now

Never Fight Fires Alone

Docs, community, and expert help—pick your path to resolution.

Learn.netdata.cloud docs
Discord, Forums, GitHub
Premium support available
> Get answers now

60 Seconds to First Dashboard

One command to install. Zero config. 850+ integrations documented.

Linux, Windows, K8s, Docker
Auto-discovers your stack
> Read our documentation

76,000+ Engineers Strong

615+ contributors. 1.5M daily downloads. One mission: simplify observability.

Per-Second. 90% Cheaper. Data Stays Home.

Side-by-side comparisons: costs, real-time granularity, and data sovereignty for every major tool.

See why teams switch from Datadog, Prometheus, Grafana, and more.

> Browse all comparisons
Edge-Native Observability, Born Open Source
Per-second visibility, ML on every metric, and data that never leaves your infrastructure.
Founded in 2016
615+ contributors worldwide
Remote-first, engineering-driven
Open source first
> Read our story
Promises We Publish—and Prove
12 principles backed by open code, independent validation, and measurable outcomes.
Open source, peer-reviewed
Zero config, instant value
Data sovereignty by design
Aligned pricing, no surprises
> See all 12 principles
Edge-Native, AI-Ready, 100% Open
76k+ stars. Full ML, AI, and automation—GPLv3+, not premium add-ons.
76,000+ GitHub stars
GPLv3+ licensed forever
ML on every metric, included
Zero vendor lock-in
> Explore our open source
Build Real-Time Observability for the World
Remote-first team shipping per-second monitoring with ML on every metric.
Remote-first, fully distributed
Open source (76k+ stars)
Challenging technical problems
Your code on millions of systems
> See open roles
Meet the Team Behind Netdata
Conferences, meetups, and tradeshows where you can see Netdata in action and talk to the engineers who build it.
Live demos and deep dives
Book 1-on-1 meetings
Talks and panel sessions
Event recaps and photos
> See all events
Talk to a Netdata Human in <24 Hours
Sales, partnerships, press, or professional services—real engineers, fast answers.
Discuss your observability needs
Pricing and volume discounts
Partnership opportunities
Media and press inquiries
> Book a conversation
Your Data. Your Rules.
On-prem data, cloud control plane, transparent terms.
Trust & Scale
76,000+ GitHub Stars

One of the most popular open-source monitoring projects

SOC 2 Type 2 Certified

Enterprise-grade security and compliance

Data Sovereignty

Your metrics stay on your infrastructure

Validated
University of Amsterdam

"Most energy-efficient monitoring solution" — ICSOC 2023, peer-reviewed

ADASTEC (Autonomous Driving)

"Doesn't miss alerts—mission-critical trust for safety software"

Community Stats
615+ Contributors

Global community improving monitoring for everyone

1.5M+ Downloads/Day

Trusted by teams worldwide

GPLv3+ Licensed

Free forever, fully open source agent

Why Join?
Remote-First

Work from anywhere, async-friendly culture

Impact at Scale

Your work helps millions of systems

$ guides / pgbouncer / pgbouncer-prepared-statement-does-not-exist ▌

Operations Guides

PgBouncer prepared statement does not exist: transaction pooling and lost session state

Your application starts throwing prepared statement "..." does not exist errors in production. PgBouncer is healthy: no queuing, no wait time, pools well under capacity, PostgreSQL is fast. Single-user testing never reproduces it. Restarting the app makes it go away for a while, then it comes back under load.

This is the pool mode mismatch failure pattern, and it is one of the nastier PgBouncer failure modes because every infrastructure signal looks green. The error is a SQL-level error from PostgreSQL, not a connectivity error from PgBouncer. Nothing in SHOW POOLS or SHOW STATS points at it. The only place it shows up is application error logs.

The mechanism: in transaction pooling mode, PgBouncer returns the server connection to the pool at the end of every transaction. The next transaction from your client may land on a different backend connection. A PREPARE executed on backend A does not exist on backend B. Under concurrency, connections are reassigned constantly, so statements vanish between transactions.

What this means

PostgreSQL prepared statements are session-scoped. They live in the memory of one specific backend process. PgBouncer in transaction mode breaks the 1:1 relationship between a client session and a backend session deliberately: that is the whole point of pooling. The client thinks it has a continuous session. It does not.

flowchart LR
  subgraph client["Client session"]
    T1["Txn 1: PREPARE my_stmt"]
    T2["Txn 2: EXECUTE my_stmt"]
  end
  subgraph pool["PgBouncer pool (transaction mode)"]
    A["Backend A
has my_stmt"] B["Backend B
never saw PREPARE"] end T1 -->|"assigned"| A T2 -->|"reassigned after Txn 1 commits"| B B --> ERR["ERROR: prepared statement
my_stmt does not exist"]

Two things make this hard to catch:

  • Testing passes. With one client and little concurrency, the pool has one server connection and the same backend gets reused every time. The statement is always there. The failure only appears when the pool actually multiplexes, which is exactly what happens in production under load.
  • Failures are intermittent. Whether a given EXECUTE lands on the “right” backend is effectively random. Some requests succeed, some fail, and the failure rate tracks pool turnover rather than anything in your code.

The same root cause breaks every session-dependent feature in transaction mode: temp tables, SET variables, advisory locks, LISTEN/NOTIFY. Prepared statements are just the one ORMs hit first, because most of them use server-side prepares by default.

Common causes

CauseWhat it looks likeFirst thing to check
ORM using server-side prepared statementsErrors mention auto-generated statement names (S_1, pdo_stmt_00000001, __asyncpg_stmt_xx__)Application logs for the statement name pattern; ORM/driver config
Switch from session to transaction pooling without a code auditErrors start the day pool_mode changed; nothing else changedSHOW CONFIG for pool_mode; config change history
SQL-level PREPARE / DEALLOCATE in application codeErrors persist even with max_prepared_statements setGrep application code for PREPARE, EXECUTE, DEALLOCATE
Driver sends DEALLOCATE against renamed statements“does not exist” errors on statement close, even on PgBouncer 1.21+ with tracking enabledDriver name and version (PHP/PDO is the known case)
Unnamed prepared statement reuseunnamed prepared statement does not exist variant of the errorDriver-level protocol behavior; same root cause

Quick checks

All of these are safe and read-only.

# 1. Confirm the pooling mode in effect right now
psql -h 127.0.0.1 -p 6432 -U pgbouncer pgbouncer -c "SHOW CONFIG;" | grep -i pool_mode

# 2. Check PgBouncer version (max_prepared_statements needs 1.21+)
psql -h 127.0.0.1 -p 6432 -U pgbouncer pgbouncer -c "SHOW VERSION;"

# 3. Confirm pool metrics really are healthy (expected in this failure mode)
psql -h 127.0.0.1 -p 6432 -U pgbouncer pgbouncer -c "SHOW POOLS;"
# Expect: cl_waiting = 0, sv_idle > 0, nothing saturated.

# 4. Find the actual error text and statement names in app logs
grep -o 'prepared statement "[^"]*" does not exist' /path/to/app.log | sort | uniq -c | sort -rn

# 5. On PostgreSQL, see which prepared statements currently exist per backend
# (run on the database, not PgBouncer)
SELECT pid, name, prepare_time FROM pg_prepared_statements;

The statement names from check 4 are the fingerprint. Hibernate generates names like S_1, S_2. PDO generates pdo_stmt_00000001. asyncpg generates __asyncpg_stmt_xx__. Auto-generated names mean the driver is doing server-side prepares without your code asking for it.

How to diagnose it

  1. Confirm the error is coming from PostgreSQL, not PgBouncer. The error string prepared statement ... does not exist is a PostgreSQL error (SQLSTATE 26000) relayed through PgBouncer. PgBouncer itself logs nothing about it. If PgBouncer’s log is clean and SHOW POOLS is green, that confirms the pattern.

  2. Correlate error bursts with concurrency. Pull timestamps of the errors from app logs and lay them next to connection counts (SHOW POOLS history, cl_active, transaction rate from SHOW STATS_AVERAGES). The signature: error rate scales with pool turnover, not with total query volume. Zero errors at 2 a.m., steady errors at peak.

  3. Identify who is preparing. Match the statement names against your stack’s driver conventions (check 4 above). If the names are auto-generated, your ORM or driver defaults are responsible: Hibernate, Django with persistent connections, JDBC with a nonzero prepare threshold, asyncpg with its statement cache, PDO with native prepares.

  4. Verify the PgBouncer version and whether tracking is enabled. SHOW VERSION, then check max_prepared_statements in SHOW CONFIG. On anything older than 1.21, there is no server-side workaround in PgBouncer at all. On 1.21–1.23 the setting defaults to 0; on 1.24 and later it defaults to 200.

  5. Reproduce deliberately. Run two concurrent clients through the same pool doing PREPARE in one transaction and EXECUTE in the next, with pool_size greater than 1. The error reproduces immediately. This gives you a regression test for whichever fix you choose.

Metrics and signals to monitor

No PgBouncer metric detects this failure directly. PgBouncer has zero error counters in any SHOW command; the failure lives in application logs. What you can monitor:

SignalWhy it mattersWarning sign
Application log rate of prepared statement ... does not existThe only direct signalAny occurrence in production
pool_mode in SHOW CONFIGConfiguration drift check after reloads and deploystransaction when the app expects session
cl_active / transaction ratePool turnover context: how aggressively connections are being reassignedError rate tracking turnover rate confirms diagnosis
Prepared statement counters (1.24+: total_client_parse_count/avg_client_parse_count, total_server_parse_count/avg_server_parse_count, and total_bind_count/avg_bind_count)Confirms whether tracking is actually re-preparing on backendsclient parse count high but server parse count near zero means statements are not being replayed
avg_wait_time, cl_waiting, sv_active/pool_sizeGuardrail: verifies the failure is not a saturation problem masquerading as oneAll green, which is itself the confirming signal for this pattern

Column positions in SHOW STATS are version-dependent (1.24 added the prepared statement counters). Reference columns by name, not position.

Fixes

There are three real options, ordered by how much of your stack they touch.

Enable max_prepared_statements (PgBouncer 1.21+)

Set max_prepared_statements to a nonzero value (the release notes suggest something like 100 as a starting point) and RELOAD. PgBouncer then intercepts protocol-level Parse messages, renames statements to PGBOUNCER_<id>, and re-prepares them on demand on whichever backend the client currently holds. This is the only fix that keeps transaction pooling AND server-side prepares.

Know the limits before you commit:

  • Protocol-level only. PgBouncer tracks the extended query protocol’s Parse/Bind/Describe messages. It does not parse SQL text, so SQL-level PREPARE foo AS ... and DEALLOCATE are not tracked and never will be. If your code uses SQL-level prepares, this fix does nothing.
  • DEALLOCATE from drivers breaks it. Because statements are renamed server-side, a driver that sends DEALLOCATE pdo_stmt_00000001 (the original name) gets “does not exist” because the backend knows it as PGBOUNCER_1. PHP/PDO is the documented case: it is only compatible with this feature on PHP 8.4+ with libpq 17. Older PDO setups must use emulated prepares instead.
  • Version gate. You need 1.21+ for the feature and 1.24+ for the prepared-statement counters that let you verify it is working. If you are pinned to an older version, this option is unavailable.
  • Memory. PgBouncer stores the query-and-parameters text once in a global statement cache; each client and tracked backend keeps mappings to it. Typical queries are negligible, but a large limit plus many distinct SQL texts and many backends/clients is the memory case to test.
  • The official feature notes report throughput gains, but they do not document a universal CPU-overhead figure; isolated operator reports include increased CPU. Validate with your own load test before rolling out fleet-wide.

Disable server-side prepared statements client-side

The driver falls back to client-side (emulated) prepares: the SQL text is sent inline per execution, nothing is stored on the backend, and transaction pooling works fine. This is the lowest-risk fix and works on every PgBouncer version.

Per driver:

  • JDBC: prepareThreshold=0 on the connection URL.
  • PHP/PDO: PDO::ATTR_EMULATE_PREPARES => true.
  • asyncpg: statement_cache_size=0. The asyncpg docs call this out explicitly for PgBouncer users seeing intermittent __asyncpg_stmt_xx__ does not exist errors.
  • ORMs (Hibernate, Django): set the underlying driver’s prepare threshold to zero rather than fighting ORM-level options.

The cost is real but usually modest: you lose the parse/plan caching benefit of server-side prepares. For OLTP workloads behind a pooler, the difference is often small; measure before assuming it matters. The PgBouncer 1.21 release claimed large throughput gains from server-side prepared statements in synthetic benchmarks, so if your workload is parse-heavy, prefer the first fix.

Move the affected workload to session pooling

Set pool_mode = session for the specific database/user pair that needs session state, and leave the rest of the deployment in transaction mode. PgBouncer pools are per (database, user), so you can scope this precisely. Switch the affected pool to session mode as the immediate workaround, then audit the code for session-state dependencies.

The tradeoff: session mode holds a server connection for the client’s entire session. Your multiplexing ratio drops to 1:1 for that pool, and you must size pool_size for concurrent sessions rather than concurrent transactions. Watch sv_active and cl_waiting on that pool after the switch; it will need more capacity than it did in transaction mode.

What not to do

Do not try to fix this with server_reset_query. DISCARD ALL runs between client assignments and clears leftover session state, which is about hygiene in the other direction. It cannot preserve statements across reassignment, and older guidance about adding DEALLOCATE ALL there predates max_prepared_statements and only addresses cleanup, not availability.

Prevention

  • Audit before switching pool modes. Before moving any pool to transaction mode, grep the application and check driver defaults for prepared statements, temp tables, SET, advisory locks, and LISTEN/NOTIFY. This is the single highest-value step; the failure is designed-in otherwise.
  • Treat driver defaults as configuration. Most ORMs enable server-side prepares silently. Pin the prepare behavior explicitly (threshold, cache size, emulate flag) in every service’s database config, and document which mode each service expects.
  • Test with concurrency. A single-user smoke test cannot catch this class of bug. Any pool mode change or driver upgrade should be validated with at least as many concurrent clients as pool_size, forcing real reassignment.
  • Alert on the error string. Since PgBouncer exposes no counter, ship application logs and alert on any occurrence of prepared statement .* does not exist in production. Zero is the only acceptable rate.
  • Verify pool_mode after every RELOAD. Configuration drift on pool_mode is a realistic incident cause. Include it in post-deploy config verification (SHOW CONFIG).
  • Keep PgBouncer current. The prepared statement feature and its observability counters are recent (1.21 and 1.24 respectively), and recent releases carry security fixes. Track the release stream.

How Netdata helps

  • Pool state correlation in one view: cl_waiting, maxwait, sv_active, and sv_idle per pool, so you can confirm in seconds that the pooler is healthy and the problem is application-level, which is the defining diagnostic step for this failure.
  • Pool turnover signals: transaction and query rates per database from SHOW STATS, giving you the concurrency context to correlate error bursts in app logs against pool reassignment pressure.
  • Prepared statement counters on 1.24+: client/server parse and bind totals/averages collected and charted, so you can verify max_prepared_statements is actually replaying statements on backends after you enable it.
  • Config and version visibility: tracking pool_mode and version across your PgBouncer fleet catches drift and flags instances too old for the tracking feature.
  • Session-mode guardrails after a fix: if you scope a pool to session mode as the workaround, per-pool utilization and wait-time alerting catches the capacity regression that switch can cause.