В теории систем есть понятие наблюдаемости (observability). Его суть в следующем: чтобы понимать состояние системы, нужно знать значение определенных параметров. Критерий наблюдаемости системы — то, насколько гибко и удобно система позволяет считывать ее состояние.

Хорошая наблюдаемость позволяет быстро понять, адекватно ли работает программа, выполняются ли задачи и нет ли каких-то нештатных событий в коде, а при сбое — быстро выявить причины.

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

Не всегда очевидно, что происходит с вашим контейнером

Разработчики иногда сталкиваются с проблемой: в Kubernetes видно, что сервис жив, но приложение работает некорректно. При ближайшем рассмотрении выясняется, что сервис рестартует раз в несколько секунд и сразу же падает. Неясно, что именно приводит к сбою — приложение пишет события в stdout, который заперт внутри контейнера и исчезает сразу после перезапуска.

У приложений без контейнеров можно полагаться на какие-то базовые инструменты — перенаправление вывода программы в файл, syslog. Напротив, системы управления контейнерами в базовой поставке не предоставляют инструментов для хранения событий и логов приложений, работающих внутри контейнеров. Если повезет — можно поймать на консоль какие-то ошибки, но это, скорее, исключение из правил.

Для приложений в контейнерах нужно уделить внимание грамотному сбору логов и событий в вашем коде. Это рекомендуется всем, в том числе и тем, кто не пользуется Kubernetes — не стоит полагаться на stdout и grep.

Логирование контейнеров

Как мы уже выяснили, с логами в контейнерах есть нюансы. Поэтому вопросом логирования нужно заниматься сознательно, предусмотрев ведение логов в чем-то понадежнее stdout.

На рынке есть решения, которые заточены на ведение журналов в больших системах с тысячами узлов и миллионами событий. Вот что стоит попробовать:

  • ELK Stack — комбинация из трех продуктов: Elasticsearch, Logstash и Kibana. На правильную настройку стека потребуется 10-20 часов. Но зато ELK Stack справится с самыми сложными задачами по повышению наблюдаемости системы, и у него много инструментов для визуализации и анализа данных.
  • Graylog — простое и надежное решение, заточенное на хранение логов. Настроить его намного проще, чем ELK, но и функциональность сильно меньше. В Graylog лишь базовый набор функций для поиска и анализа информации, нет красивых отчетов, умных фильтров операций и интерактивных дашбордов.
У ELK много инструментов для визуализации и анализа любых данных, поступающих из приложений. Источник

Что нужно логировать:

  • Прохождение сложных участков бизнес-логики приложения, результаты и ход работы сложных алгоритмов.
  • Работу программы в нештатном режиме — обработку исключений, нестандартный ввод.
  • Итоговые результаты работы приложения — нужно понимать, насколько успешно приложение справляется с задачами.

ELK Stack для логирования контейнеров можно подключить на платформе Mail.ru Cloud Solutions, пошаговая инструкция с примером такого подключения — в этой статье. Вы можете создать одну виртуальную машину со стеком ELK или комплекс из двух инстансов ELK Multi Instance. Зарегистрировавшись на платформе, вы также получаете доступ к другим приложениям для разработки. Например, можете воспользоваться GitLab CE, Docker CE, развернуть в облаке базы данных или Kubernetes.

Логирование ошибок

Логирование ошибок — это, по сути, тоже логирование, но со своими нюансами. Если в программе произошла ошибка, вам нужно точно локализовать код, в котором что-то сломалось, и сохранить стек вызова. Конечно, это можно доверить дефолтным системным методам логирования, но они не всегда хорошо справляются с задачей: выкинуть текст ошибки в stdout недостаточно для качественного приложения.

Инженеры рекомендуют доверить логирование ошибок отдельной системе, которая специализируется исключительно на сбоях. Один из лидеров этого рынка — Sentry. Sentry умеет логировать все — ошибки на сервере, в браузере и мобильном приложении, и ее просто встроить в любой код.

Мониторинг ошибок избавит вас от поиска причин сбоя в коде: все необходимые стеки вызова, переменные и другие данные о состоянии программы попадут в систему аналитики сбоев.

Sentry автоматически собирает все ошибки в работе программы и создает на их основе понятные отчеты

Health Checks

Health Checks — специальные системные методы программы, вызов которых возвращает ее состояние. Они позволяют понять, все ли работает штатно, жива ли программа, требуется ли ей перезапуск или внимание админа.

Health Checks можно вызывать вручную из консоли админа или интегрировать их в вашу инфраструктуру контейнерных приложений. Большинство систем оркестрации контейнеров умеет работать со специализированными Health Checks, и на их основе принимать решения о перезапуске сервиса. Даже в самом популярном контейнере Docker есть директива Health Сhecks, которая помогает системе оркестрации принимать правильные решения.

Важно

По возможности всегда встраивайте диагностические вызовы в свой код — это один из шагов по повышению наблюдаемости системы.

Метрики

Метрики работы программы позволяют получить высокоуровневое представление о том, как работает сервис.

  • Сколько запросов отработано за нужный период.
  • Сколько пользователей посетило приложение.
  • Какие результаты работы программы, были ли ошибки, сколько и каких.

Эти показатели расскажут о том, как в целом обстоят дела в системе и нужно ли расследовать какие-то события, например, внезапно подскочивший процент ошибок.

Помимо технических параметров, нужно следить и за бизнес-метриками. Тот факт, что приложение технически исправно, еще не означает, что сервис работает, как задумано.

Например, вы видите, что пользователи логинятся на сайте, но заказов в корзине нет. Это может означать, что сломался процесс добавления товаров в корзину. Возможно, есть проблемы в интерфейсе или кто-то случайно удалил кнопку заказа с сайта (да, и такое бывает).

Обязательно выводите и изучайте бизнес-метрики:

  • Средние показатели выручки и прибыли за последний период.
  • Активность пользователей.
  • Показатели конверсии.
  • Показатели ключевых действий: заказы, оплаты и другие важные для бизнеса действия.

После работы со всеми методами повышения наблюдаемости, вы получите систему, которую очень легко понимать, диагностировать и чинить. А это, в свою очередь, сказывается на стабильности бизнеса. Если вы быстро замечаете нештатные ситуации и оперативно на них реагируете — качество кода стабильно повышается и ошибок в приложении остается меньше.