Проблема
Стандартный мониторинг метрик и логов не выявляет аномалии на уровне цепочки вызовов микросервисов: задержки, потерянные трейсы, асинхронные ошибки, подозрительные паттерны (например, сканирование, скрытые каналы).

Причины
- Микросервисы генерируют распределённые транзакции, которые не видны в изоляции.
- Аномалии проявляются как отклонения в длительности и порядке спанов (span), частоте вызовов, кодах возврата, отсутствии или дублировании трейсов.
- Традиционные алерты по CPU/памяти не коррелируют с бизнес-логикой.

Решение

1. Инструментируйте код стандартными библиотеками OpenTelemetry (OTel).
- Пример для Java:
java
// Auto-instrumentation
OpenTelemetrySdk.builder().setTracerProvider(...).buildAndRegisterGlobal();

- Пример для Python (Flask):
python
from opentelemetry.instrumentation.flask import FlaskInstrumentor
FlaskInstrumentor().instrument_app(app)


2. Настройте сбор и визуализацию трейсов.
- Jaeger (рекомендуется) + Prometheus для метрик + Grafana для дашбордов.
- Конфигурация OTel exporter в Jaeger:
yaml
exporters:
jaeger:
endpoint: "http://jaeger-collector:14250"
tls:
insecure: true


3. Определите пороги аномалий на основе исторических данных (статистика p95, p99).
- В Grafana создайте панель с запросом к Jaeger:
promql
histogram_quantile(0.95, sum(rate(jaeger_span_duration_bucket{service="my-service"}[5m])) by (le))


4. Настройте алерты на аномалии:
- Задержки спанов > 3σ от среднего.
- Резкий рост количества ошибок (span status = ERROR).
- Отсутствие трейсов (падение rate спанов > 50% за минуту).
- Пример правила Prometheus AlertManager:
yaml
groups:
- name: traceanomalies
rules:
- alert: HighTraceLatency
expr: histogram_quantile(0.99, rate(...)) > 5
for: 2m


5. Примените ML-детекцию (опционально):
- Используйте библиотеку Prophet или Facebook Kats для прогноза baseline.
- Для подозрительных паттернов (например, вызовы одного endpoint с уникальными User-Agent) — добавьте log enrichment (через OTel span attributes) и ищите в Elasticsearch через Logstash.

6. Корреляция с логами и аудитом:
- Привяжите trace_id к логам (через OTel context).
- В Kibana создайте дашборд: `trace_id: ${trace_id}` → время выполнения, code, ошибки.

Ключевые команды для анализа (Jaeger API)
- Поиск аномально долгих трейсов за последний час:
bash
curl -G "http://jaeger-query:16686/api/traces" \
--data-urlencode "service=my-service" \
--data-urlencode "lookback=1h" \
--data-urlencode "limit=100" \
--data-urlencode "minDuration=5000ms"

- Получение всех трейсов с ошибками:
bash
curl -G "http://jaeger-query:16686/api/traces" \
--data-urlencode "service=my-service" \
--data-urlencode "tags={\"error\":\"true\"}"


Легальность: все методы применяются к собственным системам в рамках внутреннего пентеста и мониторинга ИБ, соответствуют Федеральному закону № 152-ФЗ о персональных данных при обезличивании идентификаторов.