V minulém článku o službě Starlink jsem se snažil popsat, jak je možné vyměnit router výrobce za jiný a jaké výhody to přinese. Dále jsme se zaměřili na rozdíly mezi Starlink kity první a druhé generace. Dnes se podíváme na možnosti monitorování antény, kterou přijímáme a vysíláme satelitní signál.
Rok se Starlinkem
Pod posledním článkem se v komentářích rozjela velmi plodná debata na téma proč Starlink ano a proč ne. Přikláním se k názoru, že i v Čechách se stále nacházejí místa, kde pozemní šíření signálu není na vysoké úrovni. To byl i můj důvod, proč jsem tuto službu objednal a platil hodně drahé připojení. Naštěstí byla služba zlevněna, a to jak hardware, tak datový tarif. Nedávno došlo k dalšímu zlevnění Starlink kit a dokonce k možnosti jeho pronájmu.
Od doby kdy jsem Starlink první generace obdržel (září 2021), jsem jej provozoval na chatě, kde, jak již bylo řečeno, jsou problémy s pozemním internetovým připojením. Starlink kit jsem instaloval dle jednoduchého návodu a konfiguroval pomocí mobilní aplikace. Služba byla od začátku stabilní, a to i za hustého sněžení či jiných meteorologických anomálií. Samozřejmě, že k drobným výpadkům docházelo, ale nikdy jsem nezaznamenal dlouhodobější nefunkčnost. Mile mě překvapila latence, která se pohybuje mezi 30–60 ms.
Při zprovoznění služby je uživatel nucen si nainstalovat mobilní aplikaci Starlink pro Android nebo iOS. Aplikace poskytuje možnosti, jako je konfigurace Wi-Fi zabudované v routeru výrobce a zobrazení klientů, kteří jsou k Wi-Fi připojeni. Další funkcí je např. odstavení antény, která se motoricky přesune do výchozí polohy. Tato funkcionalita je nutná např. pro sbalení sestavy do krabice. Dále je možné skrze aplikaci měřit rychlost připojení k internetu. Dalšími funkcemi je sledování uptime, latence, přenesených dat, ale i výpadků služby.
Monitoring služby Starlink
Mobilní aplikace i anténa používá moderní vysoce výkonný framework RPC (Remote Procedure Call) s otevřeným zdrojovým kódem. Pomocí RPC máte možnost se dostat k hodnotám, které vám poskytne mobilní aplikace, ale i k mnoha dalším, jako je například verze firmware a podobně.
Pro monitoring těchto hodnot jsem použil Zabbix a jeho proxy, která mi běží na vyměněném routeru. Abychom získali monitorované metriky, musíme komunikovat pomocí klienta gRPC. Tato funkcionalita není v Zabbixu implementována. Existuje ale několik projektů, které to umí.
Pro získání dat jsem použil projekt starlink-grpc-tools. Je psán v Pythonu a vyžaduje doinstalování modulů grpcio
a grpcio-tools
. Použil jsem jen jeho část a tou je dish_grpc_prometheus.py. Pokud spustíme tento skript na výchozím portu 8080 jako službu, poskytne seznam hodnot ve formátu Prometheus, přesněji Data model – Prometheus. Přesněji se skrze gRPC připojuje na adresu antény 192.168.100.1
a ze systému antény získá metriky.
Prometheus, Starlink, metriky
Význam metrik je poměrně podrobně zdokumentován v kódu projektu. Pro sestavení šablony Zabbixu jsem v starlink_grpc.py čerpal hodnoty Value maping jednotlivých alarmů, které se objevují např. před a během aktualizace firmware antény.
# HELP starlink_status_state # TYPE starlink_status_state gauge starlink_status_state{state="UNKNOWN"} 0 1681564391000 starlink_status_state{state="CONNECTED"} 1 1681564391000 starlink_status_state{state="BOOTING"} 0 1681564391000 starlink_status_state{state="SEARCHING"} 0 1681564391000 starlink_status_state{state="STOWED"} 0 1681564391000 starlink_status_state{state="THERMAL_SHUTDOWN"} 0 1681564391000 starlink_status_state{state="NO_SATS"} 0 1681564391000 starlink_status_state{state="OBSTRUCTED"} 0 1681564391000 starlink_status_state{state="NO_DOWNLINK"} 0 1681564391000 starlink_status_state{state="NO_PINGS"} 0 1681564391000 starlink_status_state{state="DISH_UNREACHABLE"} 0 1681564391000 # HELP starlink_info # TYPE starlink_info gauge starlink_info{id="ut01000000-00000000-000XXXXXX",hardware_version="rev2_proto2",software_version="6cae12a2-2492- 41cd-b838-59909916a28f.uterm.release"} 1 1681564391000 # HELP starlink_status_uptime_seconds # TYPE starlink_status_uptime_seconds counter starlink_status_uptime_seconds 559639.0 1681564391000 # HELP starlink_status_seconds_to_first_nonempty_slot # TYPE starlink_status_seconds_to_first_nonempty_slot gauge starlink_status_seconds_to_first_nonempty_slot 0.0 1681564391000 # HELP starlink_status_pop_ping_drop_rate # TYPE starlink_status_pop_ping_drop_rate gauge starlink_status_pop_ping_drop_rate 0.0 1681564391000 # HELP starlink_status_downlink_throughput_bps # TYPE starlink_status_downlink_throughput_bps gauge starlink_status_downlink_throughput_bps 10217.32421875 1681564391000 # HELP starlink_status_uplink_throughput_bps # TYPE starlink_status_uplink_throughput_bps gauge starlink_status_uplink_throughput_bps 3070.23046875 1681564391000 # HELP starlink_status_pop_ping_latency_ms # TYPE starlink_status_pop_ping_latency_ms gauge starlink_status_pop_ping_latency_ms 36.761905670166016 1681564391000 # HELP starlink_status_alerts # TYPE starlink_status_alerts gauge starlink_status_alerts 0.0 1681564391000 # HELP starlink_status_fraction_obstructed # TYPE starlink_status_fraction_obstructed gauge starlink_status_fraction_obstructed 0.0016988745192065835 1681564391000 # HELP starlink_status_currently_obstructed # TYPE starlink_status_currently_obstructed gauge starlink_status_currently_obstructed 0.0 1681564391000 # HELP starlink_status_seconds_obstructed # TYPE starlink_status_seconds_obstructed gauge starlink_status_seconds_obstructed 0.0 1681564391000 # HELP starlink_status_obstruction_duration # TYPE starlink_status_obstruction_duration gauge starlink_status_obstruction_duration 0.6519809365272522 1681564391000 # HELP starlink_status_obstruction_interval # TYPE starlink_status_obstruction_interval gauge starlink_status_obstruction_interval 8640.0 1681564391000 # HELP starlink_status_direction_azimuth # TYPE starlink_status_direction_azimuth gauge starlink_status_direction_azimuth 2.2196857929229736 1681564391000 # HELP starlink_status_direction_elevation # TYPE starlink_status_direction_elevation gauge starlink_status_direction_elevation 70.41776275634766 1681564391000 # HELP starlink_status_is_snr_above_noise_floor # TYPE starlink_status_is_snr_above_noise_floor gauge starlink_status_is_snr_above_noise_floor 1.0 1681564391000 # HELP starlink_exporter_missing_metrics # TYPE starlink_exporter_missing_metrics gauge starlink_exporter_missing_metrics{metric="status_alert_motors_stuck"} 1 1681564391000 starlink_exporter_missing_metrics{metric="status_alert_thermal_throttle"} 1 1681564391000 starlink_exporter_missing_metrics{metric="status_alert_thermal_shutdown"} 1 1681564391000 starlink_exporter_missing_metrics{metric="status_alert_mast_not_near_vertical"} 1 1681564391000 starlink_exporter_missing_metrics{metric="status_alert_unexpected_location"} 1 1681564391000 starlink_exporter_missing_metrics{metric="status_alert_slow_ethernet_speeds"} 1 1681564391000 starlink_exporter_missing_metrics{metric="status_alert_roaming"} 1 1681564391000 starlink_exporter_missing_metrics{metric="status_alert_install_pending"} 1 1681564391000 starlink_exporter_missing_metrics{metric="status_alert_is_heating"} 1 1681564391000 starlink_exporter_missing_metrics{metric="status_alert_power_supply_thermal_throttle"} 1 1681564391000 starlink_exporter_missing_metrics{metric="ping_stats_samples"} 1 1681564391000 starlink_exporter_missing_metrics{metric="ping_stats_end_counter"} 1 1681564391000 starlink_exporter_missing_metrics{metric="usage_download_usage"} 1 1681564391000 starlink_exporter_missing_metrics{metric="usage_upload_usage"} 1 1681564391000
Jak Zabbix monitoruje metriky Promethea
Moderní způsob, jak Zabbix monitoruje metriky, spočívá v získání všech hodnot najednou pomocí typu HTTP agent, např. jako tento výstup. Pro konfiguraci položky HTTP agent použijeme makra, která jsou předkonfigurována v šabloně {$STARLINK.SCHEME}://{HOST.CONN}:{$STARLINK.PORT}/metrics
.
Jednotlivé dílčí metriky se získávají pomoci položky typu Dependent item v kombinaci s Preprocessing. Dokumentace Zabbixu uvádí vše podrobně jako Prometheus checks. Jednotlivá schémata pro zpracování (processing patern) jsou pěkně vidět zabbixové šabloně Template_Starlink_dish.yaml v malém projektu zabbix-starlink.
Běh starlink-grpc-tools v Dockeru
Pro monitoring mého druhého cestovního Starlink kitu druhé generace s tarifem roam jsem pro monitoring použil Raspberry Pi a starlink-grpc-tools pouštím v Dockeru. Samotný kontejner běží jako služba SystemD. Kontejner jsem mírně upravil, přesněji jsem odstranil nepotřebné pythoní moduly.
U Starlink v2 prozatím používám router dodávaný výrobcem. Konektivita běží jako dual-stack, IPv4 je dostupná skrze CG-NAT a IPv6 je dynamická. Velkou nevýhodou routeru je, že nemá ethernetovou zásuvku. Řešením je si dokoupit Ethernet adapter, který se zapojí mezi anténu a router proprietárními kabely a koncovkami. RPi pak může být připojeno pomocí ethernetu nebo pomoci Wi-Fi.
Docker image pro RPi jsem si musel vytvořit:
# git clone https://github.com/smejdil/zabbix-starlink # git clone https://github.com/sparky8512/starlink-grpc-tools && cd starlink-grpc-tools # cp ../zabbix-starlink/Dockerfile.patch ./ # patch < Dockerfile.patch # patching file Dockerfile # docker build -t starlink-grpc-tools . # docker run -d -t -p 8080:8080 --name='starlink-grpc-tools' starlink-grpc-tools
Docker a SystemD
Pokud chceme zajistit spuštění kontejneru i po restartu systému, můžeme použít vlastní službu v SystemD.
# cp ../zabbix-starlink/docker.starlink-grpc-tools.service /etc/systemd/system/ # systemctl daemon-reload # systemctl enable docker.starlink-grpc-tools.service # systemctl restart docker.starlink-grpc-tools.service
Provozování rezidentního i cestovního (roam) Starlinku je o to zábavnější, když sledujete samotné jeho fungování pomocí standardních monitorovacích nástrojů.