Rurociągi dziennika: ELK i Loki
1) Dlaczego i kiedy: cele pozyskiwania drewna
Obserwowalność i RCA: przyspieszenie Debaga, pośmiertne, sterowanie SLO/SLA.
Bezpieczeństwo i audyt: ślady dostępu, anomalie, dochodzenia.
Wskaźniki biznesowe: konwersja, przepływ płatności, błędy PSP, zachowanie użytkownika.
Zgodność: przechowywanie, maskowanie PII, polityka retencji, blokada prawna.
Rodzaje dzienników: aplikacja, infrastruktura (kubelet, kube-proxy, CNI, ingress), sieć, audyt, płatność, zdarzenia internetowe, Nginx/Envoy, baza danych.
2) Architektury wysokiego szczebla
Wariant A: ELK
Producenci → Logshipper (Filebeat/Fluent Bit/Vector) → Logstash/Beats wejście → Elasticsearch → Kibana/Алертинz
Wariant B: Loki
Producenci → Promtail/Fluent Bit → Loki dystrybutor/ingester/querier → Grafana/Алертинz
Hybryda
ELK do wyszukiwania pełnych tekstów/facetów, Loki do taniego skalowalnego przechowywania i szybkich pytań podobnych do wykresu; korelacja z metrykami/śladami w Grafanie.
3) Poziomy przepływu i przetwarzania danych
1. Kolekcja: bajtowe pliki ogonowe, dziennik, syslog, pojemniki stdout, HTTP.
2. Wzbogacenie: znormalizowanie znacznika czasu, hosta/podstrona/przestrzeń nazw, (prod/etap), zwolnienie, commit SHA, ślad/span id.
3. Parsing: JSON → pola płaskie; grok/regex; formaty Nginx/Envoy; systemy płatności (kody błędów PSP).
4. Filtrowanie/edycja: cut PII (PAN, CVV, e-mail, adresy), sekrety, żetony.
5. Routing: według najemcy/usługi/poziomu dziennika; gorący/ciepły/zimny; do S3/object przechowywania.
6. Przechowywanie i przechowywanie: Zasady TTL według klasy danych.
7. Dostęp/Analityka/Alerty.
4) ELK: kluczowe rozwiązania
4. 1 Logstash/Beats
Użyj Beats/Fluent Bit na węzłach do łatwego zbierania, Logstash jako centralny ETL (grok, sekcję, mutate, geoip, translate).
Puli Logstash: ingest-ETL, security-ETL, payments-ETL - aby odizolować obciążenia.
4. 2 Elastyczny search
Shading: skupić się na ~ 20-50 GB na odłamek; unikać „wybuchu odłamków”.
Strategia indeksu: 'logs- <najemca> - <service> -RRRR. MM. DD' lub strumienie danych; przewrócenie według rozmiaru/czasu.
- gorący: SSD, 1-7 dni; ciepło: HDD, 7-30 dni; zimno: objętościowe; zamrożone: minimalny koszt z wolniejszym dostępem.
- Mapowanie - Pola typu twardego, ograniczenie field ddata i tworzenie pól dynamicznych.
- Cache i zapytania: filtry według pól słów kluczowych, agregaty - starannie; pin-to-hot do wyszukiwania wysokiej częstotliwości.
4. 3 kibany
Przestrzenie dla wielu najemców.
Zapisane wyszukiwania, obiektyw/TSVB, progi/mierniki alarmowe.
RBAC według wzorców indeksu ('logs-tenant-').
5) Loki: kluczowe decyzje
5. 1 Model etykiety
Etykiety są indeksem Loki. "Użyj niskiej kardynalności: 'cluster', 'namspace', 'app', 'level', 'na', 'lokator'.
Pola o wysokiej kardynalności (uid, request_id) - z rzędu; pobierz '| =', '| json', '| regexp' podczas pytań przez LogQL.
5. 2 Składniki
Promtail: сбовstdout, pliki, dziennikarstwo; parsers (JSON, regex, cri).
Dystrybutor/Ingester/Querier/Query-frontend: skalowanie według roli; buforowanie żądań.
Przechowywanie obiektów (S3/GCS/MinIO) do długoterminowego przechowywania kłód kawałkowych.
5. 3 techniki LogQL
Szybki grep: '{app = „payments”, level =” error”} | = „declined”'
Марсин, JSON: ' {app =” api”} | json | code =” 5xx” | unwrap duration | avg ()'
Korelacja z metrykami: 'rate ({app = „nginx”} | = „200” [5m])'
6) Porównanie ELK vs Loki (w skrócie)
Wyszukiwanie/agregowanie: ELK jest silniejszy w przypadku złożonych zapytań w pełnym tekście i faceted; Loki - grep-like, szybki i tani.
Koszt: Loki jest często tańsze na większych woluminach (przechowywanie obiektów + mniejszy indeks).
Złożoność operacyjna: ELK wymaga dyscypliny w indeksach/ILM, Javu-hips; Loki - dyscypliny etykiet.
Korelacja z metrykami/śladami: Loki integruje się naturalnie ze stosem Grafana/OTel; ELK wie również, jak, ale częściej poprzez integrację.
7) Bezpieczeństwo i zgodność
Wydanie PII na krawędzi (nadawca): maska PAN, e-mail, telefon, adresy, żetony.
TLS w tranzycie, mTLS między agentami i autobusami.
RBAC: indeksy/etykiety dla jednego najemcy; izolacja neimspacji/przestrzeni.
Higiena tajemnic: zmienne środowiskowe bez tajemnic, indywidualni tajni menedżerowie.
Legal Hold: segment/index zamrażania mechanizmu; odpisać raz na sporne okresy.
Usuwanie/zatrzymywanie: Zasady TTL według klasy danych (prod/stateful/payments/audit).
Ścieżki kontroli dostępu do dziennika.
8) Niezawodność i przepustowość
Buforowanie i backpressure: lokalne pliki/dyski dla agentów; wycofuje się z wykładniczym backoff.
Idempotencja: 'ingest _ id'/' log _ d' fields, aby uniknąć duplikatów podczas duplikatów.
HA: minimum 3 węzły dla mistrzów/intestatorów Loki ES; środki antyaffinity ма AZ.
kwoty i limity stawek w podziale na najemców/usługi; ochrona przed wyrębem „burz”.
Schemat poziomu dziennika: „ERROR” ograniczony, „DEBUG” tylko tymczasowo poprzez flagi dynamiczne.
9) Wydajność i dostrajanie
ELK:- Hałas JVM 50% RAM (ale ≤ ~ 30-32 GB na węzeł), pamięć podręczna strony jest ważna.
- Inteligentne przewrócenie (20-50 GB/shard), 'odświeżanie _ odstępu' na indeksy.
- W Logstash, unikać „ciężkich” grok; jeśli to możliwe, rejestrowanie JSON u źródła.
- Odpowiedni zestaw etykiet jest kluczem do prędkości.
- Duże kawałki → tańsze przechowywanie, ale droższa pamięć przy spożyciu; saldo.
- Query-frontend + cache (meme/Redis) dla wielokrotnych żądań.
10) FinOps do dzienników (koszt)
Zmniejszająca się kardynalność pól/etykiet.
Próbkowanie DEBUG i dynamiczne „przełączniki dziennika”.
Obrót: krótkie gorące, długie zimno do obiektu.
Deduplikacja i skonsolidowane wiadomości (partia).
Archiwizacja rzadko używanych dzienników do tanich klas przechowywania.
Deska rozdzielcza wartości: strumienie głośności/danych/etykiety/indeksy/najemcy.
11) Obserwowalność 3-w-1
Identyfikator identyfikacyjny/identyfikator Span-ID każdego dziennika (oprogramowanie pośrednie na bramach i usługach API).
OpenTelemetry: pojedynczy kontekst; eksporterów do Tempo/Jaeger, metryki do Prometeusza/Mimira, dzienniki do Loki/ELK.
Szybkie scenariusze: „alert według metryki → przejdź do odpowiednich dzienników → przejdź do toru”.
12) Wielopoziomowość i izolacja
Izolacja w przestrzeni nazw (etykiety K8s), oddzielne wzory indeksów/etykiety „najemca”.
Separacja wpisów/desek rozdzielczych/retenschna przez najemcę.
Rozliczenie zużycia: objętość spożycia, przechowywanie, żądania.
13) Monitorowanie i SLO dla samego przenośnika
SLO ingest: "99. 9% dzienników dostarczonych Wyszukiwanie SLO: „zapytania p95 <Y sec”. 14) Typowe programy rozmieszczenia Zarządzany: Elasticsearch Service/Opensearch, Grafana Cloud Loki. 15) Przykłady konfiguracji 15. 1 Promtail (K8s, CRI JSON) 15. 2 Logstash (połknięcie i maskowanie) 16) Tablice ostrzegawcze i rozdzielcze (szablony) Обибка API: 'rate ({app = „api „, level =” error”} [5m])> threshold' → PagerDuty/Telegram. 17) Kontrole jakości (log-QA) Kontrakty na logowanie: format JSON, wymagane pola ('ts',' level ',' service ',' na ',' trace _ id', 'msg'). 18) Częste błędy i anty-wzory Etykiety Loki o wysokiej kardynalności ('user _ id',' request _ id') → eksplozja pamięci. 19) Plan realizacji (iteracje) 1. MVP: środki + jeden rurociąg (aplikacje), podstawowe deski rozdzielcze, wydanie PII. 20) Lista kontrolna wprowadzenia do produkcji 21) Mini-FAQ Co wybrać - ELK lub Loki?
Metryki techniczne: głębokość kolejki, rejestry spadków, szybkość przerobu, szybkość błędów parsera, awaria węzła ingester/ES.
Hosted : Zestawy Stat dla ES/Loki, anty-powinowactwo do AZ, trwałe woluminy, przechowywanie obiektów.
Agenci krawędzi (aplikacje w regionach): lokalny bufor + kanał TLS do centralnego wlewu.yaml scrape_configs:
- job_name: kubernetes-pods kubernetes_sd_configs:
- role: pod pipeline_stages:
- cri: {}
- json:
expressions:
level: level msg: message trace: trace_id
- labels:
level:
app:
namespace:
- match:
selector: '{namespace="prod"}'
stages:
- regex:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
- replace:
expression: '(?P<pan>\b[0-9]{12,19}\b)'
replace: '[REDACTED_PAN]'
relabel_configs:
- action: replace source_labels: [__meta_kubernetes_pod_label_app]
target_label: app
- action: replace source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- action: replace source_labels: [__meta_kubernetes_pod_node_name]
target_label: noderuby input {
beats { port => 5044 }
}
filter {
json { source => "message" skip_on_invalid_json => true }
mutate { add_field => { "env" => "%{[kubernetes][labels][env]}" } }
PII mutate {
gsub => [
"message", "\b[0-9]{12,19}\b", "[REDACTED_PAN]",
"message", "(?i)(authorization: Bearer)([A-Za-z0-9\.\-_]+)", "\1[REDACTED_TOKEN]"
]
}
}
output {
elasticsearch {
hosts => ["https://es-hot-1:9200","https://es-hot-2:9200"]
index => "logs-%{[fields][tenant]}-%{[app]}-%{+YYYY. MM. dd}"
ilm_enabled => true ssl => true cacert => "/etc/ssl/certs/ca. crt"
user => "${ES_USER}"
password => "${ES_PASS}"
}
}
5xx splash in Nginx/Envoy; spadek spożycia środków; wzrost wyszukiwania opóźnień.
Linter logs w CI: zakazanie nowych pól o wysokiej kardynalności bez zgody.
Usługi kanaryjskie: generowanie dzienników referencyjnych do wczesnego wykrywania regresji.
Pola dynamiczne w ES bez mapowania → „eksplozja indeksu”.
DEBUG w sprzedaży "na zawsze. "Włącz flagami i z TTL.
Brak rewizji PII.
Jeden wspólny „monolityczny” rurociąg dla wszystkiego - lepsze segmenty według domeny.
2. Rozszerzenie: network/infra-logs, wpisy SLO, korelacja z utworami.
3. FinOps: matryca retencji, raport kosztów, optymalizacja etykiety/indeksu.
4. Multi-najemca: spacje, RBAC, rachunki zużycia.
5. Niezawodność: HA, katastrofy-wiertarki, Legal Hold.