diff --git a/bin/pt-stalk b/bin/pt-stalk index 401eb1e7..c52a801a 100755 --- a/bin/pt-stalk +++ b/bin/pt-stalk @@ -1013,8 +1013,13 @@ collect_system_data() { } collect_mysql_data_loop() { - (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ + + + (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ >> "$d/$p-processlist" & + (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SELECT * FROM performance_schema.threads\G") \ + >> "$d/$p-threads" & + if [ "$have_lock_waits_table" ]; then (echo $ts; lock_waits "$d/lock_waits.running") >>"$d/$p-lock-waits" & (echo $ts; transactions) >>"$d/$p-transactions" & diff --git a/lib/bash/collect.sh b/lib/bash/collect.sh index 44b039eb..9ae0f3db 100644 --- a/lib/bash/collect.sh +++ b/lib/bash/collect.sh @@ -286,8 +286,15 @@ collect_system_data() { } collect_mysql_data_loop() { - (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ + + # SHOW FULL PROCESSLIST duplicates information in performance_schema.threads we collecting now + # Keeping it for backward compatibility and may remove in the future + + (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ >> "$d/$p-processlist" & + (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SELECT * FROM performance_schema.threads\G") \ + >> "$d/$p-threads" & + if [ "$have_lock_waits_table" ]; then (echo $ts; lock_waits "$d/lock_waits.running") >>"$d/$p-lock-waits" & (echo $ts; transactions) >>"$d/$p-transactions" & diff --git a/t/pt-stalk/PT-1718-threads.t b/t/pt-stalk/PT-1718-threads.t new file mode 100644 index 00000000..2679f8bb --- /dev/null +++ b/t/pt-stalk/PT-1718-threads.t @@ -0,0 +1,69 @@ +#!/usr/bin/env perl + +BEGIN { + die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n" + unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH}; + unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib"; +}; + +use strict; +use warnings FATAL => 'all'; +use English qw(-no_match_vars); +use Test::More; +use PerconaTest; +use DSNParser; +use Sandbox; +require VersionParser; + +my $dp = new DSNParser(opts=>$dsn_opts); +my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); +my $dbh = $sb->get_dbh_for('source'); + +if ( !$dbh ) { + plan skip_all => 'Cannot connect to sandbox source'; +} + +my $cnf = "/tmp/12345/my.sandbox.cnf"; +my $pid_file = "/tmp/pt-stalk.pid.$PID"; +my $log_file = "/tmp/pt-stalk.log.$PID"; +my $dest = "/tmp/pt-stalk.collect.$PID"; +my $int_file = "/tmp/pt-stalk-after-interval-sleep"; +my $pid; + +sub cleanup { + diag(`rm $pid_file $log_file $int_file 2>/dev/null`); + diag(`rm -rf $dest 2>/dev/null`); +} +my $retval = system("$trunk/bin/pt-stalk -- --no-defaults --protocol socket --socket /dev/null >$log_file 2>&1"); +my $output = `cat $log_file`; + +# ########################################################################### +# Test if threads collection works +# ########################################################################### + +cleanup(); + +$retval = system("$trunk/bin/pt-stalk --no-stalk --dest $dest --pid $pid_file --iterations 1 -- --defaults-file=$cnf >$log_file 2>&1"); + +PerconaTest::wait_until(sub { !-f $pid_file }); + +$output = `ls $dest`; + +like( + $output, + qr/threads/, + "threads data collected" +); + +$output = `cat $dest/*-threads`; + +like( + $output, + qr/(threads)/, + "threads collection has data" +); + +cleanup(); +$sb->wipe_clean($dbh); +ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); +done_testing()