#!/usr/bin/perl use strict; use warnings; use File::Basename; use File::Compare; use File::Copy; use Test::More; use lib 't'; use pgsm; # Get file name and CREATE out file name and dirs WHERE requried PGSM::setup_files_dir(basename($0)); my $PG_VERSION_STRING = `pg_config --version`; if (index(lc($PG_VERSION_STRING), lc("percona")) == -1) { plan skip_all => "pg_stat_monitor test case only for PPG server package install with extensions."; } # CREATE new PostgreSQL node and do initdb my $node = PGSM->pgsm_init_pg(); my $pgdata = $node->data_dir; # UPDATE postgresql.conf to include/load pg_stat_monitor library open my $conf, '>>', "$pgdata/postgresql.conf"; print $conf "shared_preload_libraries = 'pg_stat_monitor, pgaudit, set_user, pg_repack'\n"; print $conf "pg_stat_monitor.pgsm_bucket_time = 360000\n"; print $conf "pg_stat_monitor.pgsm_normalized_query = 'yes'\n"; close $conf; # Start server my $rt_value = $node->start; ok($rt_value == 1, "Start Server"); # Create PGSM extension my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION pg_stat_monitor;', extra_params => ['-a']); ok($cmdret == 0, "CREATE PGSM EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); ok($cmdret == 0, "Reset PGSM EXTENSION"); PGSM::append_to_debug_file($stdout); # Create Other extensions ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pgaudit;', extra_params => ['-a']); ok($cmdret == 0, "CREATE pgaudit EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS set_user;', extra_params => ['-a']); ok($cmdret == 0, "CREATE set_user EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_repack;', extra_params => ['-a']); ok($cmdret == 0, "CREATE pg_repack EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SET pgaudit.log = 'none'; CREATE EXTENSION IF NOT EXISTS postgis; SET pgaudit.log = 'all';", extra_params => ['-a']); ok($cmdret == 0, "CREATE postgis EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS postgis_raster;', extra_params => ['-a']); ok($cmdret == 0, "CREATE postgis_raster EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS postgis_sfcgal;', extra_params => ['-a']); ok($cmdret == 0, "CREATE postgis_sfcgal EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;', extra_params => ['-a']); ok($cmdret == 0, "CREATE fuzzystrmatch EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS address_standardizer;', extra_params => ['-a']); ok($cmdret == 0, "CREATE address_standardizer EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS address_standardizer_data_us;', extra_params => ['-a']); ok($cmdret == 0, "CREATE address_standardizer_data_us EXTENSION"); PGSM::append_to_debug_file($stdout); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder;', extra_params => ['-a']); ok($cmdret == 0, "CREATE postgis_tiger_geocoder EXTENSION"); PGSM::append_to_debug_file($stdout); # Print PGSM settings ($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_shared_buffer';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); ok($cmdret == 0, "Print PGSM EXTENSION Settings"); PGSM::append_to_debug_file($stdout); # Create example database and run pgbench init ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE database example;', extra_params => ['-a']); print "cmdret $cmdret\n"; ok($cmdret == 0, "CREATE Database example"); PGSM::append_to_debug_file($stdout); my $port = $node->port; print "port $port \n"; my $out = system ("pgbench -i -s 20 -p $port example"); print " out: $out \n"; ok($cmdret == 0, "Perform pgbench init"); $out = system ("pgbench -c 10 -j 2 -t 5000 -p $port example"); print " out: $out \n"; ok($cmdret == 0, "Run pgbench"); ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT datname, substr(query,0,150) AS query, SUM(calls) AS calls FROM pg_stat_monitor GROUP BY datname, query ORDER BY datname, query, calls;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); ok($cmdret == 0, "SELECT XXX FROM pg_stat_monitor"); PGSM::append_to_debug_file($stdout); # DROP EXTENSION $stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); ok($cmdret == 0, "DROP PGSM EXTENSION"); PGSM::append_to_debug_file($stdout); # Stop the server $node->stop; # Done testing for this testcase file. done_testing();