RE:NODE

Monitoring serveru Valheim: počty hráčů, A2S a upozornění na výpadek

Text: Tým RE:NODE
11 min čtení


Nejlevnější užitečný způsob, jak server Valheim hlídat, je zeptat se ho přes protokol dotazů Steamu, kolik má hráčů. Server odpovídá na dotazy A2S na portu hry plus jedna - ve výchozím stavu UDP 2457 - a jakýkoli nástroj A2S vrátí název serveru a počet hráčů za pár milisekund. To pokryje „běží to“ a „hraje někdo“. Kdo se připojil, kdo odešel a kdo zemřel, zjistíš z logu serveru, protože ten zaznamenává každé připojení. Přidej kontrolu zvenčí, která upozorní, když dotaz dvakrát nebo třikrát po sobě přestane odpovídat, a budeš vědět, že server spadl, dřív než tvoje parta.

Následuje každá vrstva: dotaz, log, kontroly dostupnosti, které opravdu rozumí UDP, sledování zdrojů a jak zabránit tomu, aby se z upozornění stal šum, který všichni ztlumí.

Co stojí za sledování#

Monitoring je užitečný jen tehdy, když každý signál odpovídá na otázku, podle které bys jednal. U serveru Valheim jsou čtyři:

OtázkaSignálOdkud pochází
Je server dostupný?Dotaz A2S odpovídáDotazovací port UDP, zvenčí
Hraje někdo?Počet hráčůDotaz A2S nebo log
Kdo se připojil, odešel nebo zemřel?Řádky o připojení a postaváchLog serveru
Chystá se to spadnout?Paměť a CPU vůči limituHostitel nebo panel

Běžící proces není totéž co server, na který se lidé dokážou připojit. Proces může žít, zatímco uvízl při načítání světa, zatímco pravidlo firewallu blokuje port nebo zatímco čeká na mód, který se nenačetl. Dotaz zvenčí je kontrola, která odpovídá tomu, co zažívají hráči, takže na ní se má upozorňovat. Všechno ostatní slouží k diagnostice.

Obecný argument pro upozorňování na příznaky místo příčin je v článku monitoring, který ti něco řekne. Pro Valheim konkrétně to znamená: upozorni, když dotaz selže, a když se to stane, podívej se na paměť a log.

Dotazovací port Steamu a A2S#

Dedikovaný server Valheimu používá dva porty UDP. Port hry (-port, ve výchozím stavu 2456) nese hru. Port nad ním nese dotazy serveru Steamu - protokol A2S, který používají prohlížeče serverů k výpisu serveru a zobrazení počtu hráčů.

PortProtokolCo tam odpovídá
2456UDPHerní provoz
2457UDPDotazy A2S: info, players, rules

Pokud změníš -port, dotazovací port se posune s ním: -port 2466 znamená dotazy na 2467. Oba musí být otevřené v každém firewallu mezi monitorovacím nástrojem a serverem. Dotaz, který zvenčí vyprší, ale ze samotného stroje odpoví, je problém firewallu, ne serveru.

A2S má tři požadavky. A2S_INFO vrací název serveru, mapu, počet hráčů a maximum hráčů. A2S_PLAYER vrací seznam připojených hráčů se jménem, skóre a dobou připojení. A2S_RULES vrací dvojice klíč-hodnota, které server zveřejňuje. U Valheimu je spolehlivý A2S_INFO. Seznam hráčů je méně užitečný, než zní - jména mohou být prázdná nebo obecná, podle verze a platformy - takže ber počet jako pravdu a seznam jako bonus. Protokol a to, proč některé hry odpovídají jinak než jiné, vysvětluje dotazovací porty a A2S.

Dotazování pomocí python-a2s a GameDig#

Téměř každou potřebu pokryjí dva nástroje. python-a2s je malá knihovna v Pythonu, která posílá požadavky A2S a vrací zpracované výsledky:

bash
$ pip install python-a2s
valheim_status.py
import a2sADDRESS = ("203.0.113.10", 2457)  # query port, not game portinfo = a2s.info(ADDRESS, timeout=3.0)print(f"{info.server_name}: {info.player_count}/{info.max_players}")for player in a2s.players(ADDRESS, timeout=3.0):    print(player.name or "(no name)", round(player.duration / 60), "min")

Vypršení časového limitu vyvolá výjimku, což je přesně to, co chceš: monitorovací skript může „výjimku“ považovat za „server nefunguje“. Vypiš celý objekt info jednou, abys viděl, co vrací tvoje verze serveru - pole jsou stejná pro každou hru s A2S, ale to, co do některých Valheim dává, se v čase měnilo.

GameDig je nástroj pro Node.js, který zná zvláštnosti stovek her, včetně toho, na který port se dotazovat:

bash
$ npm install -g gamedig$ gamedig --type valheim 203.0.113.10:2456

Profil Valheimu v GameDig počítá s posunem dotazovacího portu, takže mu zadáváš port hry. Pokud vyprší časový limit, podívej se do dokumentace své verze, jak s portem zachází, a zkus přímo dotazovací port. Vrací JSON s name, numplayers, maxplayers a ping, takže se snadno předá cokoli dalšího.

Existuje také IGameServersService/GetServerList z Steam Web API, který vypisuje servery registrované na hlavním serveru Steamu a vyžaduje klíč Steam Web API. Ukazuje, co vidí komunitní prohlížeč, což je užitečné, když je otázka „proč můj server chybí v seznamu“. Kontrola zdraví to není: registrace zaostává za realitou o minuty. Tento případ řeší server Valheim se nezobrazuje v seznamu.

Sledování hráčů z logu#

Log je jediný zdroj, který ví, kdo co dělal. Každé připojení, vznik postavy a odpojení vytvoří řádek. Přesné znění se mezi verzemi mění a crossplay servery logují ID platforem přes PlayFab, ne prosté SteamID, takže než se na vzorec spolehneš, ověř ho ve vlastním logu. Na nedávném serveru jen pro Steam vypadají řádky, na které stojí za to hledat grepem, takto:

code
Got connection SteamID 76561198012345678Got character ZDOID from Ragnar : 1234567890:1Got character ZDOID from Ragnar : 0:0Closing socket 76561198012345678World saved ( 412.338ms )

Co každý z těch řádků říká:

  • Got connection SteamID - klient se připojil, ještě než si vybral postavu. Použij ID pro seznamy adminů a banů.
  • Got character ZDOID from <name> : <id> - postava hráče se objevila, takže tohle je skutečný okamžik „připojil se“, spolu se jménem postavy.
  • Stejný řádek končící 0:0 - postava zemřela. Na tomto řádku stojí oznamovače smrtí na Discordu.
  • Closing socket - klient odešel.
  • World saved - uložení dokončeno, s dobou, jak dlouho trvalo. Doba uložení, která stále roste, je časný příznak toho, že svět těžkne.

Na instalaci se systemd sleduj log živě pomocí journalctl -u valheim -f. S -logFile místo toho použij tail -F na soubor; -F sleduje soubor i přes rotaci. K přehledu připojení a odchodů stačí malá smyčka:

watch-players.sh
#!/usr/bin/env bashjournalctl -u valheim -f -o cat | while read -r line; do  case "$line" in    *"Got character ZDOID from"*": 0:0"*) echo "DEATH  ${line#*from }" ;;    *"Got character ZDOID from"*)         echo "JOIN   ${line#*from }" ;;    *"Closing socket"*)                    echo "LEAVE  ${line##* }" ;;  esacdone

Vzorec smrti se musí testovat před vzorcem připojení, protože oba obsahují stejný prefix. Nahraď echo voláním webhooku Discordu a máš základní oznamovač bez jakýchkoli modů. Celý průchod logem, včetně startovacích řádků a chyb, na které stojí za to reagovat, je v článku log serveru Valheim vysvětlen.

Pokud nechceš skript udržovat, mód Discord Connector dělá stejnou práci zevnitř serveru a zvládá i ID z crossplaye - viz Discord Connector pro Valheim.

Kontroly dostupnosti, které rozumí UDP#

Většina služeb pro kontrolu dostupnosti hlídá weby: požadavek HTTP nebo spojení TCP na port. Pro Valheim nefunguje ani jedno. Server nemluví HTTP a oba jeho porty jsou UDP, takže kontrola portu TCP na 2456 selže, i když je server úplně zdravý. Obyčejný ping ICMP prokáže jen to, že stroj běží, ne hru.

Co funguje:

  • Vlastní hostovaná kontrola, která mluví A2S. Uptime Kuma, běžná self-hosted volba, má typy monitorů pro herní servery; nedávné verze zahrnují jeden postavený na GameDig. Nasměruj ho na adresu herního serveru s typem Valheim a upozorňuje přes Discord, e-mail, Telegram a většinu dalších kanálů. Starší verze nabízely typ herního serveru Steam, který vyžadoval klíč Steam Web API, takže zkontroluj, co má tvá verze.
  • Úloha cronu na jiném stroji. Spouštěj výše uvedený skript v Pythonu každou minutu z jiného serveru, počítej po sobě jdoucí selhání, upozorni na třetí. Patnáct řádků kódu a žádné závislosti kromě python-a2s.
  • Stavový endpoint z tvého kontejneru. Docker obraz lloesche/valheim-server umí spustit malý stavový webový server, který zveřejňuje výsledek dotazu jako JSON (proměnné STATUS_HTTP v jeho README). Obyčejná kontrola HTTP ho pak může sledovat. Pozor, běží uvnitř stejného kontejneru, takže ti nepoví, že vnější svět nedosáhne na port hry.

Spouštěj kontrolu mimo vlastní síť serveru. Kontrola ze stejného stroje nic neříká o firewallu, směrování ani poskytovateli, a to jsou věci, které se rozbijí, aniž by si proces všiml.

Paměť, CPU a disk#

Dotaz ti řekne, že je něco špatně; grafy zdrojů obvykle řeknou co. Sleduj tři čísla.

MetrikaZdravéStojí za zásah
PaměťStabilní po načtení světa, během dnů pomalu rosteDo 10-15 % limitu nebo skok po přidání módu
CPUŠpičky, když hráči bojují, staví nebo přicházejí do nových zónNa limitu při málo hráčích
DiskPomalu roste s velikostí světa a zálohamiZálohy plní disk nebo se .db světa za týden zdvojnásobí

Paměť je to, co ukončuje hry. Spotřeba Valheimu roste s prozkoumanou a zastavěnou plochou a server, který dosáhne limitu paměti, se zastaví natvrdo, bez uložení. Vzorec, na který si dát pozor, je pomalý stoupavý sklon během dnů bez zploštění - právě to naplánovaný restart srovná, jak popisuje naplánované restarty Valheimu. Realistická čísla podle velikosti skupiny jsou v článku kolik RAM potřebuje server Valheim.

Na vlastním Linuxovém stroji ukazuje systemctl status valheim aktuální paměť jednotky a ps -o rss,cmd -C valheim_server.x86_64 dává rezidentní paměť procesu v kilobajtech. Pro historii funguje cokoli, co zaznamenává metriky - node_exporter a Prometheus, Netdata nebo vlastní grafy hostitele.

Na RE:NODE konzole ukazuje živé grafy paměti, CPU a disku proti limitům tarifu, takže otázka „jak jsem blízko“ je zodpovězena bez instalace čehokoli. Hlídač také každé dvě minuty zjišťuje, jestli server nespadl nebo jestli jeho uptime nešel pozpátku. Restarty, o které jsi požádal, se nepočítají; tři neočekávané restarty za hodinu dají na stránku serveru varování a automaticky otevřou tiket, takže smyčka pádů je zaznamenána, i když spíš. Sekce o konzoli v průvodcích ukazuje, kde grafy jsou.

Upozornění, která lidé neztlumí#

Upozornění, které se spustí při každém zakolísání pingu hráče, je během týdne ztlumené a pak zmešká skutečný výpadek. Pár pravidel drží upozornění smysluplná:

  1. Vyžaduj po sobě jdoucí selhání. Jeden ztracený paket UDP je normální. Upozorni po třech neúspěšných kontrolách v minutových rozestupech, ne po jedné.
  2. Upozorni i na obnovení. „Znovu běží po 4 minutách“ ti řekne, jestli vyšetřovat, nebo ignorovat.
  3. Odděl adminská upozornění od zpráv pro hráče. Zprávy o připojení a smrti patří do kanálu, který hráči čtou. Výpadky a varování o paměti patří někam, kam vidí jen admini.
  4. Ztlum plánovanou práci. Pokud se server restartuje každý den v 05:00, kontrola by nikoho neměla budit v 05:01. Buď ji během okna pozastav, nebo vyžaduj, aby selhání trvala déle, než restart trvá.
  5. Přidej, co víš. Upozornění „dotaz selhal z Frankfurtu, poslední počet hráčů 3, paměť 92 % limitu“ je takové, podle kterého se dá jednat z telefonu.

Minimální kontrola po sobě jdoucích selhání:

check_valheim.py
import a2s, json, pathlib, sys, urllib.requestADDRESS = ("203.0.113.10", 2457)WEBHOOK = "https://discord.com/api/webhooks/REPLACE/ME"STATE = pathlib.Path("/var/tmp/valheim_failures")def notify(text):    body = json.dumps({"content": text}).encode()    req = urllib.request.Request(WEBHOOK, body, {"Content-Type": "application/json"})    urllib.request.urlopen(req, timeout=5)fails = int(STATE.read_text()) if STATE.exists() else 0try:    a2s.info(ADDRESS, timeout=3.0)    if fails >= 3:        notify("Valheim is answering again.")    fails = 0except Exception:    fails += 1    if fails == 3:        notify("Valheim has not answered queries for 3 minutes.")STATE.write_text(str(fails))

Spouštěj ho každou minutu z cronu na jiném stroji. Upozorní jednou při třetím selhání a jednou při obnovení, ne každou minutu mezi tím. Formátování a limity, které Discord uplatňuje, popisují webhooky Discordu pro stav serveru.

Běžné potíže s monitoringem#

Dotaz vyprší, ale hráči se připojit mohou. Monitorovací nástroj míří na port hry místo na dotazovací port, dotazovací port je zavřený ve firewallu, nebo je server crossplay a neodpovídá na dotazy Steamu tak, jak tvůj nástroj čeká. Dotazuj se ze samotného stroje, abys případy odlišil.

Počet hráčů zůstává na nule, i když lidé hrají. Stejné příčiny, nebo nástroj, který se dotazuje jiného serveru na stejné adrese. Zkontroluj název serveru v odpovědi.

Počet je správný, ale chybí jména. Na mnoha verzích Valheimu očekávané. Pro jména použij log.

Kontrola dostupnosti hlásí každé ráno výpadek. Naplánovaný restart. Pozastav kontrolu během okna, nebo vyžaduj, aby selhání trvala déle, než restart trvá.

Vzorce v logu přestaly po aktualizaci sedět. Iron Gate občas mění znění logu. Po každém větším patchi se podívej na čerstvý log a vzorce uprav.

FAQ#

Na jaký port se dotazovat, abych zjistil počet hráčů serveru Valheim?

Na port hry plus jedna, přes UDP. S výchozím -port 2456 se dotazuj na 2457. GameDig bere port hry a posun si přičte sám; python-a2s a většina dalších knihoven A2S potřebuje dotazovací port.

Vidím, kteří hráči jsou online, i bez módu?

Ano, z logu serveru. Každé objevení postavy se loguje se jménem postavy a každé odpojení s ID hráče, takže skript, který sleduje log, může udržovat živý seznam. Seznam hráčů A2S může, ale nemusí obsahovat jména, podle verze.

Proč kontrola portu TCP hlásí, že můj server Valheim nefunguje?

Protože Valheim TCP nepoužívá. Oba jeho porty jsou UDP, takže pokus o spojení TCP vždy selže. Použij kontrolu, která posílá dotazy A2S přes UDP.

Jak často má kontrola dostupnosti běžet?

Jednou za minutu, s upozorněním po třech po sobě jdoucích selháních. To zachytí skutečný výpadek asi do tří minut, aniž by někoho budilo kvůli ztracenému paketu.

Zpomaluje monitoring server?

Ne. Dotaz A2S je jediný malý paket UDP a odpověď, vyřízená mimo hlavní herní vlákno. I jeden za sekundu by byl vedle provozu jediného hráče neviditelný.