[or-cvs] r14044: Moving towards stored bandwidth (ticket 67) (in torstatus/trunk: . web)

kasimir at seul.org kasimir at seul.org
Sat Mar 15 02:42:00 UTC 2008


Author: kasimir
Date: 2008-03-14 22:42:00 -0400 (Fri, 14 Mar 2008)
New Revision: 14044

Added:
   torstatus/trunk/bandwidthhistory/
   torstatus/trunk/web/bandwidthgraph/
Modified:
   torstatus/trunk/install.sql
   torstatus/trunk/tns_update.pl
Log:
Moving towards stored bandwidth (ticket 67)

Modified: torstatus/trunk/install.sql
===================================================================
--- torstatus/trunk/install.sql	2008-03-15 02:28:47 UTC (rev 14043)
+++ torstatus/trunk/install.sql	2008-03-15 02:42:00 UTC (rev 14044)
@@ -13,21 +13,6 @@
 -- --------------------------------------------------------
 
 -- 
--- Table structure for table `Bandwidth`
--- 
-
-DROP TABLE IF EXISTS `Bandwidth`;
-CREATE TABLE `Bandwidth` (
-  `id` int(11) NOT NULL auto_increment,
-  `fingerprint` tinytext NOT NULL,
-  `write` blob NOT NULL,
-  `read` blob NOT NULL,
-  PRIMARY KEY  (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-
--- --------------------------------------------------------
-
--- 
 -- Table structure for table `DNSEL`
 -- 
 

Modified: torstatus/trunk/tns_update.pl
===================================================================
--- torstatus/trunk/tns_update.pl	2008-03-15 02:28:47 UTC (rev 14043)
+++ torstatus/trunk/tns_update.pl	2008-03-15 02:42:00 UTC (rev 14044)
@@ -33,6 +33,8 @@
 # Included Perl packages
 #  * serialize.pm
 #
+# Optional Perl packages
+#  * RRDs
 
 # Include the required packages
 use DBI;
@@ -42,7 +44,11 @@
 use MIME::Base64;
 use LWP::Simple;
 use Date::Parse;
+use RRDs;
 
+# Temporary Debugging
+$| = 1;
+
 # Set the constant to break out of getting the hostnames
 use constant TIMEOUT => 1;
 $SIG{ALRM} = sub {die "timeout"};
@@ -81,6 +87,12 @@
 }
 close ($config_handle);
 
+# Determine whether bandwidth history is enabled
+if ($config{'BandwidthHistory'} eq "true")
+{
+	use RRDs;
+}
+
 # Loop through until killed
 while (1 == 1)
 {
@@ -372,7 +384,7 @@
 			push @readhistory, "$numtime:$num";
 			$offset -= $increment;
 		}
-		$currentRouter{'read'} = join(';', at readhistory);
+		$currentRouter{'read'} = join(' ', at readhistory);
 
 		# TEMPORARY FOR BACKWARDS COMPATIBILITY
 		$currentRouter{'ReadHistoryLAST'} = "$1 $2";
@@ -407,7 +419,7 @@
 			push @writehistory, "$numtime:$num";
 			$offset -= $increment;
 		}
-		$currentRouter{'write'} = join(';', at writehistory);
+		$currentRouter{'write'} = join(' ', at writehistory);
 		
 		# TEMPORARY FOR BACKWARDS COMPATIBILITY
 		$currentRouter{'WriteHistoryLAST'} = "$1 $2";
@@ -500,7 +512,7 @@
 					push @readhistory, "$numtime:$num";
 					$offset -= $increment;
 				}
-				$currentRouter{'read'} = join(';', at readhistory);
+				$currentRouter{'read'} = join(' ', at readhistory);
 			
 				# TEMPORARY FOR BACKWARDS COMPATIBILITY
 				$currentRouter{'ReadHistoryLAST'} = "$1 $2";
@@ -534,7 +546,7 @@
 					push @writehistory, "$numtime:$num";
 					$offset -= $increment;
 				}
-				$currentRouter{'write'} = join(';', at writehistory);
+				$currentRouter{'write'} = join(' ', at writehistory);
 				
 				# TEMPORARY FOR BACKWARDS COMPATIBILITY
 				$currentRouter{'WriteHistoryLAST'} = "$1 $2";
@@ -584,10 +596,15 @@
 		);
 
 		# Update the read and write bandwidth history
+		if ($config{'BandwidthHistory'} eq "true")
+		{
 		updateBandwidth( $currentRouter{'Fingerprint'},
 			$currentRouter{'write'},
 			$currentRouter{'read'},
-			$dbh);
+			$currentRouter{'WriteHistoryINC'},
+			$currentRouter{'nickname'}
+		);
+		}
 
 		# Save to the DNSEL table as well
 		$dbresponse2->execute($currentRouter{'address'},$exitpolicystring);
@@ -763,10 +780,72 @@
     return $CACHE{$ip} || $ip;
 }
 
-# This updates the bandwidth table for a given router
+# This updates the bandwidth history database for a given router
 sub updateBandwidth {
-	my ($fingerprint, $write, $read, $dbh) = @_;
-	my $dbresponse3 = $dbh->prepare("SELECT `read`, `write` FROM `Bandwidth` WHERE `fingerprint` LIKE '$fingerprint'\;");
-	$dbresponse3->execute();
-	my @results = $dbresponse3->fetchrow();
+	my ($fingerprint, $write, $read, $inc, $name) = @_;
+
+	# Determine whether a bandwidth history file for this router exists
+	my $bwfile = $config{'TNS_Path'} . "bandwidthhistory/$fingerprint.rrd";
+	my $graphfile = $config{'TNS_Path'} . "web/bandwidthgraph/$fingerprint.png";
+	unless (-e $bwfile)
+	{
+		# Create the bandwidth history file
+		# There will be two datasources, read and write
+		#open (my $create_file, ">", $bwfile);
+		#close ($create_file);
+		RRDs::create(
+			$bwfile,
+			"--start", "1167634800", # start on Jan 1, 2007
+			"--step", "100", #$inc,
+			# Add read, write history values
+			"DS:rh:COUNTER:" . $inc . ":U:U",
+			"DS:wh:COUNTER:" . $inc . ":U:U", 
+			# Add RRAs
+			"RRA:AVERAGE:0.5:10:3600",
+			"RRA:AVERAGE:0.5:90:1200",
+			"RRA:AVERAGE:0.5:360:1200",
+			"RRA:AVERAGE:0.5:8640:600"
+		);
+	}
+	# Add the known bandwidth data into the RRD database
+	# Put the bandwidth into a hash to match the rh and wh
+	my %bandwidth = ();
+	my @readarray = split(" ",$read);
+	my @writearray = split(" ",$write);
+	foreach my $rhitem (@readarray)
+	{
+		my @rh = split(":",$rhitem);
+		$bandwidth{$rh[0]} = $rh[1] . ":U"; # By default assume 
+						    # no write history
+	}
+	foreach my $whitem (@writearray)
+	{
+		my @wh = split(":",$whitem);
+		unless ($bandwidth{$wh[0]})
+		{
+			$bandwidth{$wh[0]} = "U:U";
+		}
+		$bandwidth{$wh[0]} =~ s/\:U/\:$wh[1]/;
+	}
+	# Update the RRD database
+	foreach my $time (sort (keys %bandwidth))
+	{
+		RRDs::update(
+			$bwfile,
+			$time . ":" . $bandwidth{$time}
+		);
+		my $err = RRDs::error;
+	#	print "RRDs::update error: $err\n" if $err;
+	}
+	# Create a new RRD graph for the router
+	RRDs::graph(
+		$graphfile,
+		"--title=Daily Bandwidth for $name",
+		"--vertical-label=Bandwidth (KBps)",
+		"--start=end-1d", "--end=now",
+		"DEF:rh=$bwfile:rh:AVERAGE",
+		"DEF:wh=$bwfile:wh:AVERAGE",
+		"LINE1:rh#FF0000:Read History",
+		"LINE1:wh#FFFF00:Write History"
+	);
 }



More information about the tor-commits mailing list