POSIXový sběratel collectd ve vašich službách

Adam Štrauch 7. 7. 2009

O získávání statistik se na mnoha serverech stará nějaký skript napsaný v Pythonu, Perlu nebo podobném jazyku. Samotné sbírání dat pak často zabere více výkonu než služby, které server poskytuje. Proto vznikl projekt collectd, který je napsán v čistém C a hodí se i na malé routery s OpenWRT.

Collectd je daemon, který vytváří a sbírá statistiky z lokálního stoje i ze strojů vzdálených. Dokáže využít multicastu i unicastu, takže přidání jednoho routeru navíc je velmi pohodlné a nevyžaduje další zásahy do monitorovacího serveru. Collectd dokáže sbírat informace a také informovat administrátora, že je něco špatně pomocí emailu, případně předá zprávu externímu programu. Je to zatím relativně nová funkce, ale určitě představuje pokrok. Pro ukládání dat jsou k dispozici dva pluginy. Jeden jsem již zmínil – předává informace pomocí emailu, druhý se dokáže napojit na notifikační systém na desktopu a zobrazit detaily problému zde.

Collectd je velmi modulární. Samotný daemon se stará pouze o konfigurační soubor a dává rozhraní pluginům. Ty pak sbírají data a posílají je na zpracování dalším pluginům. Pro rozumný výstup je k dispozici plugin rrdtool a CSV. Díky tomu si může administrátor přesně určit, co všechno chce monitorovat a čím si bude zatěžovat systém. Pro běh není vyžadováno periodické spouštění a collectd běží jako daemon. To mu umožňuje sbírat data s velkým rozlišením.

Slabším místem je vytváření grafů. K dispozici je skript na vygenerování grafů z rrd databází a pak také webové rozhraní napsané v PERLu. To ale moc dobře nevypadá a doporučuji spíše si buď grafy zavést do vlastního systému, nebo vytvořit nějakou jednoduchou stránku, ve které se zobrazí to, co je potřeba. Přes to, že collectd není moc dobrý na generování grafů, sběr mu jde perfektně a pomocí dodaných skriptů jde dostat uspokojivý výsledek tam, kam potřebujeme. Největším plusem je, že collectd dokáže sbírat informace ze stovek zdrojů a nepotřebuje k tomu výpočetní farmu.

Co všechno dokáže collectd zpracovat:

  • Přístup k webserveru Apache/Lighttpd
  • DNS
  • Informace o discích (přístup, teplota, obsazení)
  • CPU/paměť/swap/load
  • Informace z lm_sensors
  • Odezvy na síti
  • Iptables
  • XEN/Qemu
  • SNMP
  • WiFi

Instalace

Instalace je na většině distribucí jednoduchá. V Debianu/Ubuntu stačí nainstalovat stejnojmenný balíček. V Gentoo je to složitější a musíme zavítat k bugu číslo 107076, kde najdeme vše potřebné. Na dalších distribucích jsem collectd nezkoušel.

Pluginy pro práci s daty

Nejdříve se podívejme na pluginy, které nesouvisejí s monitorováním a budou se nám hodit:

logfile Logování do souboru nebo na standardní výstup
syslog  Logování pomocí syslogu
rrdtool Zápis dat do RRD databází
perl    Získávání dat z perlovských skriptů
exec    Získávání dat pomocí různých externích programů
network Odesílání/příjímání statistik po síti 

Pluginy pro sběr dat

Pomocí collectd se dá udělat statistika ze všeho možného. Vybral jsem několik pluginů, které podle mě pokryjí nejčastější potřeby administrátorů. Jsou to:

apache      Statistiky ze status modulu Apache
cpu     Využití CPU
df      Obsazené místo
disk        Množství operací na disku, přenos dat atd.
dns     Činnost DNS serverů
hddtemp     Teplota disků
interface   Traffic na rozhraních
iptables    Statistiky využití pravidel ve firewallu
load        Load average
memory      Obsazení paměti
ping        Odezvy od vzdálených strojů
processes   Informace o procesech (počet určitých procesů, jejich obsazená paměť)
sensors     Získání dat z lm_sensors
snmp        Získání dat ze SNMP
swap        Obsazení swapu
users       Počet uživatelů přihlášených k systému
wireless    Kvalita a síla WiFi signálu 

Konfigurační soubor /etc/collectd.conf

Vývojový tým collectd se snaží udělat konfigurační soubor tak jednoduchý, jak to jen jde. Některé pluginy si dokáží sami nadetekovat, co potřebují a krom jejich povolení není nic dalšího potřeba. Některé pluginy potřebují jen trochu popostrčit. Konfigurační soubor sám je velmi podobný konfiguračním souborům z Apache, takže se edituje snadno a díky připraveným příkladům je na první pohled vidět, co je potřeba nastavit. Pojďme se podívat na již nakonfigurovaný collectd:

Hostname    "stroj.domena"

LoadPlugin cpu
LoadPlugin df
LoadPlugin disk
LoadPlugin hddtemp
LoadPlugin interface
LoadPlugin load
LoadPlugin logfile
LoadPlugin memory
LoadPlugin network
LoadPlugin rrdtool
LoadPlugin swap
LoadPlugin syslog
LoadPlugin wireless

<Plugin df>
    # Zařízení, které vybíráme pro monitorování případně ignorování
    Device "/dev/mapper/mishadisk-data"
    Device "/dev/mapper/mishadisk-botanicus"
    Device "/dev/mapper/mishadisk-backup"
    # Přehozením této hodnoty můžeme vybrat zařízení, které nechceme monitorovat
    IgnoreSelected false
</Plugin>

<Plugin disk>
    # Výběr disků s použitím regulárních výrazů
    Disk "/^[hs]d[a-f][0-9]?$/"
    IgnoreSelected false
</Plugin>

<Plugin hddtemp>
    # Nepředkládat název disku
    TranslateDevicename false
</Plugin>

<Plugin interface>
    # Vybereme rozhraní, které chceme monitorovat
    Interface "ath0"
    Interface "eth2"
    Interface "ath1"
    Interface "br0"
    IgnoreSelected false
</Plugin>

<Plugin logfile>
    # Úroveň logování
    LogLevel info
    # Výstup - v tomto případě standardní
    File STDOUT
    Timestamp true
</Plugin>

<Plugin network>
    # Naslouchat na této adrese informacím z dalších strojů
    Listen "10.0.0.1"
</Plugin>

<Plugin rrdtool>
    # Ka ukládat RRD databáze
    DataDir "/usr/var/lib/collectd/rrd"
    CacheTimeout 120
    CacheFlush   900
</Plugin>

<Plugin syslog>
    # Úroveň logování
    LogLevel info
</Plugin> 

Tím bychom měli konfiguraci u konce a můžeme collectd spustit. Konfigurační soubor se nachází v různých distribucích na různých místech. Pro Gentoo platí /etc/collectd.conf, pro Debian zase /etc/collectd/co­llectd.conf.

Jak se dostat k datům

Jak jsem psal již na začátku, balík s collectd obsahuje i řadu skriptů, které pomohou se zobrazením sesbíraných informací. Podívejme se na obsah /usr/share/doc/co­llectd-4.4.2/contrib/co­llection3/bin. Najdeme zde tři skripty:

  • graph.cgi
  • index.cgi
  • json.cgi

Jsou napsané v PERLu a pokud si nechceme dát práci s generováním vlastních grafů, budeme je potřebovat. Skript graph.cgi dokáže vygenerovat graf, který můžeme umístit kdekoli. Druhý v pořadí je index.cgi a ten nám vytvoří webové rozhraní, kde si můžeme grafy prohlédnout. Tak jako tak se nám bude hodit. Můžeme ho zpřístupnit třeba přes Apache:

<VirtualHost *:80>
    ServerName collectd.domena.cz
    DocumentRoot /usr/share/doc/collectd/examples/collection3/bin/

    DirectoryIndex index.cgi
    AddHandler     cgi-script      .cgi

    <Directory /usr/share/doc/collectd/examples/collection3/bin/>
        Options +ExecCGI
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost> 

Umístění adresáře collection3 se v různých distribucích liší, ale vždy by měl být někde poblíž /usr/share/doc/co­llectd.

Pokud vše funguje, podíváme se na skript graph.cgi. Jelikož to je CGI skript, bude nejjednodušší cesta k němu přes HTTP, pomocí kterého mu také předáme parametry. Příklad může vypadat třeba takhle:

http://collectd.domena.cz/graph.cgi?hostname=localhost;plugin=interface;type=if_octets;type_instance=eth0;begin=-86400 

Ale než ruční editace je jednodušší přebrat si správné adresy z webového rozhraní. Do webu je můžeme přidat klasicky pomocí tagu <img />.

<img src="http://collectd.domena.cz/graph.cgi?hostname=localhost;plugin=interface;type=if_octets;type_instance=eth0;begin=-86400" alt="eth0 - týden"  /> 

Komunikace mezi daemony

Po síťové stránce může collectd nabídnou služby server, klienta a proxy serveru. Komunikace probíhá buď přímo jako server-klient, nebo může klient vysílat data pomocí multicastu. Collectd podporuje IPv4 i IPv6 a data posílá pomocí UDP. Multicast se hodí v rozsáhlých sítích, kde se nachází hodně linuxových strojů. Nemusí to být ani plnohodnotný počítač a postačí malá krabička s OpenWRT. Na všechny stroje pak stačí rozeslat jediný konfigurační soubor a komunikace začne fungovat. Serverů na sběr dat může být několik třeba pro zálohu. V případě multicastu si všechna data uloží servery, které na něm naslouchají.

Pokud se rozhodneme ukládat data jen na jednom či dvou strojích, tak ostatní je ukládat nemusí. Proto u nich můžeme vynechat pluginy rrdtool nebo csv. Za to nesmíme zapomenou na plugin network.

Server doplníme o následující:

LoadPlugin network
LoadPlugin rrdtool
<Plugin network>
        Listen "10.0.0.1"
        Forward false
</Plugin> 

Pokud chceme naslouchat na dalších adresách, přidáme další „Listen“ řádky. Do nich můžeme dát i multicastové adresy. Pokud zde cesta dat nekončí, nastavíme „Forward“ na true a ty budou pokračovat dále. K tomu ale musíme doplnit nastavení z klienta.

Klient se doplní o řádek „Server“:

LoadPlugin network
<Plugin network>
    Server "10.0.0.1"
</Plugin> 

Pokud máme vše správně, tak třeba přes tcpdump můžeme zjistit, jestli pakety chodí tam, kam mají:

# tcpdump -i eth0 udp port 25826
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
17:48:42.643555 IP 0.0.broadband15.iol.cz.53771 > domena.cz.25826: UDP, length 1007
17:48:42.643555 IP 0.0.broadband15.iol.cz.53771 > domena.cz.25826: UDP, length 1008
17:48:42.647556 IP 0.0.broadband15.iol.cz.53771 > domena.cz.25826: UDP, length 982
[...] 

Závěr

Díky tomu, že je collectd napsán v C je velmi rychlý, dokáže udělat grafy ve velkém rozlišení a také dokáže komunikovat s ostatními. Jeho konfigurace je velmi jednoduchá a často není potřeba nastavovat nic jiného než seznam modulů. V neposlední řadě má collectd také povedenou dokumentaci a wiki, kde si můžete dohledat detaily ke všem pluginům, které v článku nebyly zmíněny. Není prakticky cesta jak se v collectd ztratit. Bohužel i novější distribuce collectd zanedbávají a najdeme v nich poněkud starší verze.

Odkazy

Našli jste v článku chybu?
120na80.cz: Víte, co je svobodná menstruace?

Víte, co je svobodná menstruace?

Měšec.cz: Kurzy platebních karet: vyplatí se platit? (TEST)

Kurzy platebních karet: vyplatí se platit? (TEST)

Vitalia.cz: Očkování je nutné, říká homeopatka

Očkování je nutné, říká homeopatka

Vitalia.cz: Za její cukrovkou stojí rodiče

Za její cukrovkou stojí rodiče

Vitalia.cz: „Sjíždět“ porno není bez rizika

„Sjíždět“ porno není bez rizika

DigiZone.cz: Jetelín končí. Prima ho vyřadila

Jetelín končí. Prima ho vyřadila

Vitalia.cz: Vakcína Cervarix je oficiálně i pro chlapce

Vakcína Cervarix je oficiálně i pro chlapce

Měšec.cz: Test: Výběry z bankomatů v cizině a kurzy

Test: Výběry z bankomatů v cizině a kurzy

Podnikatel.cz: OSA zdraží, ale taky přidá nový poplatek

OSA zdraží, ale taky přidá nový poplatek

120na80.cz: Lepší poporodní sexuální život? Žádný problém

Lepší poporodní sexuální život? Žádný problém

Vitalia.cz: Musí moudrák opravdu ven?

Musí moudrák opravdu ven?

DigiZone.cz: ČTÚ červenec: rušení trochu vzrostlo

ČTÚ červenec: rušení trochu vzrostlo

Měšec.cz: Udali ho na nelegální software a přišla Policie

Udali ho na nelegální software a přišla Policie

Vitalia.cz: Ženy, které milují příliš, jsou neštěstí

Ženy, které milují příliš, jsou neštěstí

Lupa.cz: Hackujete? Můžete mít problém sehnat práci

Hackujete? Můžete mít problém sehnat práci

Podnikatel.cz: Pozor na vykuky, imitují služby České pošty

Pozor na vykuky, imitují služby České pošty

Lupa.cz: Co vzal čas: internetové kavárny a herny

Co vzal čas: internetové kavárny a herny

Měšec.cz: Na návštěvě na exekutorském úřadě

Na návštěvě na exekutorském úřadě

Lupa.cz: Měřičům síly hesla se nedá věřit. Víte proč?

Měřičům síly hesla se nedá věřit. Víte proč?

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře