В 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:
Логи на месте, всё работает.







