Реализованы сервисы ВМ2 - проверка сообщений и синхронизация с Б24 (деплой еще без перевода в боевой режим)

This commit is contained in:
mi
2026-08-13 18:52:42 +03:00
parent 5100ba9fc3
commit 99605b1c77
144 changed files with 15295 additions and 1120 deletions
+19 -10
View File
@@ -1,6 +1,6 @@
# module-09. Наблюдаемость production-like контура
> Статус: целевая спецификация наблюдаемости MVP на одной VM.
> Статус: целевая спецификация наблюдаемости MVP для ВМ1/ВМ2 и отдельного private SigNoz.
> Источники: [`README.md`](README.md), [`arch-00-glossary.md`](arch-00-glossary.md), [`arch-01-system-architecture.md`](arch-01-system-architecture.md), [`arch-02-api-contracts.md`](arch-02-api-contracts.md), [`arch-03-docker-compose-blueprint.md`](arch-03-docker-compose-blueprint.md), [`arch-04-settings-and-content.md`](arch-04-settings-and-content.md), [`arch-05-agent-development-process.md`](arch-05-agent-development-process.md), [`module-01-api-backend.md`](module-01-api-backend.md)[`module-08-keycloak.md`](module-08-keycloak.md).
## 1. Цели и границы
@@ -20,11 +20,11 @@ Telemetry не является источником бизнес-истины
### 2.1. Обязательный минимум в основном Compose
Архитектура явно требует только `otel-collector`. Поэтому **основной production-like Compose обязан содержать Collector, но не обязан размещать Prometheus/Grafana/Loki/Tempo на той же VM**.
Каждый root Compose (ВМ1 и ВМ2) обязан содержать локальный `otel-collector`. Prometheus/Grafana/Loki/Tempo не обязаны размещаться на application VM.
Предпочтительный operable-вариант после выбора backend:
1. приложения экспортируют OTLP gRPC в `otel-collector:4317`;
1. приложения на каждой VM экспортируют OTLP gRPC только в свой local `otel-collector:4317`;
2. Collector отправляет telemetry в выбранный удалённый управляемый OTLP backend провайдера;
3. JSON stdout остаётся аварийным локальным журналом Docker с rotation;
4. пока удалённый backend не выбран, допустим архитектурный минимум из arch-03: bounded JSON stdout/platform logs и Collector `debug` exporter с sampling в acceptance; такой режим не считается полноценным production-хранением и не закрывает alerting/SLO.
@@ -309,6 +309,7 @@ CPU, load, memory/swap, disk usage/inodes/IO, network, container restarts/OOM, D
### Message Safety
- checks/verdicts по `allow|deny|pending|error`;
- `processing_mode`, active/used `config_version`, config activation result, `message_safety_mock_enabled` и forced outcomes по `text|file`/`allow|deny`;
- poll duration/count buckets, timeout и recovery backlog age;
- stub mode info и terminal `400` отдельно, пока действует test-only контракт;
- cache hit, Redis latency, task expired/not-found.
@@ -342,11 +343,11 @@ CPU, load, memory/swap, disk usage/inodes/IO, network, container restarts/OOM, D
## 10. Dashboards
1. **Executive/SLO**: availability, error budget burn, p50/p95/p99, message delivery, auth, active incidents.
2. **nginx edge**: RPS, 4xx/5xx, upstream latency/status, 429, WS, TLS, cache.
2. **nginx ingress по VM**: отдельные панели/filters ВМ1 и ВМ2; RPS, 4xx/5xx, upstream latency/status, 429, WS, TLS, cache, CRM webhook на ВМ2.
3. **api-backend**: routes, DB/Redis pools, JWKS, circuits, outbox/safety backlog, S3.
4. **message-safety**: verdicts, pending/poll, task TTL, Redis, distribution stub outcomes.
4. **message-safety**: capabilities, verdicts, `202` poll, PG queue age/leases/fencing, ClamAV/signature age, file/link cache и DNS dependency.
5. **bitrix-local-app**: install/OAuth, connector, outbound/inbox/DLQ, API/Bitrix latency.
6. **bitrix-sync**: mode, DB probe, last success/staleness; нельзя показывать CRM sync как рабочий в stub.
6. **bitrix-sync**: mode/readiness, queue depth/oldest age, workflow/command transitions, CRM batch latency/subcommand outcome, limiter/throttle, retry/DLQ, webhook/reconciliation lag, mapping invariants и business-alert SLA.
7. **Keycloak**: login/OTP/lockout, sessions/tokens, provider settings cache, JVM/DB.
8. **Redis**: memory/evictions/AOF/latency/clients/keyspace.
9. **PostgreSQL/S3**: provider metrics, storage, connections, backup/PITR, object errors.
@@ -386,12 +387,18 @@ CPU, load, memory/swap, disk usage/inodes/IO, network, container restarts/OOM, D
- TLS expiry <14 дней warning, <7 дней page;
- disk >85% warning, >92% page; OOM/restart loop;
- managed PG backup/PITR failure.
- Message Safety active config missing/invalid, referenced artifact unavailable или config refresh stale >5 с.
- `message_safety_mock_enabled=1` — active page/high-severity alert без auto-resolve по времени; закрывается только после возврата в standard.
- bitrix-sync invalid/revoked credential или обязательная configuration/grant missing;
- bitrix-sync technical DLQ >0, mapping invariant violation или worker/limiter heartbeat stale;
- bitrix-sync queue oldest age >30 с при healthy CRM либо sustained рост;
- Contact webhook/reconciliation cursor lag выше двух configured intervals.
### Ticket/warning alerts
- p95 regression 20% release-over-release;
- settings/JWKS cache stale;
- bitrix-sync stub probe stale >150s;
- bitrix-sync CRM last success stale, rate-limit errors выше baseline или business alert SLA overdue;
- OAuth expires <24h без успешного refresh;
- quarantine orphan growth;
- cardinality/ingest growth >2× baseline.
@@ -453,6 +460,8 @@ Legal retention/erasure имеет приоритет; изменение тре
- restart policy с backoff;
- приложения имеют bounded non-blocking OTLP exporter queue.
Collector существует отдельным экземпляром на ВМ1 и ВМ2. Каждый имеет собственный `otel-queue` volume/limits и экспортирует в private SigNoz `192.168.0.5:4317`; ВМ2 никогда не использует Docker hostname collector ВМ1. Telemetry outage/overflow fail-open для business и Safety readiness, но создаёт alert.
Доступ к Docker socket запрещён. Для container metrics используется безопасный exporter/hostmetrics, а не unrestricted socket mount.
## 15. Security
@@ -521,7 +530,7 @@ Legal retention/erasure имеет приоритет; изменение тре
## 17. Проверки и Definition of Done
- Collector config проходит validate и запускается в едином Compose;
- Collector config проходит validate и запускается в root Compose каждой VM;
- OTLP gRPC и HTTP принимают три сигнала;
- все сервисы имеют правильные resource attributes;
- request проходит nginx/API/Safety/Open Lines с одним `request_id` и связанным trace;
@@ -541,7 +550,7 @@ Legal retention/erasure имеет приоритет; изменение тре
### Решения
- O1: обязательный архитектурный минимум — Collector; выбран self-hosted SigNoz
- O1: обязательный архитектурный минимум — local Collector на каждой application VM; выбран self-hosted SigNoz
на отдельной VM `192.168.0.5`, доступный по приватному OTLP gRPC.
- O2: Prometheus/Grafana/Loki/Tempo — отдельный operable profile, не скрытая обязательная нагрузка основной VM.
- O3: JSON stdout — аварийный локальный buffer; audit App DB — durable.
@@ -562,7 +571,7 @@ Legal retention/erasure имеет приоритет; изменение тре
1. `arch-03` разрешает stdout/platform exporter как минимум, но production-like расследования и alerts без backend ограничены. Здесь remote OTLP backend рекомендован, но не объявлен выбранным: провайдер остаётся TBD.
2. `module-05` использует test-only terminal `400` и non-sticky verdict вместо canonical `403`/sticky production verdict. Dashboards обязаны маркировать сервис `stub`; production SLO Safety на нём недостоверен.
3. `module-07` — только DB connectivity stub, тогда как arch-01/02 описывают полноценную CRM sync. Dashboard не должен показывать queue/CRM SLI, которых нет.
3. `module-07` задаёт full sync target; до code/portal cutover dashboard обязан показывать `sync_disabled`, а не синтетический CRM success. Queue/CRM SLI включаются только после module-07 preflight.
4. Retention, RPO/RTO и production SLO открыты в module-01/04/06/08; значения этого документа являются initial ops policy, не закрывают legal/product TBD.
5. Observability env (`OTEL_REMOTE_*`, service names, sampling/queue limits)
добавлены в arch-04 и `.env.example`; sampling/queue limits уточняются после