Система мониторинга базируется на следующих компонентах:
- Prometheus - позволяет собирать метрики из различных источников и сохранять их в базу в виде временных рядов (time-series data model)
- Источники (экспортеры) данных:
- cAdvisor - сервис "из-коробки" собирает системные метрики с запущенных контейнеров
- Node Exporter - сервис, собирающий системные метрики операционной системы хоста
- Список поддерживаемых экспортеров для ознакомления
- Источники (экспортеры) данных:
- Promtail - агент-экспортер, который собирает с контейнеров логи и отправляет в агрегатор Loki. Принцип работы в 3 шага:
- Discovers targets
- Attaches labels to log streams
- Pushes them to the Loki instance.
- Loki - многокомпонентный агрегатор (читай база данных) логов. Обеспечивает приём, хранение и очитску логов а так же выполнение queyr-запросов для их получения.
- Grafana - предоставляет централизованный доступ к веб-интерфейсу, для наглядной визуализации и просмотра собранных данных.
{
"GF_INSTALL_PLUGINS": "grafana-oncall-app",
"GF_SERVER_ROOT_URL": "%(protocol)s://%(domain)s/",
"GF_AUTH_ANONYMOUS_ENABLED": "false",
"GF_USERS_ALLOW_SIGN_UP": "false"
"GF_SECURITY_ADMIN_PASSWORD": "",
"GF_SECURITY_ADMIN_USER": "",
"GF_SERVER_DOMAIN": "",
"GF_SMTP_ENABLED": "true",
"GF_SMTP_FROM_ADDRESS": "",
"GF_SMTP_HOST": "",
"GF_SMTP_PASSWORD": "",
"GF_SMTP_USER": "",
}
Promtail является экспортёром логов и может быть установлен на каждой машине, где установлена служба docker и запущенно N контейнеров, логи с которых требуется собирать и просматривать. Конфигуация будет отличаться в следующих случаях.
В таком случае необходим запущенный агрегатор Loki с параметром:
services:
loki:
...
ports:
expose:
- 3100
После запуска сервиса по адрессу http://loki:3100/loki/api/v1/push будет доступен эндопоинт для экспорта в него логов. Подробнее об HTTP API Grafana Loki
Конфигурация Promtail в docker-compose будет выглядеть следующим образом:
promtail:
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./promtail-config.yaml:/etc/promtail/promtail-config.yaml
command:
- --config.file=/etc/promtail/promtail-config.yaml
depends_on:
- loki
Монтируем в контейнеров docker.sock хоста для корректной работы docker service discovery
и пробрасываем в контейнер свой .yml конфиг для Promtail.
promtail-config.yaml
будет выглядеть следующим образом:
client:
url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: docker-container-logs
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 30s
relabel_configs:
- source_labels: ['__meta_docker_container_label_com_docker_compose_project']
regex: '(.*)'
target_label: '${PREFIX}_compose_project'
PREFIX
может быть любым, и служит для идентификации логов с конкретного docker-хоста, задается в качестве переменной окружения. В качестве client
указываем loki:3100, т.к. и экспортёр и агрегатор находятся в сети одного докер-хоста
В таком случае, необходимо cделать доступным для внешних подключений эндпоинт Loki:
services:
loki:
...
labels:
- "traefik.enable=true"
- "traefik.subdomain=loki"
- "traefik.http.services.loki.loadbalancer.server.port=3100"
- "traefik.http.routers.loki.tls.certresolver=letsEncrypt"
Запустить на удаленной машине Promtail, изменив конфигурацию в promtail-config.yaml
:
client:
url: https://your.domain/loki/api/v1/push
scrape_configs:
- job_name: docker-container-logs
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 30s
relabel_configs:
- source_labels: ['__meta_docker_container_label_com_docker_compose_project']
regex: '(.*)'
target_label: '${PREFIX}_compose_project'
При такой конфигурации Promtail будет экспортировать собранные на удалённом сервере логи из docker и направлять их в указанный в client
эндпоинт агрегатора
Prometheus активно собирает/пуллит метрики с таргетов и формирует базу данных временных рядов. В качестве таргетов для сбора метрик указаны cAdvisor
и node-exporter
:
scrape_configs:
- job_name: prom
scrape_interval: 30m
static_configs:
- targets: ['cadvisor:8080', 'node-exporter:9100']