Документация / Руководство по установке / Эксплуатация
Мониторинг и журналы
Компоненты SecurityFlow пишут журналы в stdout и stderr контейнеров. Состояние проверяется HTTP-эндпоинтами, счётчиками воркеров и длиной очередей RabbitMQ. Метрик в формате Prometheus компоненты не отдают: для графиков используйте метрики Kubernetes и брокеров.
Проверки здоровья
| Компонент | Запрос | Доступ | Ответ | Что проверяет |
|---|---|---|---|---|
| Core: интерфейс и API | GET / на порту 8000 |
без авторизации и проверки лицензии | 200, пустое тело |
процесс отвечает. Через фронт не проксируется |
| Core через фронт | GET / |
без авторизации | 200 |
фронт и процесс интерфейса и API |
| Core → Radar | GET / |
Authorization: Token <API-токен> пользователя Core; лицензия, которая открывает Radar |
{"is_ |
Core достаёт до Radar, токен Radar верный |
| Core: задачи Celery | GET / |
право на глобальные настройки | список задач: name, id, progress, time |
что сейчас выполняют воркеры Core |
| Radar | GET / |
без авторизации | {"is_ |
Radar back отвечает |
| Radar: токен | GET / |
Authorization: Bearer <токен Radar> |
{"is_ |
токен верный. Этот же запрос делает воркер перед каждым пайплайном |
| Radar: воркеры | GET /, GET / |
Bearer | счётчики воркеров и потоков | сколько воркеров подключено и сколько занято |
| Radar: пайплайны | GET / |
Bearer | число пайплайнов по статусам | очередь и зависшие пайплайны |
Пример ответа GET /api/v1/workers/total/:
{
"pipeline_workers_total": 8,
"pipeline_threads_total": 24,
"utils_workers_total": 8,
"utils_threads_total": 16
}
pipeline_workers_total - подключённые пайплайн-воркеры, по одному на под. pipeline_threads_total - их текущие процессы: пайплайн-воркер запускается с --autoscale 1,MAX_SCALEWORKERS_COUNT, поэтому в простое процессов меньше, чем слотов. GET /api/v1/workers/active/ возвращает pipeline_workers_active, pipeline_threads_active, utils_workers_active, utils_threads_active - сколько из них сейчас заняты.
Проверка токена изнутри пода воркера:
kubectl -n securityflow-radar exec <под воркера> -c <пайплайн-воркер> -- python3 -c \
"import os,requests;print(requests.get(os.environ.get('AUDITOR_HOST','http://auditor:8090')+'/api/v1/auth-health-check/',headers={'Authorization':'Bearer '+os.environ['ACCESS_TOKEN']},timeout=10).status_code)"
Ожидаемый результат: 200.
Пробы Kubernetes
Пробы компонентов в Kubernetes:
| Компонент | Проба | Примечание |
|---|---|---|
| Интерфейс и API Core | HTTP GET /healthcheck/, порт 8000 |
если ALLOWED_HOSTS ограничен, проба должна передавать разрешённый заголовок Host |
| Приём отчётов Core | TCP, порт 8001 | у процесса один эндпоинт - POST /api/v1/scan/import/ |
| Фронт Core, фронт Radar | HTTP GET /, порты 80 и 8080 |
|
| Radar back | HTTP GET /api/v1/health-check/, порт 8090 |
|
| Процессы Celery: worker и планировщик Core, разбор отчётов, помощники, воркеры Radar | HTTP-проверки нет | следите за перезапусками подов, счётчиками воркеров и очередями |
Воркер Radar, запущенный общим скриптом entrypoint.sh, завершается с кодом 1, если остановился любой из его процессов: dockerd или один из процессов Celery. Kubernetes перезапускает контейнер.
Состояние очередей
Длина очередей показывает, справляются ли воркеры.
kubectl -n securityflow-core exec <под RabbitMQ Core> -- rabbitmqctl list_queues name messages consumers
kubectl -n securityflow-radar exec <под RabbitMQ Radar> -- rabbitmqctl list_queues name messages consumers
| Очередь | Брокер | Кто разбирает | Что значит рост |
|---|---|---|---|
appsecpanel_worker |
Core | worker Core | не хватает реплик worker или он остановлен |
importer_service |
Core | разбор отчётов | не хватает слотов разбора - см. Расчёт ресурсов |
db_helper_* |
Core | помощник БД | помощник БД перегружен или остановлен |
jira_helper_service |
Core | Jira-помощник | Jira недоступна или отвечает медленно |
pipeline_queue |
Radar | пайплайн-воркеры | не хватает слотов сканирования |
utils_queue |
Radar | utils-воркеры | utils-воркеры остановлены |
Очередь с сообщениями и consumers 0 - процесс, который её разбирает, не работает.
В интерфейсе:
- Core: "Глобальные настройки" → "Активные задачи" - задачи Celery, которые выполняются сейчас.
- Radar: "Настройки" → "Воркеры"; на странице "Пайплайны" - "Активные Воркеры:" и "Активные Потоки:".
Журналы
Журналы контейнеров читайте через kubectl logs. При перезапуске пода журнал теряется - для хранения подключите сборщик журналов кластера.
kubectl -n securityflow-core logs deployment/<компонент> --since=1h
kubectl -n securityflow-radar logs <под воркера> -c <контейнер> --since=1h
| Компонент | Что в журнале | На что смотреть |
|---|---|---|
| Job подготовки базы Core | миграции, создание администратора, имена сканеров | строки [admin] и [scanners]. Если пароль администратора сгенерирован, он есть в этом журнале - ограничьте доступ к нему |
| Интерфейс и API Core | gunicorn, ошибки запросов | ошибки проверки лицензии: Signature verification failed., License has expired., Unable to decode the license. |
| Worker Core | задачи Celery | ошибки обращения к Radar при запуске аудита, сверка лицензии |
| Фронт Core | доступ nginx: $remote_addr "$request" $status $body_bytes_sent rt=... urt=... |
rt - полное время ответа, urt - время бэкенда: видно, что тормозит |
| Radar back | uvicorn, корневой журнал на уровне DEBUG | Running Alembic migrations..., Starting Uvicorn server..., ACCESS_TOKEN is not set. Skipping periodic curl. |
| Пайплайн-воркер | loguru | Worker start pipeline with uuid: ..., Aborting the pipeline ..., Pipeline have been finished |
| Utils-воркер | loguru | Cleaner will delete N old volumes out of M total. - ежедневная очистка |
Ошибки запуска сканов из Core
Если Core не смог передать задание в Radar, он пишет ошибку в журнал worker, а аудит в интерфейсе остаётся без находок. Если аудит пустой, проверьте журнал worker Core и список пайплайнов в Radar.
Фоновые проверки Radar back
Проверку таймаутов и сбор статистики Radar back запускает при старте, только если задан ACCESS_TOKEN. Если токен в переменной не принят Radar, эти циклы останавливаются, а API продолжает работать. Признак - пайплайны не закрываются по таймауту. Исправьте ACCESS_TOKEN и перезапустите Radar back.
Сверка лицензии
Worker Core пишет результат сверки с сервером лицензий:
| Сообщение | Что значит |
|---|---|
Лицензия: сервер недоступен (...), решение не меняем |
нет связи с сервером лицензий, лицензия действует |
Лицензия: сервер ответил <код>, вердикта нет, решение не меняем |
ответ без вердикта, например 403 белого списка или 5xx; лицензия действует |
Лицензия: ответ сервера не JSON, решение не меняем |
неожиданный ответ, лицензия действует |
Лицензия снята: <причина> |
сервер ответил, что лицензия недействительна: отозвана, истекла или не найдена. Core покажет экран активации |
Подробнее - Лицензирование.
Журналы джоб Radar
- Пока джоба идёт, её лог копится в Redis. После завершения лог переносится в базу Radar.
- В интерфейсе: "Пайплайны" → "Логи". Поиск пайплайнов по тексту логов - поле "Поиск пайплайнов по логам джоб..".
- API:
GET /api/v1/jobs-instances/<id>/logs/. - В начале лога печатаются видимые переменные джобы. Значения скрытых переменных заменяются на
***MASKED***. - Логи удаляются вместе с пайплайном - по умолчанию через сутки. Срок задаётся в настройке очистки, см. Очистка Radar.
Фоновые задачи
| Компонент | Задача | Расписание | Что делает |
|---|---|---|---|
| Планировщик Core | сверка лицензии | раз в LICENSE_CHECK_INTERVAL_SECONDS, по умолчанию 300 с; дополнительно от запросов пользователей, не чаще раза в 60 с на процесс |
спрашивает сервер лицензий, действует ли лицензия |
| Планировщик Core | пересчёт метрик | по расписанию кэша метрик, если он включён | пересчитывает метрики продуктов и ассетов |
| Планировщик Core | расписания аудитов | по расписаниям в "Radar" → "Расписание" | запускает аудиты |
| Планировщик Core | расписания уведомлений | по расписаниям уведомлений | отправляет уведомления по сохранённому фильтру |
| Планировщик Core | сканирование реестров | по расписанию интеграции с реестром | ищет новые теги образов и запускает их сканирование |
| Планировщик Core | celery.backend_cleanup |
штатное расписание Celery | очищает результаты задач Celery |
| Помощник БД | автовалидатор, дедупликатор, расчёт CVSS | постоянный цикл с паузой из настроек, не меньше 40 с | применяют правила к находкам |
| Radar back | проверка таймаутов | раз в 10 с, если задан ACCESS_TOKEN |
закрывает джобы и пайплайны по таймауту |
| Radar back | статистика | раз в час, если задан ACCESS_TOKEN |
минимум, максимум и среднее время джоб за 24 часа; из него считается "Ожидаемое" время |
| Планировщик Radar | очистка | ежедневно в 00:00 UTC по расписанию Celery | удаляет старые тома Docker и пайплайны - см. Очистка Radar |
Порядок полей в расписаниях Core
Выражение расписания в API Core (crontab_expr) - 5 полей в порядке минута час день_недели день_месяца месяц. В обычном cron третье поле - день месяца. Например, 0 3 1 * * в Core - каждый понедельник в 03:00, время по UTC.
Метрики
Компоненты SecurityFlow не отдают метрики Prometheus. Для мониторинга используйте:
- эндпоинты из раздела Проверки здоровья - как внешние HTTP-проверки;
- счётчики
GET /api/v1/workers/total/иGET /api/v1/workers/active/- загрузка слотов сканирования; - длину очередей RabbitMQ;
- метрики Kubernetes: перезапуски подов, CPU и память против limit, заполнение дисков узлов scan;
- статистику длительности джоб Radar:
GET /api/v1/statistics/иGET /api/v1/statistics/all/?size=10с токеном Radar.