Dashboardy Grafany¶
Dashboardy żyją w defaults/grafana/provisioning/dashboards/ i są auto-syncowane na
deploy (patrz Architektura konfiguracji) —
zaktualizowany dashboard w repo trafia na żywe wdrożenie z git pull && make up, bez
ręcznego cp.
Dashboardy tworzone w UI Grafany żyją w jej bazie i nie są ruszane.
Dostępne dashboardy¶
Log Monitoring¶
Wolumen logów w czasie z podziałem na poziom + tabela per serwer + przeglądarka
logów z Loki. Dropdowny Service / Container / Log Level filtrują wszystkie
panele; klik w serię na wykresie ustawia var-level, klik w wiersz tabeli —
var-service (data linki); drag-select po wykresie zawęża czas. Panel „Logs"
z enableInfiniteScrolling.
Uwaga — inaczej niż na dashboardzie WAF-a: tutaj lupki „Filter for value" przy
polach modsec_* (w szczegółach linii logu) nadal wygaszą wszystkie trzy panele
(dlaczego). Filtrowanie po
service, container i detected_level działa normalnie — to labele strumienia,
więc trafiają dokładnie tam, gdzie Grafana je wstawia.
Ten dashboard celowo nie dostał parsera-zaślepki, który naprawia lupki na WAF-ie.
Cena byłaby tu realna: przeniesienie filtra po service/container z selektora
strumienia do potoku zamienia wyszukanie po indeksie w skan wszystkich strumieni —
a to jedyny dashboard pytający o logi wszystkich kontenerów, nie samego
webservera. Na trzy pola, które i tak działają, nie warto.
Czwarty dropdown, ModSecurity, izoluje albo wycisza trafienia WAF-a:
| Stan | Co pokazuje |
|---|---|
wszystko |
domyślny, bez filtrowania |
tylko WAF |
wyłącznie czytelne linie error.log ModSecurity |
bez WAF |
wszystko poza zdarzeniami WAF-a (znikają oba wpisy — JSON audit i linia error.log) |
tylko WAF pokazuje żądania, na których CRS przekroczył próg anomalii — te mają
poziom warn, więc przy Log Level = error wynik będzie pusty. Trafienia
podprogowe (reguła się zapaliła, ale próg nie został przekroczony) nie trafiają
do error.log i widać je wyłącznie na dashboardzie
WAF.
WAF (ModSecurity / OWASP CRS)¶
Trafienia WAF-a w jednym miejscu, żeby ruch skanerów nie mieszał się z awariami
aplikacji w „Log Monitoring". Panele: rząd statystyk (trafienia, zablokowane,
unikalne adresy IP, unikalne reguły), oś czasu z podziałem blocked / detected,
ranking reguł wiodących, kategorie ataków, najaktywniejsze adresy IP, najczęściej
atakowane ścieżki, rozkład anomaly score i surowe wpisy audit logu.
Filtry u góry: Vhost (regex po nazwie hosta — istotne przy multi-host), Akcja
(blocked = połączenie zerwane; detected = trafienie na ścieżce wyjętej z blokowania
regułami 10002/10003, zalogowane ale przepuszczone) oraz Reguła, Atak,
Adres IP, Ścieżka, Anomaly score — wszystkie regexowe, domyślnie .*.
Pięć ostatnich ustawia się klikiem w wiersz tabeli: klik w regułę w rankingu
zawęża cały dashboard do tej reguły, klik w adres IP — do tego adresu, i tak dalej.
Klik zachowuje pozostałe filtry, więc dają się składać („co ten adres IP robił na
tej ścieżce"). Wyczyścisz je wpisując .* z powrotem w pole u góry.
Lupka „Filter for value" działa
Grafana pokazuje przy komórkach tabeli i przy polach w szczegółach linii logu
lupki „Filter for value" / „Filter out value". Na tym dashboardzie zawężają
wszystkie panele, a wybrany filtr pojawia się jako chip Filters nad
dashboardem (zdejmujesz go ×). Masz więc trzy równorzędne drogi: lupka,
kliknięcie w wiersz (data link) i okienka u góry.
Do 08.2026 ta lupka wygaszała cały dashboard — wszystkie panele pokazywały „No data". Co to było i czym naprawione: Filtry ad-hoc.
Źródłem danych są pola modsec_* wyciągane z audit logu przez Alloy — opis pól i
przykładowe zapytania: WAF.
Każdy panel agregujący liczy wyłącznie żądania, w których zapaliła się reguła
(| modsec_src = "audit" | modsec_rule_id != ""). Bez drugiego filtra wpadałyby tam
401 z logowania do paneli, 429 z rate limitingu i awarie 5xx — dlaczego, opisuje
Wpisy audytowe, w których nie zapaliła się żadna reguła.
Kopiując stamtąd zapytanie do własnego panelu, przenieś oba filtry.
Slow queries (log) i Top 100 queries (pg_stat_statements)¶
Monitoring wolnych zapytań — opisany osobno: Wolne zapytania.
PostgreSQL: Maintenance¶
VACUUM/ANALYZE, dead tuples, bloat, cache hit ratio.
PostgreSQL: Storage & tables¶
Rozmiar bazy, największe tabele/indeksy, dead tuples, szacowany bloat.
Datasource — read-only bpp_monitor¶
Grafana łączy się z PostgreSQL przez read-only rolę bpp_monitor (nie superusera
aplikacji). Datasource jest renderowany z force-syncowanego
datasources.yaml.tpl przez scripts/generate-grafana-datasources.sh — szczegóły
mechaniki w Architekturze konfiguracji.
Rolę tworzy make create-monitoring-user.