В Grafana версии 6.0 была предоставлена новая плюшка — просмотрщик логов Loki, аналог известного всем стека ELK/EFK.
Является встроенной возможностью самой Grafana, и заточен под работу с Prometehus и Kubernetes, с возможностью использования их метрик.
Проект совсем новый, и главный его недостаток, который выявился за время попытки поднять хотя бы Proof of Concept, который и описывается в этом посте дальше — это недостаток документации и живых примеров.
Тем не менее — в целом система понравилась, особенно факт того, что не надо поднимать отдельный стек ELK, и что для просмотра дашбордов мониторинга и логов можно использовать единую Grafana. Так что — буду пробовать её внедрить, и если будут успехи — добавлю новые посты с более детальной настройкой.
Или всё-таки вернусь к варианту с ELK.
Домашняя страница — тут>>>, полезный пост в блоге Grafana тут>>>, Гитхаб — тут>>>.
Есть ветка обсуждения на Reddit тут>>>.
Имеется отдельная CLI утилита для Loki — logcli
, но пока её не трогал.
Loki-стек состоит из трёх компонентов:
promtail
— агент, который собирается сбором логов и передачей данных в Lokiloki
— собственно, сам сервер обработки и хранения логов- Grafana — получает данные от Loki, и выводит их в дашборе
Содержание
Loki Proof of Concept
Попробуем запустить всё это, добавить логи NGINX, и посмотреть — как оно будет выглядеть в самой Grafana.
Запуск стека
Создадим домашнюю директорию:
[simterm]
root@bttrm-dev-console:/opt# mkdir /opt/loki root@bttrm-dev-console:/opt# cd /opt/loki/
[/simterm]
Создадим Compose-файл — loki-compose.yml
:
version: "3" networks: loki: services: loki: image: grafana/loki:master ports: - "3100:3100" command: -config.file=/etc/loki/local-config.yaml networks: - loki promtail: image: grafana/promtail:master volumes: - /var/log:/var/log command: -config.file=/etc/promtail/docker-config.yaml networks: - loki grafana: image: grafana/grafana:master ports: - "3000:3000" networks: - loki
Запускаем:
[simterm]
root@bttrm-dev-console:/opt/loki# docker-compose -f loki-compose.yml up
[/simterm]
В аутпуте promtail
-а отображается информация о логах, которые он тейлит:
…
promtail_1 | level=info ts=2019-02-05T14:07:30.777577365Z caller=filetargetmanager.go:165 msg=»Adding target» key=»{job=\»varlogs\»}»
promtail_1 | level=info ts=2019-02-05T14:07:30.779215957Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/daemon.log
promtail_1 | 2019/02/05 14:07:30 Seeked /var/log/alternatives.log — &{Offset:19515 Whence:0}
promtail_1 | level=info ts=2019-02-05T14:07:30.782000937Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/alternatives.log
promtail_1 | 2019/02/05 14:07:30 Seeked /var/log/auth.log — &{Offset:3869 Whence:0}
promtail_1 | level=info ts=2019-02-05T14:07:30.782899496Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/auth.log
promtail_1 | level=info ts=2019-02-05T14:07:30.783409465Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/bootstrap.log
promtail_1 | level=info ts=2019-02-05T14:07:30.78359605Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/cloud-init-output.log
promtail_1 | level=info ts=2019-02-05T14:07:30.783648219Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/cloud-init.log
promtail_1 | level=info ts=2019-02-05T14:07:30.784386768Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/dpkg.log
promtail_1 | level=info ts=2019-02-05T14:07:30.785801248Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/faillog
promtail_1 | level=info ts=2019-02-05T14:07:30.785871765Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/kern.log
promtail_1 | level=info ts=2019-02-05T14:07:30.785943765Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/lastlog
promtail_1 | level=info ts=2019-02-05T14:07:30.78598882Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/syslog
promtail_1 | level=info ts=2019-02-05T14:07:30.786064399Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/user.log
…
Аналогично экспортёрам Prometheus — данные доступны через URI /mertics
:
[simterm]
root@ip-172-31-43-174:/opt/loki# curl localhost:3100/metrics # HELP cortex_cache_corrupt_chunks_total Total count of corrupt chunks found in cache. # TYPE cortex_cache_corrupt_chunks_total counter cortex_cache_corrupt_chunks_total 0.0 # HELP cortex_chunk_store_chunks_per_query Distribution of #chunks per query. # TYPE cortex_chunk_store_chunks_per_query histogram cortex_chunk_store_chunks_per_query_bucket{le="10.0"} 0.0 cortex_chunk_store_chunks_per_query_bucket{le="80.0"} 0.0 cortex_chunk_store_chunks_per_query_bucket{le="640.0"} 0.0 cortex_chunk_store_chunks_per_query_bucket{le="5120.0"} 0.0 cortex_chunk_store_chunks_per_query_bucket{le="40960.0"} 0.0 cortex_chunk_store_chunks_per_query_bucket{le="327680.0"} 0.0 cortex_chunk_store_chunks_per_query_bucket{le="+Inf"} 0.0 ...
[/simterm]
Открываем в браузере http://IP:3000 — и попадаем в Grafana:
Логинимся — admin:admin.
Добавление Loki как data source
Логи отображаются через новое меню в Grafana => Explore, документация — тут>>>.
Добавляем новый data source, тип Loki:
Указываем URL http://loki:3100 (т.к. сервисы в Docker со своей сетью):
Переходим в Explore:
Проверяем имещиеся логи — открываем Log labels:
Добавление логов
Настройки сбора логов для promtail
-а указываются в его файле настроек /etc/promtail/local-config.yaml
или /etc/promtail/docker-config.yaml
.
Устанавливаем NGINX:
[simterm]
root@ip-172-31-43-174:/home/admin# apt install nginx -y
[/simterm]
Проверяем его логи:
[simterm]
root@ip-172-31-43-174:/opt/loki# tail -f /var/log/nginx/* ==> /var/log/nginx/access.log <== ==> /var/log/nginx/error.log <== ==> /var/log/nginx/access.log <== 194.***.***.27 - - [05/Feb/2019:14:03:02 +0000] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" 194.***.***.27 - - [05/Feb/2019:14:03:03 +0000] "GET /favicon.ico HTTP/1.1" 404 200 "http://34.243.211.206/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
[/simterm]
Файл настроек самого Loki расположен в /etc/loki
контейнера:
[simterm]
root@ip-172-31-43-174:/opt/loki# docker exec -ti loki_loki_1 ls -l /etc/loki/ total 4 -rw-r--r-- 1 root root 489 Feb 5 12:00 local-config.yaml
[/simterm]
promtail
— в /etc/promtail
:
[simterm]
root@ip-172-31-43-174:/opt/loki# docker exec -ti loki_promtail_1 ls -l /etc/promtail/ total 8 -rw-r--r-- 1 root root 312 Feb 5 12:00 docker-config.yaml -rw-r--r-- 1 root root 317 Feb 5 12:00 local-config.yaml
[/simterm]
Создаём новый файл настроек, например /opt/loki/loki-promtail-conf.yml
:
server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml client: url: http://loki:3100/api/prom/push scrape_configs: - job_name: system entry_parser: raw static_configs: - targets: - localhost labels: job: varlogs __path__: /var/log/*log - job_name: nginx entry_parser: raw static_configs: - targets: - localhost labels: job: nginx __path__: /var/log/nginx/*log
Тут в scrape_configs
добавляем новую джобу — nginx, и указываем путь к файлам логов, которые будем тейлить.
Нет, ссылки на документацию по добавлению новых логов я так и не нашёл… Пока что. Делал методом тыка.
Обновляем Compose-файл — добавляем маппинг нового файла настроек в /etc/promtail/docker-config.yaml
:
... promtail: image: grafana/promtail:master volumes: - /opt/loki/loki-promtail-conf.yml:/etc/promtail/docker-config.yaml - /var/log:/var/log command: -config.file=/etc/promtail/docker-config.yaml networks: - loki ...
Перезапускаем стек, проверяем логи, которые promtail
наблюдает сейчас:
…
promtail_1 | level=info ts=2019-02-05T15:08:10.53723788Z caller=filetargetmanager.go:165 msg=»Adding target» key=»{job=\»varlogs\»}»
promtail_1 | level=info ts=2019-02-05T15:08:10.538575763Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/daemon.log
promtail_1 | level=info ts=2019-02-05T15:08:10.539914281Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/dpkg.log
promtail_1 | level=info ts=2019-02-05T15:08:10.541431662Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/alternatives.log
promtail_1 | level=info ts=2019-02-05T15:08:10.541911162Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/auth.log
promtail_1 | level=info ts=2019-02-05T15:08:10.542352516Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/bootstrap.log
promtail_1 | level=info ts=2019-02-05T15:08:10.542780189Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/cloud-init-output.log
promtail_1 | level=info ts=2019-02-05T15:08:10.543222436Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/cloud-init.log
promtail_1 | level=info ts=2019-02-05T15:08:10.54394579Z caller=filetargetmanager.go:165 msg=»Adding target» key=»{job=\»nginx\»}»
promtail_1 | level=info ts=2019-02-05T15:08:10.54473202Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/faillog
promtail_1 | level=info ts=2019-02-05T15:08:10.545166611Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/kern.log
promtail_1 | level=info ts=2019-02-05T15:08:10.54564307Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/lastlog
promtail_1 | level=info ts=2019-02-05T15:08:10.546097865Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/syslog
promtail_1 | level=info ts=2019-02-05T15:08:10.54651553Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/user.log
promtail_1 | 2019/02/05 15:08:10 Seeked /var/log/alternatives.log — &{Offset:0 Whence:0}
promtail_1 | 2019/02/05 15:08:10 Seeked /var/log/auth.log — &{Offset:0 Whence:0}
promtail_1 | 2019/02/05 15:08:10 Seeked /var/log/nginx/access.log — &{Offset:0 Whence:0}
promtail_1 | level=info ts=2019-02-05T15:08:10.548790452Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/nginx/access.log
promtail_1 | 2019/02/05 15:08:10 Seeked /var/log/nginx/error.log — &{Offset:0 Whence:0}
promtail_1 | level=info ts=2019-02-05T15:08:10.54959973Z caller=filetarget.go:269 msg=»start tailing file» path=/var/log/nginx/error.log
…
key=»{job=\»nginx\»}» появился, всё гуд.
Проверяем в самой Grafana:
Логи на месте, всё работает.