ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/experimental/reports/queuegraphing/watch.pl
Revision: 1.1
Committed: Sun Oct 21 16:52:41 2001 UTC (23 years, 1 month ago) by tdb
Content type: text/plain
Branch: MAIN
Log Message:
An experimental go at using rrdtool to graph i-scream data. Graphing the
Queue's seem like a good idea, as this wasn't done anywhere else. The
README file gives details on how this works.

File Contents

# User Rev Content
1 tdb 1.1 #!/usr/local/bin/perl -w
2    
3     $| = 1;
4    
5     use strict;
6     use iscream::XMLParser;
7     use IO::Socket;
8    
9     if (@ARGV != 2) {
10     die "Usage: ihost.pl [i-scream client interface] [TCP port]\n";
11     }
12    
13     my($addr) = $ARGV[0];
14     my($cport) = $ARGV[1];
15    
16     my($csock) = new IO::Socket::INET(
17     PeerAddr => $addr,
18     PeerPort => $cport,
19     Proto => 'tcp'
20     ) or die "Cannot connect!";
21    
22     if (!defined $csock) {
23     print "ERROR: Could not connect to $addr:$cport.\n";
24     print "Please check that there is an i-scream server at this address.\n";
25     exit(1);
26     }
27    
28     my($response);
29    
30     $response = <$csock>;
31     if ($response && $response ne "PROTOCOL 1.1\n") {
32     print "The i-scream server sent an unexpected protocol id: $response\n";
33     close($csock);
34     exit(1);
35     }
36    
37     print $csock "queuegrapher\n";
38     $response = <$csock>;
39     if ($response && $response ne "OK\n") {
40     print "Received unexpected response: $response\n";
41     close($csock);
42     exit(1);
43     }
44    
45     print $csock "SETHOSTLIST\n";
46     $response = <$csock>;
47     if ($response && $response ne "OK\n") {
48     print "Received odd response: $response\n";
49     close($csock);
50     exit(1);
51     }
52    
53     print $csock "_NULL_\n";
54     $response = <$csock>;
55     if ($response && $response ne "OK\n") {
56     print "Received odd response: $response\n";
57     close($csock);
58     exit(1);
59     }
60    
61     print $csock "STARTDATA\n";
62     $response = <$csock>;
63    
64     chop $response;
65     print "Asked to connect to port $response on $addr, connecting...\n";
66    
67     my($dport) = $response;
68    
69     my($dsock) = new IO::Socket::INET(
70     PeerAddr => $addr,
71     PeerPort => $dport,
72     Proto => 'tcp'
73     ) or die "Cannot connect!";
74    
75     if (!defined $dsock) {
76     print "ERROR: Could not connect to $addr:$dport.\n";
77     print "Failure in communications.\n";
78     close($csock);
79     exit(1);
80     }
81    
82     while(1) {
83     $response = <$dsock>;
84     my($err, %xmlhash) = &iscream::XMLParser::parse($response);
85     if($err) {
86     print "SKIPPED (bad xml): $response";
87     }
88     #foreach my $key (keys %xmlhash) {
89     # print "$key == $xmlhash{$key}\n";
90     #}
91     if($xmlhash{"packet.attributes.type"} eq "queueStat") {
92     my($hash) = $xmlhash{"packet.attributes.hashCode"};
93     my($date) = $xmlhash{"packet.attributes.date"};
94     my($name) = $xmlhash{"packet.attributes.name"};
95     my($total) = $xmlhash{"packet.queue.attributes.total"};
96     my($i) = 0;
97     while(defined $xmlhash{"packet.queue.attributes.queue$i"}) {
98     if( ! -f "$hash\_$i.rrd" ) {
99     print "making new database for $hash\_$i\n";
100     &makerrd($hash, $i, $date, $name);
101     }
102     my($size) = $xmlhash{"packet.queue.attributes.queue$i"};
103     my($cmd) = "rrdtool update $hash\_$i.rrd $date:$size:$total";
104     print `$cmd`;
105     print "$cmd\n";
106     ++$i;
107     }
108     }
109     else {
110     print "SKIPPED: valid xml, but not a queueStat packet";
111     }
112     #if($response =~ /^<packet type="queueStat" date="(\d+)" name="(.*)" hashCode="(\d+)"><queue queue0="(\d+)" total="(\d+)" maxSize="(\d+)"><\/queue><\/packet>$/) {
113     # print "DATE: $1 HASH: $3 SIZE0: $4 TOTAL: $5 MAX: $6\n";
114     # if( ! -f "$3.rrd" ) {
115     # print "making new database for $3\n";
116     # &makerrd($3, $1, $2);
117     # }
118     # my($cmd) = "rrdtool update $3.rrd $1:$4:$5";
119     # print `$cmd`;
120     #}
121     #else {
122     # print "SKIPPED: $response";
123     #}
124     }
125    
126     exit 0;
127    
128     #<packet type="queueStat" date="1003332749" name="net3filter Filter" hashCode="2905137"><queue queue0="0" total="783170" maxSize="1000"></queue></packet>
129    
130     #packet.attributes.name == realtimeclients TCPHandler:myrtle.ukc.ac.uk
131     #packet.queue.attributes.total == 13
132     #packet.queue.attributes.maxSize == 1000
133     #packet.queue.attributes.queue0 == 0
134     #packet.queue.attributes.queue1 == 0
135     #packet.attributes.hashCode == 4575504
136     #packet.attributes.date == 1003614252
137     #packet.attributes.type == queueStat
138    
139     sub makerrd() {
140     my($name, $queuenum, $start, $comment) = @_;
141     $start = $start - 15;
142     my($init) = "rrdtool create $name\_$queuenum.rrd --start $start --step 15";
143     my($ds) = "DS:size:GAUGE:600:U:U DS:total:COUNTER:600:U:U";
144     # 3h in 15s samples 1d in 2m samples 1w in 15m samples 1m in 1hr samples
145     my($rra1) = "RRA:AVERAGE:0.5:1:720 RRA:AVERAGE:0.5:8:720 RRA:AVERAGE:0.5:60:672 RRA:AVERAGE:0.5:240:744";
146     my($rra2) = "RRA:MAX:0.5:1:720 RRA:MAX:0.5:8:720 RRA:MAX:0.5:60:672 RRA:MAX:0.5:60:744";
147     my($cmd) = "$init $ds $rra1 $rra2";
148     print `$cmd`;
149     print "$cmd\n";
150     print `echo "$comment" > $name.def`;
151     }