###### tags: `monitoring`
# Логирование с помощью Loki. Cadvisor для мониторинга контейнеров.
### Что такое **Loki**
**Grafana Loki** — это набор компонентов для полноценной системы работы с логами. В отличие от других подобных систем Loki основан на идее индексировать только метаданные логов — labels (так же, как и в Prometheus), a сами логи сжимать рядом в отдельные чанки. Это легковесная система сбора логов, которая подходит для работы с микросервисами, контейнерами и т.п
### Практика. Часть 1
Давайте добавим в наш docker-compose файл из предыдущей практики контейнер с Grafana Loki.
```
loki:
container_name: loki
image: grafana/loki:main
ports:
- "3100:3100"
volumes:
- ./loki-config.yml:/etc/loki/local-config.yaml
- loki-data:/data/loki
command: -config.file=/etc/loki/local-config.yaml
```
Содержимое файла **loki-config.yml**:
```
auth_enabled: false
server:
http_listen_port: 3100
common:
instance_addr: 127.0.0.1
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
query_range:
results_cache:
cache:
embedded_cache:
enabled: true
max_size_mb: 100
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
```
* Данный конфиг - целая наука. Наша цель сейчас показать как собираются логи с помощью Loki, поэтому разбирать конфиг мы сейчас не будем. Подробнее прочитать тут: [Hash Ring Loki](https://grafana.com/docs/loki/latest/fundamentals/architecture/rings/)
Запустите наш обновленный кластер мониторинга и добавьте в Grafana еще один источник данных - Loki.
Поля, которые нужно добавить:
* URL
*Возможно Loki выдаст ошибку: Data source connected, but no labels received. Verify that Loki and Promtail is configured properly. Однако она сейчас ни на что не повлияет, так как у нас просто нет никаких данных. В дальнейшем она уйдет.*
Теперь нам необходимо сделать так, чтобы в Loki шли логи. Одна из крутых фич Loki - нативная интеграция с Docker как **log-driver**.
Для этого на вашем сервере выполните:
```
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
```
Перезапустите docker-daemon:
```
sudo systemctl restart docker
```
Для того, чтобы потом удалить или провести другие работы с драйвером Loki, воспользуйтесь этим гайдом: [Loki driver](https://grafana.com/docs/loki/latest/clients/docker-driver/)
Теперь давайте добавим какое-то небольшое веб-приложение в наш кластер, логи которого будем собирать через Loki.
Добавьте в ваш docker-compose файл такую запись:
```
logging:
driver: loki
options:
loki-url: "http://127.0.0.1:3100/loki/api/v1/push"
```
Затем добавьте наше веб-приложение + подключение log-driver Loki(можно добавить во все сервисы в нашем docker-compose)
```
malwaretotal:
container_name: malwaretotal
image: nocturnalq/malwaretotal
ports:
- "8080:80"
volumes:
- ./malwares.yml:/app/malwares.yml
logging:
driver: loki
options:
loki-url: "http://127.0.0.1:3100/loki/api/v1/push"
```
Содержимое файла **malwares.yml**:
```
data:
- title: Delete pages malware
sha256sum: 22a0e537896636542f57aaae2923a35f7a8c5ff787b49b34bfc4be5bda17d526
md5sum: 368a74c02630d461e0aabf71d34601f9
info: This malware downloads database
counter: 0
- title: Database download
sha256sum: 3356834575c0b62c28dab0b63234d92c41651a78c1fb40b96df19727ae33a9d9
md5sum: 3ed09f7decc98c3f44770dac2ac38aa0
info: This malware deletes pages
counter: 0
```
Обратите внимание! Мы указали "особенный" log driver для нашего контейнера с приложением, которое мы будем мониторить.
Запустите наш обновленный кластер.
**Вернитесь в Loki Data Source в Grafana и нажмите на кнопку *Explore -> Label Filters -> Run Query* теперь вы видите логи ваших приложений!**
### Практика. Часть 2
Мы научились мониторить метрики сервера, логи приложений.
Но мы живем в "контейнерном мире", поэтому нам необходимо мониторить контейнеры: их ресурсы, потребление. Для этого существует популярный инструмент от Google - **cAdvisor**. cAdvisor (Container Advisor) предоставляет данные по использованию ресурсов и производительности запущенных контейнеров. Формирует метрики в читаемом для Prometheus формате. Наряду с node_exporter является одним из самых необходимых экспортеров.
Установим cAdvisor в наш кластер:
```
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.46.0
container_name: cadvisor
ports:
- "8081:8080"
devices:
- "/dev/kmsg:/dev/kmsg"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /var/run/docker.sock:/var/run/docker.sock:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
```
Если возникнут ошибки: [Фикс cgroupsV2](https://stackoverflow.com/questions/72754039/failed-to-get-containers-in-cadvisor-docker) | [Mountpoint for CPU not found](https://github.com/google/cadvisor/issues/1943)
Можно попасть в веб-интерфейс:
```
localhost:8081
```
Однако, как и в случае с Prometheus, информация исчерпывающая, однако все некрасиво, поэтому существует [Dashboard для Grafana: ](https://grafana.com/grafana/dashboards/14282-cadvisor-exporter/)
Мы уже упомянули, что cAdvisor - это такой же экспортер для Prometheus, поэтому давайте заведем его в наш **prometheus.yml**
```
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node_exporter'
scrape_interval: 15s
static_configs:
- targets: ['node-exporter:9100']
- job_name: cadvisor
scrape_interval: 5s
static_configs:
- targets: ['cadvisor:8080']
rule_files:
- "alert.rules"
alerting:
alertmanagers:
- scheme: http
static_configs:
- targets: ['alertmanager:9093']
```
**Добавьте новый дэшборд и наслаждайтесь проделанной работой!**
**ОТЧЕТ: В качестве отчета по двум практическим работам принимается работающий кластер мониторинга + скриншоты. Можно приложить ссылку на GitHub с вашим проектом**