Historia zdarzeń: co się działo, dzień po dniu
Pasek zdarzeń na dashboardzie pokazuje ostatnie minuty i znikał przy
każdym restarcie usługi. Teraz te same zdarzenia — awaria, powrót,
rekord dnia, prawie pełny — są zapisywane i leżą na nowej stronie
Historia, z filtrem po serwerze i rodzaju zdarzenia.
Zapisujemy przez 90 dni. Pasek na dashboardzie zostaje taki, jaki
był: to podgląd ostatnich minut, a nie archiwum. Kanał Atom czyta
już historię, więc nie pustoszeje po każdej aktualizacji serwisu.
Kopia zapasowa jednym kliknięciem (strona za hasłem)
Panel administracyjny dostał przycisk Pobierz kopię zapasową:
pakuje cały katalog danych usługi do jednego pliku ZIP i oddaje go
przeglądarce. Wcześniej wymagało to wejścia po SSH.
Adresu webhooka w archiwum nie ma i to jest decyzja, nie
przeoczenie — to jedyny sekret w tym katalogu, a archiwum ląduje
w Pobranych. W środku leży kartka z listą plików, informacją, czego
nie spakowano, i instrukcją przywracania.
Nowa strona: „Jak to działa”
W nawigacji doszła strona pisana dla odwiedzającego, nie dla
programisty. Tłumaczy zwykłymi słowami, skąd biorą się te liczby,
jak czytać ocenę A/B/C i co właściwie znaczy „nietypowa aktywność”.
Trzy rzeczy są tam powiedziane wprost. Po pierwsze: dane pochodzą
z oficjalnego, publicznego API FiveM — tego samego, z którego
korzysta lista serwerów w grze. Nie wchodzimy na serwery, nie logujemy
się i nie omijamy żadnych zabezpieczeń. Po drugie: serwis nie jest
oficjalny i nie ma związku z Cfx.re ani Rockstar Games. Po trzecie:
oznaczenie nietypowego licznika to nie jest oskarżenie —
opisujemy zachowanie liczby, którą serwer sam o sobie rozgłasza.
Dokumentacja API zostaje na swoim miejscu, dla kogoś, kto chce
szczegółów technicznych. Nowa strona prowadzi do niej linkiem.
Szybki podgląd: „czy z tym serwerem wszystko gra” bez zmiany strony
Na karcie serwera — na dashboardzie ikona pulsu w rogu, na liście
przycisk Szybki podgląd — rozwija się panel z odpowiedzią na jedno
pytanie. Bez przeładowania i bez wchodzenia na osobną stronę.
Wzorzec licznika napisany zwykłymi słowami. Zamiast nazw z kodu
panel mówi na przykład „serwer podaje inną liczbę graczy niż cfx”. Są tam
cztery różne odpowiedzi i żadna nie udaje innej: nic nietypowego,
widzimy coś, ale to się jeszcze nie utrzymuje, utrzymuje się —
i osobno nie wiemy, gdy okno pomiarowe niczego nie rozstrzyga.
Ostatnie dwa najłatwiej byłoby skleić w jedno milczenie, a znaczą
coś przeciwnego.
Pod spodem stoją liczby, z których to wyszło: uptime z 7 dni razem
z długością okna, uptime doby i wiek ostatniego odczytu. Panel niczego
nie liczy po swojemu — zdanie pod literą oceny składa teraz jeden
wspólny plik dla obu stron, więc dashboard i lista nie mają jak
powiedzieć dwóch różnych rzeczy o tym samym serwerze.
Strona Analiza licznika zostaje tam, gdzie była: panel prowadzi
do niej linkiem i jej nie zastępuje. To jest skrót do odpowiedzi,
a nie skrócona wersja rozliczenia.
Powiadomienia na Discorda — dla prowadzącego serwis
Na stronie za hasłem doszedł panel webhooka Discorda. Powiadomienie
przychodzi, gdy przypięty serwer przestanie odpowiadać albo wróci
oraz gdy utrzyma się obserwacja licznika. Zdarzenia wybiera się
osobno, bo to różne poziomy hałasu. Jest też przycisk „Wyślij testowe”.
Powiadomienie opisuje zmianę stanu, a nie każdy odczyt. Pętla
odpytywania chodzi co 20 s, więc ten sam stan nie leci częściej niż raz
na 10 minut, a lawina zdarzeń zatrzymuje się na dwudziestu w tym samym
oknie.
Przyjmujemy wyłącznie adresy Discorda. Pole, w które wkleja się
dowolny adres, a serwis potem sam pod niego uderza, byłoby furtką do
wysyłania żądań gdziekolwiek — także w głąb sieci, w której ta usługa
stoi. Sam adres nie wychodzi z serwera: nawet strona za hasłem widzi
tylko skrót.
Ocena zdrowia serwera: A, B albo C — zawsze z uzasadnieniem
Na kartach serwerów — na dashboardzie i na liście — oraz na stronie
Analiza licznika stoi teraz jedna litera złożona z dwóch pomiarów,
które i tak prowadzimy: uptime z 7 dni i wskaźnik licznika graczy. A to uptime powyżej
99% i żadna utrzymująca się obserwacja licznika, B — uptime od 95%
do 99%, C — uptime poniżej 95% albo utrzymująca się obserwacja.
Litera nigdy nie stoi sama. Obok zawsze idzie zdanie z liczbami,
które ją dały, a na karcie serwera cały rachunek: obie wartości, reguła
w całości i to, co konkretnie przesądziło. Ocena bez podstawy czyta się
jak wyrok, a to opis dwóch pomiarów.
Gdy któregoś pomiaru nie da się policzyć, oceny po prostu nie ma —
zamiast niej piszemy, czego brakuje. Serwer dodany kwadrans temu ma 100%
uptime z czterdziestu odpytań; to prawda o kwadransie, nie o tygodniu,
więc litery z tego nie robimy.
Jest też odznaka do wklejenia w README: /badge-ocena.svg?server=KOD.
Ona także pokazuje literę razem z powodem, a brak oceny maluje na szaro,
nigdy na czerwono — to, czego nie zmierzyliśmy, nie jest zarzutem wobec
serwera. Czego ta ocena nie mówi: czy serwer jest dobry, uczciwy
albo wart grania.
Ranking wzrostu na stronie Trendy
Nad panelami serwerów stoi teraz jedna tabela: śledzone serwery
ustawione od największego wzrostu do największego spadku, ze średnią
z tego tygodnia, średnią z poprzedniego, zmianą w procentach
i strzałką kierunku.
Do rankingu wchodzi tylko serwer z kompletem czternastu dób —
ten sam warunek, który obowiązuje panele niżej. Ranking nie liczy
niczego po swojemu: przepisuje liczby, które raport ma już policzone,
razem z regułą „zmiana mniejsza niż 5% to brak zmian".
Serwery bez kompletu mają osobną listę „Zbieramy jeszcze dane"
z liczbą dni, które zostały. Osobno wymieniamy też te, dla których
poprzedni tydzień był na tyle pusty, że procent nie miałby sensu —
zostają wtedy same liczby. Doklejone na koniec tabeli wyglądałyby jak
ostatnie miejsca, a „jeszcze nie wiemy" to co innego niż „spadek”.
Wskaźnik licznika: pełny serwer to nie „płaski licznik"
Po zewnętrznej recenzji wskaźnika sprawdziliśmy go na dobie prawdziwych
danych i wyszedł błąd, którego nie było widać na danych testowych:
niski współczynnik zmienności zapalał się niemal wyłącznie na
serwerach z kompletem graczy. Na 254 zapalenia 242 przypadały na
chwile, gdy serwer stał powyżej 90% swojego limitu slotów — zwykle
z kolejką i z licznikiem zmieniającym się co kilka minut.
Komplet to teraz także „kilka slotów pod limitem". Liczba graczy
z listy cfx nie obejmuje tych na ekranie ładowania, a to oni zajmują
ostatnie sloty, więc pełny serwer zwykle stoi kilka miejsc pod limitem,
a nie dokładnie na nim. Przy komplecie milkną oba pomiary małej
zmienności — wcześniej milkł tylko zastój, a współczynnik zmienności
i tak zapalał tę samą obserwację.
Blisko limitu progi są dwa razy ostrzejsze. Powyżej 90% slotów
limit ucina ruchy liczby graczy w górę, więc płaski wykres jest tam
zwyczajny także przy prawdziwej rotacji. Karta serwera pokazuje, gdzie
licznik stoi względem limitu i który próg obowiązuje.
Uczciwie o tym, czego ta zmiana nie robi: licznik sztucznie trzymany na
limicie jest teraz dla tej rodziny pomiarów niewidoczny. Po samej liczbie
nie da się odróżnić pełnego serwera od podtrzymywanego z zewnątrz, a pełny
serwer zdarza się codziennie. Opis decyzji i tego, czego wskaźnik
nigdy mierzyć nie będzie, jest w dokumentacji projektu.
Karta szczegółowa serwera: cała analiza licznika w jednym miejscu
Kliknij nazwę serwera na dashboardzie albo na liście, a wejdziesz
na stronę, która pokazuje cały rachunek wskaźnika licznika graczy
dla tego jednego serwera. Na liście jest do niej także osobny przycisk
„Analiza licznika".
Najważniejsza zmiana: widać liczby także wtedy, gdy nic się nie
zapaliło. Dotąd karta serwera mówiła „za mało obserwacji" albo „nic
nietypowego" i na tym się kończyło — sam wynik pomiaru przepadał.
Teraz widać, że współczynnik zmienności wynosi na przykład 4,7% przy
progu 2%, że licznik stoi 5 minut, a musiałby godzinę, i że do pełnego
okna pomiarowego brakuje ośmiu obserwacji.
Każda liczba jedzie z powodem, dla którego jej nie używamy —
jeśli nie używamy. „Okno pomiarowe jeszcze nie spełnia warunków" i
„serwer ma komplet, więc stała liczba jest skutkiem limitu, a nie
własnością licznika" to dwie zupełnie różne rzeczy i strona je
rozróżnia.
Doba po dobie, z powodem odrzucenia. Przy miarach kształtu doby
widać nie tylko „10 z 14 dób", ale które doby wypadły i dlaczego:
za małe pokrycie, za mało godzin z obserwacją, za długa przerwa.
Czego strona pokazać nie może, i mówi to wprost. Dziennika
sygnałów nie ma — bufor obserwacji żyje w pamięci i ginie przy
restarcie usługi. Widać więc, od kiedy warunek trwa nieprzerwanie,
czy rodzina jest właśnie wygaszana, a także czy zapalała się
wcześniej: ile razy była potwierdzona i ile czasu temu zgasła.
Bez tego rodzina, która zgasła kwadrans temu, wyglądała dokładnie
tak samo jak taka, która nie zapaliła się ani razu. Ten licznik
zeruje i restart usługi, i dłuższa przerwa w odczytach — strona
mówi o tym w tym samym zdaniu, żeby nikt nie czytał zera jako
„tu nigdy nic się nie dzieje".
Osobno zaznaczamy, że profil godzinowy zbieramy tylko dla serwerów
przypiętych — dla pozycji dołożonej z listy jedna z miar nie policzy
się nigdy, i lepiej to napisać, niż zostawić puste miejsce wyglądające
jak czekanie na dane. Dotyczy to też serwera, który był przypięty
i przestał: jego stare doby z profilem zostają (rollupy są trwałe),
więc miara liczy się jeszcze z nich, ale przestanie, gdy wyjdą z okna.
Strona pisze wprost, że nowych danych już nie zbieramy.
Dla korzystających z API: to samo pod GET /api/serwer?server=KOD.
Progi jadą razem z liczbami, więc nic po drugiej stronie nie musi trzymać
własnej kopii. Szczegóły w dokumentacji API.
Wskaźnik wzorca: poprawki po sprawdzeniu, skąd biorą się liczby
Przejrzeliśmy ten wskaźnik od początku — razem ze źródłem FiveM
i z pomiarem tego, jak zachowuje się publiczne API cfx. Wyszło
kilka rzeczy, które trzeba było naprawić, i kilka zdań, które
trzeba było wycofać.
Udana odpowiedź HTTP nie znaczy, że dane są świeże.
W pomiarze 34 odczytów co 15 sekundy — zero błędów — cfx oddało
w sumie cztery różne obserwacje na serwer. Ta sama
obserwacja wracała do nas średnio 8,5 raza. Wskaźnik liczył
dotąd po odczytach, więc częściowo mierzył rytm odświeżania
cfx, a nie zachowanie serwera. Teraz liczy po różnych
obserwacjach źródłowych, a karta pokazuje osobno „Widziany
przez cfx" i „Pobrany przez nas".
Liczba równa limitowi slotów przestała być przesłanką.
Serwer z kompletem ma stały licznik nawet przy pełnej rotacji
graczy — każde wyjście zastępuje wejście z kolejki. Bierzemy teraz
rzeczywisty limit tego serwera, a nie listę „typowych"
limitów, która była zwykłym zgadywaniem cudzej konfiguracji.
Okrągłość liczby (podzielność przez 5) też już o niczym nie
decyduje.
„Płaski wykres" i „zamrożona liczba" to jedna obserwacja, nie
dwie. Oba mówią to samo — licznik się nie rusza — więc nie
liczą się już jako dwie osobne przesłanki.
Wycofane zdania. Pisaliśmy wcześniej, że „żywy serwer ma
noc", że dwa sygnały naraz „przestają być zbiegiem okoliczności"
i że przypadkowe zapalenie wymagałoby braku nocy przez dwa
tygodnie. Żadne z tych zdań nie wynikało z pomiaru. Równy,
powtarzalny rytm od 60 graczy w nocy do 140 wieczorem spełnia
nasz próg „płaskości" — a serwer ma wyraźną noc. Miara nazywa się
teraz dosłownie: niski stosunek szczytu do średniej, jest
oznaczona jako eksperymentalna i sama z siebie nie daje
mocniejszego komunikatu niż neutralna informacja.
Wskaźnik mówi teraz, czego nie wie. „Nie wykryto niczego
przy wystarczających danych", „za mało obserwacji", „dane
nieaktualne" i „świeżość nieznana" to cztery różne odpowiedzi —
wcześniej wszystkie wyglądały tak samo, czyli jak milczenie.
Uczciwie o progach: dobrano je na trzech serwerach i jednej
dobie. Są wstępne, wymagają sprawdzenia na innych serwerach
i późniejszym okresie i nie określają, jak często wskaźnik się
myli. Brak oznaczenia nadal nie potwierdza, że liczba
graczy na czyimś serwerze jest prawdziwa.
Lista serwerów · Trendy
Wskaźnik wzorca patrzy teraz też na dwa tygodnie wstecz
Ten wpis jest już nieaktualny — opisane niżej zdania
zostały wycofane, a sam sygnał przerobiony. Zostawiamy go, żeby
było widać, co zmieniliśmy i dlaczego. Aktualny opis jest we wpisie
powyżej.
Do „Nietypowego wzorca aktywności" doszedł sygnał, który nie patrzy
na chwilę, tylko na pełne doby: dla każdego dnia porównuje
szczyt z tego dnia ze średnią z tego dnia. Stosunek bliski jedynki
przez dziesięć i więcej dób znaczy, że liczba mało się w tej dobie
rozjeżdżała.
Pisaliśmy wtedy, że taki sygnał wystarcza sam, bo
przypadkiem się nie zapala. To było nieprawdą: równy,
powtarzalny rytm od 60 graczy w nocy do 140 wieczorem daje stosunek
1,40 i też by tu wpadł. Dziś ta miara jest oznaczona jako
eksperymentalna i sama z siebie nie daje mocniejszego komunikatu
niż neutralna informacja.
Karta pokazywała wtedy przy każdym sygnale, krótko- czy
długoterminowy jest. Dziś pokazuje rodzinę obserwacji
i to, czy miara jest eksperymentalna — bo to rodzina, a nie
długość okna, decyduje o tym, jak mocny jest komunikat.
Próg wzięliśmy z pomiaru na własnych serwerach: stosunek
szczyt/średnia wychodził 2,0–3,2, więc próg stanął ćwierć poniżej
najniższej wartości. Uzupełnienie: to były trzy serwery
i jedna doba, a margines 25% jest arbitralny — nie mówi, jak
często wskaźnik się myli. Liczą się wyłącznie doby zebrane
w co najmniej 90%, a dziś także takie, w których braki nie skupiają
się w jednej porze doby.
Uczciwie o zakresie: to działa tylko dla trzech serwerów
dashboardu, bo tylko one mają u nas trwałą historię dzienną.
Lista serwerów takiej historii nie zbiera — tak samo jak nie ma tam
uptime'u.
Trendy · Lista serwerów
Kilka serwerów naraz, jednym wklejeniem
Pole dodawania jest teraz wielolinijkowe. Wklejasz kilka kodów albo
linków — jeden na linię albo po przecinku, jak wygodniej — i lecą
razem. Najwyżej dziesięć w jednym zgłoszeniu. Ctrl + Enter wysyła
bez sięgania po mysz.
Wynik dostajesz w jednym podsumowaniu, pogrupowanym po tym, co
się z którą pozycją stało: dodane, już na liście, powtórzone
w zgłoszeniu, nieznalezione, zły format — zamiast dziesięciu osobnych
komunikatów pod rząd.
Gdy cokolwiek wymaga poprawki, wklejona treść zostaje w polu.
Literówkę w jednym kodzie poprawia się wtedy na miejscu, zamiast
wklejać wszystko od nowa.
Lista serwerów
Szukanie, filtr i sortowanie na liście serwerów
Nad kartami doszedł pasek: pole szukania (po nazwie, nazwie projektu
albo kodzie), filtr frameworku i cztery tryby sortowania — kolejność
dodania, najwięcej graczy, najmniej w kolejce, dostępność. Filtrowanie
nadąża za pisaniem, bez wciskania Entera i bez przeładowania strony.
Wszystko liczy się na danych, które przeglądarka i tak już ma, więc
przełączanie niczego nie dopytuje. Wybrane sortowanie i filtr strona
zapamiętuje na następną wizytę.
Uczciwie o „dostępności": to nie jest uptime z historii, taki
jak na dashboardzie — lista nie zbiera historii cudzych serwerów.
Ten tryb układa karty po bieżącym stanie i świeżości ostatniego
udanego odczytu.
Przy okazji klawisz / celuje teraz w szukanie, a pole dodawania
serwera przeniosło się na n.
Lista serwerów
Karty pokazują więcej niż dotąd — i mówią, gdy to nie FiveM
Przejrzeliśmy pełną odpowiedź API dla 31 losowo dobranych, naprawdę
różnych serwerów (ESX, QBCore, vRP, bez frameworku, sześć różnych
języków) i wyciągnęliśmy z surowego zrzutu to, co zasługiwało na
własne miejsce: opis własnymi słowami serwera, nazwę projektu, rekord
graczy, whitelistę wraz z instrukcją dołączenia, link do sklepu
i poziom pure mode.
Najważniejsze znalezisko: trzy z tych 31 serwerów to wcale nie był
FiveM, tylko RedM (Red Dead Redemption 2) — i na karcie wyglądały
identycznie jak reszta. Teraz mówią to wprost, nad licznikami.
Przy okazji cztery serwery z próbki podawały zaproszenie na Discorda
pod innym kluczem, niż czytaliśmy, więc karta nie miała ani jednego
linku mimo że serwer go podał. Już czyta oba.
Doszła też informacja, czy serwer udostępnia publicznie nicki swoich
graczy — pięć z 31 to robiło. Pokazujemy sam fakt; nicków nie
wypisujemy i wypisywać nie będziemy.
Lista serwerów
Lista serwerów mieści teraz 300 pozycji
Sufit listy podskoczył z 60 na 300. Odświeżanie dalej jest rozłożone
równomiernie w czasie, więc od strony cfx nic się nie zmienia poza
tym, że pełna runda trwa około 75 sekund zamiast minuty.
Limit dodawania (5 prób na 10 minut z jednego adresu) zostaje bez
zmian — to ochrona przed spamem, a nie przed długością listy.
Lista serwerów
Nietypowy wzorzec aktywności
Karta serwera na liście potrafi teraz zwrócić uwagę, że coś w jego
liczbie graczy nie składa się w całość. Patrzymy na trzy rzeczy:
czy liczba zgłaszana przez serwer zgadza się z policzoną przez cfx,
czy wykres graczy nie jest podejrzanie płaski i czy liczba nie stoi
na okrągłej wartości dłużej, niż ten serwer normalnie się zmienia.
Ramka pojawia się dopiero wtedy, gdy zejdą się co najmniej dwa
z tych sygnałów naraz. Każdy z osobna ma zwyczajne wytłumaczenie —
inny moment liczenia graczy, martwa pora w nocy, przypadek — więc
pojedynczy nie znaczy nic i niczego nie pokazujemy.
To wskazówka, a nie oskarżenie: karta wypisuje same pomiary i zostawia
wniosek czytającemu. Patrzymy wyłącznie na to, co serwer rozgłasza
o sobie jako całości — żadnych danych o pojedynczych graczach.
Uczciwie: próbki żyją w pamięci, więc po restarcie usługi wskaźnik
potrzebuje kilkunastu minut, zanim ma z czego cokolwiek policzyć.
Lista serwerów
Kopiowanie linku prosto z karty
Każda karta na dashboardzie ma teraz mały przycisk kopiowania. Jedno
kliknięcie i w schowku ląduje link do porównania tego serwera —
gotowy do wklejenia na Discorda. Po kliknięciu pojawia się „Skopiowano!",
które samo znika po chwili.
Gdyby przeglądarka odmówiła dostępu do schowka (zdarza się na
połączeniu bez HTTPS), karta pokazuje link do ręcznego zaznaczenia
zamiast udawać, że się udało.
Dashboard
Odznaki z uptime'em i frameworkiem
Do odznaki z liczbą graczy dołączyły dwie nowe: dostępność serwera
z ostatniej doby i wykryty framework. Kolor mówi od razu, czy uptime
jest w porządku, czy warto się przyjrzeć. Obie do wklejenia w README
albo na stronę, tak samo jak poprzednia.
Dokumentacja API
Kanał RSS ze zdarzeniami
Pasek zdarzeń ze strony głównej — powroty, awarie, rekordy —
można teraz czytać w dowolnym czytniku RSS. Wystarczy wkleić adres
serwisu, resztę czytnik znajdzie sam.
Uczciwie: zdarzenia żyją tylko w pamięci i restart usługi je kasuje,
więc to podgląd ostatnich kilkudziesięciu minut, a nie archiwum.
Nowy adres: /feed.xml
Widać, co już zebraliśmy do raportu trendów
Zakładka „Trendy" przez pierwsze dwa tygodnie pokazywała tylko
komunikat „zbieramy dane". Teraz pod nim widać dzień po dniu to, co
faktycznie już mamy — średnią graczy i kolejki z każdej doby.
To dalej nie jest porównanie i nie ma tam ani jednego procentu.
Porównanie tydzień do tygodnia pojawia się dopiero przy komplecie
pełnych dni — ta zasada się nie zmieniła. Dni niepełne i dzisiejszy
są oznaczone osobno, bo to one tłumaczą, dlaczego licznik stoi.
Trendy
Alert, gdy serwer przestanie ukrywać nicki
Na zamkniętej podstronie z graczami doszedł przełącznik, który
pilnuje, czy któryś serwer przestał podmieniać nicki na etykietę
zastępczą. Gdy lista zrobi się czytelna, przychodzi powiadomienie
z nazwą serwera.
Działa tylko dopóki karta jest otwarta — nie ma powiadomień w tle
i strona mówi to wprost, zamiast obiecywać coś, czego nie dowozimy.
Strona wewnętrzna