#!/bin/env perl
BEGIN {
if
(
$ENV
{ASNMTAP_PERL5LIB} ) {
eval
'use lib ( "$ENV{ASNMTAP_PERL5LIB}" )'
; } }
use
Date::Calc
qw(Add_Delta_Days Date_to_Text_Long Delta_Days)
;
use
lib (
"$CHARTDIRECTORLIB"
);
$PROGNAME
=
"generateChart.pl"
;
my
$prgtext
=
"Generate Chart"
;
my
$version
=
do
{
my
@r
= (
q$Revision: 3.000.016$
=~ /\d+/g);
sprintf
"%d."
.
"%03d"
x
$#r
,
@r
}; # must be all on one line or MakeMaker will get confused.
my
(
$rv
,
$dbh
,
$sth
,
$sql
,
$sqlPeriode
,
$debugMessage
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
);
my
(
$background
,
$forGround
,
$axisColor
,
$numberOfDays
,
$numberOfLabels
,
$dummy
,
$trendvalue
,
$chartTitle
);
my
(
$endDateIN
,
$i
,
$j
,
$yearFrom
,
$monthFrom
,
$dayFrom
,
$yearTo
,
$monthTo
,
$dayTo
,
$goodDate
,
$slaWindow
);
my
(
@avg1
,
@avg2
,
@avg3
,
@data
,
@dataOK
,
@dataWarning
,
@dataCritical
,
@dataUnknown
,
@dataNoTest
,
@dataOffline
);
my
(
@icons
,
@labels
,
@labels1
,
@labels2
,
@labels3
,
$applicationTitle1
,
$applicationTitle2
,
$applicationTitle3
);
my
(
$currentYear
,
$currentMonth
,
$currentDay
) = (((
localtime
)[5] + 1900), ((
localtime
)[4] + 1), (
localtime
)[3]);
$applicationTitle1
=
$applicationTitle2
=
$applicationTitle3
=
'<NIHIL>'
;
my
@arrMonths
=
qw(January Februari March April May June July August September October November December)
;
my
$width
= 1000;
my
$hight
= 380;
my
$xOffset
= 74;
my
$yOffset
= 28;
my
$AreaBOffset
= 78;
my
$trendZone
= 0xFFFF99;
my
$cgi
= new CGI;
my
$pagedir
= (
defined
$cgi
->param(
'pagedir'
)) ?
$cgi
->param(
'pagedir'
) :
'index'
;
$pagedir
=~ s/\+/ /g;
my
$pageset
= (
defined
$cgi
->param(
'pageset'
)) ?
$cgi
->param(
'pageset'
) :
'index-cv'
;
$pageset
=~ s/\+/ /g;
my
$debug
= (
defined
$cgi
->param(
'debug'
)) ?
$cgi
->param(
'debug'
) :
'F'
;
my
$sessionID
= (
defined
$cgi
->param(
'CGISESSID'
)) ?
$cgi
->param(
'CGISESSID'
) :
''
;
my
$selChart
= (
defined
$cgi
->param(
'chart'
)) ?
$cgi
->param(
'chart'
) :
'ErrorDetails'
;
my
$uKey1
= (
defined
$cgi
->param(
'uKey1'
)) ?
$cgi
->param(
'uKey1'
) :
'none'
;
my
$uKey2
= (
defined
$cgi
->param(
'uKey2'
)) ?
$cgi
->param(
'uKey2'
) :
'none'
;
my
$uKey3
= (
defined
$cgi
->param(
'uKey3'
)) ?
$cgi
->param(
'uKey3'
) :
'none'
;
my
$startDateIN
= (
defined
$cgi
->param(
'startDate'
)) ?
$cgi
->param(
'startDate'
) :
'none'
;
my
$inputType
= (
defined
$cgi
->param(
'inputType'
)) ?
$cgi
->param(
'inputType'
) :
'none'
;
my
$selQuarter
= (
defined
$cgi
->param(
'quarter'
)) ?
$cgi
->param(
'quarter'
) : 0;
my
$selMonth
= (
defined
$cgi
->param(
'month'
)) ?
$cgi
->param(
'month'
) : 0;
my
$selWeek
= (
defined
$cgi
->param(
'week'
)) ?
$cgi
->param(
'week'
) : 0;
my
$selYear
= (
defined
$cgi
->param(
'year'
)) ?
$cgi
->param(
'year'
) : 0;
my
$timeperiodID
= (
defined
$cgi
->param(
'timeperiodID'
)) ?
$cgi
->param(
'timeperiodID'
) : 1;
my
$pf
= (
defined
$cgi
->param(
'pf'
)) ?
$cgi
->param(
'pf'
) :
'off'
;
$endDateIN
=
$cgi
->param(
'endDate'
)
if
(
$cgi
->param(
'endDate'
) ne
''
);
if
(
$debug
eq
'T'
) {
$debugMessage
=
"chart: $selChart, uKey1: $uKey1, uKey2: $uKey2, uKey3: $uKey3, startDate: $startDateIN, endDate: $endDateIN, inputType: $inputType, selMonth: $selMonth, selWeek: $selWeek, selYear: $selYear."
;
$AreaBOffset
+= 18;
}
if
(
$pf
eq
'on'
) {
$background
= 0xF7F7F7;
$forGround
= 0x000000;
$axisColor
= 0x0C0C0C;
}
else
{
$background
= 0x000000;
$forGround
= 0xF7F7F7;
$axisColor
= 0x0000FF;
}
my
$forceIndex
=
"force index (key_startDate)"
;
$forceIndex
=
''
;
$rv
= 1;
if
(
$selChart
eq
"Status"
) {
$yOffset
= 0;
$AreaBOffset
= 0;
}
elsif
(
$selChart
eq
"ErrorDetails"
) {
$hight
= 500;
$yOffset
= 0;
$AreaBOffset
= 0;
}
elsif
(
$selChart
eq
"HourlyAverage"
) {
my
(
$tmpStartDate
,
$tmpEndDate
);
(
$goodDate
,
$tmpStartDate
,
$tmpEndDate
,
$numberOfDays
) = get_sql_startDate_sqlEndDate_numberOfDays_test (
$STRICTDATE
,
$FIRSTSTARTDATE
,
$inputType
,
$selYear
,
$selQuarter
,
$selMonth
,
$selWeek
,
$startDateIN
,
$endDateIN
,
$currentYear
,
$currentMonth
,
$currentDay
, 0);
unless
(
$goodDate
) {
$rv
= 0;
$errorMessage
=
"Wrong Startdate and/or Enddate"
;
}
elsif
(
$numberOfDays
> 7 ) {
$rv
= 0;
$errorMessage
=
"Hourly Average Not Available"
;
}
else
{
(
$yearFrom
,
$monthFrom
,
$dayFrom
) =
split
(/-/,
$tmpStartDate
)
if
(
defined
$tmpStartDate
);
(
$yearTo
,
$monthTo
,
$dayTo
) =
split
(/-/,
$tmpEndDate
)
if
(
defined
$tmpEndDate
);
}
}
if
(
$rv
) {
$dbh
= DBI->
connect
(
"DBI:mysql:$DATABASE:$SERVERNAMEREADONLY:$SERVERPORTREADONLY"
,
"$SERVERUSERREADONLY"
,
"$SERVERPASSREADONLY"
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
"Cannot connect to the database"
,
$debug
,
''
,
""
,
''
,
""
,
''
, 0,
''
,
$sessionID
);
if
(
$dbh
and
$rv
) {
if
(
$uKey1
eq
'none'
) {
$rv
= 0;
$errorMessage
=
"URL Access Parameters Error: Application 1"
;
}
else
{
(
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
,
$applicationTitle1
,
$trendvalue
,
undef
) = get_title(
$dbh
,
$rv
,
$uKey1
,
$debug
, 0,
$sessionID
);
}
if
(
$rv
) {
if
(
$uKey2
ne
'none'
) { (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
,
$applicationTitle2
,
undef
,
undef
) = get_title(
$dbh
,
$rv
,
$uKey2
,
$debug
, 0,
$sessionID
); } }
if
(
$rv
) {
if
(
$uKey3
ne
'none'
) { (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
,
$applicationTitle3
,
undef
,
undef
) = get_title(
$dbh
,
$rv
,
$uKey3
,
$debug
, 0,
$sessionID
); } }
if
(
$rv
) {
if
(
$uKey1
eq
'none'
and
$applicationTitle1
eq
'<NIHIL>'
) {
$rv
= 0;
$errorMessage
=
"URL Access Parameters Error: Application 1: $applicationTitle1"
;
}
else
{
if
(
$uKey2
eq
'none'
and
$applicationTitle2
eq
'<NIHIL>'
) {
if
(
$selChart
eq
"Status"
) {
$chartTitle
=
"Status"
;
}
elsif
(
$selChart
eq
"ErrorDetails"
) {
$chartTitle
=
"Error Details"
;
}
elsif
(
$selChart
eq
"Bar"
) {
$chartTitle
=
"Bar"
;
}
elsif
(
$selChart
eq
"HourlyAverage"
) {
$chartTitle
=
"Hourly Average"
;
}
elsif
(
$selChart
eq
"DailyAverage"
) {
$chartTitle
=
"Daily Average"
;
}
$chartTitle
.=
" for '$applicationTitle1' "
;
}
else
{
$chartTitle
=
"Comparing '$applicationTitle1'"
;
if
(
$uKey3
eq
'none'
and
$applicationTitle3
eq
'<NIHIL>'
) {
$chartTitle
.=
" and '$applicationTitle2' "
;
}
else
{
$chartTitle
.=
", '$applicationTitle2' and '$applicationTitle3' "
;
}
}
}
if
(
$rv
) {
my
$addAreaBOffset
= 22;
$addAreaBOffset
= 8
if
(
$selChart
eq
"HourlyAverage"
);
$addAreaBOffset
= 36
if
(
$selChart
eq
"DailyAverage"
);
if
(
$inputType
eq
"fromto"
) {
if
(
defined
$endDateIN
) {
$chartTitle
.=
"from $startDateIN to $endDateIN"
;
}
else
{
$chartTitle
.=
"on $startDateIN"
;
}
}
elsif
(
$inputType
eq
"year"
) {
$chartTitle
.=
"for $selYear"
;
}
elsif
(
$inputType
eq
"quarter"
) {
$chartTitle
.=
"for $selYear quarter $selQuarter"
;
}
elsif
(
$inputType
eq
"month"
) {
$chartTitle
.=
"for "
.
$arrMonths
[
$selMonth
-1] .
' '
.
$selYear
;
}
elsif
(
$inputType
eq
"week"
) {
$chartTitle
.=
"for $selYear week $selWeek"
;
}
else
{
$rv
= 0;
$errorMessage
=
"Whoops - title error! ($inputType)"
;
}
my
(
$sqlStartDate
,
$sqlEndDate
);
if
(
$rv
) {
$AreaBOffset
+=
$addAreaBOffset
;
(
$goodDate
,
$sqlStartDate
,
$sqlEndDate
,
undef
) = get_sql_startDate_sqlEndDate_numberOfDays_test (
$STRICTDATE
,
$FIRSTSTARTDATE
,
$inputType
,
$selYear
,
$selQuarter
,
$selMonth
,
$selWeek
,
$startDateIN
,
$endDateIN
,
$currentYear
,
$currentMonth
,
$currentDay
, 0);
if
(
$goodDate
) {
$sqlPeriode
=
"AND startDate between '$sqlStartDate' AND '$sqlEndDate' "
;
if
(
$timeperiodID
> 1 ) {
$sql
=
"select timeperiodName, sunday, monday, tuesday, wednesday, thursday, friday, saturday from $SERVERTABLTIMEPERIODS where timeperiodID = '$timeperiodID'"
;
$sth
=
$dbh
->prepare(
$sql
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot dbh->prepare: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
$sth
->execute() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->execute: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
if
(
$rv
) {
(
$slaWindow
,
my
(
$sunday
,
$monday
,
$tuesday
,
$wednesday
,
$thursday
,
$friday
,
$saturday
)) =
$sth
->fetchrow_array() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->fetchrow_array: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
(
$sth
->rows);
$sth
->finish() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->finish"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
my
$slaPeriode
= create_sql_query_from_range_SLA_window (
$sunday
,
$monday
,
$tuesday
,
$wednesday
,
$thursday
,
$friday
,
$saturday
);
$chartTitle
.=
", $slaWindow"
if
(
defined
$slaWindow
);
$sqlPeriode
.=
"$slaPeriode "
if
(
defined
$slaPeriode
);
}
}
}
else
{
$rv
= 0;
$errorMessage
=
"Wrong Startdate and/or Enddate"
;
}
}
if
(
$rv
and
$uKey1
ne
'none'
) {
if
(
$selChart
eq
"Status"
) {
my
(
$title
,
$status
,
$aantal
,
%problemSummary
);
$sql
= create_sql_query_events_from_range_year_month (
$inputType
,
$sqlStartDate
,
$sqlEndDate
,
"select SQL_NO_CACHE title, status, count(status) as aantal"
,
$forceIndex
,
"WHERE uKey = '$uKey1'"
,
$sqlPeriode
,
"AND status !='OFFLINE'"
,
"GROUP BY status"
,
''
,
""
,
"ALL"
);
$sth
=
$dbh
->prepare(
$sql
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot dbh->prepare: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
$sth
->execute() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->execute: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
$sth
->bind_columns( \
$title
, \
$status
, \
$aantal
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->bind_columns: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
if
(
$rv
) {
if
(
$sth
->rows ) {
my
%labels
= ();
while
(
$sth
->fetch() ) {
if
(
$status
eq
'<NIHIL>'
) {
$status
=
"UNKNOWN"
}
if
(
exists
$labels
{
$status
}) {
$labels
{
$status
} +=
$aantal
;
}
else
{
$labels
{
$status
} =
$aantal
;
}
}
foreach
my
$label
(
keys
%labels
) {
push
(
@labels
,
$label
);
if
(
$label
eq
'OK'
) {
push
(
@icons
,
"$IMAGESPATH/$ICONS{OK}"
);
$labels
{
$label
} *= 8
if
(
$uKey1
eq
'KBO-WI-P-01'
);
}
elsif
(
$label
eq
'WARNING'
) {
push
(
@icons
,
"$IMAGESPATH/$ICONS{WARNING}"
);
$labels
{
$label
} *= 8
if
(
$uKey1
eq
'KBO-WI-P-01'
);
}
elsif
(
$label
eq
'CRITICAL'
) {
push
(
@icons
,
"$IMAGESPATH/$ICONS{CRITICAL}"
);
}
elsif
(
$label
eq
'UNKNOWN'
) {
push
(
@icons
,
"$IMAGESPATH/$ICONS{UNKNOWN}"
);
}
elsif
(
$label
eq
'NO TEST'
) {
push
(
@icons
,
"$IMAGESPATH/$ICONS{'NO TEST'}"
);
}
elsif
(
$label
eq
'NO DATA'
) {
push
(
@icons
,
"$IMAGESPATH/$ICONS{'NO DATA'}"
);
}
elsif
(
$label
eq
'OFFLINE'
) {
push
(
@icons
,
"$IMAGESPATH/$ICONS{OFFLINE}"
);
}
push
(
@data
,
$labels
{
$label
});
}
}
else
{
$hight
= 380;
$rv
= 0;
$errorMessage
=
"NO DATA FOR THIS PERIOD (1)"
;
}
$sth
->finish() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->finish"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
}
}
elsif
(
$selChart
eq
"ErrorDetails"
) {
my
(
$title
,
$statusmessage
,
$aantal
,
%problemSummary
);
$sql
= create_sql_query_events_from_range_year_month (
$inputType
,
$sqlStartDate
,
$sqlEndDate
,
"select SQL_NO_CACHE title, statusmessage, count(statusmessage) as aantal"
,
$forceIndex
,
"WHERE uKey = '$uKey1'"
,
$sqlPeriode
,
"AND status ='CRITICAL'"
,
"GROUP BY statusmessage"
,
''
,
""
,
"ALL"
);
$sth
=
$dbh
->prepare(
$sql
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot dbh->prepare: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
$sth
->execute() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->execute: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
$sth
->bind_columns( \
$title
, \
$statusmessage
, \
$aantal
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->bind_columns: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
if
(
$rv
) {
if
(
$sth
->rows ) {
while
(
$sth
->fetch() ) {
my
(
$dummy
,
$rest
) =
split
(/:/,
$statusmessage
, 2);
$rest
=
$dummy
unless
(
$rest
);
if
(
$rest
) {
(
$rest
,
undef
) =
split
(/\|/,
$rest
, 2);
(
$dummy
,
$rest
) =
split
(/,/,
$rest
, 2);
$rest
=
$dummy
unless
(
$rest
);
}
else
{
$rest
=
' UNDEFINED'
;
}
if
(
exists
$problemSummary
{
$rest
}) {
$problemSummary
{
$rest
} +=
$aantal
;
}
else
{
$problemSummary
{
$rest
} =
$aantal
;
}
}
foreach
my
$rest
(
sort
{
$problemSummary
{
$b
} <=>
$problemSummary
{
$a
}} (
keys
(
%problemSummary
))) {
push
(
@data
,
$problemSummary
{
$rest
});
push
(
@labels
,
substr
(
$rest
, 1, 38));
}
}
else
{
$hight
= 380;
$rv
= 0;
$errorMessage
=
"NO ERRORS FOR THIS PERIOD"
;
}
$sth
->finish() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->finish"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
}
}
elsif
(
$selChart
eq
"Bar"
) {
my
(
$seconden
,
$duration
,
$startDate
,
$startTime
,
$status
,
$step
);
my
(
$dataOK
,
$dataWarning
,
$dataCritical
,
$dataUnknown
,
$dataNoTest
,
$dataOffline
);
$sql
= create_sql_query_events_from_range_year_month (
$inputType
,
$sqlStartDate
,
$sqlEndDate
,
"select SQL_NO_CACHE duration, startDate, startTime, status, step"
,
$forceIndex
,
"WHERE uKey = '$uKey1'"
,
$sqlPeriode
,
''
,
""
,
''
,
"order by startDate, startTime"
,
"ALL"
);
$sth
=
$dbh
->prepare(
$sql
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot dbh->prepare: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
$sth
->execute() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->execute: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
$sth
->bind_columns( \
$duration
, \
$startDate
, \
$startTime
, \
$status
, \
$step
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->bind_columns: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
if
(
$rv
) {
if
(
$sth
->rows ) {
my
$counter
= 0;
$numberOfLabels
= (
$sth
->rows < 25) ?
$sth
->rows : 25;
my
$labelCounter
=
int
(
$sth
->rows /
$numberOfLabels
);
my
$limitTrendvalue
= (
$trendvalue
) ?
$trendvalue
* 2.5 : 9000;
my
$moreDays
= (
defined
$endDateIN
or
$inputType
eq
"year"
or
$inputType
eq
"quarter"
or
$inputType
eq
"month"
or
$inputType
eq
"week"
) ? 1 : 0;
while
(
$sth
->fetch() ) {
$dataOK
=
$dataWarning
=
$dataCritical
=
$dataUnknown
=
$dataNoTest
=
$dataOffline
=
"0"
;
$seconden
=
int
(
substr
(
$duration
, 6, 2)) +
int
(
substr
(
$duration
, 3, 2)*60) +
int
(
substr
(
$duration
, 0, 2)*3600);
$seconden
+= 0.5
if
(
$seconden
== 0);
if
(
$status
eq
'OK'
) {
$dataOK
= (
$seconden
<
$limitTrendvalue
) ?
$seconden
:
$limitTrendvalue
;
}
elsif
(
$status
eq
'WARNING'
) {
$dataWarning
=
"-5"
;
}
elsif
(
$status
eq
'CRITICAL'
) {
$dataCritical
=
"-5"
;
}
elsif
(
$status
eq
'UNKNOWN'
) {
$dataUnknown
=
"-5"
;
}
elsif
(
$status
eq
'NO TEST'
) {
$dataNoTest
=
"-5"
;
}
elsif
(
$status
eq
'OFFLINE'
) {
$dataOffline
=
"-5"
;
}
push
(
@dataOK
,
$dataOK
);
push
(
@dataWarning
,
$dataWarning
);
push
(
@dataCritical
,
$dataCritical
);
push
(
@dataUnknown
,
$dataUnknown
);
push
(
@dataNoTest
,
$dataNoTest
);
push
(
@dataOffline
,
$dataOffline
);
if
(
$labelCounter
== 1 or
$labelCounter
==
$counter
or (
$counter
== 0 and
$labelCounter
>= 2)) {
if
(
$moreDays
) {
push
(
@labels
,
$startDate
.
" ~ "
.
substr
(
$startTime
, 0, 5));
}
else
{
push
(
@labels
,
substr
(
$startTime
, 0, 5));
}
$counter
= 1;
}
else
{
push
(
@labels
,
""
);
$counter
++;
}
}
$AreaBOffset
+= 36
if
(
$moreDays
);
}
else
{
$hight
= 380;
$rv
= 0;
$errorMessage
=
"NO DATA FOR THIS PERIOD (2)"
;
}
$sth
->finish() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->finish"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
}
}
elsif
(
$selChart
eq
"HourlyAverage"
or
$selChart
eq
"DailyAverage"
) {
(
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = getAverage( 1,
$dbh
,
$rv
,
$uKey1
,
$sqlStartDate
,
$sqlEndDate
,
$sqlPeriode
,
$selChart
,
$debug
);
}
}
if
(
$rv
and
$uKey2
ne
'none'
) {
if
(
$selChart
eq
"HourlyAverage"
or
$selChart
eq
"DailyAverage"
) {
(
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = getAverage( 2,
$dbh
,
$rv
,
$uKey2
,
$sqlStartDate
,
$sqlEndDate
,
$sqlPeriode
,
$selChart
,
$debug
);
}
}
if
(
$rv
and
$uKey3
ne
'none'
) {
if
(
$selChart
eq
"HourlyAverage"
or
$selChart
eq
"DailyAverage"
) {
(
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = getAverage( 3,
$dbh
,
$rv
,
$uKey3
,
$sqlStartDate
,
$sqlEndDate
,
$sqlPeriode
,
$selChart
,
$debug
);
}
}
if
(
$rv
) {
if
(
$selChart
eq
"HourlyAverage"
) {
my
@refenentieLabels
;
for
(
$i
= 0;
$i
<
$numberOfDays
; ++
$i
) {
for
(
$j
= 0;
$j
<= 23; ++
$j
) {
my
(
$Tyear
,
$Tmonth
,
$Tday
) = Add_Delta_Days(
$yearFrom
,
$monthFrom
,
$dayFrom
,
$i
);
push
(
@refenentieLabels
,
"$Tyear-$Tmonth-$Tday:$j"
);
push
(
@labels
,
$j
);
}
}
$width
= (
$numberOfDays
> 1 ) ? 24 *
$numberOfDays
* 25 :
$width
;
@avg1
= rebuildDataArrayHourlyAverage (\
@refenentieLabels
, \
@labels1
, \
@avg1
);
@avg2
= rebuildDataArrayHourlyAverage (\
@refenentieLabels
, \
@labels2
, \
@avg2
)
if
(
$uKey2
ne
'none'
);
@avg3
= rebuildDataArrayHourlyAverage (\
@refenentieLabels
, \
@labels3
, \
@avg3
)
if
(
$uKey3
ne
'none'
);
}
elsif
(
$selChart
eq
"DailyAverage"
) {
my
$prev
=
"2003-10-12"
;
@labels
=
sort
(
@labels1
,
@labels2
,
@labels3
);
@labels
=
grep
(
$_
ne
$prev
&& (
$prev
=
$_
),
@labels
);
$numberOfLabels
=
scalar
(
@labels
);
$width
= (
$numberOfLabels
> 40 ) ?
$numberOfLabels
* 25 :
$width
;
@avg1
= rebuildDataArrayDailyAverage (\
@labels
, \
@labels1
, \
@avg1
);
@avg2
= rebuildDataArrayDailyAverage (\
@labels
, \
@labels2
, \
@avg2
)
if
(
$uKey2
ne
'none'
);
@avg3
= rebuildDataArrayDailyAverage (\
@labels
, \
@labels3
, \
@avg3
)
if
(
$uKey3
ne
'none'
);
}
}
}
}
$dbh
->disconnect or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
"Sorry, the database was unable to disconnect"
,
$debug
,
''
,
""
,
''
,
""
,
''
, 0,
''
,
$sessionID
);
}
}
my
$c
;
if
(
$selChart
eq
"Status"
or
$selChart
eq
"ErrorDetails"
) {
$c
= new PieChart(
$width
,
$hight
,
$background
, -1, 0);
$c
->setPieSize(
$width
/2,
$hight
/2, 130);
$c
->set3D();
}
else
{
$c
= new XYChart(
$width
,
$hight
,
$background
,
$background
, 0);
$c
->setPlotArea(
$xOffset
,
$yOffset
,
$width
- 95,
$hight
-
$AreaBOffset
, 0xffffff, -1, 0xaCCCCCC, 0xaCCCCCC, 0xaCCCCCC);
$c
->xAxis()->setWidth(1);
$c
->yAxis()->setWidth(1);
$c
->xAxis()->setColors(
$axisColor
);
$c
->yAxis()->setColors(
$axisColor
);
my
$yAxisTitle
= (
$selChart
eq
'Bar'
) ?
'Response time'
:
'Average response time'
;
$c
->yAxis()->setTitle(
$yAxisTitle
,
"arial.ttf"
, 9,
$forGround
);
$c
->xAxis()->setTitle(
"<*block,valign=absmiddle*>Date/Time<*/*>"
)->setFontColor(
$forGround
);
}
$chartTitle
=
"Error for '$prgtext'"
unless
(
defined
$chartTitle
and
$rv
);
$c
->addText(
$width
/2, 14,
$chartTitle
,
"arialbi.ttf"
, 10,
$forGround
, 5, 0);
$c
->addText(
$width
- 18,
$hight
- 33,
$debugMessage
,
"arial.ttf"
, 8,
$forGround
, 6, 0)
if
(
defined
$debugMessage
);
$c
->addText(
$width
/2, ((
$hight
-
$yOffset
-
$AreaBOffset
)/2) +
$yOffset
+ 16,
$errorMessage
,
"arial.ttf"
, 12, 0xFF0000, 5, 0)
if
(
defined
$errorMessage
);
$c
->addText(
$width
/2, ((
$hight
-
$yOffset
-
$AreaBOffset
)/2) +
$yOffset
- 16,
$dbiErrorCode
,
"arial.ttf"
, 10, 0xFF0000, 5, 0)
if
(
defined
$dbiErrorCode
);
$c
->addText(
$width
/2, ((
$hight
-
$yOffset
-
$AreaBOffset
)/2) +
$yOffset
+ 48,
$dbiErrorString
,
"arial.ttf"
, 10, 0xFF0000, 5, 0)
if
(
defined
$dbiErrorString
);
$c
->addText(
$width
- 3, 92,
$APPLICATION
.
" @ "
.
$BUSINESS
,
"arial.ttf"
, 8,
$forGround
, 6, 270);
$c
->addText(
$width
- 18,
$hight
- 18,
$DEPARTMENT
.
" @ "
.
$BUSINESS
.
", created on: "
.
scalar
(
localtime
()) .
"."
,
"arial.ttf"
, 8,
$forGround
, 6, 0);
if
(
$rv
) {
if
(
$selChart
eq
"Status"
or
$selChart
eq
"ErrorDetails"
) {
if
(
$selChart
eq
"Status"
) {
my
(
@colors
);
foreach
my
$label
(
@labels
) {
push
(
@colors
,
$COLORSPIE
{
$label
} ); }
$c
->setColors2(
$perlchartdir::DataColor
, \
@colors
);
$c
->addExtraField(\
@icons
);
}
elsif
(
$selChart
eq
"ErrorDetails"
) {
my
$colors
= [0xb8bc9c, 0xecf0b9, 0x999966, 0x333366, 0xc3c3e6, 0x594330,0xa0bdc4];
$c
->setColors2(
$perlchartdir::DataColor
,
$colors
);
}
$c
->setLabelLayout(
$perlchartdir::SideLayout
);
$c
->setLabelStyle(
"tahoma.ttf"
, 8,
$forGround
)->setBackground(
$perlchartdir::Transparent
,
$perlchartdir::Transparent
, 0);
$c
->setLabelFormat(
"<*block,valign=absmiddle*><*img={field0}*> {label} (#{value} - {percent}%)"
);
$c
->setLineColor(
$perlchartdir::SameAsMainColor
,
$forGround
);
$c
->setStartAngle(135);
$c
->setData(\
@data
, \
@labels
);
}
else
{
my
$fontAngel
= (
$selChart
eq
"HourlyAverage"
) ? 0 : 45;
$c
->xAxis()->setLabelStyle(
"Arial.ttf"
, 8,
$forGround
)->setFontAngle(
$fontAngel
);
$c
->xAxis()->setLabels(\
@labels
);
$c
->yAxis()->setLabelStyle(
"Arial.ttf"
, 8,
$forGround
)->setFontAngle(0);
$c
->yAxis()->setLabelFormat(
"{value|2,.}"
);
$c
->yAxis()->setAutoScale(5, 10, 0);
if
(
$uKey2
eq
'none'
and
$uKey3
eq
'none'
) {
$trendvalue
= 3600
if
(
$trendvalue
== 0);
$trendvalue
+= 0.05;
$c
->yAxis()->addZone(
$trendvalue
, 3600,
$trendZone
)
if
(
$trendvalue
!= 0);
}
$c
->yAxis()->addZone(0, -6,
$trendZone
);
my
$layer
;
if
(
$selChart
eq
"Bar"
) {
$layer
=
$c
->addBarLayer2(
$perlchartdir::Stack
);
$layer
->setBarGap(-1.7E-100, 0);
$layer
->addDataSet(\
@dataOK
,
$layer
->yZoneColor(
$trendvalue
,
$COLORSRRD
{OK},
$COLORSRRD
{TRENDLINE}),
" Duration"
);
$layer
->addDataSet(\
@dataWarning
,
$COLORSRRD
{WARNING},
" Warning"
);
$layer
->addDataSet(\
@dataCritical
,
$COLORSRRD
{CRITICAL},
" Critical"
);
$layer
->addDataSet(\
@dataUnknown
,
$COLORSRRD
{UNKNOWN},
" Unknown"
);
$layer
->addDataSet(\
@dataOffline
,
$COLORSRRD
{OFFLINE},
" Offline"
);
$layer
->addDataSet(\
@dataNoTest
,
$COLORSRRD
{
"NO TEST"
},
" No Test"
);
}
elsif
(
$selChart
eq
"HourlyAverage"
or
$selChart
eq
"DailyAverage"
) {
if
(
$selChart
eq
"HourlyAverage"
) {
for
(
$i
= 1;
$i
<
$numberOfDays
; ++
$i
) {
my
$xMark1
=
$c
->xAxis()->addMark((24 *
$i
), 0x0000FF); }
my
$xCorrectie
= 95 -
$xOffset
;
for
(
$i
= 0;
$i
<
$numberOfDays
; ++
$i
) {
my
$cdate
= Date_to_Text_Long ( Add_Delta_Days(
$yearFrom
,
$monthFrom
,
$dayFrom
,
$i
) );
my
$x
= (
$numberOfDays
> 1) ? (
$i
* 600) + 300 +
$xCorrectie
: (
$width
/2) +
$xCorrectie
;
$c
->addText(
$x
, 40,
$cdate
,
"arialbi.ttf"
, 10, 0x000000, 5, 0);
}
}
$layer
=
$c
->addSplineLayer();
$layer
->addDataSet(\
@avg1
, 0xcf4040,
"$applicationTitle1"
)->setDataSymbol(
$perlchartdir::DiamondSymbol
, 8);
if
(
$uKey2
ne
'none'
) {
$layer
->addDataSet(\
@avg2
, 0x6699cc,
"$applicationTitle2"
)->setDataSymbol(
$perlchartdir::DiamondSymbol
, 8); }
if
(
$uKey3
ne
'none'
) {
$layer
->addDataSet(\
@avg3
, 0x009900,
"$applicationTitle3"
)->setDataSymbol(
$perlchartdir::DiamondSymbol
, 8); }
$layer
->setDataLabelFormat(
"{value|2,.}"
);
}
$layer
->setBorderColor(
$perlchartdir::Transparent
);
if
(
$pf
eq
'on'
) {
$c
->addLegend(2,
$hight
- 32, 0,
"arial.ttf"
, 8)->setBackground(
$perlchartdir::Transparent
);
}
else
{
$c
->addLegend(2,
$hight
- 32, 0,
"arial.ttf"
, 8)->setFontColor(
$forGround
);
}
}
}
binmode
(STDOUT);
print
"Content-type: image/png\n\n"
;
print
$c
->makeChart2(
$perlchartdir::PNG
);
sub
getAverage {
my
(
$number
,
$dbh
,
$rv
,
$uKey
,
$sqlStartDate
,
$sqlEndDate
,
$sqlPeriode
,
$selChart
,
$debug
) =
@_
;
my
(
$sql
,
$sth
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
,
$startDate
,
$hour
,
$average
,
@avg
,
@labels
);
if
(
$selChart
eq
"HourlyAverage"
) {
$sql
= create_sql_query_events_from_range_year_month (
$inputType
,
$sqlStartDate
,
$sqlEndDate
,
"select SQL_NO_CACHE startDate, hour(startTime) as hour, round(avg(time_to_sec(duration)), 2)"
,
$forceIndex
,
"WHERE uKey = '$uKey'"
,
$sqlPeriode
,
"AND status = 'OK'"
,
"GROUP BY startDate, hour(startTime)"
,
''
,
"order by startDate, hour"
,
"ALL"
);
}
else
{
$sql
= create_sql_query_events_from_range_year_month (
$inputType
,
$sqlStartDate
,
$sqlEndDate
,
"select SQL_NO_CACHE startDate, round(avg(time_to_sec(duration)), 2)"
,
$forceIndex
,
"WHERE uKey = '$uKey'"
,
$sqlPeriode
,
"AND status = 'OK'"
,
"GROUP BY startDate"
,
''
,
"order by startDate"
,
"ALL"
);
}
$sth
=
$dbh
->prepare(
$sql
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot dbh->prepare: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
$sth
->execute() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->execute: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
if
(
$selChart
eq
"HourlyAverage"
) {
$sth
->bind_columns( \
$startDate
, \
$hour
, \
$average
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->bind_columns: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
}
else
{
$sth
->bind_columns( \
$startDate
, \
$average
) or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->bind_columns: $sql"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
)
if
$rv
;
}
if
(
$rv
) {
if
(
$sth
->rows ) {
while
(
$sth
->fetch() ) {
push
(
@avg
,
$average
);
if
(
$selChart
eq
"HourlyAverage"
) {
push
(
@labels
,
$startDate
.
":"
.
$hour
);
}
else
{
push
(
@labels
,
$startDate
);
}
}
}
else
{
$hight
= 380;
$rv
= 0;
$errorMessage
=
"NO DATA FOR THIS PERIOD (3)"
;
}
$sth
->finish() or (
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
) = error_trap_DBI(
""
,
"Cannot sth->finish"
,
$debug
,
''
,
""
,
''
,
""
, 0,
''
,
$sessionID
);
}
if
(
$number
== 1 ) {
@avg1
=
@avg
;
@labels1
=
@labels
;
}
elsif
(
$number
== 2 ) {
@avg2
=
@avg
;
@labels2
=
@labels
;
}
elsif
(
$number
== 3 ) {
@avg3
=
@avg
;
@labels3
=
@labels
;
}
return
(
$rv
,
$errorMessage
,
$dbiErrorCode
,
$dbiErrorString
);
}
sub
rebuildDataArrayHourlyAverage {
my
(
$arr_full
,
$arr_part
,
$arr_data
) =
@_
;
my
(
@arr_res
,
$found
,
$cdate1
,
$time1
,
$cdate2
,
$time2
,
$year1
,
$month1
,
$day1
,
$year2
,
$month2
,
$day2
);
for
(
my
$i
= 0;
$i
<
@$arr_full
;
$i
++) {
(
$cdate1
,
$time1
) =
split
(/:/,
@$arr_full
[
$i
]);
(
$year1
,
$month1
,
$day1
) =
split
(/-/,
$cdate1
);
$found
= 0;
for
(
my
$j
= 0;
$j
<
@$arr_part
;
$j
++) {
(
$cdate2
,
$time2
) =
split
(/:/,
@$arr_part
[
$j
]);
(
$year2
,
$month2
,
$day2
) =
split
(/-/,
$cdate2
);
if
((
$time1
==
$time2
) and (
$day1
==
$day2
)) {
push
(
@arr_res
,
@$arr_data
[
$j
]);
$found
= 1;
}
}
push
(
@arr_res
, 0.00)
unless
(
$found
);
}
return
@arr_res
;
}
sub
rebuildDataArrayDailyAverage {
my
(
$arr_full
,
$arr_part
,
$arr_data
) =
@_
;
my
(
@arr_res
,
$found
);
for
(
my
$i
= 0;
$i
<
@$arr_full
;
$i
++) {
$found
= 0;
for
(
my
$j
= 0;
$j
<
@$arr_part
;
$j
++) {
if
(
@$arr_full
[
$i
] eq
@$arr_part
[
$j
]) {
push
(
@arr_res
,
@$arr_data
[
$j
]);
$found
= 1;
}
}
push
(
@arr_res
, 0.00)
unless
(
$found
);
}
return
@arr_res
;
}