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

7. 7. 2009
Doba čtení: 7 minut

Sdílet

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“:

bitcoin_skoleni

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

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.