Django приложение в докере. Логирование и мониторинг(тоже в докере)

e6ebafa0a935fb44c36a680de107c7e8

Обещанная вторая часть.

Первая часть здесь https://habr.com/ru/articles/844280/

Основной идеей было настроить все с минимальным количеством ручных действий для работы логирования и мониторинга.

Одно ручное действие все же потребуется — указать хост (или ip), по которому Prometheus будет собирать метрики в файле https://github.com/famer/loki/blob/main/prometheus.yml. В остальном все заработает просто по docker-compose up.

Полный код здесь

Разберем основные моменты.

Схема следующая:

Promtail собирает логи с докер контейнеров через докер сокет. Логи приложений соответственно пишутся в stdout stderr. То есть в лог самого контейнера. Как настроено логирование для Django приложения можно посмотреть здесь https://github.com/famer/django/blob/main/itjobs/settings/prod.py (из первой части):

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}} ` 

На этом все.

© Habrahabr.ru