Changeset 1950

Show
Ignore:
Timestamp:
04/17/08 17:50:50 (7 months ago)
Author:
mpaschal
Message:

Check in MT::Tool helper
Convert report-slow-requests and upgrade tools to use MT::Tool
BugzID: 67410

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/release-35/tools/report-slow-request

    r1706 r1950  
    77# $Id$ 
    88 
     9package MT::Tool::ReportSlowRequest; 
    910use strict; 
    1011 
    1112use lib "./lib"; 
     13use base qw( MT::Tool ); 
    1214 
    13 use Getopt::Long qw/:config no_ignore_case/; 
    1415use List::Util qw( min ); 
    1516use Time::HiRes qw( time ); 
     
    1819use Data::Dumper; 
    1920 
    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 ); 
     21my ($arg_day, $arg_logdir, $arg_sample, $arg_slow, $arg_debug, $arg_dump); 
    2822 
    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, 
     23sub 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            ? 
    7135    }; 
    7236} 
    7337 
    74 $stash{slow} = 
    75   [ sort { $b->{time_total} <=> $a->{time_total} } @{ $stash{slow} || [] } ]; 
     38sub usage { 
     39
    7640 
    77 report( \%stash ); 
     41sub 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 
     52sub 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
    78106 
    79107sub report { 
     
    100128    } 
    101129} 
     130 
     131__PACKAGE__->main() unless caller; 
     132 
     1331; 
     134 
  • branches/release-35/tools/upgrade

    r1174 r1950  
    77# $Id$ 
    88 
     9package MT::Tool::Upgrade; 
    910use strict; 
    1011 
    11 use Getopt::Long; 
     12use lib  qw( extlib lib ); 
     13use base qw( MT::Tool ); 
     14 
    1215use 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; 
    1916use MT::Upgrade; 
    2017 
    21 my $mt = new MT(Config => 'mt.cfg') or die MT->errstr; 
     18sub usage { '[--dryrun] [--sql] [--name <name>]' } 
    2219 
    23 MT->add_callback('MT::Upgrade::SQL', 1, undef, \&sql_cb) if $sqlonly; 
     20sub help { 
     21    return q{ 
     22        Installs or upgrades a database to the current MT schema. 
    2423 
    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    }; 
    3032} 
    3133 
    32 my $install; 
    33 my $driver = MT::Object->driver; 
    34 if (!$driver || !$driver->table_exists('MT::Author')) { 
    35     $install = 1; 
     34my ($dryrun, $name, $sqlonly); 
     35 
     36sub options { 
     37    return ( 
     38        'dryrun!' => \$dryrun, 
     39        'sql!'    => \$sqlonly, 
     40        'name=s'  => \$name, 
     41    ); 
    3642} 
    3743 
    38 unless ($install || $name) { 
    39     print "Please set username to set superuser at upgrading.  cf: upgrade --name Melody\n"; 
    40     exit; 
    41 } 
    4244 
    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 
     45sub main { 
     46    my $class = shift; 
     47    my ($verbose) = $class->SUPER::main(@_); 
    5048 
    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    } 
    5757 
    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    } 
    6391} 
    6492 
     
    6896    print "\t* " . $msg . "\n" unless $sqlonly; 
    6997} 
     98 
    7099sub error { 
    71100    my $pkg = shift; 
     
    73102    confess $err; 
    74103} 
     104 
    75105sub sql_cb { 
    76106    my $cb = shift; 
     
    78108    print "$stmt\n"; 
    79109} 
     110 
     111 
     112__PACKAGE__->main() unless caller; 
     113 
     1141; 
     115