HOWTO RRD

HOWTO και TIP.
Άβαταρ μέλους
kargig
Sr. Member
Sr. Member
Δημοσιεύσεις: 448
Εγγραφή: 08 Νοέμ 2005, 21:42
Distro: Windows
Τοποθεσία: Ioannina
Επικοινωνία:

HOWTO RRD

Δημοσίευση από kargig » 02 Δεκ 2005, 23:52

-start disclaimer-
Το HOWTO αυτό θα είναι λιγάκι γενικό για δώσει μια πρώτη ιδέα για την χρήση των RRD αρχείων. Δεν έχει σκοπό να καλύψει πως γίνεται install το κάθε πακέτο που αναφέρεται μέσα σε αυτό το HOWTO στα διάφορα distros, ούτε και να αναλύσει κάθε option του rrdtool. Αποτελεί απλά μια εισαγωγή στα rrds ώστε να δώσει ιδέες για το τι μπορεί να κάνει κάποιος με το εργαλείο αυτό.
-end disclaimer-



Τι είναι RRD ?

RRD λέγονται κάποιες "βάσεις δεδομένων" με στοιχεία για κίνηση γραμμών, θερμοκρασίες και άλλα στατιστικά που μπορεί κανείς να μαζέψει από κάθε είδους sensors. Δημιουργούνται από το πρόγραμμα rrdtool. Το βασικότερο πλεονέκτημα του RRD έναντι άλλων "τρόπων" συλλογής στατιστικών (όπως το mrtg) είναι η δυναμικότητα που παρέχουν, καθώς τα στοιχεία αποθηκεύονται σε μία βάση δεδομένων και μπορείς να τα ανακαλείς για να φτιάξεις ένα γράφημα της κίνησης ενός interface όποτε τα χρειάζεσαι και όχι ανά "τακτά" χρονικά διαστήματα όπως πχ χρειάζεται το mrtg. Επίσης παρέχει πολύ μεγαλύτερη ανάλυση και ευελιξία στα γραφήματα, μπορείς να παίρνεις τιμές από κάποιο sensor μέχρι και ανά 1-2 second.

Πως φτιάχνουμε ένα RRD ?

Θα πάρουμε για παράδειγμα την εξαγωγή στατιστικών για την ethernet0 (eth0) ενός linux μηχανήματος. Αφού έχουμε εγκαταστήσει το rrdtool για την διανομή μας, προχωρούμε στην δημιουργία της rrd βάσης. Δημιουργούμε το αρχείο eth0_rrd_create.sh με τα εξής περιεχόμενα:

Κώδικας: Επιλογή όλων

#!/bin/sh
rrdtool create eth0.rrd --start `date +"%s"` \
DS:IN:COUNTER:600:0:12500000 \
DS:OUT:COUNTER:600:0:12500000 \
--step 300 \
RRA:AVERAGE:0.5:1:2000 \
RRA:AVERAGE:0.5:6:2000 \
RRA:AVERAGE:0.5:24:2000 \
RRA:AVERAGE:0.5:288:2000 \
RRA:MAX:0.5:1:2000 \
RRA:MAX:0.5:6:2000 \
RRA:MAX:0.5:24:2000 \
RRA:MAX:0.5:288:2000
Η γραμμή "DS:IN:COUNTER:600:0:12500000" σημαίνει τα εξής -> DS:ds-name:COUNTER:heartbeat:min:max
όπου:
DS = Data Source, κοινώς τι θέλουμε να κάνουμε monitor. Εμείς θα πάρουμε τώρα το INcoming και το OUTgoing traffic της κάρτας δικτύου. Επίσης ορίζουμε τον τύπο του μετρητή ως COUNTER, επειδή είναι κάτι που αυξάνει συνέχεια και δεν είναι απλή ένδειξη τιμής (τότε θα βάζαμε GAUGE). Μετά τον τύπο ορίζουμε το heartbeat που είναι το μέγιστο διάστημα σε seconds που μπορεί να μην έχουμε πάρει τιμές μέχρι να θεωρήσει το rrdtool ότι το status του sensor είναι unknown. Έπειτα ορίζουμε το MIN:MAX του sensor. Στη συγκεκριμένη περίπτωση μιλάμε για μία 100Mbit  ethernet όπου MIN=0 και MAX=12500000 bytes.
To step ορίζει το κάθε πότε περιμένει η βάση rrd μια τιμή. Στη συγκεκριμένη περίπτωση είναι κάθε 300 seconds = 5 minutes.
Τα RRA (Round Robin Archives) καθορίζουν την ακρίβεια των τιμών. Για να μην μπλέξουμε πολύ τα πράγματα για τώρα, ας θεωρήσουμε ότι απλά "ισχύουν".

τώρα εκτελούμε το αρχείο αυτό ως εξής:

Κώδικας: Επιλογή όλων

/bin/sh eth0_rrd_create.sh
θα δούμε στο τρέχον directory μας ένα αρχείο με όνομα eth0.rrd. H βάση μας έχει δημιουργηθεί. Τώρα μένει να την τροφοδοτήσουμε με δεδομένα. Προς το παρόν μεταφέρουμε αυτό το αρχείο σε ένα άλλο κατάλογο που θα βάζουμε όλα μας τα rrd. Εγώ χρησιμοποιώ το /var/rrds/ , ο καθένας μπορεί να βάλει βέβαια ότι τον βολεύει.

Πως γεμίζουμε ένα RRD ?

Για το παράδειγμα με την eth0 υπάρχουν πολλοί τρόποι να πάρει κανείς στατιστικά και να τα στείλει στη βάση. Εδώ θα παρουσιάσω 2 από αυτούς.

α) Με χρήση IPTABLES.
Δημιουργούμε 2 rules στα IPTABLES μας με κενό target. Έτσι θα χρησιμοποιήσουμε τους μετρητές που παρέχουν τα iptables για bytes (ή και packets αν θέλουμε) και θα στείλουμε τα δεδομένα που θα πάρουμε στην rrd βάση μας.

Δημιουργούμε το εξής μικρό script iptables.sh:

Κώδικας: Επιλογή όλων

#!/bin/bash
IPTABLES=/sbin/iptables
$IPTABLES -I INPUT -i eth0
$IPTABLES -I OUTPUT -o eth0
το βάζουμε μαζί με τα άλλα scripts μας και το καλούμε σε ένα από τα boot scripts μας (rc.local, local.start, κτλ αναλόγως την διανομή).
Αυτό θα δημιουργήσει τα rules με τα κενά targets που θέλουμε. Αν τρέξουμε τωρα "iptables -nxvL" (με την προϋπόθεση ότι δεν έχουμε άλλα rules για τα IPTABLES) θα δούμε κάτι σαν:

Κώδικας: Επιλογή όλων

Chain INPUT (policy ACCEPT 8227306 packets, 8621975599 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
 8227257 8621970407            all  --  eth0   *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 6050224 packets, 695679163 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
 6050072 695668967            all  --  *      eth0    0.0.0.0/0            0.0.0.0/0
Δημιουργούμε τώρα ένα ακόμα script ώστε να παίρνουμε τα bytes που μας δίνουν τα iptables και να τα στέλνουμε στην rrd βάση μας.
inout.sh:

Κώδικας: Επιλογή όλων

#!/bin/bash
IPTABLES="/sbin/iptables"
BYTES=`$IPTABLES -nvxL | grep -w eth0 | awk '{ print $2 }'`;
echo "$BYTES"
BYTESIN=`echo $BYTES | cut -d ' ' -f1`
BYTESOUT=`echo $BYTES | cut -d ' ' -f2` 
/usr/bin/rrdtool update /var/rrds/eth0.rrd N:$BYTESIN:$BYTESOUT
Αν έχετε αλλάξει το μέρος όπου βάζετε τα δικά σας rrd ίσως χρειαστεί να αλλάξετε κατάλληλα την τελευταία γραμμή.
Δοκιμάστε να τρέξετε "με το χέρι" το inout.sh 1-2 φορές ως εξής: /bin/sh inout.sh και ύστερα τρέξτε κάτι σαν αυτό:

Κώδικας: Επιλογή όλων

athlios ~ # rrdtool last /var/rrds/eth0.rrd
1133555102
Αν σας βγάζει τιμή, όπως βγάζει και σε μένα όλα πήγαν καλά μέχρι εδώ. Αν όχι έχετε κάνει κάποιο λάθος στα παραπάνω οπότε πρέπει να το διορθώσετε πριν προχωρήσετε παρακάτω.

Αυτοματοποίηση συγκέντρωσης στατιστικών
Αν όλα έχουν πάει καλά μέχρι εδώ προχωράμε στην αυτοματοποίηση της συγκέντρωσης των στατιστικών. Τοποθετούμε στο crontab μας μία γραμμή της μορφής α) ή β), αναλόγως ποιον τρόπο χρησιμοποιήσαμε για την συξκέντρωση των στατιστικών:

α)

Κώδικας: Επιλογή όλων

*/5 * * * * /bin/sh /SCRIPTSDIR/inout.sh
αλλάζοντας προφανώς το SCRIPTSDIR με το directory που βάζουμε εμείς τα scripts μας.
Αν μετά από 6-7 λεπτά τρέξουμε πάλι το

Κώδικας: Επιλογή όλων

# rrdtool last /var/rrds/eth0.rrd
θα πρέπει να βλέπουμε μια νέα τιμή.

Δημιουργία γραφημάτων
Ωραία, γεμίζουμε την βάση με δεδομένα...πως θα τα δούμε τώρα αυτά με όμορφα γραφηματάκια ? Χρειαζόμαστε ένα web server (apache, thttpd, lighthttpd,κτλ) με cgi support να τρέχει στο μηχάνημά μας. Δημιουργούμε ύστερα το εξής αρχείο eth0.cgi και το τοποθετούμε στο cgi directory του web server μας:

Κώδικας: Επιλογή όλων

#!/usr/bin/rrdcgi
<HTML>
<HEAD><TITLE>eth0 Stats</TITLE></HEAD>
        <BODY>
        <H3>Daily BANDWIDTH Usage(5min average)</H3>
        <RRD::GRAPH
        /var/www/localhost/stats/eth0_day.png -h 150 -w 400  -a PNG
        --imginfo '<IMG SRC=/stats/%s WIDTH=%lu HEIGHT=%lu >'
    --start -86400 --end -300 --x-grid MINUTE:30:HOUR:1:HOUR:2:0:%H 
    DEF:IN_bytes=/var/rrds/eth0.rrd:IN:AVERAGE
    DEF:OUT_bytes=/var/rrds/eth0.rrd:OUT:AVERAGE
    "CDEF:IN_bits=IN_bytes,"
    "CDEF:OUT_bits=OUT_bytes,"
    "CDEF:OUT_bits_neg=OUT_bits,-1,*"
    "CDEF:eth0_bytes_in=IN_bytes,0,12500000,LIMIT,UN,0,IN_bytes,IF,86400,*"
    "CDEF:eth0_bytes_out=OUT_bytes,0,12500000,LIMIT,UN,0,OUT_bytes,IF,86400,*"
    "CDEF:eth0_bytes=eth0_bytes_in,eth0_bytes_out,+"
    AREA:IN_bits#9FB6CD:IN
    AREA:OUT_bits_neg#00CED1:OUT
    COMMENT:"\n"
    COMMENT:"             maximum       average       current\n"
    COMMENT:"in    "
    GPRINT:IN_bits:MAX:"%7.2lf %sb/s"
    GPRINT:IN_bits:AVERAGE:"%7.2lf %Sb/s"
    GPRINT:IN_bits:LAST:"%7.2lf %Sb/s"
    COMMENT:"\n"
    COMMENT:"out   "
    GPRINT:OUT_bits:MAX:"%7.2lf %Sb/s"
    GPRINT:OUT_bits:AVERAGE:"%7.2lf %Sb/s"
    GPRINT:OUT_bits:LAST:"%7.2lf %Sb/s"
    COMMENT:"\n"
    GPRINT:eth0_bytes_in:AVERAGE:"graph totals  %7.2lf %sB i"
    GPRINT:eth0_bytes_out:AVERAGE:"%7.2lf %sB o"
    GPRINT:eth0_bytes:AVERAGE:"%7.2lf %sB t"
    COMMENT:"\n"
  

>

<H3>Weekly BANDWIDTH Usage(30min average)</H3>
        <RRD::GRAPH
        /var/www/localhost/stats/eth0_week.png -h 150 -w 400 -a PNG
        --imginfo '<IMG SRC=/stats/%s WIDTH=%lu HEIGHT=%lu >'
        --lazy --start -604800 --end -1800
    DEF:IN_bytes=/var/rrds/eth0.rrd:IN:AVERAGE
    DEF:OUT_bytes=/var/rrds/eth0.rrd:OUT:AVERAGE
    "CDEF:IN_bits=IN_bytes,"
    "CDEF:OUT_bits=OUT_bytes,"
    "CDEF:OUT_bits_neg=OUT_bits,-1,*"
    "CDEF:eth0_bytes_in=IN_bytes,0,12500000,LIMIT,UN,0,IN_bytes,IF,604800,*"
    "CDEF:eth0_bytes_out=OUT_bytes,0,12500000,LIMIT,UN,0,OUT_bytes,IF,604800,*"
    "CDEF:eth0_bytes=eth0_bytes_in,eth0_bytes_out,+"
    AREA:IN_bits#9FB6CD:IN
    AREA:OUT_bits_neg#00CED1:OUT
    COMMENT:"\n"
    COMMENT:"             maximum       average       current\n"
    COMMENT:"in    "
    GPRINT:IN_bits:MAX:"%7.2lf %sb/s"
    GPRINT:IN_bits:AVERAGE:"%7.2lf %Sb/s"
    GPRINT:IN_bits:LAST:"%7.2lf %Sb/s"
    COMMENT:"\n"
    COMMENT:"out   "
    GPRINT:OUT_bits:MAX:"%7.2lf %Sb/s"
    GPRINT:OUT_bits:AVERAGE:"%7.2lf %Sb/s"
    GPRINT:OUT_bits:LAST:"%7.2lf %Sb/s"
    COMMENT:"\n"
    GPRINT:eth0_bytes_in:AVERAGE:"graph totals  %7.2lf %sB i"
    GPRINT:eth0_bytes_out:AVERAGE:"%7.2lf %sB o"
    GPRINT:eth0_bytes:AVERAGE:"%7.2lf %sB t"
    COMMENT:"\n"


>
<H3>Monthly BANDWIDTH Usage(2hour average)</H3>
        <RRD::GRAPH
        /var/www/localhost/stats/eth0_month.png -h 150 -w 400 -a PNG
        --imginfo '<IMG SRC=/stats/%s WIDTH=%lu HEIGHT=%lu >'
        --lazy --start -2592000 --end -7200
    DEF:IN_bytes=/var/rrds/eth0.rrd:IN:AVERAGE
    DEF:OUT_bytes=/var/rrds/eth0.rrd:OUT:AVERAGE
    "CDEF:IN_bits=IN_bytes,"
    "CDEF:OUT_bits=OUT_bytes,"
    "CDEF:OUT_bits_neg=OUT_bits,-1,*"
    "CDEF:eth0_bytes_in=IN_bytes,0,12500000,LIMIT,UN,0,IN_bytes,IF,604800,*"
    "CDEF:eth0_bytes_out=OUT_bytes,0,12500000,LIMIT,UN,0,OUT_bytes,IF,604800,*"
    "CDEF:eth0_bytes=eth0_bytes_in,eth0_bytes_out,+"
    AREA:IN_bits#9FB6CD:IN
    AREA:OUT_bits_neg#00CED1:OUT
    COMMENT:"\n"
    COMMENT:"             maximum       average       current\n"
    COMMENT:"in    "
    GPRINT:IN_bits:MAX:"%7.2lf %sb/s"
    GPRINT:IN_bits:AVERAGE:"%7.2lf %Sb/s"
    GPRINT:IN_bits:LAST:"%7.2lf %Sb/s"
    COMMENT:"\n"
    COMMENT:"out   "
    GPRINT:OUT_bits:MAX:"%7.2lf %Sb/s"
    GPRINT:OUT_bits:AVERAGE:"%7.2lf %Sb/s"
    GPRINT:OUT_bits:LAST:"%7.2lf %Sb/s"
    COMMENT:"\n"
    GPRINT:eth0_bytes_in:AVERAGE:"graph totals  %7.2lf %sB i"
    GPRINT:eth0_bytes_out:AVERAGE:"%7.2lf %sB o"
    GPRINT:eth0_bytes:AVERAGE:"%7.2lf %sB t"
    COMMENT:"\n"


>
<H3>Yearly BANDWIDTH Usage(1day average)</H3>
        <RRD::GRAPH
        /var/www/localhost/stats/eth0_year.png
        --imginfo '<IMG SRC=/stats/%s WIDTH=%lu HEIGHT=%lu >'
        --lazy --start -31536000 --end -86400 -h 150 -w 400 -a PNG
    DEF:IN_bytes=/var/rrds/eth0.rrd:IN:AVERAGE
    DEF:OUT_bytes=/var/rrds/eth0.rrd:OUT:AVERAGE
    "CDEF:IN_bits=IN_bytes,"
    "CDEF:OUT_bits=OUT_bytes,"
    "CDEF:OUT_bits_neg=OUT_bits,-1,*"
    "CDEF:eth0_bytes_in=IN_bytes,0,12500000,LIMIT,UN,0,IN_bytes,IF,604800,*"
    "CDEF:eth0_bytes_out=OUT_bytes,0,12500000,LIMIT,UN,0,OUT_bytes,IF,604800,*"
    "CDEF:eth0_bytes=eth0_bytes_in,eth0_bytes_out,+"
    AREA:IN_bits#9FB6CD:IN
    AREA:OUT_bits_neg#00CED1:OUT
    COMMENT:"\n"
    COMMENT:"             maximum       average       current\n"
    COMMENT:"in    "
    GPRINT:IN_bits:MAX:"%7.2lf %sb/s"
    GPRINT:IN_bits:AVERAGE:"%7.2lf %Sb/s"
    GPRINT:IN_bits:LAST:"%7.2lf %Sb/s"
    COMMENT:"\n"
    COMMENT:"out   "
    GPRINT:OUT_bits:MAX:"%7.2lf %Sb/s"
    GPRINT:OUT_bits:AVERAGE:"%7.2lf %Sb/s"
    GPRINT:OUT_bits:LAST:"%7.2lf %Sb/s"
    COMMENT:"\n"
    GPRINT:eth0_bytes_in:AVERAGE:"graph totals  %7.2lf %sB i"
    GPRINT:eth0_bytes_out:AVERAGE:"%7.2lf %sB o"
    GPRINT:eth0_bytes:AVERAGE:"%7.2lf %sB t"
    COMMENT:"\n"



>

</BODY>
</HTML>
Αν υποθέσουμε πως το cgi directory του server μας, είναι το cgi-bin αν πάμε στο http://127.0.0.1/cgi-bin/eth0.cgi
θα πρέπει να βλέπουμε κάποια όμορφα γραφηματάκια.

Επίλογος
Με κάποια σχετικά απλά scripts καταφέραμε να κάνουμε monitor το traffic μιας eth0. Σίγουρα υπάρχουν έτοιμα πακέτα όπως το cacti που τα κάνει όλα αυτά πολύ πιο αυτοματοποιημένα, αλλά κάποιος με παρόμοιο τρόπο με αυτόν  που περιέγραψα παραπάνω μπορεί να φτιάξει τα δικά του στατιστικά για κάθε είδους μέγεθος. Από τo free space ενός δίσκου, το signal του wireless client του, τη θερμοκρασία του cpu, και πολλά πολλά άλλα. Όλα εξαρτώνται από τη δυνατότητά μας να φτιάχνουμε scripts όπως το inout.sh αφού αυτό είναι που κάνει όλη την εισαγωγή των δεδομένων στην rrd βάση. Αν σας δυσκολεύει το cgi μπορείτε να βρείτε το RRGrapher του Dave Plonka που φτιάχνει δυναμικά cgis διαβάζοντας τα rrd που του δίνετε.

Καλό monitoring!
Τελευταία επεξεργασία από το μέλος kargig την 15 Δεκ 2007, 19:05, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
agorf
Top Poster
Top Poster
Δημοσιεύσεις: 637
Εγγραφή: 07 Νοέμ 2005, 23:44
Distro: Debian testing
Τοποθεσία: Χαλκίδα
Επικοινωνία:

RRD [HOWTO]

Δημοσίευση από agorf » 28 Φεβ 2006, 00:29

Ωραίο και χρήσιμο HOWTO. Καλό θα ήταν να περιλάμβανε και μια περιγραφή των RRA's μιας και, κατ' εμέ, είναι το πιο δυσνόητο κομμάτι του RRDTool.

linuxs
Jr. Member
Jr. Member
Δημοσιεύσεις: 61
Εγγραφή: 09 Οκτ 2016, 21:16

Re: HOWTO RRD

Δημοσίευση από linuxs » 08 Μαρ 2011, 00:45

thx και σε μένα! +1

Απάντηση

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης