
Если вы собираете метрики через VictoriaMetrics, вы работаете в облаках, у вас большая инфраструктура, развернутая в нескольких зонах доступности, то в какой-то момент заметите, что счета за метрики начинают составлять ощутимый процент в счете за инфраструктуру.
Иногда этот момент совпадает с пробелами в графиках, из за того, что вы перегрузили сервис мониторинга своего облачного провайдера.
Когда мы говорим о сборе метрик в HA средах и VictoriaMetrics, обычно рассматриваются два пути:
Шардирование (Sharding): Каждый агент собирает свою часть данных. Если один шард падает — часть метрик теряется. Для критической инфраструктуры это неприемлемо.
Репликация (Replication): Вы запускаете 2+ идентичных инстанса VMAgent (по одному на зону). Каждый из них идет к одним и тем же таргетам и забирает одни и те же данные.
И тут начинаются проблемы:
Умножение нагрузки: Если у вас 3 реплики агента, ваш сервис-таргет получает в 3 раза больше запросов. Если сервис и так нагружен, лишний парсинг метрик может его "добить".
Лимиты и деньги: Если вы собираете метрики из внешних API или платных сервисов, где тарификация идет за запросы, ваши расходы растут линейно количеству реплик.
Смещение по времени: Реплики могут приходить за данными в разное время, что иногда приводит к "ступенькам" на графиках при переключении между источниками данных.
Мы столкнулись с этим при масштабировании к��астера VictoriaMetrics: переход на 3 реплики для трёхзонной отказоустойчивости утроил счёт за сбор метрик из облачных сервисов. Было больно.
Чтобы решить эти проблемы, я разработал Metric Cacher Exporter. Это легковесный кеширующий прокси-сервис на Go, который встает между агентом сбора (Prometheus/VictoriaMetrics) и сервис-таргетами.
Как это работает?
Кэшер проверяет наличие данных в Redis.
Если данных нет, он идет в upstream (реальный сервис).
Сохраняет результат в Redis с заданным TTL.
Отдает ответ агенту.
Если одновременно приходит несколько одинаковых запросов — в Upstream идёт только один, остальные ждут ответа.
На наших инсталляциях внедрение metric-cacher-exporter позволило снизить затраты на сервис сбора метрик примерно на 70-80%.
Внедрение за 5 минут:
Интеграция с vmagent — через relabel_configs без изменения таргетов:
scrape_configs: - job_name: "my-app" scrape_interval: 60s params: cacheTTL: ["55"] # TTL < scrape_interval static_configs: - targets: ["my-service:9090"] # оригинальный адрес relabel_configs: # Перенаправляем запрос через кешер - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: metric-cacher-exporter:8080 # адрес кешера
Иногда самое эффективное решение - не очередной "распределённый супер-кластер", а простой прокси с "умным" кешированием.
Проект opensource, исходный код доступен на GitHub. Issue и MR приветствуются.
GitHub: https://github.com/spions/metric-cacher-exporter
Docker Hub: spions/metric-cacher-exporter:latest
