Skip to main content

Enroll a New PostgreSQL Server

This guide walks you through the complete procedure to register a new PostgreSQL server in PMP4PG and start collecting its metrics.


Overview​

1. Authenticate as ADMIN and generate a registration token
↓
2. Prepare the PostgreSQL server (monitoring user)
↓
3. Install the PMP4PG Agent RPM
↓
4. Configure the agent (token + connection settings)
↓
5. Start the agent — registration runs automatically
↓
6. Copy credentials back into config and restart
↓
7. The server appears in the Global Dashboard

Step 1 — Authenticate and Generate a Registration Token​

Registration tokens are single-use credentials that authorize an agent to register itself with the PMP4PG backend. Only an ADMIN user can generate them.

1.1 — Sign in as ADMIN​

curl -X POST http://<BACKEND_HOST>:8080/pmp/user/signin \
-H "Content-Type: application/json" \
-d '{
"username": "ADMIN",
"password": "<admin_password>"
}'

Copy the token value from the response — you will use it in the next call.

1.2 — Generate a Registration Token​

curl -X POST http://<BACKEND_HOST>:8080/pmp/api/admin/registration-tokens/generate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <JWT_TOKEN>" \
-d '{
"siteCode": "PAR01",
"description": "Token for new prod server in Paris",
"expiresInHours": 5,
"maxUses": 1
}'
FieldDescription
siteCodeSite or datacenter identifier (free text, e.g. PAR01, LON02)
descriptionHuman-readable description for audit purposes
expiresInHoursToken validity period in hours
maxUsesNumber of times the token can be used — always 1 for security
warning

Copy the registration token immediately — it is displayed only once. Each token is valid for a single registration and expires after the configured number of hours.


Step 2 — Prepare the PostgreSQL Server​

On the PostgreSQL server you want to monitor, create a dedicated monitoring user.

-- 1. Create the monitoring user
CREATE USER pmp4pg WITH LOGIN PASSWORD 'changeit';

-- 2. pg_monitor role: grants access to pg_stat_activity, pg_stat_statements,
-- pg_stat_replication, pg_stat_wal, pg_stat_bgwriter, etc.
-- Also includes pg_read_all_settings and pg_read_all_stats.
GRANT pg_monitor TO pmp4pg;

-- 3. pg_stat_statements access (if the extension is installed)
-- Required to query the view from any database.
GRANT SELECT ON pg_stat_statements TO pmp4pg;

\q

Then add the following line to pg_hba.conf:

# PMP4PG monitoring user — TCP connection with password
host all pmp4pg 127.0.0.1/32 scram-sha-256

Option B — PEER Authentication (Local Socket, No Password)​

sudo -u postgres psql

CREATE USER pmp4pg WITH LOGIN;
GRANT pg_monitor TO pmp4pg;
GRANT SELECT ON pg_stat_statements TO pmp4pg;
GRANT CONNECT ON DATABASE postgres TO pmp4pg;

\q

Then add the following line to pg_hba.conf before existing local rules:

# PMP4PG monitoring user — PEER authentication (no password)
local all pmp4pg peer

Reload PostgreSQL after editing pg_hba.conf:

systemctl reload postgresql

Enable pg_stat_statements (if not already active)​

# Add to postgresql.conf
echo "shared_preload_libraries = 'pg_stat_statements'" >> /var/lib/pgsql/16/data/postgresql.conf
echo "pg_stat_statements.track = all" >> /var/lib/pgsql/16/data/postgresql.conf

# Restart PostgreSQL
systemctl restart postgresql

# Create the extension
sudo -u postgres psql -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;"

Step 3 — Install the PMP4PG Agent​

Transfer the RPM package to the target server and install it:

dnf install pmp4pg-agent-1.0.0-1.x86_64.rpm

The installer creates the following structure:

PathDescription
/usr/bin/pmp4pg-agentAgent binary
/etc/pmp4pg/agent.confConfiguration file
/var/log/pmp4pg/Log directory
pmp4pg-agent.servicesystemd service unit (not started yet)

Step 4 — Configure the Agent​

Edit the configuration file:

vi /etc/pmp4pg/agent.conf

Fill in the following sections:

# === AGENT ===
agent:
id: "" # Leave empty — assigned after registration
api_key: "" # Leave empty — assigned after registration
registration_token: "PASTE_TOKEN_HERE" # Token generated in Step 1

# === POSTGRESQL CONNECTION ===
postgresql:
host: "localhost"
port: 5432
user: "pmp4pg"
password: "your_secure_password" # Leave empty if using PEER auth
database: "postgres"
ssl_mode: "disable"

# === SERVER IDENTITY ===
server:
id: "" # Leave empty — assigned after registration
environment: "RUN" # RUN, DR or BUILD
tag: "" # Optional free-text tag

# === BACKEND ===
backend:
url: "http://<BACKEND_HOST>:8080/pmp" # Use https:// if TLS is enabled on the backend
timeout_seconds: 30
retry_attempts: 3
retry_delay: 5
compression: "gzip" # "gzip" or ""
tls:
enabled: false # set to true when backend uses HTTPS
skip_verify: false
ca_cert: ""
tip

See Agent Configuration → for the full reference of every parameter, including the collectors, buffer and logging sections.

info

agent.id, api_key and server.id are assigned automatically during registration. Leave them empty at this stage.


Step 5 — Run the Registration​

The agent detects that agent.id is empty and automatically enters registration mode on first start:

systemctl start pmp4pg-agent

Follow the logs to monitor the registration process:

tail -f /var/log/pmp4pg/agent.log

On success, the agent prints the assigned credentials directly in the log:

======================================================================
COPY THE FOLLOWING TO YOUR agent.conf:
----------------------------------------------------------------------
agent:
id: "52103fa1-4fa6-445c-a86b-3a7fdb216348"
api_key: "api_0RYqu5Azaa4-KgrcH86U4FPqojuFKpdYhbReNwYjlvi27wH3h2wdedxd-AG8-UrF"
registration_token: "" # Clear the token after registration

server:
id: "03153ee0-e28e-4720-8c9c-74470fbefd53"
environment: "PROD" # Keep your value
tag: "" # Keep your value
----------------------------------------------------------------------
NEXT STEPS:
----------------------------------------------------------------------
1. Edit your agent.conf file
2. Copy the above credentials
3. Clear the registration_token
4. Save the file
5. Restart the agent
======================================================================
Important

Note down all three values: agent.id, api_key and server.id. All three are required in the next step.


Step 6 — Update the Configuration​

Edit the configuration file and paste the credentials printed in the log:

vi /etc/pmp4pg/agent.conf
agent:
id: "52103fa1-4fa6-445c-a86b-3a7fdb216348" # ← paste here
api_key: "api_0RYqu5Azaa4-KgrcH86..." # ← paste here
registration_token: "" # ← clear the token (mandatory)

server:
id: "03153ee0-e28e-4720-8c9c-74470fbefd53" # ← paste here
environment: "RUN"
tag: ""
danger

The registration_token must be cleared after registration. Leaving it set will cause the agent to attempt re-registration on every restart.


Step 7 — Enable and Restart the Agent​

# Enable the service to start automatically on boot
systemctl enable pmp4pg-agent

# Restart to apply the updated configuration
systemctl restart pmp4pg-agent

# Verify the service is running
systemctl status pmp4pg-agent

Confirm the agent is sending metrics successfully:

tail -f /var/log/pmp4pg/agent.log

Expected output:

level=info msg="Batch sent successfully" component=os_metrics_sender status_code=201
level=info msg="Batch sent successfully" component=pg_stat_database_sender status_code=201
level=info msg="Heartbeat sent successfully" component=heartbeat_sender status_code=200

Step 8 — Verify in the Dashboard​

Within 30 seconds, the new server appears in the PMP4PG Global Dashboard with status ACTIVE.

Global Dashboard Overview


Troubleshooting​

401 Unauthorized on some endpoints​

Check that the api_key in agent.conf matches exactly what was returned during registration. Also verify that the registration_token has been cleared.

Server already exists error​

This occurs when registering a PostgreSQL cluster that shares its pg_system_identifier with an already-registered server (e.g. a VM clone or physical restore). This is handled automatically — the backend distinguishes servers by the combination of pg_system_identifier and hostname, so cloned servers register as separate entries.

Connection refused to backend​

Verify the backend.url in agent.conf and confirm network connectivity from the agent host:

curl -v http://<BACKEND_HOST>:8080/pmp/actuator/health

PostgreSQL connection error​

Verify the pmp4pg user exists and pg_hba.conf is correctly configured, then reload PostgreSQL:

systemctl reload postgresql

# Test the connection manually
sudo -u pmp4pg psql -c "SELECT 1;"

Next Steps​