mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-10 13:11:32 +00:00
PT-2289 - Allow pt-stalk do disable ps-lock-transactions data collection via parameter
- Implemented feature - Started working on the test
This commit is contained in:
37
bin/pt-stalk
37
bin/pt-stalk
@@ -971,8 +971,10 @@ collect_mysql_data_one() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "mysqladmin" ]; then
|
||||
$CMD_MYSQLADMIN $EXT_ARGV ext -i$OPT_SLEEP_COLLECT -c$cnt >>"$d/$p-mysqladmin" &
|
||||
mysqladmin_pid=$!
|
||||
fi
|
||||
|
||||
ps_instrumentation_enabled=$($CMD_MYSQL $EXT_ARGV -e 'SELECT ENABLED FROM performance_schema.setup_instruments WHERE NAME = "transaction";' \
|
||||
| sed "2q;d" | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')
|
||||
@@ -1014,18 +1016,25 @@ collect_system_data() {
|
||||
|
||||
collect_mysql_data_loop() {
|
||||
|
||||
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "processlist" ]; then
|
||||
(echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \
|
||||
>> "$d/$p-processlist" &
|
||||
fi
|
||||
|
||||
(echo $ts; $CMD_MYSQL $EXT_ARGV -e "SELECT * FROM performance_schema.threads\G") \
|
||||
>> "$d/$p-threads" &
|
||||
|
||||
if [ "$have_lock_waits_table" ]; then
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "lock-waits" ]; then
|
||||
(echo $ts; lock_waits "$d/lock_waits.running") >>"$d/$p-lock-waits" &
|
||||
fi
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "transactions" ]; then
|
||||
(echo $ts; transactions) >>"$d/$p-transactions" &
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "${mysql_version}" '>' "5.6" ] && [ $ps_instrumentation_enabled == "yes" ]; then
|
||||
if [ "${mysql_version}" '>' "5.6" ] && [ $ps_instrumentation_enabled == "yes" ] \
|
||||
&& ! [ "${OPT_SKIP_COLLECTION}" =~ "ps-locks-transactions" ]; then
|
||||
ps_locks_transactions "$d/$p-ps-locks-transactions"
|
||||
fi
|
||||
|
||||
@@ -1252,6 +1261,7 @@ innodb_status() {
|
||||
|
||||
local innostat=""
|
||||
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "innodbstatus" ]; then
|
||||
$CMD_MYSQL $EXT_ARGV -e "SHOW /*!40100 ENGINE*/ INNODB STATUS\G" \
|
||||
>> "$d/$p-innodbstatus$n"
|
||||
grep "END OF INNODB" "$d/$p-innodbstatus$n" >/dev/null || {
|
||||
@@ -1266,6 +1276,7 @@ innodb_status() {
|
||||
done
|
||||
fi
|
||||
}
|
||||
fi
|
||||
}
|
||||
|
||||
rocksdb_status() {
|
||||
@@ -1274,7 +1285,7 @@ rocksdb_status() {
|
||||
has_rocksdb=`$CMD_MYSQL $EXT_ARGV -e "SHOW ENGINES" | grep -i 'rocksdb'`
|
||||
exit_code=$?
|
||||
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
if [ $exit_code -eq 0 ] && ! [ "${OPT_SKIP_COLLECTION}" =~ "rocksdbstatus" ]; then
|
||||
$CMD_MYSQL $EXT_ARGV -e "SHOW ENGINE ROCKSDB STATUS\G" \
|
||||
>> "$d/$p-rocksdbstatus$n" || rm -f "$d/$p-rocksdbstatus$n"
|
||||
fi
|
||||
@@ -1356,6 +1367,7 @@ collect_mysql_variables() {
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "thread-variables" ]; then
|
||||
sql="select * from performance_schema.variables_by_thread order by thread_id, variable_name;"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
@@ -1367,6 +1379,7 @@ collect_mysql_variables() {
|
||||
sql="select * from performance_schema.status_by_thread order by thread_id, variable_name; "
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
@@ -1727,6 +1740,18 @@ main() {
|
||||
log 'Both options --system-only and --mysql-only specified, collecting only disk-space, hostname, output, and trigger metrics';
|
||||
fi
|
||||
|
||||
if [ "$OPT_SKIP_COLLECTION" ]; then
|
||||
local supported_skips="ps-locks-transactions,thread-variables,innodbstatus,lock-waits,mysqladmin,processlist,rocksdbstatus,transactions"
|
||||
IFS=',' read -ra skips <<< "$OPT_SKIP_COLLECTION"
|
||||
for skip in "${skips[@]}"; do
|
||||
echo "$supported_skips" | grep -q "$skip"
|
||||
if [ $? -ne 0 ]; then
|
||||
log "Invalid --skip-collection value: $skip, exiting."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Note: $$ is the parent's PID, but we're a child proc.
|
||||
# Bash 4 has $BASHPID but we can't rely on that. Consequently,
|
||||
# we don't know our own PID. See the usage of $! below.
|
||||
@@ -2391,6 +2416,12 @@ How long to sleep between collection loop cycles. This is useful with
|
||||
C<--no-stalk> to do long collections. For example, to collect data every
|
||||
minute for an hour, specify: C<--no-stalk --run-time 3600 --sleep-collect 60>.
|
||||
|
||||
=item --skip-collection
|
||||
|
||||
type: array
|
||||
|
||||
A comma-separated list of collection types to skip. Valid values are: C<"ps-locks-transactions,thread-variables,innodbstatus,lock-waits,mysqladmin,processlist,rocksdbstatus,transactions">.
|
||||
|
||||
=item --socket
|
||||
|
||||
short form: -S; type: string
|
||||
|
@@ -243,8 +243,10 @@ collect_mysql_data_one() {
|
||||
# get and keep a connection to the database; in troubled times
|
||||
# the database tends to exceed max_connections, so reconnecting
|
||||
# in the loop tends not to work very well.
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "mysqladmin" ]; then
|
||||
$CMD_MYSQLADMIN $EXT_ARGV ext -i$OPT_SLEEP_COLLECT -c$cnt >>"$d/$p-mysqladmin" &
|
||||
mysqladmin_pid=$!
|
||||
fi
|
||||
|
||||
ps_instrumentation_enabled=$($CMD_MYSQL $EXT_ARGV -e 'SELECT ENABLED FROM performance_schema.setup_instruments WHERE NAME = "transaction";' \
|
||||
| sed "2q;d" | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')
|
||||
@@ -289,18 +291,25 @@ collect_mysql_data_loop() {
|
||||
|
||||
# SHOW FULL PROCESSLIST duplicates information in performance_schema.threads we collecting now
|
||||
# Keeping it for backward compatibility and may remove in the future
|
||||
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "processlist" ]; then
|
||||
(echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \
|
||||
>> "$d/$p-processlist" &
|
||||
fi
|
||||
|
||||
(echo $ts; $CMD_MYSQL $EXT_ARGV -e "SELECT * FROM performance_schema.threads\G") \
|
||||
>> "$d/$p-threads" &
|
||||
|
||||
if [ "$have_lock_waits_table" ]; then
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "lock-waits" ]; then
|
||||
(echo $ts; lock_waits "$d/lock_waits.running") >>"$d/$p-lock-waits" &
|
||||
fi
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "transactions" ]; then
|
||||
(echo $ts; transactions) >>"$d/$p-transactions" &
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "${mysql_version}" '>' "5.6" ] && [ $ps_instrumentation_enabled == "yes" ]; then
|
||||
if [ "${mysql_version}" '>' "5.6" ] && [ $ps_instrumentation_enabled == "yes" ] \
|
||||
&& ! [ "${OPT_SKIP_COLLECTION}" =~ "ps-locks-transactions" ]; then
|
||||
ps_locks_transactions "$d/$p-ps-locks-transactions"
|
||||
fi
|
||||
|
||||
@@ -538,6 +547,7 @@ innodb_status() {
|
||||
|
||||
local innostat=""
|
||||
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "innodbstatus" ]; then
|
||||
$CMD_MYSQL $EXT_ARGV -e "SHOW /*!40100 ENGINE*/ INNODB STATUS\G" \
|
||||
>> "$d/$p-innodbstatus$n"
|
||||
grep "END OF INNODB" "$d/$p-innodbstatus$n" >/dev/null || {
|
||||
@@ -552,6 +562,7 @@ innodb_status() {
|
||||
done
|
||||
fi
|
||||
}
|
||||
fi
|
||||
}
|
||||
|
||||
rocksdb_status() {
|
||||
@@ -560,7 +571,7 @@ rocksdb_status() {
|
||||
has_rocksdb=`$CMD_MYSQL $EXT_ARGV -e "SHOW ENGINES" | grep -i 'rocksdb'`
|
||||
exit_code=$?
|
||||
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
if [ $exit_code -eq 0 ] && ! [ "${OPT_SKIP_COLLECTION}" =~ "rocksdbstatus" ]; then
|
||||
$CMD_MYSQL $EXT_ARGV -e "SHOW ENGINE ROCKSDB STATUS\G" \
|
||||
>> "$d/$p-rocksdbstatus$n" || rm -f "$d/$p-rocksdbstatus$n"
|
||||
fi
|
||||
@@ -646,6 +657,7 @@ collect_mysql_variables() {
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
|
||||
if ! [ "${OPT_SKIP_COLLECTION}" =~ "thread-variables" ]; then
|
||||
sql="select * from performance_schema.variables_by_thread order by thread_id, variable_name;"
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
@@ -657,6 +669,7 @@ collect_mysql_variables() {
|
||||
sql="select * from performance_schema.status_by_thread order by thread_id, variable_name; "
|
||||
echo -e "\n$sql\n" >> $outfile
|
||||
$CMD_MYSQL $EXT_ARGV -e "$sql" >> $outfile
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
79
t/pt-stalk/pt-2289.t
Normal file
79
t/pt-stalk/pt-2289.t
Normal file
@@ -0,0 +1,79 @@
|
||||
#!/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 threads;
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
use Time::HiRes qw(sleep);
|
||||
|
||||
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;
|
||||
my $output;
|
||||
my $retval;
|
||||
|
||||
sub cleanup {
|
||||
diag(`rm $pid_file $log_file $int_file 2>/dev/null`);
|
||||
diag(`rm -rf $dest 2>/dev/null`);
|
||||
}
|
||||
|
||||
# ###########################################################################
|
||||
# Test that it collects all data when no --skip-collection is given.
|
||||
# ###########################################################################
|
||||
|
||||
cleanup();
|
||||
|
||||
$retval = system("$trunk/bin/pt-stalk --no-stalk --pid $pid_file --log $log_file --dest $dest --iterations 1 -- --defaults-file=$cnf >$log_file 2>&1");
|
||||
|
||||
PerconaTest::wait_until(sub { !-f $pid_file });
|
||||
|
||||
is(
|
||||
$retval >> 8,
|
||||
0,
|
||||
"Parent exit 0"
|
||||
);
|
||||
|
||||
ok(
|
||||
-d $dest,
|
||||
"Creates --dest (collect) dir"
|
||||
);
|
||||
|
||||
# ps-locks-transactions,thread-variables,innodbstatus,lock-waits,mysqladmin,processlist,rocksdbstatus,transactions
|
||||
ok(
|
||||
glob("$dest/*-ps-locks-transactions"),
|
||||
"Collects *-ps-locks-transactions"
|
||||
) or diag(`ls $dest`);
|
||||
|
||||
|
||||
# #############################################################################
|
||||
# Done.
|
||||
# #############################################################################
|
||||
|
||||
cleanup();
|
||||
diag(`rm -rf $dest 2>/dev/null`);
|
||||
$sb->wipe_clean($dbh);
|
||||
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
||||
done_testing;
|
Reference in New Issue
Block a user