Dohled nad 4 000 Discord servery: Grafana, PostHog a co nám ukázaly
Smyčka, která potichu způsobovala polovinu našeho provozu, tři miliony zbytečných požadavků denně a útok, který skončil po jedné minutě. Co náš monitoring vidí a co záměrně nevidí.

AlphaCloud běží na něco málo přes 4 000 Discord serverech, rozdělených do čtyř shardů. To jsou čtyři procesy, z nichž každý obsluhuje část serverů a všechny mluví se stejným API.
V takové velikosti se problém málokdy ukáže tím, že něco rozbije. Mnohem častěji všechno funguje, jen dráž, pomaleji nebo hlučněji, než by mělo. Proto jsme v září 2026 přestavěli náš monitoring. Tenhle článek ukazuje, jak vypadá a co nám ukázal v prvních týdnech.
Dva nástroje, dvě otázky
Grafana odpovídá na otázku: co dělá bot? Bot a API posílají metriky do Prometheu (požadavky, doby odezvy, chybovost, odpovědi Discordu, využití AI) a logy jdou do Loki. Každý serverový uzel má vlastní stack a Grafana je dostupná jen přes privátní síť, ne z internetu.
PostHog odpovídá na otázku: co lidé zažívají na našich webech? Zobrazení stránek, chyby v prohlížeči, doby načítání a se souhlasem i nahrané relace. PostHog se spustí, až když souhlasíš v cookie banneru.
To rozdělení je záměrné. Grafana se dívá na stroje, PostHog na rozhraní. Kdo obojí vmáčkne do jednoho nástroje, dostane buď uživatelská data do serverových logů, nebo zátěž serverů do produktové analytiky.
Co našel
Smyčka, která tvořila polovinu provozu
Ankety s časem ukončení uzavírá úloha na pozadí, která každou minutu kontroluje, jestli něco nevypršelo. Dělala to pro každý server zvlášť. Při zhruba 1 000 serverech na shard a čtyřech shardech to dělalo asi 70 požadavků za sekundu, skoro všechny s odpovědí „nic nevypršelo“.
Všimli jsme si toho až v Grafaně, když jsme si požadavky bota na API rozpadli podle cesty: tenhle jediný endpoint tvořil víc než polovinu veškerého provozu. Všechno fungovalo. Jen to neslo zátěž, o kterou nikdo nežádal.
Teď se každý shard jednou za minutu zeptá: „Které servery mají vůbec nějakou vypršelou anketu?“ a podrobnosti načte jen pro ně. Ze zhruba 4 200 požadavků za minutu se staly asi čtyři.
Tři miliony odpovědí „nenastaveno“
Stejný vzorec, jiné místo: několik modulů (záznamy supportu, nepřítomnosti, seznam týmu, statistiky bota, newsletter) ve svých smyčkách pravidelně četlo nastavení každého serveru. Na většině serverů daný modul vůbec nastavený není, takže odpověď zněla „nenalezeno“. Zhruba tři miliony krát denně.
Oprava je nenápadná: „nenastaveno“ si teď pamatujeme 30 minut. Bezpečné je to jen proto, že každý z těchto modulů pošle botovi aktualizaci ve chvíli, kdy se ve webovém panelu uloží, takže nastavení modulu nikdy neznamená čekat 30 minut.
Výpadky Discordu nejsou naše chyby
Náš týmový kanál pro chyby zveřejňoval každou neúspěšnou akci jako „Runtime Error“, i s unikátní referencí a vším ostatním. To zahrnovalo i chvíle, kdy sám Discord odpověděl chybou serveru. To není ani chyba na naší straně, ani nic, co bychom mohli opravit, a v kanálu to vypadalo přesně jako skutečná závada.
Dnes se to zapíše jako varování a člen dostane výzvu, ať to za pár sekund zkusí znovu, místo aby mu byl nabídnut odkaz na nahlášení chyby. Kanál pro chyby, kde polovina zpráv nejsou chyby, časem přestane někdo číst. A pak propásneš tu skutečnou.
Útok, který trval jednu minutu
Jednoho odpoledne na konci září dostala naše domovská stránka během jedné minuty něco málo přes 500 000 požadavků, z mnoha zemí najednou. Většina z toho byla zastavena dřív, než se to dostalo k našim serverům, a o minutu později byl provoz zpátky v normálu.
Neviděli jsme to proto, že by něco spadlo. Viděli jsme to proto, že to číslo nesedělo ke zbytku grafu. To je skutečný úkol monitoringu: ne bít na poplach, když všechno hoří, ale ukazovat, kde něco nesedí k normálu.
Co náš monitoring záměrně nevidí
Pravidla jsou tu stejně důležitá jako dashboardy:
- Žádné IP adresy návštěvníků v lozích. Slibují to naše zásady ochrany osobních údajů, takže je odstraňujeme na dvou místech: při zápisu access logu a ještě jednou před uložením.
- Žádná ID serverů, uživatelů ani zpráv v metrikách. Každá metrika se dělí jen podle hrubých vlastností (modul, třída stavu, shard). To chrání data a udržuje databázi metrik malou.
- Nahrávky relací ukazují naše rozhraní, ne tvůj obsah. Čitelný zůstane jen text, který doslova pochází z našich překladových souborů. Názvy serverů, kanálů a uživatelů, vstupy a náhledy jsou zamaskované. Pokud se seznam povolených textů nepodaří načíst, zamaskuje se všechno.
- Na webu všechno až po souhlasu. Což z tamních čísel dělá zároveň spodní hranici. Pro skutečné počty zobrazení se díváme na anonymní souhrny od našeho síťového poskytovatele.
Podrobnosti najdeš v zásadách ochrany osobních údajů.
Co si z toho bereme
To drahé je málokdy to rozbité. Žádné ze zjištění výše nevyvolalo chybu. Vyvolala zátěž, náklady a šum, a bez měření nic z toho nikdy neuvidíš.
Ptát se po jednotlivých serverech neškáluje. Obě velká zjištění měla stejný vzorec: smyčka přes všechny servery, která se ptá na každý zvlášť. Odpovědí je skoro vždy stejná otázka, položená jednou pro všechny.
Upozornění musí být vzácné, jinak to žádné upozornění není. Proto tým pinguje jen Grafana, a jen kvůli věcem, které vyžadují, aby někdo zasáhl. Nové typy chyb z PostHogu přistávají v kanálu bez pingu.
Pokud sám provozuješ Discord server a chceš vidět moduly, které tu zazněly: ankety, záznamy supportu a nepřítomnosti najdeš ve webovém panelu a popsané jsou v dokumentaci.
Další články
Co nás naučil bot na více než 2 000 Discord serverech
Čtyři věci, které ve velkém fungují jinak, než předpokládáš, když píšeš kód.
Ze zákulisíKdyž náš poskytovatel AI vyřadil model
Výměna modelu, prázdné odpovědi bez chyby a účet, který najednou vyskočil na několikanásobek. Co se rozbilo a proč bylo tak těžké příčinu vidět.
Ze zákulisíProč v AlphaCloud zůstává skoro všechno zdarma
Většina Discord botů zamyká své nejužitečnější funkce za předplatné. My to záměrně neděláme, a souvisí to méně se štědrostí, než by se mohlo zdát.