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-transaction-vs-session-pooling ▌

Operations Guides

PgBouncer transaction vs session pooling: what each mode breaks and when to use it

pool_mode is the most consequential setting in pgbouncer.ini. It decides when a server connection is returned to the pool, which in turn decides how many PostgreSQL backends you need and which PostgreSQL features your application is no longer allowed to use.

The failure pattern that brings people to this page is consistent: someone switches from session to transaction for efficiency, deploys, and hours or days later the application starts throwing intermittent “prepared statement does not exist” errors, losing temp tables mid-request, or leaking advisory locks. Every PgBouncer metric looks healthy. The breakage only shows up under concurrency, because single-user testing keeps landing on the same backend.

How the modes differ

The only difference between the three modes is the lifetime of the binding between a client connection and a server connection. Everything else about PgBouncer stays the same.

flowchart TD
  C[Client sends query] --> M{pool_mode}
  M -->|session| S1[Server assigned for entire client session]
  S1 --> S2[Returned when client disconnects]
  S2 --> S3[server_reset_query runs - DISCARD ALL]
  M -->|transaction| T1[Server assigned per transaction]
  T1 --> T2[Returned at COMMIT or ROLLBACK]
  T2 --> T3[No reset query - session state must not exist]
  M -->|statement| ST1[Server assigned per statement]
  ST1 --> ST2[Returned after each statement]
  ST2 --> ST3[Multi-statement transactions rejected]
  • Session mode: the server connection is assigned when the client connects and held until the client disconnects. Multiplexing is minimal; PgBouncer mostly acts as a connection funnel and reaper. Every PostgreSQL session feature works, because the client keeps the same backend for its whole life. When the connection is returned, PgBouncer runs server_reset_query (default DISCARD ALL) to scrub session state before reuse.
  • Transaction mode: the server connection is assigned when a transaction starts and returned at COMMIT or ROLLBACK. An autocommit statement is a one-statement transaction, so it holds a server connection for exactly that statement. This is the standard production mode and gives real multiplexing: hundreds of clients can share a pool of 20 backends. The cost is that nothing which lives outside a transaction boundary survives.
  • Statement mode: the server connection is returned after every statement. Multi-statement transactions are rejected outright. Rarely usable outside narrow read-only workloads, because most applications eventually issue BEGIN.

What transaction mode breaks

Check this table before touching pool_mode. Anything in it that your application uses will fail intermittently under load, not deterministically in testing, because failure depends on whether the next transaction lands on a different backend.

FeatureBehavior in transaction modeFailure signature
Session-level SET (search_path, statement_timeout, custom GUCs)Lost between transactionsSettings silently revert; queries behave differently request to request
PREPARE / EXECUTE (SQL-level)Broken“prepared statement X does not exist”
Protocol-level prepared statementsWorks on 1.21+ with max_prepared_statements > 0Same error on older versions or with incompatible drivers
Temp tables created outside the transaction that reads themGone“relation does not exist”
Session advisory locks (pg_advisory_lock)OrphanedLock acquired on one backend, never released; mysterious contention
LISTENNever delivered reliablyNotifications silently missed
WITH HOLD cursorsBrokenCursor state lost at commit
LOAD (extension loading into session)LostExtension functions missing on next transaction

Three of these deserve expansion because they cause the worst real-world damage.

Prepared statements. Before PgBouncer 1.21, any use of prepared statements in transaction mode failed under concurrency. Version 1.21 added max_prepared_statements, which tracks protocol-level prepares (the extended query protocol used by most drivers: PQprepare, JDBC PreparedStatement, and similar) and replays them on whichever backend the next transaction lands on. Since 1.24 this is enabled by default with max_prepared_statements = 200. Two traps remain: SQL-level PREPARE foo AS ... is invisible to PgBouncer and still breaks, and some drivers are incompatible with the tracking (the PgBouncer FAQ calls out PHP/PDO unless PHP 8.4+ with libpq 17 is used). If you upgrade from a version older than 1.24, prepared statement tracking turns on by default. Usually an improvement, but it is a behavior change worth knowing about before the upgrade, not after.

Advisory locks. pg_advisory_lock() is session-scoped. If the application acquires the lock in one transaction and the unlock call lands on a different backend, the lock is orphaned on the first backend and held until that connection is recycled. The symptom is lock contention with no holder visible in the session you are inspecting. Transaction-scoped advisory locks (pg_advisory_xact_lock) are safe, because they release at commit on the same backend that took them.

SET variables. SET search_path or SET statement_timeout issued at connect time works in development, where one client keeps one backend, then fails intermittently in production when the next transaction lands elsewhere. The fix is SET LOCAL inside the transaction, which is scoped to the transaction and therefore survives transaction mode correctly. server_reset_query does not save you here: in transaction mode it is not executed at all, because the mode assumes no session state exists to reset.

What session mode costs

Session mode breaks nothing. That is its entire value proposition. The cost is efficiency: one server connection per connected client, held for the whole session even while the client sits idle between requests. With 500 connected clients you need 500 PostgreSQL backends, and PgBouncer adds little beyond connection funneling and the DISCARD ALL cleanup on return.

One hidden cost: server_reset_query runs on every connection return in session mode. If DISCARD ALL is slow on your backend (many temp tables to clean, for example), it delays connection reuse, but PgBouncer does not charge that reset time to avg_query_time; check reset timing and pool turnover separately.

Use session mode when:

  • The application uses LISTEN/NOTIFY, session advisory locks, WITH HOLD cursors, or session-level SET state and you cannot or will not change the code.
  • You need a compatibility landing zone during migration, while you audit and fix session-dependent features before switching to transaction mode.
  • Client counts are genuinely low and multiplexing buys you nothing.

PgBouncer lets you set pool_mode per database in [databases] and per user in [users], so you can run well-behaved workloads in transaction mode and pin LISTEN/NOTIFY users to session mode.

Statement mode

Statement mode returns the server connection after each statement and rejects multi-statement transactions. Almost no general-purpose application qualifies, because the first BEGIN it issues will fail. It exists for simple, strictly autocommit read workloads where you want maximum connection turnover. If you are not sure whether your workload qualifies, it does not.

Auditing an application before switching to transaction mode

The mistake is not choosing transaction mode. The mistake is switching without an audit. Work through this list against the actual application code and its ORM configuration:

  • Prepared statement usage. Search for PREPARE, and check the ORM or driver: Hibernate, Django with persistent connections, and many others prepare statements by default. Confirm the PgBouncer version (1.21+ with max_prepared_statements configured) and confirm driver compatibility.
  • Session state. Search for SET statements issued outside transactions, SET SESSION, and connection-initialization hooks in the framework that run SET at connect time.
  • Temp tables. Search for CREATE TEMP and ON COMMIT PRESERVE ROWS. Temp tables created and consumed inside one transaction are fine; temp tables that outlive a transaction are not. ON COMMIT DROP tables are safe.
  • Advisory locks. Search for pg_advisory_lock. Convert to pg_advisory_xact_lock where the locking semantics allow it.
  • LISTEN/NOTIFY. Search for LISTEN. If present, that workload needs session mode or a dedicated direct connection that bypasses PgBouncer.
  • Cursors. Search for WITH HOLD. Ordinary cursors scoped to a transaction are fine.

If you find violations you cannot fix immediately, the escape hatch is server_reset_query_always = 1, which forces the reset query to run in transaction mode. The PgBouncer documentation is blunt about this: it is a workaround for running session-feature-using applications over a transaction-mode pooler. Treat it as a bridge, not a destination.

Confirming your current mode and watching for a mismatch

Check what is actually running, per database, not just what the config file says:

# Confirm the effective pool_mode and prepared statement settings
psql -h 127.0.0.1 -p 6432 -U pgbouncer pgbouncer -c "SHOW CONFIG;" | grep -Ei "pool_mode|max_prepared_statements|server_reset_query"

The dangerous property of a pool mode mismatch is that PgBouncer itself looks completely healthy. The pattern to recognize:

  • Application logs show “prepared statement X does not exist”, “current transaction is aborted”, “relation does not exist” for temp tables, or stale reads.
  • cl_waiting is zero, avg_wait_time is near zero, pool utilization looks normal.
  • avg_query_time is low, because the failures are fast SQL errors, not slow queries.
  • Errors correlate with concurrency, not with specific requests. Single-user testing passes.

There is no PgBouncer metric that detects session state loss. Detection lives in application error logs. The PgBouncer-side value of monitoring is confirming that the pooler is not the problem, which points the investigation at the application layer faster.

Signals to watch

SignalWhy it mattersWarning sign
pool_mode in SHOW CONFIGConfirms the effective mode per database after every RELOADMode differs from what the application was audited for
Application SQL error logsThe only place session state loss surfaces“does not exist” errors that correlate with load
avg_query_timeBackend execution time; in session mode it does not include post-release reset timeElevated query time with healthy backend
avg_xact_time vs avg_query_timeIn transaction mode, a large gap means idle-in-transaction clients holding server connectionsSustained gap well beyond what your transaction shapes justify
sv_active / pool_sizeTransaction mode should oscillate well below 100%; session mode tracks connected clientsSustained saturation in transaction mode
cl_waitingBrief queuing is normal in transaction mode; in session mode any queuing means connections held too longSustained nonzero values

How Netdata helps

  • Netdata collects the SHOW POOLS and SHOW STATS families per database, so cl_waiting, sv_active, sv_idle, avg_wait_time, avg_query_time, and avg_xact_time are available as per-second time series rather than point-in-time snapshots.
  • The avg_xact_time versus avg_query_time gap is directly chartable, which surfaces idle-in-transaction connection holding in transaction mode before it exhausts the pool.
  • Comparing wait time against query time on the same dashboard answers the “pooler latency or database latency” question in one look, which is the first fork in any PgBouncer investigation.
  • Because PgBouncer exposes no error counters, correlating healthy-looking PgBouncer metrics with application-side error spikes is what identifies a pool mode mismatch; having both in one place shortens that correlation from a log-diving exercise to a glance.
  • PgBouncer 1.23 added server-assignment counters (total_server_assignment_count / avg_server_assignment_count) and 1.24 exposed prepared-statement counters in SHOW STATS/SHOW STATS_AVERAGES; collect these directly if your monitoring does not parse them.