IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 5, 2010, 3:54:50 PM (16 years ago)
Author:
rhenders
Message:

major changes to support generaionof IPP metrics

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/czartool/CzarDb.pm

    r29582 r29686  
    1010use base 'czartool::MySQLDb';
    1111our @ISA = qw(czartool::MySQLDb);    # inherits from MySQLDb
     12
     13use czartool::StageMetrics;
    1214
    1315###########################################################################
     
    4951    return 1;
    5052}
     53
     54###########################################################################
     55#
     56# Gets stdscience lables active in the provided time period
     57# TODO ugly hack to avoind getting update labels
     58#
     59###########################################################################
     60sub getStdscienceLabelsInTimePeriod {
     61    my ($self, $begin, $end, $labels) = @_;
     62
     63    my $query = $self->{_db}->prepare(<<SQL);
     64
     65    SELECT DISTINCT label
     66        FROM chip
     67        WHERE timestamp >= '$begin'
     68        AND timestamp <= '$end'
     69        AND label NOT LIKE '%_ud%'
     70        AND label NOT LIKE 'update%'
     71        AND label NOT LIKE 'all_%_labels'
     72SQL
     73
     74    if (!$query->execute) {return 0;}
     75
     76    ${$labels} = $query->fetchall_arrayref();
     77
     78    return 1;
     79}
     80
     81
    5182
    5283###########################################################################
     
    264295}
    265296
     297###########################################################################
     298#
     299# Returns the start and end times during one day for the provided label and start/end stages
     300#
     301###########################################################################
     302sub getDayTimings {
     303    my ($self, $label, $startStage, $endStage, $begin, $started, $finished, $timeTaken) = @_;
     304
     305    my $end = $self->addInterval($begin, "1 DAY");
     306
     307    my $startStageMetrics = new czartool::StageMetrics($startStage, $label, $begin, $end);
     308    my $endStageMetrics = new czartool::StageMetrics($endStage, $label, $begin, $end);
     309
     310    if (!$self->runAnalysis($startStageMetrics)) {return 0;}
     311    if (!$self->runAnalysis($endStageMetrics)) {return 0;}
     312
     313    ${$started} = $startStageMetrics->getStarted();
     314    ${$finished} = $endStageMetrics->getFinished100();
     315
     316    if (!${$started} || !${$finished}) {${$timeTaken} = undef;}
     317    else {${$timeTaken} = $self->diffTimes(${$finished}, ${$started});}
     318
     319    return 1;
     320}
    266321
    267322###########################################################################
     
    271326###########################################################################
    272327sub runAnalysis {
    273     my ($self,
    274             $label,
    275             $stage,
    276             $fromTime,
    277             $toTime,
    278             $_started,
    279             $_finished,
    280             $_stuck,
    281             $_processed,
    282             $_pending,
    283             $_faults,
    284             $_totalTime) = @_;
     328    my ($self, $stageMetrics) = @_;
     329
     330    if (!$stageMetrics) {return 0;}
     331
     332    my $stage = $stageMetrics->getStage();
     333    my $label = $stageMetrics->getLabel();
     334    my $fromTime = $stageMetrics->getStartTime();
     335    my $toTime = $stageMetrics->getEndTime();
     336
     337    $toTime = $self->addInterval($toTime, "20 MINUTE"); # TODO dodgy
    285338
    286339    my $query = $self->{_db}->prepare(<<SQL);
     
    293346SQL
    294347
    295     $query->execute;
    296 
    297348    my $lastProcessed = -1;
    298349    my $lastPending = -1;
     
    300351    my $lastTimestamp = undef;
    301352    my ($linearProcessed, $linearPending, $linearFaults);
     353
     354    # first, count toatl processed in time window so that we can find time of 50%, 75%, 90% etc
     355    $query->execute;
     356    my $totalProcessed = 0;
     357    my $firstRow = 1;
     358    while (my @row = $query->fetchrow_array()) {
     359        my ($thisTimestamp, $thisPending, $thisFaults, $thisProcessed) = @row;
     360
     361        # get linear values
     362        if($lastProcessed != -1 && $thisProcessed > $lastProcessed) {
     363           
     364            $totalProcessed = $totalProcessed + ($thisProcessed - $lastProcessed);
     365        }
     366
     367        $lastProcessed = $thisProcessed;
     368        if ($firstRow) {$stageMetrics->setInitialPending($thisPending); $firstRow = 0;}
     369    }
     370
     371    # nothing to do here
     372    if (!$totalProcessed) {return 1;}
     373
     374    my $percent25 = $totalProcessed * 0.25;
     375    my $percent50 = $totalProcessed * 0.5;
     376    my $percent75 = $totalProcessed * 0.75;
     377    my $percent90 = $totalProcessed * 0.9;
     378    my $percent95 = $totalProcessed * 0.95;
     379
    302380    my ($derivProcessed, $derivPending, $derivFaults);
    303     my $started = undef;
    304     my $finished = undef;
    305    
    306381    my $notProcessing = undef;
    307382    my $howLongNotProcessing = undef;
    308383    my $notProcessingLongerThanInterval = 0;
    309 
    310384    my $stuck = undef;
    311385    my $howLongStuck = undef;
    312386    my $stuckLongerThanInterval = 0;
    313 
    314387    my $stuffToDo = undef;
    315     my $interval = "00:20:00";
    316 
     388    my $interval = "00:20:00"; # TODO dodgy - see above
     389    my $started = undef;
     390    my $finished = undef;
     391   
     392    my ($have25, $have50, $have75, $have90, $have95, $have100) = 0;
     393
     394    # now, loop again, this time recording more data
     395    $query->execute;
    317396    $linearProcessed = 0;
     397    $lastProcessed = -1;
    318398    while (my @row = $query->fetchrow_array()) {
    319399        my ($thisTimestamp, $thisPending, $thisFaults, $thisProcessed) = @row;
     
    326406        $linearPending = $thisPending;
    327407        $linearFaults = $thisFaults;
     408
     409        if (!$have25 && $linearProcessed >= $percent25) {$stageMetrics->setFinished25($thisTimestamp); $have25 = 1;}
     410        if (!$have50 && $linearProcessed >= $percent50) {$stageMetrics->setFinished50($thisTimestamp); $have50 = 1;}
     411        if (!$have75 && $linearProcessed >= $percent75) {$stageMetrics->setFinished75($thisTimestamp); $have75 = 1;}
     412        if (!$have90 && $linearProcessed >= $percent90) {$stageMetrics->setFinished90($thisTimestamp); $have90 = 1;}
     413        if (!$have95 && $linearProcessed >= $percent95) {$stageMetrics->setFinished95($thisTimestamp); $have95 = 1;}
    328414
    329415        # get first derivative values
     
    363449                if (defined $notProcessing) {
    364450                   
    365                     if ($stuckLongerThanInterval) {
    366 
    367 #                        print "* $stage procesing was stuck for  $howLongStuck, from $stuck until $lastTimestamp\n";
    368                     }
    369                     if ($notProcessingLongerThanInterval) {
    370 
    371             #            print " * $stage not procesing for  $howLongNotProcessing, from $notProcessing until $thisTimestamp\n";
    372                     }
    373451                    $notProcessing = undef;
    374452                    $stuck = undef;
    375453                }
    376454                if (!defined $started) {
     455
    377456                    $started = $lastTimestamp;
    378457                    $finished = undef;
    379 #                    print "* $stage processing started at $started\n";
    380458                }
    381459            }
     
    418496    }
    419497
    420     ${$_processed} = $linearProcessed;
    421     ${$_pending} = $stuffToDo;
    422     ${$_faults} = $lastFaults;
     498    $stageMetrics->setProcessed($linearProcessed);
     499    $stageMetrics->setFinalPending($stuffToDo);
     500    $stageMetrics->setFaults($lastFaults);
     501
     502
     503    if (!defined $finished) {
     504
     505        $stageMetrics->setFinished25(undef);
     506        $stageMetrics->setFinished50(undef);
     507        $stageMetrics->setFinished75(undef);
     508        $stageMetrics->setFinished90(undef);
     509        $stageMetrics->setFinished95(undef);
     510        $stageMetrics->setFinished100(undef);
     511        $stageMetrics->setTotalTime($self->diffTimes($lastTimestamp, $started));
     512    }
    423513
    424514    if (defined $finished) {
    425         ${$_finished} = $finished;
    426         ${$_totalTime} = $self->diffTimes($finished, $started);
    427     }
    428 
    429     elsif(defined $started) {
    430    
    431         ${$_finished} = undef;
    432     }
    433    
     515
     516        $stageMetrics->setFinished100($finished);
     517        $stageMetrics->setTotalTime($self->diffTimes($finished, $started));
     518    }
     519
     520
    434521    if (!defined $started){
    435522   
    436         ${$_started} = undef;
     523        $stageMetrics->setStarted(undef);
    437524    }
    438525    else {
    439526   
    440         ${$_started} = $started;
     527        my $rate = ($stageMetrics->getProcessed()/$self->getTimeInSecs($stageMetrics->getTotalTime) ) * 3600.0;
     528        $stageMetrics->setRate($rate);
     529        $stageMetrics->setStarted($started);
    441530    }
    442531    if ($stuck && $stuckLongerThanInterval && !defined $finished) {
    443532
    444         ${$_stuck} = $stuck;
     533        $stageMetrics->setStuck($stuck);
    445534    }
    446535    else {
    447536   
    448         ${$_stuck} = undef;
     537        $stageMetrics->setStuck(undef);
    449538    }
    450539
     
    517606            my $timeDiff = $self->diffTimesInSecs($thisTimestamp, $lastTimestamp);
    518607               
    519             if ($thisProcessed >= $lastProcessed){
     608            if ($thisProcessed >= $lastProcessed && $timeDiff){
    520609                $derivProcessed = abs($thisProcessed - $lastProcessed)/$timeDiff;
    521610            }
     
    15121601    $self->setRevision(12);
    15131602}
    1514 
    151516031;
    15161604
Note: See TracChangeset for help on using the changeset viewer.