Давайте теперь объединять наши инструменты (Zipkin, ELK, Prometheus, Grafana), чтобы создать целостную систему для наблюдения за микросервисами.
Логирование запросов с помощью ELK
ELK-стек (Elasticsearch, Logstash, Kibana) помогает централизовать сбор логов и сделать их доступными для анализа. Каждый микросервис отправляет свои логи в Logstash, а тот передаёт логи в базу Elasticsearch. Затем через Kibana мы можем визуализировать и анализировать эти данные.
Пример настройки логирования в Spring Boot:
# application.yml
logging:
file:
name: logs/microservice.log
level:
root: INFO
logstash:
appender:
enabled: true
destination: localhost:5000 # порт Logstash
На стороне Logstash настройка выглядит так:
input {
tcp {
port => 5000
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "app-logs-%{+YYYY.MM.dd}"
}
}
И вот магия: мы видим все логи из всех сервисов в одном месте! Ошибки, запросы, даже ощущения сервиса, что у него "боли в голове".
Трассировка запросов с Zipkin и Spring Cloud Sleuth
Распределённая трассировка делает сервисы болтливыми: теперь они рассказывают, кто позвал их, а они кого позвали в ответ. Используя Zipkin и Spring Cloud Sleuth, вы создаёте цепочку (trace) из "ключевых событий" (spans), которые возникают в процессе выполнения одного запроса.
Пример настройки Sleuth и Zipkin:
spring:
sleuth:
sampler:
probability: 1.0 # 100% запросов будут трассироваться
zipkin:
base-url: http://localhost:9411 # адрес сервиса Zipkin
Пример трассировки в коде:
@RestController
@RequestMapping("/serviceA")
public class ServiceAController {
private final RestTemplate restTemplate;
@Autowired
public ServiceAController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/callB")
public String callServiceB() {
String response = restTemplate.getForObject("http://localhost:8081/serviceB/hello", String.class);
return "ServiceA -> " + response;
}
}
Теперь, глядя в Zipkin, вы будете видеть счастливую цепочку вызовов и время исполнения каждого из них.
Мониторинг метрик с Prometheus и Grafana
Переходим к метрикам. Они позволяют измерять состояние сервисов (CPU, память, количество запросов) или бизнес-показатели (количество успешных покупок, средняя продолжительность сессии).
Spring Boot Actuator уже публикует метрики, а Prometheus их собирает. Вот как подключить Actuator для публикации метрик:
management:
endpoints:
web:
exposure:
include: '*'
metrics:
export:
prometheus:
enabled: true
После этого мы добавляем сервис в конфигурацию Prometheus:
# prometheus.yml
scrape_configs:
- job_name: 'service-a'
static_configs:
- targets: ['localhost:8080'] # endpoint Actuator
А через Grafana легко сделать дашборд, который будет трансформировать сухие числа в красивые графики.
Интеграция всего вместе: ELK + Zipkin + Prometheus + Grafana
У вас есть логи, трассировка, графики метрик — всё есть! Как же всё это работает в комплексе?
- Запрос пришёл: пользователь отправляет запрос на ваш микросервис.
- Логирование: каждый сервис логирует свои действия. Логи идут в ELK.
- Трассировка: Sleuth связывает вызовы в единый trace, который хранится в Zipkin.
- Мониторинг метрик: Prometheus собирает данные о производительности.
- Визуализация: Grafana показывает вам общую картину: дашборды метрик, поиски в логах, трассировка.
Примеры использования Observability в реальных системах
Большие компании от Netflix до Uber используют схожие подходы для наблюдаемости. Например:
- Netflix: активно применяет распределённую трассировку для анализа своей сложной микросервисной системы.
- Uber: реализует метрики и трассировку для оптимизации логистических процессов.
- Airbnb: основная ставка на централизованное логирование и визуализацию.
Эти инструменты делают их системы устойчивыми, предотвращая простои и масштабные сбои.
Рекомендации и лучшие практики
- Сосредоточьтесь на ключевых показателях. Например, успешность запросов, латентность, использование ресурсов.
- Автоматизируйте анализ проблем. Метрики + трассировка + логи должны быть связаны. Если видите спад в метрике, идите в трассировку и найдите виновного.
- Настраивайте оповещения. Добавьте алерты в Prometheus, чтобы сразу узнавать о проблемах.
- Используйте профили. Подключите разные уровни логирования для production и разработки.
Напоследок
Перед вами система, в которой Zipkin, ELK, Prometheus и Grafana работают как единое целое для создания полной наблюдаемости. Это не просто удобство — это обязательный инструмент для работы с микросервисами.
Вы готовы, чтобы справляться даже с самыми запутанными проблемами в ваших системах. Да, теперь никакой внезапный круг запросов не сможет вас обмануть. Вы видите их насквозь. Поздравляю, у вас теперь рентгеновское зрение для микросервисов!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ