Správa šablon v zabbixu

Zabbix je velmi silný nástroj pro sběr a vyhodnocování dat. My jej používáme k monitoringu serverů.

Občas ale narazíme na situaci, kdy nám výchozí šablona z nějakého důvodu nevyhovuje a musíme do ní udělat zásah. Ukážeme si tedy, jak takové zásahy děláme.

Ukázka problémové situace

Na grafu níže máme server, kde se podle grafu zdá, že máme dostupný orientačně 210 GB volného místa. Protože víme, že na tomto serveru je nárůst dat pozvolný, tak máme nastavené limity velmi nízko.

Zabbix - graf využitého místa

Když se ale připojíme na server, tak zjistíme, že je ale situace úplně jiná a volného místa tam už není tolik, kolik se zdálo.

# df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       3.3T  3.2T  50G  98% /home

Podíváme se tedy na volné místo v grafech a tam opravdu vidíme, že volného místa je tam výrazně méně, než se zdálo z původního grafu.

Zabbix - graf volného místa

Příčinou tohoto jevu je způsob, jakým zabbix získává informace. V prvním grafu pracuje s celkovým místem a obsazeným místem. Obsazené místo ale v tomto případě neobsahuje alokované místo samotným filesystémem (v tomto případě ext4). Naopak volné místo ukazuje opravdu dostupné volné místo.

Alokované místo filesystémem si můžeme zkontrolovat následovně:

# tune2fs -l /dev/sda1 | egrep 'Reserved block count|Block size'
Reserved block count:     44039689
Block size:               4096

Problémy s triggerem

A nyní se dostáváme k problémům s triggerem, který má volné místo kontrolovat. Trigger používá konstrukci:

last(/Linux by Zabbix agent active/vfs.fs.size[{#FSNAME},total])-last(/Linux by Zabbix agent active/vfs.fs.size[{#FSNAME},used]))<{$VFS.FS.FREE.MIN.CRIT:"{#FSNAME}"}

Čili stejně jako v grafu pracuje s obsazeným místem (bez alokace filesystémem) a celkovou dostupnou kapacitou úložiště.

Dává ale větší smysl, aby pracoval s volným místem:

last(/Linux by Zabbix agent active/vfs.fs.size[{#FSNAME},free])<{$VFS.FS.FREE.MIN.CRIT:"{#FSNAME}"}

Naštěstí nejsme první, kdo na tento problém narazil: https://support.zabbix.com/browse/ZBX-19502 a jsou tam naplánované změny.

Oprava je tedy velmi snadná.

Dlouhodobá udržitelnost šablon

Nyní používáme zabbix ve verzi 6.0 LTS a už se velmi těšíme na verzi 7. Zabbix s každou novou verzí aktualizuje šablony a přidává do nich mnoho nových vlastností, které jednoznačně vítáme.

Na druhou stranu ale potřebujeme zachovat změny, které jsou specifické pro naše potřeby. Kdybychom tedy udělali aktualizaci šablon s novým zabbixem, tak bychom přišli o úpravu výše.

Zabbix serverů máme navíc několik (obecně si můžeme vytvářet neomezené množství instancí) a potřebujeme tuto změnu aplikovat na všechny.

Migrace šablon

Pro migrace databázového schématu se běžně používají nástroje jako je např. https://phinx.org/ nebo každé komplexnější ORM má nějakou svou alternativu.

My jsme tedy volili podobnou cestu a udělali jsme si malý framework, který funguje velmi podobně. Přes Zabbix API aplikuje změny, uloží si poslední úspěšně provedenou migraci a pokračuje další migrací.

Ukázka migrace

<?php

declare(strict_types=1);

namespace App\Migrations;

use ZabbixWrapper\Entity as ZE;

final class ZabbixMigration20240505160512LinuxByZabbixAgentActiveDiskFreeSpaceFix extends \App\Service\Migration\AbstractMigration implements \App\Service\Migration\MigrationInterface
{
    public function run(): void
    {
        $manager = $this->getEntityManager();

        $discovery = $manager->getEntity(ZE\Template::class, 'Linux by Zabbix agent active')
            ->getEntity(ZE\DiscoveryRule::class, 'Mounted filesystem discovery');

        $discovery->getEntity(ZE\TriggerPrototype::class, '{#FSNAME}: Disk space is critically low')->update([
            'expression' => 'last(/Linux by Zabbix agent active/vfs.fs.size[{#FSNAME},pused])>{$VFS.FS.PUSED.MAX.CRIT:"{#FSNAME}"} and (last(/Linux by Zabbix agent active/vfs.fs.size[{#FSNAME},free])<{$VFS.FS.FREE.MIN.CRIT:"{#FSNAME}"} or timeleft(/Linux by Zabbix agent active/vfs.fs.size[{#FSNAME},pused],1h,100)<1d)'
        ]);
    }
}

Pro samotnou práci se Zabbix API používáme knihovnu https://github.com/serverzone/ZabbixWrapper, která nám pomáhá s tímto čitelným, plynulým zápisem.

Upgrade na Zabbix 7

Protože nás brzy čeká upgrade na Zabbix 7, tak se tímto přístupem nebojíme, že bychom o něco přišli a zároveň budeme mít radost z toho, že můžeme používat všechny novinky v šablonách, které nám vývojáři připravili.

Při plánování upgrade na novější verzi si uděláme čistou instalaci zabbixu (nyní již máme automatizovanou puppetem), prozkoumáme novinky, postupně projdeme všechny migrace, které jsme udělali do předchozí verze, a revidujeme je. Až budeme mít nový zabbix připravený, tak se pustíme do reinstalace produkčních prostředí.

Závěr

Dlouho jsme bojovali s tím, jak udržet všechny zabbix servery synchronizované. Sice nás práce s těmito migracemi stojí trochu víc práce a přemýšlení, protože psaní migrací není tak lehké jako naklikat si změny ve webovém prostředí Zabbixu, ale máme jistotu, že budeme mít plnou historii změn, které děláme.

Příště popíšeme další vlastnosti zabbixu, které řešíme jinak a kvůli kterým si kompilujeme a udržujeme vlastní fork zabbix-agenta.