docs(proof): add operational evidence profile
This commit is contained in:
@@ -53,6 +53,7 @@ runtime, OCR/content-analysis, 1C/AI/ETL integration и MCP/dev helpers. Эти
|
||||
- [Установка для эксперта](INSTALL_FOR_EXPERT_RU.md)
|
||||
- [Сценарий экспертной проверки](docs/EXPERT_TEST_SCENARIO_RU.md)
|
||||
- [Release manifest 2026-06](docs/RELEASE_MANIFEST_2026-06.md)
|
||||
- [Эксплуатационный профиль](docs/OPERATIONAL_PROOF_PROFILE_RU.md)
|
||||
- [Сторонние компоненты](THIRD_PARTY_COMPONENTS.md)
|
||||
- [Сторонние лицензии](THIRD_PARTY_LICENSES_RU.md)
|
||||
- [Архитектура](docs/ARCHITECTURE_RU.md)
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
-- Operational proof snapshot for DetMir/AWatch-rus.
|
||||
-- Output is aggregate-only: no users, company names, hosts, domains, paths,
|
||||
-- evidence content, tokens, passwords or raw incident payloads.
|
||||
|
||||
SELECT
|
||||
database,
|
||||
count() AS tables_total,
|
||||
sum(total_rows) AS rows_total,
|
||||
formatReadableSize(sum(total_bytes)) AS compressed_size,
|
||||
formatReadableSize(sum(total_bytes_uncompressed)) AS uncompressed_size
|
||||
FROM system.tables
|
||||
WHERE database = 'analytics_1c'
|
||||
AND engine NOT IN ('View')
|
||||
GROUP BY database;
|
||||
|
||||
SELECT
|
||||
version() AS clickhouse_version,
|
||||
uptime() AS uptime_seconds,
|
||||
(SELECT count() FROM system.tables WHERE database = 'analytics_1c') AS analytics_objects,
|
||||
formatReadableSize((
|
||||
SELECT sum(total_bytes)
|
||||
FROM system.tables
|
||||
WHERE database = 'analytics_1c'
|
||||
AND engine NOT IN ('View')
|
||||
)) AS analytics_compressed_size;
|
||||
|
||||
SELECT
|
||||
count() AS queries_logged,
|
||||
min(event_time) AS first_query,
|
||||
max(event_time) AS last_query,
|
||||
quantile(0.5)(query_duration_ms) AS p50_ms,
|
||||
quantile(0.95)(query_duration_ms) AS p95_ms,
|
||||
max(query_duration_ms) AS max_ms
|
||||
FROM system.query_log
|
||||
WHERE event_time >= now() - INTERVAL 7 DAY
|
||||
AND type = 'QueryFinish'
|
||||
AND current_database = 'analytics_1c';
|
||||
|
||||
SELECT 'business_events' AS table_name, count() AS rows, min(ts) AS min_ts, max(ts) AS max_ts
|
||||
FROM analytics_1c.business_events
|
||||
UNION ALL
|
||||
SELECT 'document_change_events', count(), min(ts), max(ts)
|
||||
FROM analytics_1c.document_change_events
|
||||
UNION ALL
|
||||
SELECT 'detections', count(), min(ts), max(ts)
|
||||
FROM analytics_1c.detections
|
||||
UNION ALL
|
||||
SELECT 'cases', count(), min(opened_at), max(opened_at)
|
||||
FROM analytics_1c.cases
|
||||
UNION ALL
|
||||
SELECT 'company_health_signals', count(), min(generated_at), max(generated_at)
|
||||
FROM analytics_1c.company_health_signals
|
||||
UNION ALL
|
||||
SELECT 'company_forecasts', count(), min(generated_at), max(generated_at)
|
||||
FROM analytics_1c.company_forecasts
|
||||
ORDER BY table_name;
|
||||
|
||||
SELECT
|
||||
countDistinct(infobase) AS infobases,
|
||||
countDistinct(user) AS users_in_reglog,
|
||||
countDistinct(host) AS hosts_in_reglog,
|
||||
count() AS reglog_events,
|
||||
min(ts) AS min_ts,
|
||||
max(ts) AS max_ts
|
||||
FROM analytics_1c.reglog_events;
|
||||
|
||||
SELECT
|
||||
countDistinct(infobase) AS infobases,
|
||||
countDistinct(company_entity_key) AS company_entities,
|
||||
countDistinct(document_id) AS documents,
|
||||
countDistinct(user) AS users,
|
||||
count() AS business_events,
|
||||
min(ts) AS min_ts,
|
||||
max(ts) AS max_ts
|
||||
FROM analytics_1c.business_events;
|
||||
|
||||
SELECT
|
||||
severity,
|
||||
status,
|
||||
count() AS detections
|
||||
FROM analytics_1c.detections
|
||||
GROUP BY severity, status
|
||||
ORDER BY detections DESC;
|
||||
|
||||
SELECT
|
||||
severity,
|
||||
status,
|
||||
count() AS cases
|
||||
FROM analytics_1c.cases
|
||||
GROUP BY severity, status
|
||||
ORDER BY cases DESC;
|
||||
|
||||
SELECT
|
||||
countDistinct(company_key) AS registry_companies,
|
||||
countIf(key_contour = 1) AS key_contour_rows,
|
||||
countDistinct(assignee_name) AS assignees,
|
||||
max(ts) AS last_snapshot
|
||||
FROM analytics_1c.company_registry;
|
||||
@@ -0,0 +1,148 @@
|
||||
# Эксплуатационный профиль DetMir
|
||||
|
||||
Документ фиксирует не функциональные обещания, а проверяемые эксплуатационные
|
||||
показатели. Это материал для коммерческих презентаций, пилотов и экспертных
|
||||
обсуждений: сколько данных система уже обрабатывает, как быстро отвечает
|
||||
аналитический слой, какие классы инцидентов/сигналов фиксируются и где лежат
|
||||
проверочные артефакты.
|
||||
|
||||
Снимок ниже обезличен: не раскрываются имена пользователей, компаний, хостов,
|
||||
пути, домены, токены, evidence-файлы и содержимое инцидентов.
|
||||
|
||||
## Снимок 2026-06-03
|
||||
|
||||
Источник: агрегированные запросы ClickHouse `analytics_1c`, системный
|
||||
`query_log`, runbook DetMir/AWatch-rus.
|
||||
|
||||
### Масштаб данных
|
||||
|
||||
| Метрика | Значение |
|
||||
|---|---:|
|
||||
| ClickHouse objects в `analytics_1c` | 46 |
|
||||
| MergeTree tables | 24 |
|
||||
| Всего строк в MergeTree tables | 764 098 |
|
||||
| Compressed size | 12.04 MiB |
|
||||
| Uncompressed size | 252.31 MiB |
|
||||
| ClickHouse uptime на момент снимка | 782 640 секунд |
|
||||
|
||||
### Нагрузка ClickHouse за 7 дней
|
||||
|
||||
| Метрика | Значение |
|
||||
|---|---:|
|
||||
| Завершенных query в `analytics_1c` | 60 588 |
|
||||
| P50 query duration | 12 ms |
|
||||
| P95 query duration | 208.45 ms |
|
||||
| Max query duration | 2 039 ms |
|
||||
| Окно query log | 2026-05-27 07:12:59 -> 2026-06-03 07:12:42 |
|
||||
|
||||
Практический вывод: аналитический слой уже выдерживает десятки тысяч запросов
|
||||
за неделю с медианной задержкой около десятков миллисекунд.
|
||||
|
||||
### Объем бизнес/аудит-событий
|
||||
|
||||
| Поток | Строк | Диапазон данных |
|
||||
|---|---:|---|
|
||||
| `reglog_events` | 8 070 | 2026-05-04 -> 2026-06-03 |
|
||||
| `business_events` | 4 265 | 2026-05-22 -> 2026-06-03 |
|
||||
| `document_change_events` | 8 280 | 2026-05-22 -> 2026-06-03 |
|
||||
| `company_health_signals` | 156 189 | 2026-05-22 -> 2026-06-03 |
|
||||
| `company_forecasts` | 194 228 | 2026-05-22 -> 2026-06-03 |
|
||||
| `detections` | 162 966 | 2026-05-15 -> 2026-06-03 |
|
||||
| `cases` | 162 966 | 2026-05-15 -> 2026-06-03 |
|
||||
|
||||
Важно для продаж: `detections` и `cases` в этом срезе являются
|
||||
автоматически сформированным detection/case-oriented потоком. Для внешней
|
||||
демонстрации их нужно называть именно так: `derived detections/cases`, а не
|
||||
ручные подтвержденные инциденты.
|
||||
|
||||
### Покрытие источников
|
||||
|
||||
| Метрика | Значение |
|
||||
|---|---:|
|
||||
| Учетных информационных баз в `reglog_events` | 43 |
|
||||
| Уникальных пользователей в `reglog_events` | 7 |
|
||||
| Уникальных hosts в `reglog_events` | 1 |
|
||||
| Учетных информационных баз в `business_events` | 43 |
|
||||
| Company/entity keys в `business_events` | 44 |
|
||||
| Уникальных документов в `business_events` | 1 838 |
|
||||
| Пользователей в `business_events` | 7 |
|
||||
| Registry companies | 47 |
|
||||
| Registry assignees | 7 |
|
||||
|
||||
### Severity distribution
|
||||
|
||||
`detections`:
|
||||
|
||||
| Severity | Status | Count |
|
||||
|---|---|---:|
|
||||
| critical | open | 107 359 |
|
||||
| high | open | 45 784 |
|
||||
| medium | open | 9 823 |
|
||||
|
||||
`cases`:
|
||||
|
||||
| Severity | Status | Count |
|
||||
|---|---|---:|
|
||||
| critical | open | 107 359 |
|
||||
| high | open | 45 784 |
|
||||
| medium | open | 9 823 |
|
||||
|
||||
Коммерчески корректная формулировка:
|
||||
|
||||
> DetMir уже формирует case-oriented поток технических сигналов и
|
||||
> расследовательских карточек по правилам, severity и статусам. Для пилота с
|
||||
> заказчиком отдельно настраивается политика дедупликации, подтверждения и
|
||||
> закрытия cases под регламент заказчика.
|
||||
|
||||
## ActivityWatch/AW-RUS эксплуатационные факты
|
||||
|
||||
Из runbook DetMir/AWatch-rus:
|
||||
|
||||
- зафиксирован и устранен uncontrolled growth в `aw-session-events`;
|
||||
- основной источник роста давал около `6.9M` process-level rows;
|
||||
- controlled trim удалил `6 906 190` шумных `process_start/process_stop`
|
||||
событий;
|
||||
- logon/session evidence сохранены: после trim осталось `174` logon-события;
|
||||
- AW SQLite DB был уменьшен примерно с `6.8G` до `350M`;
|
||||
- integrity check до и после maintenance: `ok`;
|
||||
- DB health guard после стабилизации: DB около `352MiB`, WAL около `4MiB`,
|
||||
recent process events `0`, latest event type `logon`, health OK.
|
||||
|
||||
Коммерческий вывод:
|
||||
|
||||
> Система не только собирает телеметрию, но и уже прошла реальную эксплуатационную
|
||||
> стабилизацию: обнаружен источник взрывного роста событий, введены безопасный
|
||||
> trim, SQLite integrity gate, DB health guard и weekly maintenance.
|
||||
|
||||
## Что показывать заказчику
|
||||
|
||||
Лучше работают не абстрактные описания, а 5 чисел:
|
||||
|
||||
1. Объем обработанных строк в ClickHouse.
|
||||
2. Число источников/пользователей/информационных баз.
|
||||
3. P50/P95 задержки аналитических запросов.
|
||||
4. Число сформированных detections/cases по severity.
|
||||
5. Uptime и история устраненных эксплуатационных проблем.
|
||||
|
||||
## Что не говорить без уточнения
|
||||
|
||||
- Не называть auto-generated `cases` подтвержденными ИБ-инцидентами без ручной
|
||||
валидации.
|
||||
- Не раскрывать реальные имена пользователей, компаний, hosts, paths, domains
|
||||
и evidence.
|
||||
- Не обещать сертифицированную DLP/SIEM/EDR/СЗИ.
|
||||
- Не использовать абсолютные цифры без даты снимка и источника.
|
||||
|
||||
## Как обновлять снимок
|
||||
|
||||
Использовать SQL pack:
|
||||
|
||||
- `clickhouse-1c/ops/operational_proof_snapshot.sql`
|
||||
|
||||
Порядок:
|
||||
|
||||
1. Выполнить SQL pack на актуальном ClickHouse.
|
||||
2. Сохранить агрегированный вывод в приватный customer/proof report.
|
||||
3. Для публичного repo переносить только обезличенные агрегаты.
|
||||
4. Если цифры используются в коммерческой презентации, рядом указывать дату
|
||||
снимка и scope.
|
||||
Reference in New Issue
Block a user