Here is something I am playing around with. The idea came from Burleson's Statspack
book. It requires Active Perl with DBD/DBI installed. Also MS Graph is used. This
is still a work in progress.
#!C:\Perl\bin\perl.exe -w
#
# rpt_avg_bbw_dy.pl
# Report Average Buffer Busy Wait by Day
# This perl script will produce a graphical
# "Signature" of information.
# This information is obtained from statspack tables
# and takes advantage of perl's Win32 OLE interface
# to Microsoft Graph.
#
use DBI;
use Win32::OLE qw( with in );
use Win32::OLE::Const "Microsoft Graph";
#
# Set Oracle User and Password Information
#
$name = "perfstat";
$passwd = "xxxxx";
$ora_sid = "PROD";
# 1 makes creation process visible. 0 is faster.
my $VISIBLE = 1;
my $iIndex = 0;
#
# Make connection to Database
#
$dbh = DBI->connect("dbi:Oracle:$ora_sid", $name, $passwd)
or die "Cannot connect : $DBI::errstr";
#
# Prepare Statement to query database
#
$sth = $dbh->prepare("select to_char(snap_time,'day') day,
avg(new.buffer_busy_wait-old.buffer_busy_wait) bbw from
perfstat.stats\$buffer_pool_statistics old,
perfstat.stats\$buffer_pool_statistics new,
perfstat.stats\$snapshot sn
where
new.snap_id = sn.snap_id
and
old.snap_id = sn.snap_id-1
group by
to_char(snap_time,'day') ")
||die "Can't prepare statement: $DBI::errstr";
$sth->execute ()
||die "Can't execute statement: $DBI::errstr";
while (($day, $bbw) = $sth->fetchrow_array)
{ # loop thru, retrieving data
$Data[$iIndex] = [$day, $bbw];
$iIndex = $iIndex + 1;
}
my %ChartOptions = (
width => 640,
height => 400,
haslegend => 0,
type => xl3DLine,
perspective => 30,
rotation => 20,
autoscaling => 1,
rightangleaxes => 1,
title => "Buffer Busy Wait Signature by Day",
);
my( @CELLS ) = ( 'a'..'zz' );
my $File = "C:\\temp\\bbw_day.gif";
# BEGIN CALLOUT A
# new() method creates an instance of MS Graph's Application object.
# To have a remote machine create the chart (DCOM) then change "MSGraph.Application"
# parameter to an anonymous array ["appserver.mydomain.com","MSGraph.Application"]
my $ChartApp = new Win32::OLE( "MSGraph.Application", "Quit" ) ||
die "Cannot create object\n";
# END CALLOUT A
$ChartApp->{Visible} = $VISIBLE;
# BEGIN CALLOUT B
my $DataSheet = $ChartApp->DataSheet();
my $Chart = $ChartApp->Chart();
# END CALLOUT B
foreach my $Option ( keys( %ChartOptions ) )
{
$Chart->{$Option} = $ChartOptions{$Option};
}
# BEGIN CALLOUT C
my $iTotal = $#Data;
foreach my $iIndex ( 0 .. $iTotal)
{
my $iday = $Data[$iIndex][0];
my $ibbw = $Data[$iIndex][1];
$DataSheet->Range( "$CELLS[$iIndex]0" )->{Value} = $iday;
$DataSheet->Range( "$CELLS[$iIndex]1" )->{Value} = $ibbw;
}
# END CALLOUT C
print "\n";
# Configure the X axis.
if( my $Axis = $Chart->Axes( xlCategory ) )
{
$Axis->{HasMajorGridlines} = 0;
$Axis->{TickLabels}->{orientation} = xlUpward;
with( $Axis->{TickLabels}->{Font},
Name => "Tahoma",
Bold => 0,
Italic => 0
);
}
# Configure the Y axis.
if( my $Axis = $Chart->Axes( xlValue ) )
{
$Axis->{HasMajorGridlines} = 1;
$Axis->{MajorGridlines}->{Border}->{Weight} = 1;
$Axis->{MajorGridlines}->{Border}->{ColorIndex} = 48;
$Axis->{MajorGridlines}->{Border}->{LineStyle} = xlContinuous;
with( $Chart->Axes( xlValue )->{TickLabels}->{Font},
Name => "Tahoma",
Bold => 0,
Italic => 0
);
}
# BEGIN CALLOUT D
# Configure data-point labels.
$Chart->SeriesCollection( 1 )->{HasDataLabels} = 1;
if( my $Labels = $Chart->SeriesCollection(1)->DataLabels() )
{
with( $Labels,
NumberFormat => "#.0",
Type => xlDataLabelsShowValue
);
with( $Labels->{Font},
Name => "Tahoma",
Bold => 0,
Italic => 0,
);
}
if( defined $ChartOptions{title} )
{
$Chart->{HasTitle} = 1;
$Chart->{ChartTitle}->{Text} = $ChartOptions{title};
$Chart->{ChartTitle}->{Font}->{Name} = "Tahoma";
$Chart->{ChartTitle}->{Font}->{Size} = 18;
}
# Remove consecutive redundant data-point labels.
$iTotal = $Chart->SeriesCollection( 1 )->Points()->{Count};
$iIndex = 0;
my $PrevText = "";
foreach my $Point (in( $Chart->SeriesCollection( 1 )->Points()))
{
my $Percent = int( ++$iIndex * 100 / $iTotal );
my $Text = $Point->{DataLabel}->{Text};
$Point->{MarkerStyle} = xlMarkerStyleDot;
$Point->{DataLabel}->{Font}->{Background} = xlBackgroundOpaque;
$Point->{DataLabel}->{Top} -= 12;
$Point->{HasDataLabel} = 0 if( $Text eq $PrevText );
$PrevText = $Text;
print "\rFormatting: $Percent%";
}
# END CALLOUT D
print "\n";
print "Exporting to GIF file: $File\n";
# BEGIN CALLOUT E
$Chart->Export( $File, "GIF", 0 );
# END CALLOUT E
`start "" "$File"`;
# print "Press <Enter> to continue...";
# <STDIN>;
-----Original Message-----
Sent: Thursday, September 19, 2002 10:58 AM
To: Multiple recipients of list ORACLE-L
We use MRTG to produce graphs for data from different sources .... network
stats, hardware stats, database stats.
Maybe you could use it for statspack.
-----Original Message-----
Sent: Thursday, September 19, 2002 8:39 AM
To: Multiple recipients of list ORACLE-L
Does anyone have or know of any utilities, preferably
freeeware or very cheap, that can produce graphs of
the data collected by statspack?
Thanks VERY much in advance.
-walt
--
Please see the official ORACLE-L FAQ: http://www.orafaq.com
--
Author: Walter K
INET: [EMAIL PROTECTED]
Fat City Network Services -- 858-538-5051 http://www.fatcity.com
San Diego, California -- Mailing list and web hosting services
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from). You may
also send the HELP command for other information (like subscribing).
--
Please see the official ORACLE-L FAQ: http://www.orafaq.com
--
Author: Kevin Lange
INET: [EMAIL PROTECTED]
Fat City Network Services -- 858-538-5051 http://www.fatcity.com
San Diego, California -- Mailing list and web hosting services
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from). You may
also send the HELP command for other information (like subscribing).
--
Please see the official ORACLE-L FAQ: http://www.orafaq.com
--
Author: Gesler, Rich
INET: [EMAIL PROTECTED]
Fat City Network Services -- 858-538-5051 http://www.fatcity.com
San Diego, California -- Mailing list and web hosting services
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from). You may
also send the HELP command for other information (like subscribing).