Нужна архитектура для хранения и отслеживания метрик приложений
Как и многие современные приложения, у меня есть несколько движущихся частей как часть моего текущего приложения:
- веб-сервис
- Различные очереди
- Различные рабочие процессы
- и т.п.
Чтобы правильно управлять моим приложением, я хочу отслеживать различные произвольные метрики, связанные с приложением, такие как:
- Средняя длина очереди за некоторый период времени
- Среднее время обработки очереди и / или максимальное время обработки
- Количество элементов, обработанных за единицу времени, или количество элементов типа X, обработанных за единицу времени, например, сколько за последнюю минуту, час, день
- и так далее
Мне трудно придумать логическую модель для этого, а затем и фактическую реализацию. Некоторые из вещей, с которыми я борюсь:
- Как эти расчеты сделаны? По тем же процессам, которые делают вещи, которые я измеряю? Отдельным процессом?
- Когда эти расчеты сделаны? Конечно, расчеты не должны быть синхронными, например, с потоком приложений.
- Как я храню результаты этих расчетов? Существует ли схема базы данных, которая подходит для хранения таких метрик?
Часть меня чувствует, что это решенная проблема, и есть архитектура или шаблон, который я должен принять или повторно использовать.
Я задаю этот вопрос намеренно, не упоминая конкретные технологии, которые использует мое приложение, потому что моя интуиция говорит мне, что это не важно для шаблона.
Мысли?
1 ответ
Вот несколько указателей для каждого вопроса
Как эти расчеты сделаны? По тем же процессам, которые делают вещи, которые я измеряю? Отдельным процессом?
Определенно не по тому же процессу. Причина в том, что если вы связываете эти вычисления с каким-либо процессом, который не целиком служит для этой единственной цели, у вас будет разрозненная логика во всех ваших службах, и это быстро станет неуправляемым. Имейте централизованное место, где все вычисления выполнены. Пусть каждая часть вашей архитектуры отправляет свою полезную нагрузку с помощью некоторой независимой передачи, такой как REST (или что-то более быстрое, если вам нужно, как сотни в секунду, как очередь сообщений, как вы упоминали).
Когда эти расчеты сделаны? Конечно, расчеты не должны быть синхронными, например, с потоком приложений.
Это зависит от вашего варианта использования. Если вам не нужно выполнять все вычисления в реальном времени, у вас может быть статический компонент, который получает весь входящий поток данных от других ваших участников, затем временно сохраняет их (подробнее об этом позже), и другой компонент, который проходит через все вновь полученные данные (или все это) для выполнения расчетов. Последнее может быть запланировано библиотекой вроде Celery, или использовать стандартные задания cron.
Как я храню результаты этих расчетов? Существует ли схема базы данных, которая подходит для хранения таких метрик?
Для этого можно использовать стандартный SQL, практически любую его реализацию. Теперь, если у вас есть метрики, которые в основном содержат метки времени или данные временных рядов, вы можете взглянуть на базы данных временных рядов (TSDB).