Обещанная вторая часть. Первая часть здесь.
Основной идеей было настроить все с минимальным количеством ручных действий для работы логирования и мониторинга.
Одно ручное действие все же потребуется — указать хост (или ip), по которому Prometheus будет собирать метрики в файле https://github.com/famer/loki/blob/main/prometheus.yml. В остальном все заработает просто по docker-compose up.
Полный код здесь
Разберем основные моменты.
Схема следующая:
Promtail собирает логи с докер контейнеров через докер сокет. Логи приложений соответственно пишутся в stdout stderr. То есть в лог самого контейнера. Как настроено логирование для Django приложения можно посмотреть здесь (из первой части):
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'root': {
'handlers': ['console'],
'level': 'INFO',
},
'loggers': {
'django': {
'handlers': ['console'],
'level': 'INFO',
'propagate': True,
},
'django.request': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
},
}
Promtail передает логи в Loki, который их хранит.
Prometheus собирает метрики по указанному в файле https://github.com/famer/loki/blob/main/prometheus.yml хосту (кстати обратите внимание на https://github.com/famer/django/blob/main/nginx.conf там доступ к метрикам запрещен со всех ip адресов, кроме указанных в целях безопасности, вообще /metrics не рекомендуется светить наружу).
Ну собственно и все, добавляете, как источники данных Loki и Prometheus в графану и дальше визуализируете как хотите.
Пример в графине для запроса и форматирования логов из nginx:
{container="/itjobs-nginx-1"} | json request_method, request_uri, status | __error__=`` | line_format `{{.request_method}} {{.request_uri}} with HTTP status: {{.status}} `
На этом все.