###### 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 с вашим проектом**