Аудит и наблюдаемость

Наблюдаемость

Наблюдаемость шлюза: метрики Prometheus, готовые дашборды Grafana и alert-правила, экран Control Tower, мониторинг ошибок, техжурнал 1С и дрейф конфигураций.

Наблюдаемость шлюза собрана из трёх слоёв: метрики Prometheus с готовыми дашбордами Grafana, единый экран Control Tower в консоли и профильные разделы (ошибки, технологический журнал, дрейф конфигураций).

Метрики Prometheus

Endpoint /metrics отдаёт метрики Prometheus, в том числе счётчики:

  • mcp_ent_tool_executions_total{tool,status}: выполнение инструментов по имени и статусу;
  • mcp_ent_http_requests_total{method,path,status}: HTTP-запросы по методу, пути и статусу.

Дашборды Grafana и алерты

В поставке каталог monitoring/: три готовых дашборда Grafana (операционный обзор, безопасность и доступ, конвейер ревью) и 12 alert-правил Prometheus. Каждая панель и каждое правило опираются на реально существующие метрики mcp_ent_* бинарника; соответствие набору метрик закреплено контракт-тестом, поэтому переименованная или удалённая метрика ломает сборку, а не молча гасит панель. Источник данных подставляется переменной ${DS_PROMETHEUS}; секретов в JSON дашбордов нет.

Control Tower

Единый read-only экран руководителя /web/admin/overview собирает 9 плиток наблюдаемости: критичные ошибки за 24 часа, свежий аудит, состояние техжурнала, здоровье информационных баз, живость MCP-серверов, фоновые работники, состояние базы данных, лицензия и рабочие места, гейт ревью (проходимость запусков за 7 дней). Каждая плитка ведёт ссылкой в свой подробный раздел.

  • Плитка показывает ровно то, что пользователь и так видит в соответствующем разделе; доступ не расширяется. Без права плитка не появляется; плитка лицензии видна только владельцу, секреты лицензии в разметку не попадают.
  • Экран отказоустойчив: если источник недоступен, его плитка показывает «недоступно», а страница всё равно открывается. Данные собираются параллельно с общим лимитом времени.

Мониторинг ошибок

Раздел /web/admin/errors строится поверх записей об ошибках в журнале аудита: фильтруемый список, топ групп ошибок, тренд по дням, бейдж «Критических за 24ч» и поиск по correlation-ID.

Выгрузка ошибок: CSV и JSONL с UTF-8 BOM, нейтрализацией формульных инъекций, потолком 100 тысяч строк и лимитом 10 выгрузок в час на пользователя.

Для AI-клиентов есть read-only инструмент get_error_summary под правом просмотра аудита.

AI-триаж ошибок

По группе ошибок панель AI-триажа предлагает вероятную причину и специфичное для 1С предложение исправления, используя локальную (on-prem) LLM: данные не покидают контур. В запрос к модели уходят только поля из белого списка (бакетированные перечисления, коды и маскированная сигнатура); персональные данные, секреты, идентификаторы пользователей и IP-адреса в запрос не попадают.

Открытие страницы модель не вызывает (показывается только кэш); пересчёт запускается отдельной кнопкой с ограничением частоты. Функция выключена по умолчанию и включается переменной AI_TRIAGE_ENABLED.

Технологический журнал 1С

Раздел /web/admin/tech-journal принимает выгрузку технологического журнала, разбирает её по требованию и строит отчёт; отдельного хранилища для этого не требуется. Корневой каталог журналов задаётся конфигурацией DEVMCP_TECH_JOURNAL_ROOT. Распаковка загрузок защищена от path-traversal и архивных бомб.

Для AI-клиентов есть инструмент tj_analyze с действиями parse, perf, locks, errors и suggest_logcfg: он понимает форматы журналов 8.3 и 8.2, события СУБД (DBMSSQL, DBPOSTGRS, SDBL), блокировки (TLOCK, TTIMEOUT, TDEADLOCK) и исключения (EXCP), а также подсказывает настройку logcfg.

Дрейф конфигураций

Read-only раздел /web/admin/config-drift сравнивает настройки подключений баз (safe-режим, активность, аудит записи, квота, наличие учётных данных) с группировкой по средам и подсветкой отклонений от общего паттерна.

Секреты структурно не попадают на страницу: учётные данные показываются только как признак «задано или не задано», сами значения, адреса подключений и полные идентификаторы не проецируются в разметку. Ошибка чтения источника показывает «недоступно», а не ломает страницу.