GH GambleHub

Система сигналів і повідомлень

1) Роль і цілі

Система сигналів - не «розсилка повідомлень», а контур прийняття рішень: вона вчасно підсвічує відхилення, пропонує дії і дотримується балансу між своєчасністю і тишею.

Цілі:
  • Знизити MTTD/MTTR за рахунок пріоритизації і чітких плейбуків.
  • Зменшити alert fatigue (втома від сповіщень) через шумозаглушення.
  • Дати дії прямо з повідомлення (ack, snooze, runbook, автодействие).
  • Дотримуватися приватності та згоди (opt-in/opt-out, зберігання логу).

2) Таксономія подій і рівні

2. 1 Типи подій

Метрики/аномалії (SRE, продукт, фінанси).
Бізнес-правила (ліміти, фрод, KYC, платежі).
Системні (деплою, деградація, ліцензії).
Призначені для користувача (поведінкові тригери, RG/відповідальна гра).

2. 2 Рівні важливості (Severity)

Critical - негайна реакція, ризик втрат/безпеки.
High - значуще погіршення KPI/SLO.
Medium - потрібні дії в робочий час.
Low/Info - спостереження/контекст, авто-згортка в дайджести.

2. 3 Пріоритет (Priority)

Матриця'Impact × Urgency'→ P1..P4. Прив'язка до каналів і SLA реакції.

3) Архітектура і потоки

Виробники сигналів → Шина подій → Нормалізація (enrich, дедуп) → Кореляція → Правила (policy engine) → Маршрутизація → Канали доставки → Центр переваг → Логи/аналітика.

Ключові компоненти:
  • Enricher: додає тенант, роль, регіон, посилання на плейбуки.
  • Deduper: згрупувати повторювані події за ключем.
  • Correlator: склеїти родинні сигнали в інцидент.
  • Policy Engine: YAML/DSL-правила, quiet hours, ескалації.
  • Delivery: in-app, email, push, SMS, webhook, чат-інтеграції.

4) Правила та політики (приклад YAML)

yaml policies:
- id: p_sre_critical match: { domain: "infra", severity: "critical" }
route:
primary: { channel: "pager", targets: ["oncall_sre"] }
fallback: { channel: "sms", delay: "2m" }
suppress:
flapping: {window: "10m," threshold: 5} # suppressing frequent twitching duplicates: {key: ["service, ""cluster,"" error _ code"], ttl: "15m"}
escalate:
after: "10m"
to: ["sre_manager"]
auto_assign: true
- id: p_product_medium match: { domain: "product", severity: "medium", kpi: "conversion" }
route:
primary: { channel: "inapp", audience: "product_owners" }
digest:
window: "1h"
max_items: 10 quiet_hours:
tz: "Europe/Kyiv"
ranges: ["22: 00-07: 00"] # only P1 digests/pager at this time

5) Дедуплікація, кореляція, придушення флапінгу

Дедуп: ідентифікатор групи'dedup _ key = hash (service'metric'dim)'; TTL ≥ вікно флапінгу.
Кореляція: об'єднуйте пов'язані сигнали по топології (servis→zavisimost), часу (± N хв) і контексту (реліз, інцидент).
Флапінг: пороги «N подій за M хвилин» → один сигнал «flapping detected» з пропозицією підняти гістерезис або suppress.

6) Маршрутизація і RACI

Responsible: хто отримує перше повідомлення/таск.
Accountable: хто ескалується після SLA.
Consulted: кого згадати в треді/чат-каналі.
Informed: кому піде дайджест/підсумки.
Призначайте по ролі і контексту (тенант, регіон, продукт-стрім).

7) Канали доставки та нюанси

КаналКоли використовуватиОсобливості/обмеження
In-appОперативні, але некритичні; діїБагатий UI, CTA, контекст
EmailДайджести, звіти, некритичніМоже губитися/фільтруватися
PushДля мобільної чергової командиОбмеження довжини, тихі години
SMS/PagerP1/P0 критикаПлатно, лаконічно, без вкладень
WebhookІнтеграції (Jira, Slack, Ops)Підписи HMAC, ретраї, ідемпотентність
Chat (Slack)Тред інциденту, колабораціяТекстові команди (ack, assign)

Ретраї: 5хх/429/таймаут → backoff + jitter;'Retry-After'поважати. Ідемпотентність: 'X-Notification-Id'на вебхуках.

8) Центр переваг (Preferences Center)

Opt-in/Opt-out за типами подій, рівнями, каналами.
Графік тиші (quiet hours), ручний snooze на 15/30/60 хв.
Поріг/чутливість (наприклад, аномалія ≥ 3 σ).
Мова/локаль, формат часу/валюти.
Прив'язка до ролей: пресети для SRE/Product/Finance.
Прозорість: показати, чому користувач отримав сигнал (посилання на правило).

9) Контент-дизайн: структура повідомлення

Шаблон для критичного сигналу (P1):
  • Заголовок: коротко, з тригером: «[P1] [PSP _ TR] Різке зростання відмов 3DS (+ 12%)».
  • Контекст: період, порушені сегменти/регіон, джерело даних.
  • Причина/гіпотеза: "Пов'язано з релізом PSP_X 18:20 UTC».
  • SLA/дедлайн: «Ескалація через 10 хв».
  • CTA: "Відкрити плейбук", "Включити fallback PSP_Y", "Ack (30 хв)".
  • Посилання: графік, інцидент-тред, метрики, runbook.
  • Метадані: `trace_id`, `incident_id`, `dedup_key`.

Тон: факти, без драматизації; числа та одиниці вимірювання; уникати абревіатур без розшифровки.
Локалізація: змінні → плейсхолдери, перекази зберігаються в ресурсах; числа/дати - по локалі.

10) Дії з повідомлень (Actionable)

Ack/Snooze з параметрами часу.
Assign/Invite в тред інциденту.
Runbook: відкрити кроки рішення з автозаповненням контексту.
One-click remediation (де безпечно): перемкнути маршрут, підняти ліміт, перезапустити джобу (з підтвердженням і аудитом).
Створити тікет (Jira/GitHub) з автозаповненням полів.

11) Якість сигналів: метрики та цілі

Precision (частка релевантних серед відправлених) ≥ 80% для P1/P2.
Recall (частка виявлених серед усіх інцидентів) ≥ 70%.
Noise: середні сигнали/годину на користувача (цільова стеля).
Ack-time p50/p95, Escalation rate, Snooze rate (як індикатор шуму).
MTTD/MTTA/MTTR (в розрізі доменів і каналів).
Silenced-but-should-alert (пропуски через правила) - окремий дашборд.

12) Управління шумом: прийоми

Гістерезис і «ковзні вікна» для порогів.
Згладжування (EWMA) перед детекцією.
Агрегація: замість 30 дрібних - один батч/дайджест з топ-контриб'юторами.
Контекстні ліміти: не більше N повідомлень/година/канал/користувач.
Авто-зворотній зв'язок: якщо користувач 3 × поспіль натискає Snooze → запропонувати підвищити поріг/змінити канал.

13) Безпека, приватність, комплаєнс

HMAC-підпис для вебхуків, ротація секретів,'X-Key-Id'.
RBAC/ABAC: видимість сигналів по ролях/тенантах.
PII-мінімізація, маски в логах, аудит дій (ack/assign/runbook).
Згоди (consent) і причини повідомлення (правило/політика) - в payload.
Retention/TTL логів повідомлень, Legal Hold по інцидентам.

14) Схеми і payload'и

Подія (внутрішня)

json
{
"id": "sig_01HX",
"domain": "payments",
"severity": "high",
"priority": "P2",
"title": "The 3DS failure graph has grown to 8. 2% (+3. 1 pp), "
"occurred_at": "2025-11-03T17:55:00Z",
"context": { "psp": "PSP_X", "country": "TR", "release_id": "rel_241103_1820" },
"metrics": { "baseline": 5. 1, "current": 8. 2, "delta_pp": 3. 1 },
"dedup_key": "payments    PSP_X    TR    3DS_FAILURE",
"runbook": "rbk_psp_3ds_spike",
"slo": { "ack_deadline_sec": 600 }
}

Повідомлення (канал-агностик)

json
{
"notification_id": "ntf_91ab",
"signal_id": "sig_01HX",
"targets": ["oncall_payments"],
"channels": ["inapp","slack","webhook"],
"cta": [
{"id": "ack," "label": "Confirm (30 min)," "payload": {"ttl ":" 30m"}},
{"id": "runbook," "label": "Open playbook," "payload": {"id ": "rbk _ psp _ 3ds _ spike"}},
{"id": "fallback," "label": "Enable fallback, PSP_Y" "confirm": true}
],
"hmac": "sha256=AbCd..."
}

15) UX-патерни в продукті

Інбокси: вкладки Critical/High/Other, бейджі кількості.
Стрічка інциденту: корельовані сигнали, таймлайн дій, «що було зроблено».
Фільтри: роль, домен, регіон, час, «тільки без відповіді».
Швидкі дії у списку (ack/snooze/assign).
Explain: «чому ви це бачите» (правило, пороги, дані).
Дайджести: ранковий/вечірній, локалізовані по TZ.

16) Тест-план

Unit: дедуп-ключі, гістерезис, флапінг, серіалізація payload'ів.
Integration: маршрутизація, quiet hours, ескалації, ретраї каналів.
E2E: сценарій P1 від аномалії до закриття тікету; P2 в quiet hours → дайджест.
Chaos: втрата каналу (SMTP/SMS), затримки, лавина сигналів, clock-skew.
A11y/i18n: screen-readers, клавіатурні ack/snooze, локалізація чисел/дат.

17) Дашборди якості

Precision/Recall по доменах.
Ack time p50/p95 і частка вчасно підтверджених.
Noise per user/hour і топ-галасливі правила.
Escalation rate і «помилкові ескалації».
Suppressed vs Delivered (скільки подавлено/зведено в дайджест).
User feedback:/ повідомлення, коментарі до шуму.

18) Чек-листи

Проектування

  • Таксономія подій і рівні узгоджені
  • Політики quiet hours/ескалацій описані
  • Дедуп/кореляція/флапінг налаштовані
  • Канали, ретраї, ідемпотентність вебхуків
  • Центр уподобань (opt-in/out, snooze)
  • Шаблони контенту та локалізація
  • Плейбуки і one-click дії (з аудитом)
  • Метрики якості та дашборди

Експлуатація

  • Порогова оптимізація раз на квартал
  • A/B правил (поріг, вікна, digest)
  • Регулярні огляди «топ-шум» і CAPA
  • Ротація секретів каналів (HMAC, SMTP, SMS)
  • Тест тривог (game days) за розкладом

19) План впровадження (3 ітерації)

Ітерація 1 - Базовий контур (2-3 тижні)

Таксономія, severity/priority, центр переваг (in-app + email).
Дедуп, проста кореляція по ключу/часу, quiet hours.
Шаблони повідомлень, плейбуки, ack/snooze/assign.

Ітерація 2 - Надійність і шумозаглушення (3-4 тижні)

Флапінг/гістерезис, дайджести, чат-інтеграції та вебхуки (HMAC, ретраї).
Ескалації по SLA, дашборди якості (precision/recall, noise).
One-click remediation (з підтвердженням і аудитом).

Ітерація 3 - Оптимізація та масштаб (безперервно)

Кореляція за топологією/релізами, авто-пропозиції порогів.
A/B правил, прогноз «коли спрацює поріг».
Огляди шуму і регулярні game days.

20) Міні-FAQ

Як боротися з alert fatigue?
Дедуп, кореляція, гістерезис, дайджести і центри переваг + регулярні огляди шуму і A/B порогів.

Чи потрібен ML для аномалій?
Корисний, але починайте з детермінованих правил і пояснюваних порогів. ML - як надбудова, обов'язково з Explain.

Чому користувачі отримують «зайві» листи?
Перевірте матчі правил, quiet hours, аудит «чому доставлено», налаштуйте ліміти на канал/годину і дайджести.

Підсумок

Сильна система сигналів - це розумна фільтрація і коректна пріоритизація + дії в один клік. Формалізуйте таксономію і політики, впровадьте дедуп/кореляцію/гістерезис, дайте користувачам контроль (preferences, snooze), забезпечте надійну доставку і прозорість «чому я це отримав». Тоді сигнали стануть інструментом управління, а не джерелом шуму.

Contact

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

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

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

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

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

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