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/collectd.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/collectd-4.4.2/contrib/collection3/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/collectd.
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.