Changeset 1950
- Timestamp:
- 04/17/08 17:50:50 (22 months ago)
- Location:
- branches/release-35
- Files:
-
- 1 added
- 2 modified
-
lib/MT/Tool.pm (added)
-
tools/report-slow-request (modified) (3 diffs)
-
tools/upgrade (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/release-35/tools/report-slow-request
r1706 r1950 7 7 # $Id$ 8 8 9 package MT::Tool::ReportSlowRequest; 9 10 use strict; 10 11 11 12 use lib "./lib"; 13 use base qw( MT::Tool ); 12 14 13 use Getopt::Long qw/:config no_ignore_case/;14 15 use List::Util qw( min ); 15 16 use Time::HiRes qw( time ); … … 18 19 use Data::Dumper; 19 20 20 GetOptions( 21 'day=s' => \my ($arg_day), 22 'logdir=s' => \my ($arg_logdir), 23 'sample=i' => \my ($arg_sample), 24 'slow=i' => \my ($arg_slow), 25 'debug' => \my ($arg_debug), 26 'dump' => \my ($arg_dump), 27 ); 21 my ($arg_day, $arg_logdir, $arg_sample, $arg_slow, $arg_debug, $arg_dump); 28 22 29 $arg_slow ||= 2; 30 31 my $proc = MT::Util::LogProcessor->new( 32 { 33 debug => $arg_debug, 34 logdir => $arg_logdir || '.', 35 sample => $arg_sample, 36 day => $arg_day || 'yesterday', 37 file_pattern => 'pl-\d{8}.log', 38 } 39 ); 40 41 my %stash = ( today => $proc->day ); 42 my ( $total_records, $elapsed ) = $proc->process_log_files( 43 sub { 44 my ($rec) = @_; 45 46 my $secs = int $rec->{time_total}; 47 48 my $bucket = $secs > 10 ? 10 : $secs; 49 $stash{by_seconds}[$bucket]++; 50 51 $stash{total_requests}++; 52 53 if ( $secs > $arg_slow - 1 ) { 54 push @{ $stash{slow} }, $rec; 55 } 56 } 57 ); 58 59 printf "Processed %d records in %.02f seconds; speed: %.02f recs/sec\n", 60 $total_records, $elapsed, $total_records / ( $elapsed || 1 ) 61 if $arg_debug; 62 63 for my $bucket ( 0 .. $#{ $stash{by_seconds} } ) { 64 my $count = $stash{by_seconds}[$bucket] || 0; 65 $stash{restime_histogram}[$bucket] = { 66 count => $count, 67 range => $bucket == 10 68 ? '10+ sec' 69 : $bucket . '-' . ( $bucket + 1 ) . 's', 70 percent => int( $count / $stash{total_requests} * 100 ) || 1, 23 sub help { 24 return q{ 25 --logdir <dir> Look for logs in directory <dir>. By default, logs 26 in the current directory are analyzed. 27 --sample <num> ? 28 --slow <secs> Number of seconds after which a request is listed 29 as one of the slowest. By default, requests over 2 30 seconds are considered the slowest. 31 --day <name> The name of the day to examine; either 'today', 32 'yesterday', or a date in the format YYYY-MM-DD. 33 --debug Enable debugging output. 34 --dump ? 71 35 }; 72 36 } 73 37 74 $stash{slow} = 75 [ sort { $b->{time_total} <=> $a->{time_total} } @{ $stash{slow} || [] } ]; 38 sub usage { 39 } 76 40 77 report( \%stash ); 41 sub options { 42 return ( 43 'logdir=s' => \$arg_logdir, 44 'sample=i' => \$arg_sample, 45 'slow=i' => \$arg_slow, 46 'day=s' => \$arg_day, 47 'debug' => \$arg_debug, 48 'dump' => \$arg_dump, 49 ); 50 } 51 52 sub main { 53 my $class = shift; 54 my ($verbose) = $class->SUPER::main(@_); 55 56 $arg_slow ||= 2; 57 58 my $proc = MT::Util::LogProcessor->new( 59 { 60 debug => $arg_debug, 61 logdir => $arg_logdir || '.', 62 sample => $arg_sample, 63 day => $arg_day || 'yesterday', 64 file_pattern => 'pl-\d{8}.log', 65 } 66 ); 67 68 my %stash = ( today => $proc->day ); 69 my ( $total_records, $elapsed ) = $proc->process_log_files( 70 sub { 71 my ($rec) = @_; 72 73 my $secs = int $rec->{time_total}; 74 75 my $bucket = $secs > 10 ? 10 : $secs; 76 $stash{by_seconds}[$bucket]++; 77 78 $stash{total_requests}++; 79 80 if ( $secs > $arg_slow - 1 ) { 81 push @{ $stash{slow} }, $rec; 82 } 83 } 84 ); 85 86 printf "Processed %d records in %.02f seconds; speed: %.02f recs/sec\n", 87 $total_records, $elapsed, $total_records / ( $elapsed || 1 ) 88 if $arg_debug; 89 90 for my $bucket ( 0 .. $#{ $stash{by_seconds} } ) { 91 my $count = $stash{by_seconds}[$bucket] || 0; 92 $stash{restime_histogram}[$bucket] = { 93 count => $count, 94 range => $bucket == 10 95 ? '10+ sec' 96 : $bucket . '-' . ( $bucket + 1 ) . 's', 97 percent => int( $count / $stash{total_requests} * 100 ) || 1, 98 }; 99 } 100 101 $stash{slow} = 102 [ sort { $b->{time_total} <=> $a->{time_total} } @{ $stash{slow} || [] } ]; 103 104 report( \%stash ); 105 } 78 106 79 107 sub report { … … 100 128 } 101 129 } 130 131 __PACKAGE__->main() unless caller; 132 133 1; 134 -
branches/release-35/tools/upgrade
r1174 r1950 7 7 # $Id$ 8 8 9 package MT::Tool::Upgrade; 9 10 use strict; 10 11 11 use Getopt::Long; 12 use lib qw( extlib lib ); 13 use base qw( MT::Tool ); 14 12 15 use Carp qw(confess); 13 GetOptions("dryrun", \my($dryrun), "name:s", \my($name), "sql", \my($sqlonly));14 15 use lib 'extlib';16 use lib 'lib';17 18 use MT;19 16 use MT::Upgrade; 20 17 21 my $mt = new MT(Config => 'mt.cfg') or die MT->errstr; 18 sub usage { '[--dryrun] [--sql] [--name <name>]' } 22 19 23 MT->add_callback('MT::Upgrade::SQL', 1, undef, \&sql_cb) if $sqlonly; 20 sub help { 21 return q{ 22 Installs or upgrades a database to the current MT schema. 24 23 25 $dryrun = 1 if $sqlonly; 26 27 if (!$sqlonly) { 28 print "upgrade -- A command line tool for upgrading the schema for Movable Type.\n"; 29 print "(Non-destructive mode)\n" if $dryrun; 24 --dryrun Determine the upgrade steps required without 25 executing any changes. 26 --sql Report the SQL that would be performed instead 27 of executing it. 28 --name <name> The author as whom to perform the upgrade steps. 29 Required when performing an upgrade (not at 30 initial install). 31 }; 30 32 } 31 33 32 my $install; 33 my $driver = MT::Object->driver; 34 if (!$driver || !$driver->table_exists('MT::Author')) { 35 $install = 1; 34 my ($dryrun, $name, $sqlonly); 35 36 sub options { 37 return ( 38 'dryrun!' => \$dryrun, 39 'sql!' => \$sqlonly, 40 'name=s' => \$name, 41 ); 36 42 } 37 43 38 unless ($install || $name) {39 print "Please set username to set superuser at upgrading. cf: upgrade --name Melody\n";40 exit;41 }42 44 43 my $author_id; 44 if (!$install && $name) { 45 require MT::BasicAuthor; 46 my $a = MT::BasicAuthor->load({name => $name}); 47 die "Not found user $name:" . MT::BasicAuthor->errstr if !$a; 48 $author_id = $a->id || 0; 49 } 45 sub main { 46 my $class = shift; 47 my ($verbose) = $class->SUPER::main(@_); 50 48 51 my $updated = MT::Upgrade->do_upgrade(App => 'main', 52 DryRun => $dryrun, 53 Install => $install, 54 SuperUser => $author_id, 55 CLI => 1, 56 ); 49 if ($sqlonly) { 50 $dryrun = 1; 51 MT->add_callback('MT::Upgrade::SQL', 1, undef, \&sql_cb); 52 } 53 else { 54 print "upgrade -- A command line tool for upgrading the schema for Movable Type.\n"; 55 print "(Non-destructive mode)\n" if $dryrun; 56 } 57 57 58 if ($install) { 59 print "Installation complete.\n"; 60 } else { 61 print "Upgrade complete!\n" if !$dryrun && $updated; 62 print "Your schema is up to date already.\n" if defined $updated && !$updated; 58 my $install; 59 my $driver = MT::Object->driver; 60 if (!$driver || !$driver->table_exists('MT::Author')) { 61 $install = 1; 62 } 63 64 unless ($install || $name) { 65 print "Please set username to set superuser at upgrading. cf: upgrade --name Melody\n"; 66 exit; 67 } 68 69 my $author_id; 70 if (!$install && $name) { 71 require MT::BasicAuthor; 72 my $a = MT::BasicAuthor->load({name => $name}) 73 or die "Not found user $name:" . MT::BasicAuthor->errstr; 74 $author_id = $a->id; 75 } 76 77 my $updated = MT::Upgrade->do_upgrade( 78 App => __PACKAGE__, 79 DryRun => $dryrun, 80 Install => $install, 81 SuperUser => $author_id, 82 CLI => 1, 83 ); 84 85 if ($install) { 86 print "Installation complete.\n"; 87 } else { 88 print "Upgrade complete!\n" if !$dryrun && $updated; 89 print "Your schema is up to date already.\n" if defined $updated && !$updated; 90 } 63 91 } 64 92 … … 68 96 print "\t* " . $msg . "\n" unless $sqlonly; 69 97 } 98 70 99 sub error { 71 100 my $pkg = shift; … … 73 102 confess $err; 74 103 } 104 75 105 sub sql_cb { 76 106 my $cb = shift; … … 78 108 print "$stmt\n"; 79 109 } 110 111 112 __PACKAGE__->main() unless caller; 113 114 1; 115
