Нужна архитектура для хранения и отслеживания метрик приложений

Как и многие современные приложения, у меня есть несколько движущихся частей как часть моего текущего приложения:

  • веб-сервис
  • Различные очереди
  • Различные рабочие процессы
  • и т.п.

Чтобы правильно управлять моим приложением, я хочу отслеживать различные произвольные метрики, связанные с приложением, такие как:

  • Средняя длина очереди за некоторый период времени
  • Среднее время обработки очереди и / или максимальное время обработки
  • Количество элементов, обработанных за единицу времени, или количество элементов типа X, обработанных за единицу времени, например, сколько за последнюю минуту, час, день
  • и так далее

Мне трудно придумать логическую модель для этого, а затем и фактическую реализацию. Некоторые из вещей, с которыми я борюсь:

  • Как эти расчеты сделаны? По тем же процессам, которые делают вещи, которые я измеряю? Отдельным процессом?
  • Когда эти расчеты сделаны? Конечно, расчеты не должны быть синхронными, например, с потоком приложений.
  • Как я храню результаты этих расчетов? Существует ли схема базы данных, которая подходит для хранения таких метрик?

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

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

Мысли?

1 ответ

Вот несколько указателей для каждого вопроса

Как эти расчеты сделаны? По тем же процессам, которые делают вещи, которые я измеряю? Отдельным процессом?

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

Когда эти расчеты сделаны? Конечно, расчеты не должны быть синхронными, например, с потоком приложений.

Это зависит от вашего варианта использования. Если вам не нужно выполнять все вычисления в реальном времени, у вас может быть статический компонент, который получает весь входящий поток данных от других ваших участников, затем временно сохраняет их (подробнее об этом позже), и другой компонент, который проходит через все вновь полученные данные (или все это) для выполнения расчетов. Последнее может быть запланировано библиотекой вроде Celery, или использовать стандартные задания cron.

Как я храню результаты этих расчетов? Существует ли схема базы данных, которая подходит для хранения таких метрик?

Для этого можно использовать стандартный SQL, практически любую его реализацию. Теперь, если у вас есть метрики, которые в основном содержат метки времени или данные временных рядов, вы можете взглянуть на базы данных временных рядов (TSDB).

Другие вопросы по тегам