JavaRush /Курси /Модуль 4: FastAPI /Налаштування моніторингу помилок у Celery і RabbitMQ

Налаштування моніторингу помилок у Celery і RabbitMQ

Модуль 4: FastAPI
Рівень 15 , Лекція 8
Відкрита

Розробити чудовий, але некерований код — це як відкрити дорогий ресторан без кухні.

Твої задачі (або повідомлення в RabbitMQ) можуть блукати по чергах, натикатися на помилки і зникати в прірві логів.

Щоб цього не відбувалося, треба встановити й налаштувати систему моніторингу, яка дозволить відстежувати виконання задач, знаходити проблемні сценарії й діагностувати їхні причини.

Давай подивимось, як налаштувати моніторинг у Celery і RabbitMQ, щоб помилки не ховались, а стояли під прожектором і чекали на нашу увагу.


Використання вбудованих інструментів для моніторингу

Моніторинг у Celery

Celery надає утиліту flower, яка є веб-інтерфейсом для моніторингу виконання задач. Через flower можна відстежувати стан воркерів, черг і задач. Давай налаштуємо його крок за кроком:

  1. Встановлення Flower:
    pip install flower
  2. Запуск Flower:

    Flower запускається як Celery-команда. Припустимо, твоє Celery-додаток називається my_app. Запуск виглядатиме так:

    celery -A my_app flower

    За замовчуванням Flower запускається на порті 5555. Відкрий у браузері http://localhost:5555, щоб побачити інтерфейс.

  3. Що можна побачити через Flower?
    • Стан воркерів: скільки їх працює, які з них відключені.
    • Черги: які задачі знаходяться в обробці.
    • Задачі: як виконані, так і очікувані, включно зі статусами (успіх, помилка).
  4. Налаштування автентифікації:

    Якщо хочеш обмежити доступ до Flower, можна налаштувати базову автентифікацію:

    celery -A my_app flower --basic_auth=username:password

Моніторинг у RabbitMQ

RabbitMQ має вбудований плагін для моніторингу — RabbitMQ Management Plugin. Якщо ти ще не його вмикав, ось як це зробити:

  1. Активація плагіна:
    rabbitmq-plugins enable rabbitmq_management
  2. Доступ до інтерфейсу:

    Плагін запускає веб-інтерфейс на порті 15672. Зайди на http://localhost:15672, щоб потрапити на панель керування RabbitMQ. Логін за замовчуванням: guest, пароль — теж guest.

  3. Можливості інтерфейсу:
    • Перегляд стану черг: скільки повідомлень чекає на обробку.
    • Відстеження з'єднань із продюсерами і консьюмерами.
    • Налаштування Dead-letter Queues і інших параметрів повідомлень.

Приклади налаштування зовнішнього моніторингу помилок

Іноді веб-інтерфейсу замало для глибокого аналізу. У таких випадках можна підключити зовнішні системи моніторингу, які будуть збирати метрики й логи. Розглянемо дві популярні системи — Prometheus + Grafana та Sentry.

Моніторинг з Prometheus і Grafana

Prometheus — це система збору метрик, а Grafana — інструмент для візуалізації. Разом вони класно підходять для моніторингу Celery і RabbitMQ.

Крок 1: Експорт метрик RabbitMQ

RabbitMQ має готовий експортер для Prometheus. Ось як його налаштувати:

  1. Встановлення RabbitMQ Prometheus Exporter:
    rabbitmq-plugins enable rabbitmq_prometheus

    Після цього метрики будуть доступні за адресою http://localhost:15692/metrics.

  2. Налаштування Prometheus:

    У конфігурацію Prometheus додай job для RabbitMQ:

    scrape_configs:
      - job_name: 'rabbitmq'
        static_configs:
          - targets: ['localhost:15692']
    
  3. Імпорт дашборду в Grafana:

    У Grafana є готові дашборди для RabbitMQ. Можеш скористатися, наприклад, RabbitMQ Overview Dashboard.

Крок 2: Експорт метрик Celery

Для Celery знадобиться бібліотека celery-prometheus-exporter. Встановимо її:

pip install prometheus-client

Тепер у коді додай експортер:


from prometheus_client import start_http_server, Counter

# Запустимо експортер на порті 8000
start_http_server(8000)

# Приклад метрики для підрахунку помилок
task_errors = Counter('task_errors', 'Total number of task errors')

@app.task
def my_task():
    try:
        # Виконання задачі
        pass
    except Exception:
        task_errors.inc()  # Збільшуємо лічильник помилок
        raise

Після цього метрики стануть доступні Prometheus, і їх можна буде візуалізувати в Grafana.


Логування й моніторинг з Sentry

Sentry — це інструмент для відстеження помилок. Він не тільки логує їх, а й дає зручний інтерфейс для аналізу. Ось як інтегрувати Sentry в проєкт:

  1. Встановлення Sentry:
    pip install sentry-sdk
  2. Ініціалізація Sentry:

    Додай у код додатку:

    
    import sentry_sdk
    from sentry_sdk.integrations.celery import CeleryIntegration
    
    sentry_sdk.init(
        dsn="https://<your-sentry-dsn>",
        integrations=[CeleryIntegration()]
    )
    
  3. Відстежування помилок:

    Після цього всі необроблені помилки з Celery будуть відправлятися в Sentry.

    • В інтерфейсі Sentry ти зможеш:
    • Бачити повну інформацію про помилку, включно зі стеком викликів.
    • Знаходити повторювані помилки і аналізувати їхню частоту.
    • Налаштовувати сповіщення (наприклад, у Slack) при виникненні критичних помилок.

Реальні кейси використання моніторингу

  • Кейс 1: "Черга впала, а воркер не помітив"
    Проблема: Одній із черг RabbitMQ вичерпався ліміт повідомлень, через що продюсер продовжував додавати повідомлення в логах, але не в чергу.
    Рішення: Після ввімкнення RabbitMQ Management Plugin команда оперативно помітила, що черга переповнена, і збільшила ліміти.
  • Кейс 2: "Задачі зависають без таймаутів"
    Проблема: Задачі Celery зависали через таймаути на зовнішніх API, блокуючи чергу.
    Рішення: За допомогою Prometheus додали метрику тривалості виконання задач. Завислі задачі швидко виявили і опрацювали.
  • Кейс 3: "А що за помилка така?"
    Проблема: Розробники знайшли неясну помилку в логах Celery, але не могли її відтворити.
    Рішення: Після інтеграції Sentry до задачі автоматично стали прикріплюватися стек-трейси, що дозволило швидко знайти й усунути джерело помилки.

З налаштованим моніторингом помилок у Celery і RabbitMQ ти отримуєш можливість не лише відстежувати стан задач, але й запобігати серйозним проблемам ще до їх виникнення. Успішного моніторингу!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ