Hlavní navigace

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?

7. 7. 2009 12:21

ad cgi v c++: to je proto, ze nejaky dement prisel s napadem natahavat program do ram po 4kb strankach ve chvili vypadku stranky. a protoze c++ ma v kodu hromadu konstruktoru, skace pri inicializaci po velke casti kodu, os generuje vypadky stranek a nuti hdd zbesile seekovat.. nahrejte si prislusne cgi programy do ramdisku a uvidite ten rozdil. :-(

ad high level jazyky vs asembler: clovek zacne psat lepsi kod v asm nez jaky produkuje kompilator nejdriv po 20 letech praxe.. pokud ma mene, jsou …

11. 7. 2009 19:35

povinná (neregistrovaný)

Já teda nevím, ale to, co popisujete, mi zní silně jako cfengine. (Divil bych se, kdyby tohle neuměl.)

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET