Hlavní navigace

Prechádzame na RRDTOOL (6)

Milan Gigel

V minulých častiach sme si ukázali mnohé praktické využitia vizualizačného nástroja pre zobrazovanie hodnôt v časových radoch. Ostala nám ešte jedna posledná téma a to práca s protokolom SNMP, ako tomu bolo pri primárnom určení nástroja MRTG.

Primárna podpora SNMP v balíku RRDTOOL implementovaná nie je. Preto je potrebné, aby sme zber dát zabezpečili nejakým externým prostriedkom, ktorý by túto prácu vykonal. Najčastejšie nás zaujíma grafické vyhodnocovanie trafficu na príslušných sieťových rozhraniach serverov a routerov v nami spravovanej sieti.

Pre jednoduchý zber nám bohaté poslúži nástroj z balíka snmp-utils z názvom snmpget. Jednoduchosť MRTG vymizá, avšak pri základnej znalosti SNMP nie je problémom danú situáciu riešiť. Vopred je potrebné v príslušnom MIB súbore (alebo prostredníctvom nástroja snmpwalk) zistiť si príslušný OID identifikátor. Jeho zistenie by malo byť bezproblémové, je však viac ako vhodné overiť si, či vrátené hodnoty skutočne vyjadrujú požadovaný údaj. V našom prípade si vytvoríme graf vyjadrujúci tok dát cez rozhranie e0 routera Cisco 2500.

V našom prípade bude počet dát pretekajúci týmto rozhraním v OID .iso.3.6.1.2.1­.2.2.1.10.1 pre dáta tečúce dnu a v .iso.3.6.1.2.1­.2.2.1.16.1 pre dáta tečúce rozhraním von. Následne, keď už príslušné identifikátory OID máme k dispozícii, môžeme uskutočniť jednoduchým spôsobom ich načítanie. Pri použití príslušných parametrov pre zjednodušenie spracovania a následnou extrakciou pomocou awku dostaneme k dispozícii požadované hodnoty vyjadrujúce kumulovanú hodnotu pretečených dát v bajtoch za celkový uptime. V našom prípade to môže vyzerať nasledovne:

#snmpget -Pe -Oq 111.111.111.111 public .iso.3.6.1.2.1.2.2.1.10.1|
  awk '{printf $2}'
584584574
#snmpget -Pe -Oq 111.111.111.111 public .iso.3.6.1.2.1.2.2.1.16.1|
  awk '{printf $2}'
452458812

Z tohto budeme vychádzať pri tvorbe modelového skriptu pre ich spracovanie. V
princípe môže skript vyzerať nasledovne:

#! /usr/bin/perl

use lib qw( /rrdtool/perl-shared/blib/lib /rrdtool/perl-shared/blib/arch );
use lib qw( /usr/local/rrdtool-1.0.33/lib/perl /rrdtool/lib/perl );

use RRDs;
my $start=time;
my $rrd=   "/home/httpd/rrdtool.domena.sk-443/html/host.rrd";
my $name = "/home/httpd/rrdtool.domena.sk-443/html/host.png";

if (not -f $rrd){
RRDs::create ($rrd, "--start",$start-1, "--step",60,
          "DS:in:COUNTER:180:U:U",
          "DS:out:COUNTER:180:U:U",
          "RRA:AVERAGE:0.5:1:3600",
          "RRA:MIN:0.5:1:3600",
          "RRA:MAX:0.5:1:3600",
);
};

my $ERROR = RRDs::error;
die "$0: unable to create `$rrd': $ERROR\n" if $ERROR;


$in=`snmpget -Pe -Oq 111.111.111.111 public .iso.3.6.1.2.1.2.2.1.10.1|
  awk '{printf \$2}'`+0;
$out=`snmpget -Pe -Oq 111.111.111.111 public .iso.3.6.1.2.1.2.2.1.16.1|
  awk '{printf \$2}'`+0;

$date=`date`;

print "$start:$in:$out";

RRDs::update $rrd,"$start:$in:$out";

my $ERROR = RRDs::error;
die "$0: unable to create `$rrd': $ERROR\n" if $ERROR;

$in=int($in/1024/1024);
$out=int($out/1024/1024);

RRDs::graph "$name",
  "--title", "Prehlad SNMP trafficu",
  "--start", "now-1d",
  "--end", "now",
  "--imgformat","PNG",
  "--width=600",
  "--height=150",
  "--step=300",
  "DEF:in=$rrd:in:AVERAGE",
  "DEF:out=$rrd:out:AVERAGE",
  "CDEF:gout=0,out,-",
  "CDEF:grin=in,8,*",
  "CDEF:grout=gout,8,*",
  "AREA:grin#d60000:Traffic in total\\: $in MB\\r",
  "AREA:grout#00d600:Traffic out total\\: $out MB\\r",
  "COMMENT:Generovane $date ",
;

if ($ERROR = RRDs::error) {
  print "ERROR: $ERROR\n";
};

Ako v predchádzajúcich príkladoch na začiatku definujeme názov RRA archívu a
výstupného grafického súboru, za ktorými nasleduje v prípade neexistencie RRA
archívu jeho vytvorenie. Všimnite si, že vstupné premenné je potrebné pre
tento účel nadefinovať ako typ COUNTER pre zabezpečenie automatického výpočtu
aktuálnej hodnoty za sledovaný časový úsek, v našom prípade 60 sekúnd.
Nasleduje zber príslušných dát pomocou snmpwalk a ich zápis do RRA archívu. Do
premenných $in a $out si uložíme celkový objem pretečených dát, ktorý pre
rýchlejšiu čitateľnosť pre dosahované veľké objemy premeníme na MB. Môžeme sa
teda pustiť do tvorby grafu samotného. Prostredníctvom DEF: si načítame pre
každý časový úsek hodnotu prietoku a prostredníctvom CDEF definícií preklopíme
prvotne odchádzajúce dáta na zápornú časť osi y a upravíme pre výpis.
Nasleduje vykreslenie AREA grafov pre obe veličiny s legendou vyjadrujúcou
celkový objem pretečených dát od posledného nulovania counterov a graf je na
svete. Výsledok môže vyzerať nasledovne:

Graf - větší obrázek

Ako vidno prostredníctvom tohto mocného nástroja je možné graficky zobrazovať ľubovoľné časové rady pri v podstate neobmedzenom počte sledovaných veličín pri možnosti presnej definície časového rámca. Uplatnenie je teda viac ako široké.

Našli jste v článku chybu?
4. 4. 2002 10:17
Vena (neregistrovaný)

Resim problem, jak jednou vytvorenou (create) databazi pozmenit, abych neznicil jiz ulozena data. Priklad: chci v jednom grafu kumulativne zobrazovat prenos dat z jednotlivych web serveru tak, abych videl i soucet prenosu. Jasne, to zvladnu. Ale jak pridat po nejake dobe do grafu dalsi web? Je to dalsi sledovana hodnota. Kdyz smazu databazi a vytvorim znovu, prijdu o historii. Kdyz vytvorim dalsi databazi, jak zobrazim v grafu data ze dvou databazi? Nejaky napad?