
| Current Path : /var/www/web-klick.de/dsh/90_akt/DivBasicF/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/90_akt/DivBasicF/JMeterReport.pm |
package DivBasicF::JMeterReport;
use Graphics::GnuplotIF;
use strict;
use Net::SSH;
use Net::SCP;
#
#
# Installation:
#
# Gnuplot installieren.
# ps2pdf installieren
#
# Perl-Module installieren:
#
# cpan -i Graphics::GnuplotIF
# cpan -i Net::SSH
# cpan -i Net::SCP
#
#
#
#
# Anwendung:
#
# Konstruktor:
# Erster Parameter: Host, auf dem der JMeter-Test ausgefuehrt wird
# Zweiter Parameter: Pfad zum Verzeichnis auf dem Host,
# auf dem die Testfiles abgelegt werden
#
#
# run_test:
#
# Erster Parameter: jmx-Template
# Zweiter Parameter: Anzahl der Requests (Platzhalter im jmx-Template: ---ANZAHL---)
# Dritter Parameter: Zeitintervall, in dem die Requests gleichmaessig
# abgesandt werden (Platzhalter im jmx-Template: ---RAMPTIME---)
#
# Es koennen mehrere run_test- Kommandos hintereinander ausgefuehrt
# werden, das Gesamtergebnis wird in der Sammel-Datei gesamt.csv abgespeichert.
#
# Bei neuen Tests muss daher dieses Filöe zunaechst geloescht werden.
#
#
# mkreport:
#
# Erster Parameter: Obergrenze fuer gueltige Messwerte. Alle Werte oberhalb
# werden aus der Messreihe gestrichen (Ausreisser).
#
# Weitere Parameter: Files, die als Grafik repraesentiert werden sollen.
# Z.B. das in gesamt.csv liegende File.
#
#
#******************************************************************
sub new {
my $class = shift;
my $self = {};
$self->{'HOST'} = shift;
$self->{'DIR'} = shift;
# unlink("gesamt.csv");
bless($self,$class);
return($self);
}
#******************************************************************
sub mkreport {
my $self = shift;
my $threshold = shift; # Grenze, ab der Messwerete ignoriert werden
my @files = @_; # threshold = 3000: alle Werte groesser 3000 werden gestrichen
# threshold = 0: keine Obergrenze
my $text; my $ee; my $dd; my $o; my $o1; my $startpoint;
my $zaehler; my $zeile; my $density; my $werte; my $max;
my $max1; my $zeit; my $file; my $faktor;
my $plot = Graphics::GnuplotIF->new();
my $of = "out.ps";
if ($files[0] =~ /^(.*)\.(.*)$/) {
$of = $1 . ".ps";
}
$plot->gnuplot_hardcopy($of,'postscript');
# $plot->gnuplot_cmd( ' set terminal postscript','set output " > dd.ps"');
foreach $file (@files) {
open(FFILE,"<".$file);
my $text = join("",<FFILE>);
close(FFILE);
$ee = {};
$dd = {};
$startpoint = 0;
$zaehler = 0;
foreach $zeile (split(/\n/,$text)) {
if ($zeile =~ /^(.*?)httpSample( +)t\=\"(\d+)\"(.*?)ts\=\"(\d+)\"/ ) {
if (!($startpoint)) { $startpoint = $5; }
$o = $5-$startpoint;
$o1 = $3;
if ($density < 0) {
$ee->{$o} = 0;
$dd->{$o} = 0;
$density = (-1) * $density;
} else {
if ($threshold and $threshold > $o1) {
$ee->{$o} = $o1;
$dd->{$o} = $density;
}
}
print "PREPARATION $zaehler\n";
$zaehler = $zaehler + 1;
}
elsif ($zeile =~ /ANZAHL\: +(\d+) +RAMPTIME\: +(\d+)/) {
$density = (-1) * $1/$2;
}
elsif ($zeile =~ /END/) {
$density = 0;
$dd->{$o} = 0;
$ee->{$o} = 0;
}
}
$zeit = [ sort {$a <=> $b} keys %$ee ];
$werte = [];
$max = 0;
$max1 = 0;
$density = [];
$zaehler = -1;
foreach $o (@$zeit) {
$zaehler = $zaehler + 1;
print "EVALUATION $zaehler\n";
push(@$werte,$ee->{$o});
push(@$density,$dd->{$o});
if ($ee->{$o} > $max) { $max = $ee->{$o}; }
if ($dd->{$o} > $max1) { $max1 = $dd->{$o}; }
}
$faktor = $max/$max1;
foreach $o (@$density) {
$o = $o * $faktor;
}
$plot->gnuplot_plot_xy($zeit,$werte,$density);
}
# $plot->gnuplot_restore_terminal();
system("ps2pdf $of");
}
#**********************************************************
sub run_test {
my $self = shift;
my $test = shift;
my $anzahl = shift;
my $ramptime = shift;
$test =~ s/---ANZAHL---/$anzahl/;
$test =~ s/---RAMPTIME---/$ramptime/;
Net::SSH::ssh($self->{'HOST'},"rm tmp.jmx; rm tmp_results.csv");
unlink("tmp.jmx");
unlink("tmp_results.csv");
open(FFILE,">tmp.jmx");
print FFILE $test;
close(FFILE);
Net::SCP::scp("tmp.jmx",$self->{'HOST'} . ":" . $self->{'DIR'});
Net::SSH::ssh($self->{'HOST'},"jmeter/bin/jmeter -t tmp.jmx -n");
Net::SCP::scp($self->{'HOST'} . ":" . $self->{'DIR'} . "tmp_results.csv",".");
open(FFILE,"<tmp_results.csv");
my $erg = join("",<FFILE>);
close(FFILE);
open(FFILE,">>gesamt.csv");
print FFILE "---------------------------------------------------\n";
print FFILE "ANZAHL: $anzahl RAMPTIME: $ramptime\n";
print FFILE "---------------------------------------------------\n";
print FFILE $erg;
print FFILE "---------------------------------------------------\n";
print FFILE "END\n";
print FFILE "---------------------------------------------------\n\n\n";
close(FFILE);
return($erg);
}
1;