---
title: Installation
description: Install pg_stat_ch from prebuilt binaries or build from source
---
## Prerequisites
- **PostgreSQL 16, 17, or 18**
- **Docker and Docker Compose** (for the quickstart and ClickHouse setup)
- **ClickHouse** (for the default export backend) or an OpenTelemetry collector
## Install from prebuilt binaries
Prebuilt binaries are published for every release on Linux (amd64 and arm64) for PostgreSQL 16, 17, and 18.
Go to the [latest release](https://github.com/ClickHouse/pg_stat_ch/releases/latest) and download the tarball matching your PostgreSQL version and architecture. For example, for PostgreSQL 18 on amd64:
```bash
curl -LO https://github.com/ClickHouse/pg_stat_ch/releases/latest/download/pg_stat_ch-v0.3.4-pg18-linux-amd64.tar.gz
```
Available variants:
| PostgreSQL | amd64 | arm64 |
|---|---|---|
| 16 | `pg_stat_ch-*-pg16-linux-amd64.tar.gz` | `pg_stat_ch-*-pg16-linux-arm64.tar.gz` |
| 17 | `pg_stat_ch-*-pg17-linux-amd64.tar.gz` | `pg_stat_ch-*-pg17-linux-arm64.tar.gz` |
| 18 | `pg_stat_ch-*-pg18-linux-amd64.tar.gz` | `pg_stat_ch-*-pg18-linux-arm64.tar.gz` |
```bash
tar -xzf pg_stat_ch-*.tar.gz
cd pg_stat_ch-*/
sudo cp pg_stat_ch.so $(pg_config --pkglibdir)/
sudo cp pg_stat_ch.control pg_stat_ch--*.sql $(pg_config --sharedir)/extension/
```
See `INSTALL.md` in the tarball for full instructions.
Debug symbol packages (`*-debuginfo.tar.gz`) are also available for crash analysis. Extract and point `gdb` at the debug directory.
## Build from source
Building from source requires **CMake 3.20+**, **Ninja** (or Make), a **C++17 compiler** (GCC 10+, Clang 13+), and PostgreSQL development headers (`postgresql-server-dev-*`).
Clone the repository with submodules:
```bash
git clone --recurse-submodules https://github.com/ClickHouse/pg_stat_ch.git
cd pg_stat_ch
```
### Using mise (recommended for development)
If you have [mise](https://mise.jdx.dev) installed:
```bash
mise run build # Debug build against the default pg_config
mise run install # Install into the PostgreSQL extension directory
```
Other build targets:
```bash
mise run build:release # Optimized release build
mise run build:16 # Build for PostgreSQL 16
mise run build:17 # Build for PostgreSQL 17
mise run build:18 # Build for PostgreSQL 18
mise run build:all # Build for all supported versions
```
### Using CMake directly
```bash
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
sudo cmake --install build
```
To target a specific PostgreSQL installation, pass `-DPG_CONFIG`:
```bash
cmake -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DPG_CONFIG=/usr/lib/postgresql/18/bin/pg_config
cmake --build build
sudo cmake --install build
```
## Load the extension
pg_stat_ch must be loaded via `shared_preload_libraries` because it needs to initialize at server startup.
```ini
shared_preload_libraries = 'pg_stat_ch'
```
If you already have other extensions loaded, add pg_stat_ch to the comma-separated list:
```ini
shared_preload_libraries = 'pg_stat_statements, pg_stat_ch'
```
```bash
sudo systemctl restart postgresql
```
```sql
CREATE EXTENSION pg_stat_ch;
```
## Verify installation
Check that the extension is loaded and the background worker is running:
```sql
-- Check version
SELECT pg_stat_ch_version();
-- Check stats (queue should be active)
SELECT * FROM pg_stat_ch_stats();
-- Check the background worker is visible
SELECT pid, application_name, state, wait_event
FROM pg_stat_activity
WHERE application_name = 'pg_stat_ch exporter';
```
If the background worker doesn't appear, check the PostgreSQL log for errors. The most common issue is forgetting to add pg_stat_ch to `shared_preload_libraries`.
## Recommended PostgreSQL settings
These PostgreSQL settings are not required but provide more data:
```ini
# Enable I/O timing (small overhead, big value)
track_io_timing = on
# Enable query ID computation (required for query grouping)
compute_query_id = on
# Enable JIT stats collection
jit = on
```
## Next steps
With the extension loaded, connect it to a backend to start receiving events:
Docker-based setup that gets you from zero to querying events in ClickHouse
Production ClickHouse deployment, schema, and data retention
Route telemetry through your existing OTel collector to Grafana, Datadog, etc.
Tune queue size, flush interval, and connection settings