Краткий обзор
- Этот репозиторий содержит набор небольших сервисов для отработки корелляции логов и нагрузочного эмулятора:
- go-service — простая Go служба с логированием в plain-text (stdout/stderr).
- python-service — FastAPI эмулятор/сервис с тем же текстовым форматом логов.
- java-service — Spring Boot сервис (Java 21) с фильтром логирования.
- emulator — оркестратор + генератор нагрузки + UI (one-shot + continuous generator).
- Все сервисы логируют одну INFO-строку на входящий запрос; при 5xx также печатается ERROR в stderr. Формат логов и правила описаны в
logging.md
и в соответствующих S*_SPEC.md.
Структура проекта (важные пути)
- go-service/ — сервис S1 (Go)
- python-service/ — сервис S2 (FastAPI)
- java-service/ — сервис S3 (Spring Boot)
- emulator-service/ — сервис эмулятор + UI + генератор
- docker-compose.yml — локальный стек и настройки логирования/healthchecks
- logging.md, S2_SPEC.md, S3_SPEC.md, EMULATOR_SPEC.md — спецификации
Подготовка (локально, требуется Docker и локальные образы)
- Убедитесь, что в локальном докере есть базовые образы (offline build): golang, python:3.11-slim, maven/eclipse-temurin:21, eclipse-temurin:21-jdk.
- Сборка и поднятие стека: docker compose up -d --build
- Остановить и вывести: docker compose down
Сервисы и доступ
- Доступ с хоста только к эмулятору:
- UI: http://localhost:8083/ (emulator)
- /v1/health — проверка здоровья каждого сервиса локально
- /v1/run — one-shot orchestration (emulator)
- /v1/config, /v1/control, /v1/stats — управление генератором нагрузки
- S1–S3 доступны внутри docker-сети
backplane
(не опубликованы наружу).
Логирование и ротация
- Формат логов: plain-text одна строка в порядке: ts level service method path status latency_ms req_id [user_id] [action] msg=... (подробности в logging.md)
- Docker Compose настраивает driver:
json-file
с:- max-size: 10m
- max-file: 3 Проверка: docker inspect | jq '.[0].HostConfig.LogConfig'
Healthchecks
- Каждый сервис имеет HEALTHCHECK внутри контейнера:
- go-service: /hc бинарник, вызывающий local /v1/health
- python-service: python stdlib проверка
- java-service: jshell/Java HTTP check
- emulator: internal health endpoint
- docker compose показывает STATE=healthy после успешной проверки.
Emulator: UI и генератор
- UI доступен на
/
:- Конфиг генератора (users, rps, randomness, actions, targets, jitter_ms, payload_bytes)
- Управление: Apply, Start, Stop, Reset Stats
- One‑shot секция: выбрать targets, mode (sequential/parallel), action, delay_ms, payload JSON или автоген payload_bytes, Stop on error; кнопка Send once вызывает POST /v1/run и отображает результаты в таблице.
- Фоновый генератор:
- Пул из
users
горутин, целевой суммарный RPS =rps
. - Интервалы: смешение fixed/exponential по параметру randomness, плюс jitter_ms.
- Для каждого запроса: новый X-Request-ID (UUIDv4), тело {user_id:"emulator", action, payload, delay_ms?}.
- Статистика в памяти: sent, ok, errors_by_code, per_service с latency (avg/p50/p95).
- Контролируется через /v1/config и /v1/control.
- Пул из
Примеры запросов (smoke)
- Health: curl -s http://localhost:8083/v1/health | jq .
- One-shot через UI или curl: curl -s -X POST http://localhost:8083/v1/run -H "Content-Type: application/json" -d '{"mode":"parallel","steps":["go","python"],"payload":{"k":"v"}}' | jq .
- Управление генератором: curl -X POST http://localhost:8083/v1/control -H "Content-Type: application/json" -d '{"state":"start"}' curl -X POST http://localhost:8083/v1/config -H "Content-Type: application/json" -d '{"users":2,"rps":10,"randomness":0.5,"actions":["ping"],"targets":["go-service","python-service"],"jitter_ms":50,"payload_bytes":128}'
DoD (быстрая проверка)
- docker compose up -d --build; убедиться, что все контейнеры healthy.
- UI доступен по http://localhost:8083/.
- One-shot: отправка по выбранным сервисам → ответ содержит request_id и results для каждого сервиса.
- Генератор: Start → через 10-15s stats.sent_requests > 0, per_service.sent > 0.
- Логи:
- Для каждого входящего запроса к эмулятору — ровно одна INFO строка (stdout).
- Для 5xx ответов — дополнительная ERROR строка в stderr.
- S1–S3 логируют свои строки с тем же req_id (корреляция).
Оффлайн/CI заметки
- При отсутствии доступа к интернету необходимо заранее загрузить базовые образы (golang, python, maven/eclipse-temurin, eclipse-temurin:jdk).
- Для сборки Java образов требуется локальный maven cache / артефакты.
Полезные файлы
- logging.md — правила и шаблон строк логов.
- S2_SPEC.md, S3_SPEC.md, EMULATOR_SPEC.md — детальные спецификации поведения сервисов.
Контакты / дальнейшие шаги
- Тесты нагрузкой и наблюдение p95/p50 — добавить скрипты E2E, экспорт логов для анализа.
- При необходимости расширить UI (grafana, prometheus) — сохранить совместимость формата логов.
Конец README.