Реализация логирования и мониторинга трафика через API Gateway
API Gateway — это единственная точка входа, через которую проходит весь трафик. Если там нет нормального логирования, вы слепой: непонятно, кто дёргает API, с каким latency, какие эндпоинты падают и почему. Настройка наблюдаемости на уровне gateway занимает меньше времени, чем потом разбираться с инцидентами вручную.
Что логировать
Минимальный набор полей на каждый запрос:
| Поле | Пример | Зачем |
|---|---|---|
request_id |
uuid4 |
Сквозная трассировка через сервисы |
consumer_id |
client_abc |
Кто делает запрос |
method + path |
GET /api/v2/orders |
Статистика по эндпоинтам |
status_code |
429 |
Мониторинг ошибок |
latency_ms |
143 |
Производительность |
upstream_latency_ms |
138 |
Где тратится время |
request_size |
1024 |
Аномалии в трафике |
response_size |
4096 |
— |
ip |
1.2.3.4 |
Безопасность |
Тело запроса логировать нельзя по умолчанию — там могут быть пароли, токены, PAN-данные. Отдельный флаг на уровне роута для дебаг-режима.
Настройка в Kong Gateway
Kong — наиболее распространённый self-hosted gateway. Логирование через плагин http-log:
plugins:
- name: http-log
config:
http_endpoint: http://logstash:5044/kong
method: POST
timeout: 1000
keepalive: 1000
flush_timeout: 2
retry_count: 10
queue:
max_batch_size: 200
max_coalescing_delay: 1
max_entries: 10000
Для Prometheus-метрик — отдельный плагин:
plugins:
- name: prometheus
config:
per_consumer: true
status_code_metrics: true
latency_metrics: true
bandwidth_metrics: true
upstream_health_metrics: true
После этого /metrics на Kong Manager отдаёт все метрики в формате Prometheus. Scrape-интервал: 15 секунд.
Настройка в AWS API Gateway
В AWS логирование настраивается на уровне Stage через CloudWatch:
{
"loggingLevel": "INFO",
"dataTraceEnabled": false,
"metricsEnabled": true,
"accessLogDestinationArn": "arn:aws:logs:us-east-1:123456789:log-group:api-gateway-access",
"accessLogFormat": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"caller\":\"$context.identity.caller\",\"user\":\"$context.identity.user\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\",\"integrationLatency\":\"$context.integrationLatency\",\"responseLatency\":\"$context.responseLatency\"}"
}
dataTraceEnabled: false — никогда не включать в production, пишет тела запросов.
CloudWatch Insights-запрос для p95 latency по эндпоинту:
fields @timestamp, resourcePath, responseLatency
| filter status >= 200
| stats pct(responseLatency, 95) as p95 by resourcePath
| sort p95 desc
| limit 20
Nginx API Gateway + OpenTelemetry
Если gateway на Nginx (nginx-plus или OpenResty), логирование настраивается через log_format:
log_format api_json escape=json
'{'
'"timestamp":"$time_iso8601",'
'"request_id":"$request_id",'
'"method":"$request_method",'
'"path":"$uri",'
'"status":$status,'
'"latency_ms":$request_time,'
'"upstream_latency_ms":"$upstream_response_time",'
'"bytes_sent":$bytes_sent,'
'"consumer":"$http_x_consumer_id",'
'"ip":"$remote_addr"'
'}';
access_log /var/log/nginx/api_access.log api_json buffer=32k flush=5s;
Для распределённой трассировки — opentelemetry-nginx-module:
opentelemetry on;
opentelemetry_propagate;
opentelemetry_operation_name $request_method_$uri;
opentelemetry_otlp_exporter otelhttp;
otelhttp_exporter_otlp_endpoint http://otel-collector:4317;
Стек для сбора и визуализации
Два распространённых варианта:
ELK-стек:
- Logstash собирает логи из gateway
- Elasticsearch хранит и индексирует
- Kibana — дашборды, алерты
Grafana Stack:
- Loki — хранение логов (дешевле ES, не индексирует поля)
- Prometheus — метрики
- Grafana — единый UI для логов и метрик
Для большинства проектов Grafana Stack проще в эксплуатации и дешевле хранение.
Ключевые дашборды, которые нужно построить:
- Обзор трафика: RPS, error rate, p50/p95/p99 latency — за последние 15 минут и 24 часа
- По consumer: кто генерирует больше всего запросов, кто получает 4xx/5xx
- По эндпоинту: топ медленных, топ ошибочных
- Upstream health: latency до бэкенд-сервисов
Алертинг
Минимальный набор алертов (Prometheus AlertManager / Grafana Alerting):
- alert: APIHighErrorRate
expr: |
sum(rate(kong_http_requests_total{status=~"5.."}[5m]))
/ sum(rate(kong_http_requests_total[5m])) > 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "Error rate > 5% за последние 5 минут"
- alert: APIHighLatency
expr: |
histogram_quantile(0.95,
sum(rate(kong_request_latency_ms_bucket[5m])) by (le, route)
) > 2000
for: 5m
labels:
severity: warning
annotations:
summary: "p95 latency > 2s для роута {{ $labels.route }}"
Сроки
Базовое логирование и дашборды: 2–3 дня. Полноценный стек с алертингом, трассировкой и ретроспективным анализом: 1–2 недели в зависимости от зрелости инфраструктуры.







