<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2900.3157" name=GENERATOR></HEAD>
<BODY>
<DIV><FONT face=Arial size=2><SPAN class=442423412-12102007>(This is a resend
since the formatting was crapped out in the previous mail)</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Hi.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>The problem with parsing is to know what you want
to parse.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>The first step is to send your information to
hobbit and see it displayed.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Second step is to configure hobbitlaunch.cfg file
to send the data from the column to your script.<BR> FROM
/etc/hobbit/hobbitlaunch.cfg<BR>[rrdstatus]<BR>
ENVFILE
/usr/lib/hobbit/server/etc/hobbitserver.cfg<BR>
NEEDS hobbitd<BR> CMD hobbitd_channel
--channel=status --log=$BBSERVERLOGS/rrd-status.log hobbitd_rrd
--extra-tests=hitastig --extra-script=/usr/lib/hobbit/server/ext/rrd_digitemp.pl
--rrddir=$BBVAR/rrd The --extra-tests is the definition of what columns you want
to parse. You can have as many columns as you like, comma seperated.<BR>The
--extra-script is the path to the script that you wish to run to do the parsing.
You can only have one there.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Then you have to edit hobbitserver.cfg and add the
test to TEST2RRD and GRAPHS variables.<BR>Then either reboot the server or kill
hobbit_channel processes (they should restart the next time they are scheduled
to run)</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>To begin to know what you have to parse, just tell
the script to write to some file (overwrite, not append .. Unless of course you
want it to grow bigger and bigger). It should be very similar to what the web
site shows.<BR>Alternatively there should be a way to use the bb program to
display it, but I didn't bother finding out how.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Then of course you do your parsing.<BR>I recommend
that you read about RRD graphs and how you can display different values (is it a
counter, is it a variable like temperature, percentage etc etc) on the official
RRD website which slips my mind ATM where it is located .. Google will probably
help.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>You should receive 3 args from hobbit when it runs
your script, it behaves so: $scriptname $hostname $testname $messagefile The
messagefile is a temporary file which you shall parse.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>The final stage is to output your information to
hobbit in a way it understands, printing directly to STDOUT.<BR>The format is
so, note that you don’t have to have the type GAUGE, replace with what you
need:<BR>DS:<datasetname>:GAUGE:600:0:100<BR><Testname>.<sensorname>.rrd<BR><value><BR>DS:<datasetname>:GAUGE:600:0:100<BR><Testname>.<sensor2name>.rrd<BR><value><BR>Etc
etc..</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>A tip for the wise, I had a lot of struggle with
this when I was making it, and then realised that I can't have the datasetnames
any different in all the files, it has to be static, that is, one
name.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Then you should check if there are any RRD files
being made.<BR>They should be located in
/var/lib/hobbit/rrd/<hostname>/</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Then there comes the fun, to be able to show off
your results in a graph. You should edit hobbitgraph.cfg file for that.<BR>Mine
looks like this:<BR>[hitastig]<BR>
FNPATTERN hitastig.(.*).rrd<BR> TITLE
Hitastig<BR> YAXIS
Celsius<BR>
DEF:h@RRDIDX@=@RRDFN@:temperature:AVERAGE<BR>
LINE2:h@RRDIDX@#@COLOR@:@RRDPARAM@<BR>
GPRINT:h@RRDIDX@:LAST: \: %5.1lf
(cur)<BR> GPRINT:h@RRDIDX@:MAX: \:
%5.1lf (max)<BR> GPRINT:h@RRDIDX@:MIN:
\: %5.1lf (min)<BR>
GPRINT:h@RRDIDX@:AVERAGE: \: %5.1lf (avg)\n</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>The files it expects are
hitastig.<sensorname>.rrd, don't let that extra dot fool you, it needs to
be there.<BR>See in the DEF line, the name I chose for the datasets is
temperature. (I REMIND YOU AGAIN, IT NEEDS TO BE STATIC)</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>If you do this successfully, you should see a graph
in hobbit as soon as you finish this last thing (just let the website refresh
once).</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>For reference (and of course to future developers
that will read the mailing list archive) I will attach my scripts here so you
know what to expect.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>dgitemp.pl -- This script reads from digitemp
values, names and peak values from the MySQL database and sends them to
hobbit.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>#!/usr/bin/perl<BR># This script reads digitemp
values and writes them to a # temporary file which the hobbit client sends out
to # the Hobbit Monitor.<BR># This script really should be rewritten so it will
contain subs for operations.<BR># That would be much more tidier.<BR># Written
by Sigurdur Gudbrandsson<BR># <A
href="mailto:sigurdur@raforninn.is">sigurdur@raforninn.is</A></FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>use strict;<BR>use DBI;</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Lets declare our variables</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $db_user = "username"; # Change to whatever your
username is my $db_pass = "password"; # Change to whatever your password is my
$db_name = "stats"; my $table_meta = "digitemp_metadata"; my $table =
"digitemp";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># We need to get some variables from the
environment, don't change this my $BB = $ENV{BB}; my $BBDISP = $ENV{BBDISP}; my
$MACHINE = $ENV{MACHINE}; my $BBTMP = $ENV{BBTMP};</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Change this to whatever you want your test to be
named my $testname = "hitastig";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Don't change this or your test will never be
green my $color = "green";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Set this to other than 0 if you want to debug my
$debug = 0;</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Lets connect to the database<BR>my $dbh =
DBI->connect("DBI:mysql:$db_name","$db_user","$db_pass")<BR>
or die "I cannot connect to dbi:mysql:$db_name as $db_user -
$DBI::errstr\n";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Lets get the sensor ID's, names and min/max
values</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $sql = "SELECT
SerialNumber,name,description,min,max FROM $db_name.$table_meta";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $sth = $dbh->prepare($sql) or die "Can't
execute statement $sql because: $DBI::errstr"; $sth->execute();</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my (@sensors) = ();<BR>while (my @ary =
$sth->fetchrow_array()) {<BR> if
($ary[3] == "NULL")
{<BR>
$ary[3] = 0.000;<BR>
}<BR> if ($ary[4] == "NULL")
{<BR>
$ary[4] = 99.999;<BR>
}<BR> push(@sensors, [@ary]); #
[@ary] is a reference } $sth->finish();</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now we have all the sensors in a two dimensional
array, @sensors # Also, if there is a NULL value in min or max, it has been
substituted with a value</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now we will get the temperature of each sensor
from the database # and check if the temp is too high or too low.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $count = 0;<BR>while (@{sensors[$count]})
{<BR> print "WHILE: entering first
while loop\n" if ($debug);<BR> my $sql
= "SELECT Fahrenheit FROM $db_name.$table WHERE
SerialNumber='$sensors[$count][0]' ORDER BY dtKey DESC LIMIT
0,1";<BR> print "SQL: term is \" $sql
\" \n" if ($debug);<BR> my $sth =
$dbh->prepare($sql) or die "Can't execute statement $sql because:
$DBI::errstr";<BR>
$sth->execute();<BR>
$sensors[$count][5] =
$sth->fetchrow_array();<BR> if
($sensors[$count][5] >
$sensors[$count][4]){<BR>
print "IF: status for $sensors[$count][1] is red\n" if
($debug);<BR>
$sensors[$count][6] =
"&red";<BR>
$color = "red";<BR>
}<BR> elsif ($sensors[$count][5] <
$sensors[$count][3]){<BR>
print "IF: status for $sensors[$count][1] is yellow\n" if
($debug);<BR>
$sensors[$count][6] =
"&yellow";<BR>
if ($color !=
"red"){<BR>
$color =
"yellow";<BR>
}<BR>
}<BR> else
{<BR>
print "IF: status for $sensors[$count][1] is green\n" if
($debug);<BR>
$sensors[$count][6] =
"&green";<BR>
}<BR>
$sth->finish();<BR>
$count++;<BR>}</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># We can close the database
now<BR>$dbh->disconnect();</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Next is to get our results into an array # For
reference, 0=SerialNumber 1=name 2=description 3=min 4=max 5=value 6=color in
our array</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $tmp =
"\n"; # First line in the
array<BR>print $color if ($debug);<BR>$count = 0;<BR>while (@{sensors[$count]})
{<BR> print "WHILE: entering second
while loop\n" if ($debug);<BR> print
"WHILE: $sensors[$count][1] is being printed\n" if
($debug);<BR> $tmp =
$tmp." $sensors[$count][6]
$sensors[$count][1] =
$sensors[$count][5]\n";<BR> $tmp =
$tmp." :
min=$sensors[$count][3]
max=$sensors[$count][4]\n";<BR> $tmp =
$tmp." :
$sensors[$count][2]\n\n";<BR>
$count++;<BR>}</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now we decode from UTF-8 to latin1 (iso-8859-1)
if there is anything in utf8 open(TEMP, ">$BBTMP/$testname.tmp.txt"); print
TEMP $tmp; close(TEMP);</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now we get the converted data<BR>$tmp =
`/usr/bin/iconv -f utf8 -t iso-8859-1 $BBTMP/$testname.tmp.txt`;</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now finally we output the information to our
beloved hobbit my $date = localtime; my $cmd = "$BB $BBDISP \"status
$MACHINE.$testname $color $date \n $tmp \n \""; system($cmd);</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>print $cmd if ($debug);<BR>print $tmp if
($debug);</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>exit;</FONT></DIV>
<DIV> </DIV><FONT face=Arial size=2>
<DIV><BR>Here is the output from this script</DIV>
<DIV> </DIV>
<DIV> &green Tölvu_kæling = 21.25
C<BR> :
min=1.000
max=25.000<BR>
: This sensor has not yet been described</DIV>
<DIV> </DIV>
<DIV> &green Verkstæði = 25.81
C<BR> :
min=0.000
max=99.999<BR>
: This sensor has not yet been described</DIV>
<DIV> </DIV>
<DIV> &green Tölvuskápur = 22.12
C<BR> :
min=14.000
max=25.000<BR>
: This sensor has not yet been described</DIV>
<DIV> </DIV>
<DIV> &green Tölvu_kæl_út = 46.38
C<BR> :
min=0.000
max=99.999<BR>
: This sensor has not yet been described</DIV>
<DIV> </DIV>
<DIV>rrd_digitemp.pl -- This script parses the information from hobbit and
produces the channel data to make the RRD files.</DIV>
<DIV> </DIV>
<DIV>#!/usr/bin/perl</DIV>
<DIV> </DIV>
<DIV>use strict;</DIV>
<DIV> </DIV>
<DIV># Input parameters: Hostname, testname (column), and messagefile my
$hostname=$ARGV[0]; my $testname=$ARGV[1]; my $fname=$ARGV[2];</DIV>
<DIV> </DIV>
<DIV>my ($line1, @line, @buff, @key, @value, $value, @tmp);</DIV>
<DIV> </DIV>
<DIV>open(IN,"$fname");<BR>read(IN, $line1,
10000);<BR>@line=split('\n',$line1);<BR>@buff = grep(/ =
/,@line);<BR>close(IN);<BR>chomp(@buff);
# Lets strip the newline if there is any.<BR>for( my $i = 0; $i <
scalar(@buff); $i++) # Now we go through the
whole array of lines<BR>{<BR>
$buff[$i] = substr($buff[$i], 10); # Trimming the
beginning<BR> $buff[$i] =~ s/
C//g;
# Removing the end<BR> $buff[$i] =~ s/
//g;
# Removing all the whitespace<BR> @tmp
= split('=', $buff[$i]);<BR> $key[$i]
= makesafe($tmp[0]);<BR> $value[$i] =
$tmp[1];<BR># print
$buff[$i]."\n";
# Printing a test line to view the results<BR>}</DIV>
<DIV> </DIV>
<DIV>open(IN,">>/var/log/hobbit/custrrd.log");<BR>write($buff[1]);<BR>close(IN);</DIV>
<DIV> </DIV>
<DIV><BR># The next loop will print out the information for making the RRD
file.<BR>for( my $i = 0; $i < scalar(@key); $i++ )
{<BR> print
"DS:temperature:GAUGE:600:0:100\n"; # Prints out
each sensor name<BR># print
"DS:".$key[$i].":GAUGE:600:0:100\n"; # Prints out
each sensor name<BR> print
$testname.".".$key[$i].".rrd\n";
# Prints out the rrd file name<BR>
print
$value[$i]."\n";
# Prints out the value<BR>}</DIV>
<DIV> </DIV>
<DIV># This sub produces safe output so hobbit will be able to make the files #
(It seems that hobbit doesn't like special letters in file names) sub makesafe
{<BR> my $word =
shift;<BR> $word =~
s/ö/o/g;<BR> $word =~
s/á/a/g;<BR> $word =~
s/í/i/g;<BR> $word =~
s/é/e/g;<BR> $word =~
s/ó/o/g;<BR> $word =~
s/ý/y/g;<BR> $word =~
s/ú/u/g;<BR> $word =~
s/æ/ae/g;<BR> $word =~
s/ð/d/g;<BR> $word =~
s/þ/th/g;<BR># $word =~
s/_//g;<BR># $word =
lc($word);<BR> return
$word;<BR>}</DIV>
<DIV> </DIV>
<DIV>exit;</DIV>
<DIV> </DIV>
<DIV><BR>I hope this isn't overkill. :)</DIV>
<DIV> </DIV>
<DIV>With regards,</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>------------------------------</DIV>
<DIV> </DIV>
<DIV>Sigurður Guðbrandsson</DIV>
<DIV> </DIV>
<DIV>Raförninn ehf.</DIV>
<DIV> </DIV>
<DIV>Suðurhlíð 35</DIV>
<DIV> </DIV>
<DIV>105 Reykjavik | Iceland</DIV>
<DIV> </DIV>
<DIV><A href="mailto:sigurdur@raforninn.is">sigurdur@raforninn.is</A> | <A
href="http://www.raforninn.is">www.raforninn.is</A></DIV>
<DIV> </DIV>
<DIV>Office: +(354) 552 2070</DIV>
<DIV> </DIV>
<DIV>Mobile: +(354) 867 3573</DIV>
<DIV> </DIV>
<DIV>------------------------------</DIV>
<DIV> </DIV>
<DIV><BR>-----Original Message-----<BR>From: Alan Sparks
[mailto:asparks@doublesparks.net]<BR>Sent: 10. október 2007 21:06<BR>To:
Sigurður Guðbrandsson<BR>Subject: Re: [hobbit] Custom graphs with multiple data
sources</DIV>
<DIV> </DIV>
<DIV>Since I am in the same boat with my server (downtime not an option), I am
interested in your approach. I already have custom scripts for this, but
am interested in what you do differently as far as parsing. Are you
parsing the incoming messages and re-sending them to Hobbit? What is the
"proper format?"<BR>Thanks for your reply.<BR>-Alan</DIV>
<DIV> </DIV>
<DIV> wrote:<BR>> Hi.<BR>><BR>> There is a fourth option, which I
took as updating to snapshot caused my hobbit to break for some reason, and
seeing that it is a system I must have up 99% of the day, I just
backported.<BR>> Well, that was not the option anyways :)<BR>><BR>> My
suggestion is that you make a custom script to parse your information and create
the RRD's (actually the hobbit server manages creating the RRD's .. You just
have to parse the information and send it in the proper format to
hobbit).<BR>> That way you can have your multi-file RRD's (one per balancer
or some) and you don't have to update to snapshot.<BR>><BR>> I wrote my
script in perl (my very first perl script .. How I hate the language ;) and it
works very well.<BR>> You will not find it in the Shire, mainly because I
haven't posted it there yet.<BR>><BR>> If you need info on how the
information is, and how to parse it, just drop me a line.<BR>><BR>> With
regards,<BR>><BR>><BR>> ------------------------------<BR>><BR>>
Sigur ur Gu brandsson<BR>><BR>> Raf rninn ehf.<BR>><BR>> Su
urhl 35<BR>><BR>> 105 Reykjavik | Iceland<BR>><BR>> <A
href="mailto:sigurdur@raforninn.is">sigurdur@raforninn.is</A> | <A
href="http://www.raforninn.is">www.raforninn.is</A><BR>><BR>> Office:
+(354) 552 2070<BR>><BR>> Mobile: +(354) 867 3573<BR>><BR>>
------------------------------<BR>><BR>><BR>> -----Original
Message-----<BR>> From: Charles Goyard
[mailto:charles.goyard@orange-ftgroup.com]<BR>> Sent: 10. okt ber 2007
06:50<BR>> To: <A href="mailto:hobbit@hswn.dk">hobbit@hswn.dk</A><BR>>
Subject: Re: [hobbit] Custom graphs with multiple data sources<BR>><BR>>
Hi,<BR>><BR>><BR>> Alan Sparks wrote :<BR>><BR>>
<BR>>> However, with this, I am only able to manage one graph, and one
data <BR>>> source, per device. I would like to graph all the
session values.<BR>>> I would also like to use multiple RRD files.
My experience with the <BR>>> single-file, multiple-DS approach is that,
if I add another virtual, <BR>>> graphing will break (updates error out,
probably since the RRD was <BR>>> not created with this new data source
defined).<BR>>> [...]<BR>>> <BR>><BR>>
Check the september 2007 mail archives, there's a discussion about
it.<BR>><BR>> There's three solutions :<BR>><BR>> - apply a patch I
posted on the list (does split-ncv on a testname<BR>> basis). My
patch has a memory leak, so beware (I kill my hobbitd_rrd<BR>>
every 24h).<BR>> - send "data" messages with a body like
"foo.rrd:mydsname:GAUGE:500<BR>> (Sorry, no pointers for that
one, and it needs a recent snapshot).<BR>> - take a snapshot or a least the
hobbitd/rrd directory from the source,<BR>> it includes the
split-ncv feature without the memory leak (thank<BR>>
Henrik).<BR>><BR>><BR>> --<BR>> Charles Goyard - <A
href="mailto:charles.goyard@orange-ftgroup.com">charles.goyard@orange-ftgroup.com</A>
- (+33) 1 45 38 01<BR>> 31 Orange Business Services - online multimedia
// ing nierie<BR>><BR>> To unsubscribe from the hobbit list, send an
e-mail to <BR>> <A
href="mailto:hobbit-unsubscribe@hswn.dk">hobbit-unsubscribe@hswn.dk</A><BR>><BR>><BR>>
To unsubscribe from the hobbit list, send an e-mail to <BR>> <A
href="mailto:hobbit-unsubscribe@hswn.dk">hobbit-unsubscribe@hswn.dk</A><BR>><BR>><BR>><BR>>
</DIV>
<DIV> </DIV>
<DIV><BR>--<BR>Alan Sparks, UNIX/Linux Systems Integration and Administration
<<A
href="mailto:asparks@doublesparks.net">asparks@doublesparks.net</A>><BR></FONT></DIV>
<DIV> </DIV>
<DIV align=left><FONT size=2>
<P align=left>------------------------------</P>
<P>Sigurður Guðbrandsson<BR>Raförninn ehf.<BR>Suðurhlíð 35<BR>105 Reykjavik |
Iceland<BR><A
href="mailto:sigurdur@raforninn.is">sigurdur@raforninn.is</A> | <A
href="http://www.raforninn.is/">www.raforninn.is</A></FONT><BR><FONT
size=2>Office: +(354) 552 2070<BR>Mobile: +(354) 867 3573</P>
<P>------------------------------</P></FONT></DIV>
<DIV> </DIV></BODY></HTML>