Grafana i wizualizacja danych
(Sekcja: Technologia i infrastruktura)
Krótkie podsumowanie
Grafana jest prezentacją dla wszystkich obserwacji: metryk, kłód, śladów, wskaźników biznesowych i wpisów w jednym miejscu. W przypadku iGaming są to: monitorowanie p95/p99, konwersja płatności, Czas-do-Portfel, dostępność dostawcy gier, geo-dystrybucja incydentów i stabilne vs kanaryjskie. Sukces: szablony (zmienne), zrozumiałe panele, adnotacje, deski rozdzielcze SLO i dyscyplina praw dostępu.
1) Architektura połączeń
Dane: Prometheus (metryki), Loki/ELK (dzienniki), Tempo/Jaeger (trasy), ClickHouse/Query/PG (dane biznesowe), OTLP przez Gateway.
Kluczowe linki: z → exemplar → trace metric → related logs by 'trace _ id'.
Foldery i RBAC: oddzielne foldery „SRE”, „Płatności”, „Ryzyko”, „Gry”, „BizOp”; рола 'Viewer/Editor/Admin' - uprawnienia granularne.
2) Projekt deski rozdzielczej: zasady
1. Odpowiedź na pytanie w 1-2 kliknięć: od karty SLO do szczegółów.
2. RED/USE dla każdej usługi + karty domenowe (TTW, konwersja depozytów).
3. Stabilna siatka: 24-kolumnowa, duża KPI na górze, szczegóły na dole.
4. Kolory i progi: minimum, tylko SLA/SLO.
5. Adnotacje wydania: Git SHA, wersja, typ wydania (kanaryjski/niebiesko-zielony).
3) Zmienne i szablony (szablonowanie)
Zmienne zmieniają jedną deskę rozdzielczą w wiele.
Przykład (Prometheus query-variable):- Nazwa: „usługa”
- Zapytanie: 'label _ values (up, service)'
- Multi-select + zawiera wszystkie - wygodne dla kruszyw.
- „region” → „” → „service” → „instancja”.
- Użyj 'regex '/' sort' dla UX i 'refresh: On dashboard load'.
4) Panele i typy renderowania
Seria czasu: p50/p95/p99, szybkość błędów, przepustowość.
Stat/Gauge: docelowy KPI (dostępność, TTW p95).
Skrajnia/Tabela: najlepsze trasy N/PSP/dostawcy gier.
Geomap: incydent termiczny/mapy opóźnień według kraju/ROR.
Płótno: strumienie schematyczne (gracz → API → PSP → Bank).
Wykres węzła: zależności serwisowe, kolorowanie przez błędy.
- Etykiety do pól, Przyłączanie zewnętrzne, Redukcja (min/max/avg), Dodaj pole z obliczeń (konwersja).
5) Przykłady zapytań i paneli
5. 1 p95 opóźnienie (PromQL)
promql histogram_quantile(0. 95,
sum by (le, route) (rate(http_request_duration_seconds_bucket{service="$service",region="$region"}[5m]))
)
5. 2 Powodzenie wniosków (proxy SLO)
promql sum(rate(http_requests_total{service="$service",status=~"2.. 3.."}[5m]))
/
sum(rate(http_requests_total{service="$service"}[5m]))
5. 3 Konwersja płatności (agregat PromQL)
promql sum(rate(payments_success_total{psp=~"$psp",currency=~"$currency"}[15m]))
/
sum(rate(payments_attempt_total{psp=~"$psp",currency=~"$currency"}[15m]))
5. 4 Szybki skok na tor (przykłady)
W panelu 'Time series' włącz Przykłady → kliknięcie na punkcie → Tempo otwiera się za pomocą 'trace _ id'.
5. 5 Loki trace_id
logql
{service="$service"} = "$traceID"
6) Adnotacje i wydarzenia
Adnotacje wydania: automatyczne dodawanie zdarzenia podczas wyczerpywania (wersja, autor, waga kanaryjska).
Incydent/Zamrożenie: Znaki początkowe/końcowe incydentu i zwolnienie okien zamrożenia.
Wydarzenia biznesowe: duże kampanie/turnieje - zaznaczenie na wykresach.
7) Wpisy w Grafanie
Zasady ostrzegania centralnie (na podstawie Prometheus/Loki/Cloud).
Punkty kontaktowe: PagerDuty/Slack/Email; Zasady powiadamiania (zakorzenienie przez folder/tagi).
Szybkość spalania wielu okien: szybkie i powolne prażenie budżetu.
Cisza: w zaplanowanych oknach i z duplikatami.
promql histogram_quantile(0. 95,
sum by (le, service) (rate(http_request_duration_seconds_bucket{service="$service"}[5m]))
) > 0. 25
8) Zaopatrzenie jako kod (IaC)
Przechowywać źródła/deski rozdzielcze/wpisy w Git.
datasource. yaml
yaml apiVersion: 1 datasources:
- name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true
- name: Loki type: loki url: http://loki:3100
- name: Tempo type: tempo url: http://tempo:3100
deska rozdzielcza. yaml
yaml apiVersion: 1 providers:
- name: sres folder: SRE type: file disableDeletion: false options:
path: /var/lib/grafana/dashboards/sre
grafana. ini (fragment)
ini
[auth]
disable_login_form = false
[users]
viewers_can_edit = false
[alerting]
enabled = true
[unified_alerting. screenshots]
capture = true
9) Bezpieczeństwo i dostęp
SSO (OIDC/SAML), grupy → role → foldery.
Prawa do danych: tylko niezbędne foldery, tylko do odczytu dla przeglądarki.
Higiena PII: nie pociągać pól z PII w panelu; dla kłód - filtr/maska.
Sekrety: tylko przez skarbiec/bezpieczne pola JSON, bez „zwykłego tekstu” w deskach rozdzielczych.
10) Wydajność i koszt
Zasady nagrywania w Prometeuszu dla ciężkich wyrażeń.
Downsampling/Zatrzymywanie w długotrwałych backendach pamięci masowej.
Pamięć podręczna deski rozdzielczej i fair intervals (nie "1s' wszędzie).
Ograniczenie kardynalności zmiennych (nie zastępuj 'user _ id'/' session _ id').
Redystrybucja: oddzielne instancje/foldery dla zespołów hałaśliwych.
11) Specjalistyczne deski rozdzielcze do iGaming
Płatności: próby/sukces/TTW p95, błąd PSP/route, mapa odchylenia geograficznego.
Gry/Dostawcy: opóźnienie i wskaźnik błędów według studia/gry, konwersja uruchomienia.
Ryzyko/oszustwo: szybkość działania, wybuchy urządzenia/IP, korelacje (tabela + bar-gage).
RG/Zgodność: sesje> progi, wzrost steków, wpisy anomalii.
Wydanie Porównaj: stabilny vs canary by p95/error/business metrics.
Infra/USE: Wykorzystanie/Nasycenie/Błędy według klastra i kolejki.
12) Przykład deski rozdzielczej JSON (fragment)
json
{
"title": "Payments SLO",
"tags": ["slo","payments"],
"time": {"from":"now-6h","to":"now"},
"panels": [
{
"type":"stat",
"title":"Availability",
"targets":[{"expr":"sum(rate(http_requests_total{service=\"payments-api\",status=~\"2.. 3..\"}[5m]))/sum(rate(http_requests_total{service=\"payments-api\"}[5m]))"}],
"thresholds":{"mode":"absolute","steps":[{"color":"red","value":0},{"color":"green","value":0. 999}]}
},
{
"type":"timeseries",
"title":"p95 latency",
"exemplars": {"color":"rgba(31,120,193,0. 6)"},
"targets":[{"expr":"histogram_quantile(0. 95,sum by (le) (rate(http_request_duration_seconds_bucket{service=\"payments-api\"}[5m])))"}]
}
]
}
13) Książki startowe i ulepszenia UX
Każdy alert ma URL Runbook (instrukcja akcji).
Linki do pokrewnych desek rozdzielczych (Płatności i PSP).
Drilldown: kliknięcia na etykietach → filtry (region/psp/trasa).
Zmienne domyślnie: '= prod', 'region = eu' - przyspiesza start.
14) Lista kontrolna wdrażania
1. Konfiguracja zasobów danych: Prometheus/Loki/Tempo/SQL.
2. Wprowadź foldery i RBAC; audyt praw.
3. Utwórz zmienne szablonu (region/na/usługa).
4. Budowanie desek rozdzielczych SLO (dostępność, p95, wskaźnik błędów, budżet błędów).
5. Dodaj adnotacje i stabilne/kanarkowe porównania.
6. Włącz przykłady i przejdź do śladów/dzienników klikając.
7. Konfiguruj alerty (wielopoziomowe) i zakorzenienie.
8. Zapewnij wszystko jako kod, sklep w Git, zrób recenzję.
9. Optymalizacja wydajności: zasady nagrywania, odstępy, pamięć podręczna.
10. Wprowadź biznesowe deski rozdzielcze (TTW, konwersja płatności, karty GGR).
15) Antypattery
„Zoo” niespójne deski rozdzielcze bez zmiennych i standardów.
Panele z ciężkim PromQL bez zasad nagrywania → powolny interfejs użytkownika.
Nadmiar kolorów/legendy/oś Y z różnymi skalami.
Połączenie PII w panelach otwartych dla przeglądarki.
Brak adnotacji o zwolnieniu - nie wiadomo skąd pochodzą skoki.
Jedna deska rozdzielcza „monovew” zamiast struktury folderu.
Podsumowanie
Grafana jest interfejsem, w którym technika spełnia produkt: metryki, dzienniki i utwory łączą się ze zdjęciami biznesowymi. Szablony, prawidłowe panele, adnotacje i wpisy przekształcają dane w rozwiązania: szybką diagnozę, przewidywalne wydania i koszty obserwacji.