Перейти к основному содержимому

Панель Наблюдаемости: support-overview (эксплуатация)

Operational-борд контекста support («Служба заботы»): здоровье приёма/жизненного цикла обращений, SLA первого ответа/решения, очередей, арбитражных дел, консюмера identity, SLA-worker и outbox. Не dev-stats: метрики — OTel-инструменты приложения + PostgreSQL-counters (ClickHouse не используется, ADR-0056/ADR-0057). Дом полей — ticket.md, arbitrage-case.md; контракты событий — ticket-created.md, ticket-status-changed.md, arbitrage-resolved.md.

Назначение

Отвечает на operational-вопрос: держит ли support свои SLA поддержки и не деградируют ли асинхронные механики (SLA-worker ticket-sla-monitor, консюмер pin.identity.users.v1, outbox pin.support.*). Продуктовый разрез тематик/нагрузки операторов (8.1/8.4) отдаёт SQL-ручка get-support-dashboard — здесь только RED + доменные бизнес-метрики надёжности. Owning team — PIN Platform (Care squad); аудитория — engineering + support. Регистрируется в observability-dashboard-catalog как service-борд.

Область Действия

ПолеЗначение
ИнструментGrafana
Folderpin/support
Сервисыsupport (owner); upstream identity (события/lookup); downstream notifications (консюмер событий)
Аудиторияengineering / support
Primary SLOкоманды p95 < 500 мс; списки/поиск p95 < 1 с; SLA-worker — точность цикла ≤ 1 мин
Статусdraft

Переменные

support — single-tenant platform-tool (TenantId = PIN CompanyId, ADR-0052): tenantId фиксирован и используется как санити-фильтр, не как высококардинальный label. Разрезы — по bounded-enum (category/queue_code/status/priority/channel), id заявителей/операторов в labels не выносятся.

ПеременнаяТипИсточникЗначение по умолчаниюБезопасность
environmentstring (enum)resource attribute deployment.environmentproductionОбязательный фильтр
servicestringresource attribute service.namesupportФиксирован
tenantIdTenantId (= PIN CompanyId)resource attribute tenant_idPINСанити-фильтр single-tenant
categorystring (enum TicketCategory)label category*Bounded (8 значений)
queueCodestring (enum Queue.Code)label queue_code*Bounded (SEED-очереди)
statusstring (enum TicketStatus)label status*Bounded (4 значения)
prioritystring (enum TicketPriority)label priority*Bounded (4 значения)
topicstring (enum pin.support.*/pin.identity.*)label topic*Bounded

Панели

PanelMetric/QueryАгрегацияПорогRunbook
intake-ratesupport_tickets_created_total{category,queue_code,channel}rate() by category/queueinfo
command-latencysupport_command_duration_ms{operation}p50/p95 by operationp95 500 мсcommand-latency
list-search-latencysupport_query_duration_ms{query_kind}p95 by query_kindp95 1 сcommand-latency
tickets-by-statussupport_tickets_by_status{status}last by statusinfo
queue-depthsupport_open_tickets{queue_code}last (New+InWork) by queuewarn: рост устойчивоqueue-backlog
first-response-latencysupport_first_response_seconds{priority}p50/p95 by priorityпротив FirstResponseDueAtsla-breach
sla-breachessupport_tickets_sla_breached{priority,kind}last/increase(1h)crit: ростsla-breach
reopen-ratesupport_ticket_reopened_totalrate()info
sla-worker-cyclesupport_sla_monitor_cycle_secondsp95 / maxcrit > 60 сsla-worker-stalled
arbitrage-by-statussupport_arbitrage_by_status{status,type}last by status/typeinfo
arbitrage-outcomessupport_arbitrage_resolved_total{outcome,escalated}increase(1d)info
identity-consumer-lagsupport_consumer_group_lag_seconds{topic}max by topicwarn 60 с / crit 300 сreplay-identity-dlq
consumer-dlqsupport_consumer_dlq_total{topic,reason}increase(5m) + depthcrit > 0replay-identity-dlq
outbox-lagsupport_outbox_publish_delay_seconds{topic=~"pin.support..*"}p95 / max agecrit > 300 с; backlog > 1000stuck-support-outbox

query_kindlist-tickets/kb-search/arbitrage-list; kind (sla-breaches) — first-response/resolution (из FirstResponseDueAt/ResolutionDueAt); status/priority/outcome — enum ticket.md/ arbitrage-case.md.

Метрики

Источник — OTel-инструменты приложения (RED) и PostgreSQL-gauges (периодический scrape counter-запросов). Все labels bounded, enum — строкой; PII/секретов/unbounded-id (заявитель/оператор) в labels нет.

МетрикаТипLabelsВладелецСмысл
support_tickets_created_totalcountercategory, queue_code, channelsupport (OTel)Приём обращений по категориям/очередям/каналам (WebForm/Operator).
support_command_duration_mshistogramoperationsupport (OTel)Latency команд (take/assign/reply/status/escalate) против SLO 500 мс.
support_query_duration_mshistogramquery_kindsupport (OTel)Latency списков/поиска против SLO 1 с.
support_tickets_by_statusgaugestatussupport (PostgreSQL)Размеры New/InWork/Resolved/Closed.
support_open_ticketsgaugequeue_codesupport (PostgreSQL)Глубина очереди — открытые (New+InWork) по очереди.
support_first_response_secondshistogramprioritysupport (OTel)Время до первого публичного ответа (INV-TKT-5) по приоритету.
support_tickets_sla_breachedgaugepriority, kindsupport (SLA-worker)Тикеты с SlaBreached=true (первый ответ/решение), из ticket-sla-monitor.
support_ticket_reopened_totalcountersupport (OTel)Темп реопенов (ReopenedCount++).
support_sla_monitor_cycle_secondsgaugesupport (worker)Длительность цикла SLA-worker (точность ≤ 1 мин, ADR-0056).
support_arbitrage_by_statusgaugestatus, typesupport (PostgreSQL)Дела по статусам/типам (Registered..Closed).
support_arbitrage_resolved_totalcounteroutcome, escalatedsupport (OTel)Решения/эскалации арбитража (ArbitrageOutcome).
support_consumer_group_lag_secondsgaugetopic, consumersupport (Kafka/OTel)Лаг SupportUserUpsertedConsumer по pin.identity.users.v1.
support_consumer_dlq_totalcountertopic, reasonsupport (OTel)Dead-letter консюмера; reason = unknown_version/handler_error.
support_outbox_publish_delay_secondsgaugetopicsupport (PostgreSQL)Возраст старейшего неопубликованного события (Pending) для pin.support.*.

Сигналы Logs И Traces

СигналQueryCorrelation
Logs (SLA breach)service=support job=ticket-sla-monitor outcome=breachedcorrelationId, ticketId, number
Logs (consumer DLQ)service=support consumer=identity-user-upserted outcome=dead-letteredcorrelationId, messageId, aggregateId (= TicketId/CaseId)
Logs (escalation)service=support operation IN (escalate-ticket,escalate-arbitrage-case)correlationId, ticketId/caseId, escalatedByUserId
Traces (create)service=support operation=create-ticket (child: identity.lookup, публикация события)correlationId, causationId
Traces (resolve)service=support operation=resolve-arbitrage-case (событие arbitrage-resolved)correlationId, causationId

Trace создания связывает создание тикета, первое сообщение переписки и публикацию события ticket-created в одном согласованном изменении; PII заявителя (ФИО/тел/email/Body) в трейсах маскируется.

Оповещения Alerts

AlertУсловиеSeverityNotificationRunbook
support_identity_consumer_lag_breachsupport_consumer_group_lag_seconds > 300 5 минHigh#pin-support-oncallreplay-identity-dlq
support_consumer_dlq_presentincrease(support_consumer_dlq_total[5m]) > 0High#pin-support-oncallreplay-identity-dlq
support_outbox_backlogoutbox Pending > 1000 или outbox_publish_delay > 300 5 минHigh#pin-support-oncallstuck-support-outbox
support_sla_worker_stalledsupport_sla_monitor_cycle_seconds > 60 или отсутствие цикла 5 минHigh#pin-support-oncallsla-worker-stalled
support_sla_breach_spikeрост support_tickets_sla_breached (increase(1h) > базового)Medium#pin-support-oncallsla-breach
support_command_latency_slo_breachcommand-latency p95 > 500 мс 10 минMedium#pin-support-oncallcommand-latency
support_queue_backlog_growingsupport_open_tickets растёт (deriv > 0) 30 мин ∧ > базовогоLow#pin-support-oncallqueue-backlog

Маскирование Sensitive Data

  • Борд не отображает TicketMessage.Body/ArbitrageNote.Body, ФИО/телефон/email заявителя, тексты решений (Decision.Rationale), secrets и токены — только счётчики/латентности/лаги.
  • RequesterUserId/AssigneeUserId/TicketId/CaseId в labels не выносятся (unbounded); доступны только как correlation в логах/трейсах для drill-down.
  • Внутренние заметки (Visibility=Internal) не проецируются на борд; screenshots для инцидентов маскируют tenantId и любые id в аннотациях.

Проверка

ПроверкаОжидаемый Результат
Empty stateПри отсутствии трафика панели показывают 0/нет данных без ошибок запроса.
Tenant filterДанные относятся только к TenantId = PIN CompanyId (single-tenant санити).
Alert linksКаждый alert ведёт на действующий (планируемый greenfield) runbook.
Time rangeПанели корректны на 15m (инцидент) и 7d (тренды приёма/SLA/арбитража).
SLO-панельcommand-latency/list-search-latency показывают пороговые линии 500 мс / 1 с.

Топология сигналов

Диагностика По Сочетаниям Сигналов (triage)

Панели читаются вместе: одна и та же деградация проявляется в нескольких сигналах, а их сочетание локализует корень и ведёт к нужному runbook.

Наблюдаемое сочетаниеВероятный кореньБизнес-эффектRunbook
outbox-lag растёт ∧ identity-consumer-lag растёт одновременноKafka/брокер недоступен или деградирует (общая шина)И исходящие pin.support.*, и синк заявителя отстают; уведомления/реплика eventual, команды работаютstuck-support-outbox
outbox-lag растёт, а identity-consumer-lag в нормеЗастрял диспетчер outbox support (не общий брокер)Уведомления по тикетам/арбитражу запаздывают; входящий синк не затронутstuck-support-outbox
consumer-dlq > 0 ∧ reason=unknown_versionРассинхрон контракта pin.identity.user-upsertedЧасть событий в DLQ, реплика ФИО/телефона заявителя устареваетreplay-identity-dlq
consumer-dlq > 0 ∧ reason=handler_error (напр. невалидный телефон)Аномалия данных producer-а identityОтдельные карточки заявителей не обновляютсяreplay-identity-dlq
sla-worker-cycle > 60 с ИЛИ нет цикла 5 мин ∧ sla-breaches не растётWorker ticket-sla-monitor не крутится/тормозитПросрочки первого ответа/решения детектятся с опозданием, эскалации супервизору запаздываютsla-worker-stalled
sla-breaches растёт ∧ queue-depth растёт ∧ command-latency в нормеНехватка операторов / всплеск приёма (не техсбой)Реальная деградация SLA поддержки; нужна балансировка нагрузкиqueue-backlog / sla-breach
command-latency p95 > 500 мс ∧ list-search-latency p95 > 1 с одновременноPostgreSQL/инфраструктура под нагрузкойЗамедлены и команды, и списки/поискcommand-latency

Ограничения И Допущения

  • Метрики status/queue/arbitrage/outbox — PostgreSQL-gauges через периодический scrape (задержка ≤ интервала scrape); мгновенные всплески между scrape-ами не видны — источник истины остаётся в БД.
  • support_tickets_sla_breached обновляется циклом ticket-sla-monitor (1 мин, ADR-0056): алерт сигнализирует накопленную просрочку с точностью цикла, не мгновенно.
  • Продуктовый разрез тематик/операторов (8.1/8.4) — вне борда: SQL-ручка get-support-dashboard; ClickHouse не используется (объём мал, ADR-0056).
  • Runbook-файлы — greenfield (пути целевые, по runbook-template).

Связанные Документы