Skip to content

PMM-7: Fixes for PMM 3.3.0 (#148) #149

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pmm_psmdb_diffauth_setup/test-auth.sh
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ docker compose -f docker-compose-pmm-psmdb.yml exec -T psmdb-server systemctl re
set +e
i=1
while [ $i -le 3 ]; do
output=$(docker compose -f docker-compose-pmm-psmdb.yml exec -T psmdb-server pmm-agent setup 2>&1)
output=$(docker compose -f docker-compose-pmm-psmdb.yml exec -T psmdb-server pmm-agent setup --config-file=/usr/local/percona/pmm/config/pmm-agent.yaml --server-address=pmm-server:8443 --metrics-mode=auto --server-username=admin --server-password=admin --server-insecure-tls)
exit_code=$?

if [ $exit_code -ne 0 ] && [[ $output == *"500 Internal Server Error"* ]]; then
Expand Down
32 changes: 32 additions & 0 deletions pmm_qa/data/load_pgsql.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
-- Step 1: Show initial buffers_alloc value
SELECT 'Initial buffers_alloc' AS info, buffers_alloc FROM pg_stat_bgwriter;

-- Step 2: Drop and create a large test table (~500MB+)
DROP TABLE IF EXISTS buffer_test;

CREATE TABLE buffer_test AS
SELECT
generate_series(1, 1_000_000) AS id,
md5(random()::text) AS filler;

ANALYZE buffer_test;

-- Step 3: Perform repeated full-table scans to stress buffer allocation
DO $$
BEGIN
FOR i IN 1..10 LOOP
RAISE NOTICE 'Running scan iteration %', i;
PERFORM COUNT(*) FROM buffer_test;
END LOOP;
END $$;

---- Step 4: Show final buffers_alloc value
--SELECT 'Final buffers_alloc' AS info, buffers_alloc FROM pg_stat_bgwriter;
VACUUM;
SELECT pg_switch_wal();

-- Step 5: Query the data
SELECT * FROM buffer_test;

-- Step 6: Delete the data
DELETE FROM buffer_test;
25 changes: 25 additions & 0 deletions pmm_qa/percona-distribution-postgresql/data/background_load.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
-- Step 1: Create a test table
CREATE TABLE IF NOT EXISTS test_users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(150),
created_at TIMESTAMP DEFAULT NOW(),
bio TEXT
);

-- Step 2: Insert 10,000 rows
INSERT INTO test_users (name, email, bio)
SELECT
'User_' || gs::TEXT AS name,
'user_' || gs::TEXT || '@example.com' AS email,
'This is a generated bio for user #' || gs::TEXT
FROM generate_series(1, 10000) AS gs;

-- Step 3: Query the data
SELECT * FROM test_users;

-- Step 4: Delete the data
DELETE FROM test_users;

-- Step 5: Drop the table
DROP TABLE test_users;
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
wal_level = replica
wal_level = logical
max_wal_senders = 10
wal_keep_size = 64MB
hot_standby = on
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
set_fact:
nodes_count: 3
when: nodes_count | int < 3
- name: Set external facing port in patroni setup
set_fact:
pdpgsql_port: 6432

- name: Remove old data folders
shell: 'rm -fr {{ data_dir }}'
Expand Down Expand Up @@ -173,14 +176,19 @@
- name: Add service to pmm server
community.docker.docker_container_exec:
container: "pdpgsql_pmm_patroni_{{ pg_version }}_{{ item }}"
command: pmm-admin add postgresql --username=postgres --password=postgres --query-source=pgstatmonitor pdpgsql_pmm_patroni_{{ pg_version }}_{{ item }}{{ random_service_name_value }} --debug 127.0.0.1:5432
command: pmm-admin add postgresql --username=postgres --cluster=pdpgsql_patroni_cluster --environment=pdpgsql_patroni_environment --password=postgres --query-source=pgstatmonitor pdpgsql_pmm_patroni_{{ pg_version }}_{{ item }}{{ random_service_name_value }} --debug 127.0.0.1:5432
loop: "{{ range(1, nodes_count | int + 1) | list }}"

- name: Add patroni service to pmm server
community.docker.docker_container_exec:
container: "pdpgsql_pmm_patroni_{{ pg_version }}_1"
command: pmm-admin add external --listen-port=8008 --service-name=patroni_service_1{{ random_service_name_value }}

- name: Add patroni service to pmm server
community.docker.docker_container_exec:
container: "pdpgsql_pmm_patroni_{{ pg_version }}_{{ item }}"
command: pmm-admin add external --listen-port=8008 --service-name=patroni_service_{{ item }}{{ random_service_name_value }}
loop: "{{ range(1, nodes_count | int + 1) | list }}"
command: pmm-admin add external --listen-port=8008 --cluster=pdpgsql_patroni_service_cluster --environment=pdpgsql_patroni_service_environment --service-name=patroni_service_{{ item }}{{ random_service_name_value }}
loop: "{{ range(2, nodes_count | int + 1) | list }}"

- name: Log Patroni cluster
community.docker.docker_container_exec:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,15 @@

- name: Remove old PostgreSQL primary container
community.docker.docker_container:
name: "pdpgsql_pmm_{{ pg_version }}_1"
name: "pdpgsql_pmm_replication_{{ pg_version }}_1"
image: "{{ docker_repo }}:{{ pg_version }}"
restart_policy: always
state: absent
ignore_errors: yes

- name: Start PostgreSQL primary container
community.docker.docker_container:
name: "pdpgsql_pmm_{{ pg_version }}_1"
name: "pdpgsql_pmm_replication_{{ pg_version }}_1"
image: "{{ docker_repo }}:{{ pg_version }}"
restart_policy: always
state: started
Expand All @@ -70,7 +70,7 @@

- name: Create replication user
community.docker.docker_container_exec:
container: "pdpgsql_pmm_{{ pg_version }}_1"
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
user: postgres
command: >
psql -c "
Expand All @@ -79,14 +79,14 @@

- name: Stop and remove replica if exists
community.docker.docker_container:
name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}"
name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}"
state: absent
loop: "{{ range(2, nodes_count | int + 1) | list }}"
ignore_errors: yes

- name: Start Percona Distribution PostgreSQL replica container
community.docker.docker_container:
name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}"
name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}"
image: "{{ docker_repo }}:{{ pg_version }}"
restart_policy: "no"
state: started
Expand All @@ -104,14 +104,14 @@

- name: Wipe replica data directory before basebackup
community.docker.docker_container_exec:
container: "pdpgsql_pmm_{{ pg_version }}_{{ item }}"
container: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}"
user: root
command: rm -rf /data/db/*
loop: "{{ range(2, nodes_count | int + 1) | list }}"

- name: Create PostgreSQL user 'pmm' with password
community.docker.docker_container_exec:
container: "pdpgsql_pmm_{{ pg_version }}_1"
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
user: postgres
command: >
bash -c '
Expand All @@ -121,16 +121,16 @@
"
'

- name: Create custom database for pgbench
- name: Create custom database
community.docker.docker_container_exec:
container: "pdpgsql_pmm_{{ pg_version }}_1"
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
user: postgres
command: >
bash -c "
echo \"
CREATE DATABASE pgbench;
\\c pgbench
GRANT CONNECT ON DATABASE pgbench TO pmm;
CREATE DATABASE test_database;
\\c test_database
GRANT CONNECT ON DATABASE test_database TO pmm;
GRANT USAGE ON SCHEMA public TO pmm;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO pmm;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
Expand All @@ -140,20 +140,20 @@

- name: Run pg_basebackup from primary to replica
community.docker.docker_container_exec:
container: "pdpgsql_pmm_{{ pg_version }}_{{ item }}"
container: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}"
user: root
command: >
bash -c "
export PGPASSWORD='{{ replication_password }}' && \
timeout 120s \
pg_basebackup --pgdata=/data/db -R -v -Fp -Xs -P \
--host=pdpgsql_pmm_{{ pg_version }}_1 --port=5432 -U {{ replication_user }} > /tmp/pg_basebackup.log 2>&1
--host=pdpgsql_pmm_replication_{{ pg_version }}_1 --port=5432 -U {{ replication_user }} > /tmp/pg_basebackup.log 2>&1
"
loop: "{{ range(2, nodes_count | int + 1) | list }}"

- name: Remove temporary backup container
docker_container:
name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}"
name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}"
state: absent
loop: "{{ range(2, nodes_count | int + 1) | list }}"

Expand All @@ -168,7 +168,7 @@

- name: Restart Percona Distribution PostgreSQL container with custom command
community.docker.docker_container:
name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}"
name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}"
image: "{{ docker_repo }}:{{ pg_version }}"
restart: true
state: started
Expand All @@ -188,17 +188,17 @@
- name: Install pg stat monitor.
include_tasks: ./tasks/install_pg_stat-monitor.yml
vars:
container_name: "pdpgsql_pmm_{{ pg_version }}"
container_name: "pdpgsql_pmm_replication_{{ pg_version }}"

- name: Install and add pmm client.
include_tasks: ../tasks/install_pmm_client.yml
vars:
container_name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}"
container_name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}"
loop: "{{ range(1, nodes_count | int + 1) | list }}"

- name: Get already connected services to pmm server
community.docker.docker_container_exec:
container: "pdpgsql_pmm_{{ pg_version }}_1"
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
command: >
sh -c 'curl --location --insecure -u"admin:{{ admin_password }}" -s --request GET "http://{{ pmm_server_ip }}:{{ '80' if pmm_server_ip is ansible.utils.ipv4 else '8080' }}/v1/management/services" | jq -r ".services[].service_name"'
register: pmm_server_services
Expand All @@ -217,20 +217,57 @@

- name: Add service to pmm server
community.docker.docker_container_exec:
container: "pdpgsql_pmm_{{ pg_version }}_{{ item }}"
command: pmm-admin add postgresql --username=pmm --password=pmm --query-source=pgstatmonitor pdpgsql_pmm_{{ pg_version }}_{{ item }}{{ random_service_name_value }} --debug 127.0.0.1:5432
container: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}"
command: pmm-admin add postgresql --username=pmm --password=pmm --cluster=pdpgsql_replication_cluster --environment=pdpgsql_replication_environment --query-source=pgstatmonitor pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}{{ random_service_name_value }} --debug 127.0.0.1:5432
loop: "{{ range(1, nodes_count | int + 1) | list }}"

- name: Run load on primary node.
include_tasks: ../postgresql/tasks/run_load_pgsql.yml
vars:
node_name: "pdpgsql_pmm_{{ pg_version }}_1"
pgbench_clients: 10
pgbench_time: 120
pgbench_scale: 1000
- name: Create pg_custom_publication view using psql
community.docker.docker_container_exec:
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
user: postgres
command: >
bash -c 'psql -U postgres -d postgres <<SQL
CREATE OR REPLACE VIEW pg_custom_publication AS
SELECT
pubname,
puballtables,
pubinsert,
pubupdate,
pubdelete
FROM
pg_publication;
SQL'

- name: Create pg_stat_statements extension
community.docker.docker_container_exec:
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
user: postgres
command: >
psql -U postgres -d test_database -c "
CREATE EXTENSION IF NOT EXISTS pg_stat_monitor;
SELECT pg_stat_monitor_version();
"

- name: Copy sample load into container
community.docker.docker_container_copy_into:
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
path: ../data/load_pgsql.sql
container_path: /load_pgsql.sql

- name: Start permanent SQL load in background
community.docker.docker_container_exec:
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
command: >
sh -c "nohup bash -c 'while true; do echo Starting insert at $(date +\"%Y-%m-%d %H:%M:%S\"); psql -U postgres -d test_database -f /load_pgsql.sql; sleep 30; done' > /tmp/sql_loop.log 2>&1 &"

- name: Create logical replication slots
community.docker.docker_container_exec:
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
user: postgres
command: psql -U postgres -d postgres -c "SELECT * FROM pg_create_logical_replication_slot('test_slot', 'test_decoding');"

- name: Check replication status on primary
community.docker.docker_container_exec:
container: "pdpgsql_pmm_{{ pg_version }}_1"
container: "pdpgsql_pmm_replication_{{ pg_version }}_1"
user: postgres
command: psql -c "SELECT * FROM pg_stat_replication;"
Loading
Loading