Store statistics into a sqlite3 database. This way, we can quickly filter links on the top page, deprecating the linkusage page

Signed-off-by: jack <jack@k-net.pro>
This commit is contained in:
jack 2017-02-25 15:58:28 +01:00
parent f8fe1b74bf
commit d6c4c0ff95
No known key found for this signature in database
GPG Key ID: 1C625C4E15F0CF99
7 changed files with 108 additions and 85 deletions

View File

@ -30,7 +30,7 @@ read_knownlinks();
my @links = values %knownlinks; my @links = values %knownlinks;
# walk through all RRD files in the given path and extract stats for all links # walk through all RRD files in the given path and extract stats for all links
# from them; write the stats to a text file, sorted by total traffic # from them; write the stats to an sqlite database
my @rrdfiles = File::Find::Rule->maxdepth(2)->file->in($rrdpath); my @rrdfiles = File::Find::Rule->maxdepth(2)->file->in($rrdpath);
@ -51,45 +51,34 @@ foreach my $rrdfile (@rrdfiles) {
} }
print "\n"; print "\n";
# now sort the keys in order of descending total traffic my $query = 'create table stats(asn int';
my @asorder = sort {
my $total_a = 0;
foreach my $t (values %{$astraffic->{$a}}) {
$total_a += $t;
}
my $total_b = 0;
foreach my $t (values %{$astraffic->{$b}}) {
$total_b += $t;
}
return $total_b <=> $total_a;
} keys %$astraffic;
open(STATSFILE, ">$statsfile.tmp");
# print header line
print STATSFILE "as";
foreach my $link (@links) { foreach my $link (@links) {
print STATSFILE "\t${link}_in\t${link}_out\t${link}_v6_in\t${link}_v6_out"; $query .= ", ${link}_in int, ${link}_out int, ${link}_v6_in int, ${link}_v6_out int";
} }
print STATSFILE "\n"; $query .= ');';
use DBI;
my $db = DBI->connect("dbi:SQLite:dbname=$statsfile.tmp", '', '');
$db->do('PRAGMA synchronous = OFF');
$db->do('drop table if exists stats');
$db->do($query);
# print data # print data
foreach my $as (@asorder) { foreach my $as (keys %{ $astraffic }) {
print STATSFILE "$as";
$query = "insert into stats values('$as'";
foreach my $link (@links) { foreach my $link (@links) {
print STATSFILE "\t" . undefaszero($astraffic->{$as}->{"${link}_in"}); $query .= ", '" . undefaszero($astraffic->{$as}->{"${link}_in"}) . "'";
print STATSFILE "\t" . undefaszero($astraffic->{$as}->{"${link}_out"}); $query .= ", '" . undefaszero($astraffic->{$as}->{"${link}_out"}) . "'";
print STATSFILE "\t" . undefaszero($astraffic->{$as}->{"${link}_v6_in"}); $query .= ", '" . undefaszero($astraffic->{$as}->{"${link}_v6_in"}) . "'";
print STATSFILE "\t" . undefaszero($astraffic->{$as}->{"${link}_v6_out"}); $query .= ", '" . undefaszero($astraffic->{$as}->{"${link}_v6_out"}) . "'";
} }
$query .= ');';
print STATSFILE "\n"; $db->do($query);
} }
close(STATSFILE); $db->disconnect();
rename("$statsfile.tmp", $statsfile); rename("$statsfile.tmp", $statsfile);
sub undefaszero { sub undefaszero {

View File

@ -17,7 +17,6 @@ $show95th = true;
$ntop = 20; $ntop = 20;
$showv6 = true; $showv6 = true;
$showtitledetail = true; $showtitledetail = true;
$hidelinkusagename = true; # $showtitledetail will need to be true to allow this
$vertical_label = true; # vertical IN/OUT label in graph $vertical_label = true; # vertical IN/OUT label in graph
$brighten_negative = true; # brighten the "negative" part of graphs $brighten_negative = true; # brighten the "negative" part of graphs

View File

@ -10,10 +10,6 @@ $default_graph_height = 360;
$top_graph_width = 600; $top_graph_width = 600;
$top_graph_height = 220; $top_graph_height = 220;
/* Size of graphs on link usage page */
$linkusage_graph_width = 600;
$linkusage_graph_height = 480;
/* Size of graphs on AS-Set page */ /* Size of graphs on AS-Set page */
$asset_graph_width = 600; $asset_graph_width = 600;
$asset_graph_height = 200; $asset_graph_height = 200;

View File

@ -95,49 +95,52 @@ function getknownlinks() {
return $knownlinks; return $knownlinks;
} }
function getasstats_top($ntop, $statfile) { function getasstats_top($ntop, $statfile, $selected_links) {
/* first step: walk the data for all ASes to determine the top 5 for the given link */ try{
$fd = fopen($statfile, "r"); $db = new SQLite3($statfile);
if (!$fd) }catch(Exception $e){
return array(); return array();
$cols = explode("\t", trim(fgets($fd))); }
/* read in up to $ntop AS stats, sum up columns */ if(sizeof($selected_links) == 0){
while (!feof($fd)) { $selected_links = array();
$line = trim(fgets($fd)); foreach(getknownlinks() as $link)
if (!$line) $selected_links[] = $link['tag'];
continue; }
$els = explode("\t", $line); $nlinks = 0;
$query_total = '0';
/* first element is the AS */ $query_links = '';
$as = $els[0]; foreach($selected_links as $tag){
$query_links .= "${tag}_in, ${tag}_out, ${tag}_v6_in, ${tag}_v6_out, ";
$nlinks += 4;
$query_total .= " + ${tag}_in + ${tag}_out + ${tag}_v6_in + ${tag}_v6_out";
}
$query = "select asn, $query_links $query_total as total from stats order by total desc limit $ntop";
$asn = $db->query($query);
$asstats = array();
while($row = $asn->fetchArray()){
$tot_in = 0; $tot_in = 0;
$tot_out = 0; $tot_out = 0;
$tot_v6_in = 0; $tot_v6_in = 0;
$tot_v6_out = 0; $tot_v6_out = 0;
foreach($row as $key => $value){
for ($i = 1; $i < count($els); $i++) { if (strpos($key, '_in') !== false) {
if (strpos($cols[$i], "_in") !== false) { if (strpos($key, '_v6_') !== false)
if (strpos($cols[$i], "_v6_") !== false) $tot_v6_in += $value;
$tot_v6_in += $els[$i];
else else
$tot_in += $els[$i]; $tot_in += $value;
} else { } else if (strpos($key, '_out') !== false) {
if (strpos($cols[$i], "_v6_") !== false) if (strpos($key, '_v6_') !== false)
$tot_v6_out += $els[$i]; $tot_v6_out += $value;
else else
$tot_out += $els[$i]; $tot_out += $value;
} }
} }
$asstats[$as] = array($tot_in, $tot_out, $tot_v6_in, $tot_v6_out); $asstats[$row['asn']] = array($tot_in, $tot_out, $tot_v6_in, $tot_v6_out);
if (count($asstats) >= $ntop)
break;
} }
fclose($fd);
return $asstats; return $asstats;
} }
@ -224,14 +227,14 @@ function clearCacheFileASSET($asset) {
} }
# return the html used in top.php : <a href=blabla><img src=blabla/></url> # return the html used in top.php : <a href=blabla><img src=blabla/></url>
function getHTMLUrl($as, $ipversion, $desc, $start, $end, $peerusage){ function getHTMLUrl($as, $ipversion, $desc, $start, $end, $peerusage, $selected_links = array()){
$img = getHTMLImg($as, $ipversion, $desc, $start, $end, $peerusage, '', '', false); $img = getHTMLImg($as, $ipversion, $desc, $start, $end, $peerusage, '', '', false, $selected_links);
$result = "<a href='history.php?as=$as&peerusage=$peerusage&v=$ipversion' target='_blank'>$img</a>"; $result = "<a href='history.php?as=$as&peerusage=$peerusage&v=$ipversion' target='_blank'>$img</a>";
return($result); return($result);
} }
# return the html used in history.php (for example) : <img src=blabla/> # return the html used in history.php (for example) : <img src=blabla/>
function getHTMLImg($as, $ipversion, $desc, $start, $end, $peerusage, $alt, $class, $history = false){ function getHTMLImg($as, $ipversion, $desc, $start, $end, $peerusage, $alt, $class, $history = false, $selected_links=array()){
global $top_graph_width; global $top_graph_width;
global $top_graph_height; global $top_graph_height;
@ -240,6 +243,14 @@ function getHTMLImg($as, $ipversion, $desc, $start, $end, $peerusage, $alt, $cla
$result = "<img alt='$alt' class='$class' src='gengraph.php?v=$ipversion&as=$as&peerusage=$peerusage&dname=$dname&start=$start&end=$end"; $result = "<img alt='$alt' class='$class' src='gengraph.php?v=$ipversion&as=$as&peerusage=$peerusage&dname=$dname&start=$start&end=$end";
if(!$history) if(!$history)
$result .= "&width=$top_graph_width&height=$top_graph_height&nolegend=1"; $result .= "&width=$top_graph_width&height=$top_graph_height&nolegend=1";
if(sizeof($selected_links) != 0){
$result .= "&selected_links=";
foreach($selected_links as $link)
$result .= "$link,";
$result = rtrim($result, ',');
}
$result .= "'"; $result .= "'";
if(!$history) if(!$history)

View File

@ -29,6 +29,23 @@ else
$peerusage = 0; $peerusage = 0;
$knownlinks = getknownlinks(); $knownlinks = getknownlinks();
if(isset($_GET['selected_links'])){
$reverse = array();
foreach($knownlinks as $link)
$reverse[$link['tag']] = array('color' => $link['color'], 'descr' => $link['descr']);
$links = array();
foreach(explode(',', $_GET['selected_links']) as $tag){
$link = array('tag' => $tag,
'color' => $reverse[$tag]['color'],
'descr' => $reverse[$tag]['descr']);
$links[] = $link;
}
$knownlinks = $links;
}
$rrdfile = getRRDFileForAS($as, $peerusage); $rrdfile = getRRDFileForAS($as, $peerusage);
if ($compat_rrdtool12) { if ($compat_rrdtool12) {

View File

@ -17,14 +17,6 @@ if($showpeeras == true){
endif; endif;
} }
echo "<span>Link usage:</span> ";
foreach ($top_intervals as $interval) {
echo '<a href="linkusage.php?numhours=' . $interval['hours'] . '"';
if ($dpagename == "linkusage" && @$_GET['numhours'] == $interval['hours'])
echo ' class="selected"';
echo '>' . $interval['label'] . '</a> | ';
}
if ($dpagename == "history"): if ($dpagename == "history"):
?><a href="history.php" class="selected">View an AS</a> | <?php ?><a href="history.php" class="selected">View an AS</a> | <?php
else: else:

View File

@ -25,7 +25,15 @@ else {
$statsfile = statsFileForHours($hours); $statsfile = statsFileForHours($hours);
} }
$label = statsLabelForHours($hours); $label = statsLabelForHours($hours);
$topas = getasstats_top($ntop, $statsfile);
$knownlinks = getknownlinks();
$selected_links = array();
foreach($knownlinks as $link){
if(isset($_GET["link_${link['tag']}"]))
$selected_links[] = $link['tag'];
}
$topas = getasstats_top($ntop, $statsfile, $selected_links);
$start = time() - $hours*3600; $start = time() - $hours*3600;
$end = time(); $end = time();
@ -98,9 +106,9 @@ echo join(" | ", $htmllinks);
</th> </th>
<td> <td>
<?php <?php
echo getHTMLUrl($as, 4, $asinfo['descr'], $start, $end, $peerusage); echo getHTMLUrl($as, 4, $asinfo['descr'], $start, $end, $peerusage, $selected_links);
if ($showv6) if ($showv6)
echo getHTMLUrl($as, 6, $asinfo['descr'], $start, $end, $peerusage); echo getHTMLUrl($as, 6, $asinfo['descr'], $start, $end, $peerusage, $selected_links);
?> ?>
</td> </td>
</tr> </tr>
@ -109,11 +117,20 @@ echo join(" | ", $htmllinks);
</table> </table>
<div id="legend"> <div id="legend">
<form method='get'>
<input type='hidden' name='numhours' value='<?php echo $hours; ?>'/>
<input type='hidden' name='n' value='<?php echo $ntop; ?>'/>
<table> <table>
<?php <?php
$knownlinks = getknownlinks(); $knownlinks = getknownlinks();
foreach ($knownlinks as $link) { foreach ($knownlinks as $link) {
echo "<tr><td style=\"border: 4px solid #fff;\">"; $tag = "link_${link['tag']}";
echo "<tr><td><input type='checkbox'";
if(isset($_GET[$tag]) && $_GET[$tag] == 'on')
echo " checked='checked'";
echo "name=\"$tag\" id=\"$tag\"/></td><td style=\"border: 4px solid #fff;\">";
echo "<table style=\"border-collapse: collapse; margin: 0; padding: 0\"><tr>"; echo "<table style=\"border-collapse: collapse; margin: 0; padding: 0\"><tr>";
if ($brighten_negative) { if ($brighten_negative) {
@ -124,10 +141,12 @@ foreach ($knownlinks as $link) {
} }
echo "</tr></table>"; echo "</tr></table>";
echo "</td><td>&nbsp;" . $link['descr'] . "</td></tr>\n"; echo "</td><td><label for=\"$tag\">&nbsp;${link['descr']}</label></td></tr>\n";
} }
?> ?>
</table> </table>
<center><input type='submit' value='Filter'/></center>
</form>
</div> </div>
<?php include('footer.inc'); ?> <?php include('footer.inc'); ?>