Реалізація логування та моніторингу трафіку через API Gateway
API Gateway — це єдина точка входу, через яку проходить весь трафік. Якщо там немає нормального логування, ви сліпі: незрозуміло, хто дергає API, з яким latency, які endpoints падають і чому. Налаштування спостережливості на рівні gateway займає менше часу, ніж потім розбиратися з інцидентами вручну.
Що логувати
Мінімальний набір полів на кожен запит:
| Поле | Приклад | Зачем |
|---|---|---|
request_id |
uuid4 |
Наскрізна трасування через сервіси |
consumer_id |
client_abc |
Хто робить запит |
method + path |
GET /api/v2/orders |
Статистика по endpoints |
status_code |
429 |
Моніторинг помилок |
latency_ms |
143 |
Продуктивність |
upstream_latency_ms |
138 |
Де витрачається час |
request_size |
1024 |
Аномалії в трафіку |
response_size |
4096 |
— |
ip |
1.2.3.4 |
Безпека |
Тіло запиту логувати не можна за замовчуванням — там можуть бути паролі, токени, PAN-дані. Окремий флаг на рівні route для режиму debug.
Налаштування в 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 по endpoints:
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
- По endpoint: топ повільних, топ ошибочних
- Upstream health: latency до backend-сервісів
Алертинг
Мінімальний набір алертів (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 для route {{ $labels.route }}"
Графік
Базове логування та дашборди: 2–3 дня. Повноцінний стек з алертингом, трасуванням та ретроспективним аналізом: 1–2 тижні залежно від зрілості інфраструктури.







