
Если вы собираете метрики через 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
Комментарии (3)

denaspireone
08.02.2026 19:21почему не использовать nginx для кеширования?
как пример https://github.com/VictoriaMetrics/prometheus-benchmark/blob/main/chart/templates/vmagent/nginx-cm.yaml
kashtan404
vmagent из коробки умеет (то есть решает описанные вами проблемы):
распределять скрейпинг между разными агентами (чтобы несколько агентов не долбили один таргет) https://docs.victoriametrics.com/victoriametrics/vmagent/#scraping-big-number-of-targets
дедуплицировать и аггрегировать данные https://docs.victoriametrics.com/victoriametrics/stream-aggregation/#deduplication
Плюс, появляется дополнительная точка отказа в виде самописного прокси, имеющего еще и внешнюю зависимость в виде редиса.
В целом то как практика нестандартного подхода к решению проблемы это хорошо, за статью плюсик. Но рекомендую более детально ознакомится с документацией, там много полезного.
spions Автор
А вы точно внимательно ознакомились с материалом? Все верно vmagent умеет, описанное вами (и мной), но не решает x2-x3 ценник за запросы, о чем собственно и описано в самом начале и для чего по сути был сделан кешер. На счет зависимости от redis - ее нет, в случае любых проблем, кешер становится просто прозрачным proxy, отказоустойчивость, которого обеспечивает k8s. Последнее было еще оттестировано на прерываемых нодах кластера.