GH GambleHub

Спостережуваність: логи, метрики, трасування

Спостережуваність: логи, метрики, трасування

1) Навіщо це потрібно

Спостережуваність - здатність системи відповідати на незаплановані питання про свій стан. Вона спирається на три основні сигнали:
  • Метрики - компактні агрегати для SLI/SLO і алертингу за симптомами.
  • Трасування - причинно-наслідкові ланцюжки запитів (end-to-end).
  • Логи - детальні події для розслідувань та аудиту.

Мета: швидкий RCA, превентивні алерти і керована надійність в рамках error budget.

2) Принципи архітектури

Єдиний контекст: скрізь прокидаємо'trace _ id','span _ id','tenant _ id','request _ id','user _ agent','client _ ip _ hash'.
Стандарти: OpenTelemetry (OTel) для SDK/агентів, JSON-формат логів (канонічний, зі схемою).
Симптоми> причини: алертим по призначених для користувача симптомів (латентність/помилки), а не по CPU.
Зв'язок сигналів: від метрики → в спани (exemplars) → в конкретні логи по'trace _ id'.
Безпека і приватність: маскування PII в логах, шифрування in transit/at rest, незмінні журнали для аудиту.
Багатоарендність: розділення просторів імен/ключів/політик.

3) Таксономія сигналів і схеми

3. 1 Метрики

RED (Rate, Errors, Duration) для сервісів і USE (Utilization, Saturation, Errors) для інфраструктури.
Типи: counter, gauge, histogram/summary. Для латентності - histogram з фіксованими bucket'ами.
Exemplars: посилання на'trace _ id'в «гарячих» бінах гістограми.

Міні-схема метрики (логіч. модель):

name: http_server_duration_seconds labels: {service, route, method, code, tenant}
type: histogram buckets: [0. 01, 0. 025, 0. 05, 0. 1, 0. 25, 0. 5, 1, 2, 5]
exemplar: trace_id

3. 2 Трасування

Спан = операція з'name','start/end','attributes','events','status'.
W3C Trace Context для переносимості.
Семплювання: базове (head) + динамічне (tail) + правила «важливості» (помилки, високі p95).

3. 3 Логи

Тільки структурований JSON; рівні: DEBUG/INFO/WARN/ERROR.
Обов'язкові поля: `ts_utc`, `level`, `message`, `trace_id`, `span_id`, `tenant_id`, `env`, `service`, `region`, `host`, `labels{}`.
Заборонено: секрети, токени, PAN, паролі. PII - тільки токенізовано/масковано.

Приклад рядка лога (JSON):
json
{"ts":"2025-10-31T12:05:42. 123Z","level":"ERROR","service":"checkout","env":"prod",
"trace_id":"c03c...","span_id":"9ab1...","tenant_id":"t-42","route":"/pay",
"code":502,"msg":"payment gateway timeout","retry":true}

4) Збір і транспорт

Агенти/експортери (daemonset/sidecar) → буфер на вузлі → шина/інгест (TLS/mTLS) → сховища сигналів.
Вимоги: back-pressure, ретраї, дедуплікація, обмеження кардинальності (labels!), захист від «log storms».

Метрики: pull (Prometheus-сумісно) або push через OTLP.
Трасування: OTLP/HTTP (gRPC), tail-семплери на колекторі.
Логи: локальний збір (journald/docker/stdout) → парсер → нормалізатор.

5) Зберігання та ретенція (tiered)

Метрики: гарячі TSDB 7-30 днів (з downsample), агрегати на більш довгий термін (90-365 днів).
Трасування: 1-7 днів повно, потім аггрегати/спани «важливих» сервісів; зберігати індекси за «service», «status», «error».
Логи: гарячий індекс 7-14 днів, теплий 3-6 міс, архів до 1-7 років (комплаєнс). Аудит - WORM.

Оптимізація витрат: downsampling, фільтрація DEBUG в проді, квоти на лейбли, sampling для трас.

6) SLI/SLO, алертинг і чергування

SLI: доступність (% успішних запитів), латентність (p95/p99), частка 5xx, свіжість даних, частка успішних джоб.
SLO: ціль на SLI (наприклад, 99. 9% успішних ≤ 400 мс).
Error budget: 0. 1% «права на помилку» → правила фічфриз/експериментів.

Алертинг за симптомами (приклад):
  • `ALERT HighLatency` если `p99(http_server_duration_seconds{route="/pay"}) > 1s` 5мин.
  • `ALERT ErrorRate` если `rate(http_requests_total{code=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0. 02`.
  • Силос-альберти (CPU/Disk) - тільки як допоміжні, без paging.

7) Кореляція сигналів

Метрика «червона» → клікаємо в exemplar → конкретний'trace _ id'→ дивимося «повільний» спан → відкриваємо логи по тому ж'trace _ id'.
Кореляція з релізами: атрибути'version','image _ sha','feature _ flag'.
Для даних/ETL: 'dataset _ urn','run _ id', зв'язок з lineage (див. відповідну статтю).

8) Семплювання і кардинальність

Метрики: обмежуємо лейбли (без'user _ id','session _ id'); квоти/валідація при реєстрації.
Трасування: комбінуємо head-sample (на вході) і tail-sample (на колекторі) з правилами: «все що 5xx, p99, помилки - 100%».
Логи: рівні та дроселювання; для частих повторюваних помилок - агрегуючі події (dedupe ключ).

Приклад tail-sampling (концептуально, OTel Collector):
yaml processors:
tailsampling:
decision_wait: 2s policies:
- type: status_code status_code: ERROR rate_allocation: 1. 0
- type: latency threshold_ms: 900 rate_allocation: 1. 0
- type: probabilistic hash_seed: 42 sampling_percentage: 10

9) Безпека і приватність

In Transit/At Rest: шифрування (TLS 1. 3, AEAD, KMS/HSM).
PII/секрети: санітайзери до відправки, токенізація, маскування.
Доступ: ABAC/RBAC на читання; розділення ролей producers/readers/admins.
Аудит: незмінний журнал доступу до логів/трас; експорт - у зашифрованому вигляді.
Багатоарендність: namespaces/tenant-labels з політиками; ізоляція ключів шифрування.

10) Профілі конфігурацій (фрагменти)

Prometheus (метрики HTTP + алертинг):
yaml global: { scrape_interval: 15s, evaluation_interval: 30s }
scrape_configs:
- job_name: 'app'
static_configs: [{ targets: ['app-1:8080','app-2:8080'] }]
rule_files: ['slo. rules. yaml']
slo. rules. yaml (приклад RED):
yaml groups:
- name: http_slo rules:
- record: job:http_request_duration_seconds:p99 expr: histogram_quantile(0. 99, sum(rate(http_server_duration_seconds_bucket[5m])) by (le,route))
- alert: HighLatencyP99 expr: job:http_request_duration_seconds:p99{route="/pay"} > 1 for: 5m
OpenTelemetry SDK (псевдокод):
python provider = TracerProvider(resource=Resource. create({"service. name":"checkout","service. version":"1. 8. 3"}))
provider. add_span_processor(BatchSpanProcessor(OTLPExporter(endpoint="otel-collector:4317")))
set_tracer_provider(provider)
with tracer. start_as_current_span("pay", attributes={"route":"/pay","tenant":"t-42"}):
business logic pass
Логи програми (stdout JSON):
python log. info("gw_timeout", extra={"route":"/pay","code":502,"trace_id":get_trace_id()})

11) Дані/ETL і стримінг

SLI для даних: свіжість (max lag), повнота (rows vs expectation), «якість» (валідатори/дуплікати).
Алерти: пропуск вікна, лаг консьюмера, зростання DLQ.
Кореляція: 'run _ id','dataset _ urn', події lineage; трасування для пайплайнів (span на батч/partition).
Kafka/NATS: метрики продюсер/консьюмер, лаг/відмова; трасування по headers (в т. ч. «traceparent»).

12) Профілювання та eBPF (доп. сигнал)

Низькорівневі гарячі шляхи CPU/alloc/IO; профілі на інцидент.
eBPF-телеметрія (мережеві затримки, DNS, системні виклики) з прив'язкою до'trace _ id '/PID.

13) Тестування спостережуваності

Контракт сигналів: перевірка експорту метрик/лейблів/гістограм в CI.
Synthetic probes: сценарії RUM/симульовані клієнти для зовнішніх SLI.
Chaos/Fire drills: вимкнення залежностей, деградація - дивимося, як алерти і чергові реагують.
Smoke в проді: пост-деплою перевірка, що нові ендпоінти мають метрики і трасування.

14) Вартість і контроль обсягів

Бюджети за сигналом/командою; дешборд «cost per signal».
Кардинальність під бюджетом (SLO по cardinality), ліміти на нові лейбли.
Downsampling, ретенції за класами даних, «холодні» архіви і WORM для аудиту.

15) Експлуатація та SLO платформи спостережуваності

SLO платформи: 99. 9% успішних інгестів; затримка до індексу метрик ≤ 30 с, логів ≤ 2 хв, трас ≤ 1 хв.
Алерти платформи: лаг інжесту, зростання дропів, помилка підпису/шифрування, переповнення буферів.
DR/HA: багатозонність, реплікація, резервні копії конфігів/правил.

16) Чек-листи

Перед продом:
  • Скрізь прокидається'trace _ id '/' span _ id'; JSON-логи зі схемою.
  • RED/USE метрики з гістограмами; exemplar → траси.
  • Tail-sampling включений; правила 5xx/p99 = 100%.
  • Алерти за симптомами + рунібуки; тихий годинник/anti-flap.
  • Санітайзери PII; шифрування at rest/in transit; WORM для аудиту.
  • Ретенції та бюджети на обсяги/кардинальність.
Експлуатація:
  • Щомісячний огляд алертів (шум/точність), тюнінг порогів.
  • Звіт по error budget і вжиті заходи (фічфриз, hardening).
  • Перевірка покриттів дашбордів/логів/трас для критичних шляхів.
  • Навчальні інциденти та оновлення runbook'ів.

17) Runbook’и

RCA: зростання p99/pay

1. Відкрити дашборд RED для'checkout'.
2. Перейти по exemplar → повільна траса → виявити «вузький спан» (напр.,'gateway. call`).
3. Відкрити логи по'trace _ id'→ подивитися таймаути/ретраї.
4. Увімкнути фіча-прапор відкату/ліміт RPS, повідомити власників залежності.
5. Після стабілізації - RCA, тікети на оптимізацію, тест відтворення.

Аномалія в даних (лаг DWH):

1. SLI «свіжість» червоний → траси джоба → failing крок.

2. Перевірити лаг брокера/DLQ, помилки конектора.

3. Запустити reprocess, повідомити споживачів (BI/продукт) через статус-канал.

18) Часті помилки

Логи без схеми і без'trace _ id'. Розслідування затягуються в рази.
Алерти по інфраструктурі замість симптомів. Paging йде «в молоко».
Безмежна кардинальність метрик. Вибух витрат і нестабільність.
Всі траси 100%. Дорого і не потрібно; вмикайте розумне семплювання.
PII/секрети в логах. Включайте санітайзери і «червоні списки».
«Німі» фічі. Новий код без метрик/трас/логів.

19) FAQ

В: Чи потрібно зберігати сирий текст логів?
ПРО: Так, але з ретенцією та архівами; для алертів і SLO достатньо агрегатів. Аудит - в WORM.

В: Що вибирати для трас - head або tail sampling?
ПРО: Комбінувати: head-probabilistic для базового покриття + tail-rules для помилок і аномалій.

В: Як зв'язати призначені для користувача метрики і технічні?
ПРО: Через загальний'trace _ id'і бізнес-лейбли ('route','tenant','plan'), а також через події продукту (конверсії) з кореляцією до трас.

В: Як не потонути в алертах?
ПРО: Бийте за симптомами, вводьте тихі години, дедуплікацію, угруповання, пріоритизацію по SLO і власник-по-замовчуванню на кожен алерт.

Пов'язані матеріали:
  • «Аудит і незмінні журнали»
  • «Шифрування In Transit/At Rest»
  • «Менеджмент секретів»
  • «Походження даних (Lineage)»
  • «Privacy by Design (GDPR)»
  • «Гарантії доставки вебхуків»
Contact

Зв’яжіться з нами

Звертайтеся з будь-яких питань або за підтримкою.Ми завжди готові допомогти!

Розпочати інтеграцію

Email — обов’язковий. Telegram або WhatsApp — за бажанням.

Ваше ім’я необов’язково
Email необов’язково
Тема необов’язково
Повідомлення необов’язково
Telegram необов’язково
@
Якщо ви вкажете Telegram — ми відповімо й там, додатково до Email.
WhatsApp необов’язково
Формат: +код країни та номер (наприклад, +380XXXXXXXXX).

Натискаючи кнопку, ви погоджуєтесь на обробку даних.