手里有两套监控集群——一套 kube-prometheus-stack,一套 VictoriaMetrics k8s-stack。想用一个 PromQL 入口同时查两边的数据,不想记两套地址、切两个 Grafana 数据源。Promxy 就是干这个的。
Promxy 是什么
Promxy 是一个 Prometheus 聚合代理。它不存储数据,只做查询代理。收到 PromQL 请求后,scatter 到多个下游 Prometheus/VM 实例,gather 合并结果,返回给调用方。
1 | Grafana → Promxy → Prometheus A |
核心定位:让多个 Prometheus/VM API 端点看起来像一个。
关键特性
- 纯 HTTP 调用:下游暴露标准 Prometheus HTTP API 就行,没有特殊协议
- 不存储数据:只转发和合并,状态全在下游
- 兼容 Prometheus 和 VM:可以混合聚合 Prometheus + VictoriaMetrics
- 支持 recording rules 和 alerting rules:输出通过 remote_write 推到后端
- 支持 Kubernetes 服务发现:自动发现下游实例
为什么需要 Promxy
场景一:多集群监控
多个 K8s 集群各自部署了 Prometheus 或 VM,需要统一查询入口。
场景二:Prometheus 迁移到 VM
过渡期 Prometheus 和 VM 并存,需要一个统一入口同时查两边数据。
场景三:高可用
同一组下游实例放多个副本,Promxy 自动去重合并。
场景四:冷热分离
历史数据在低成本存储(如 S3),近期数据在高性能存储,Promxy 按时间范围路由查询。
核心配置:ServerGroup
Promxy 的配置围绕 ServerGroup 展开。一个 ServerGroup 是一组同配置的下游实例:
1 | server_groups: |
关键参数
| 参数 | 说明 | 建议值 |
|---|---|---|
anti_affinity |
合并同一组内多个实例的时间序列阈值 | 设为 scrape interval |
remote_read |
是否用 remote_read API | VM=false,Prometheus=true |
query_params |
给下游请求加查询参数 | VM 加 nocache: 1 |
ignore_error |
该组不可用时是否忽略错误 | 关键组=false,可选组=true |
relative_time_range |
只查该组某时段的数据 | 冷热分离场景用 |
relabel_configs |
修改返回的标签 | 需要时用 |
path_prefix |
下游 API 路径前缀 | VM 集群版需要设 |
remote_read 的区别
- remote_read=true:用 Prometheus 的 remote_read API,一次请求拿所有数据,效率更高。Prometheus 支持。
- remote_read=false:用标准 PromQL API(
/api/v1/query),逐指标查询。VM 不支持 remote_read,必须设 false。
VM 集群版的坑
单机版 VM 的 API 路径是 /api/v1/query,但集群版 vmselect 的路径是 /select/0/prometheus/api/v1/query。需要加 path_prefix:
1 | - static_configs: |
不加的话 Promxy 会 404。
完整配置示例
下面是一个同时聚合 Prometheus + VictoriaMetrics 的配置:
1 | global: |
部署方式
二进制
1 | ./promxy --config=config.yaml # 默认监听 :8082 |
Docker
1 | docker run \ |
注意:master tag 不存在,latest tag 有 panic bug(index out of range)。建议用具体版本如 v0.0.93。
K8s(Helm)
Promxy 社区有 Helm chart,但版本较旧。实测中遇到的问题:
mastertag 不存在 → 改用具体版本latest有 bug → 用v0.0.93
实操:跨集群聚合查询
环境
- ws-k8s:Kind 集群,跑 kube-prometheus-stack(Prometheus v3.9.1)
- test-cluster:Kind 集群,跑 VM k8s-stack(VictoriaMetrics 集群版)
步骤
- 暴露 test-cluster 的 vmselect
Kind 集群网络隔离,需要 port-forward:
1 | kubectl --context kind-test-cluster -n victoria-metrics \ |
- 准备 Promxy 配置
1 | # promxy-config.yaml |
- 部署 Promxy
1 | helm upgrade --install promxy ./ -f values.yaml -n victoria-metrics |
- 验证
在 Grafana 添加 Promxy 为数据源(http://promxy:8082),查询 node_uname_info:
1 | {instance="ws-k8s-worker", job="node-exporter"} ← 来自 Prometheus |
两个集群的节点数据同时出现在一个查询结果里。
与公司监控架构的关系
在实际生产环境中,Promxy 通常不是单独使用的。一个典型的架构:
1 | Nginx 反代(统一入口 + 认证 + 限流) |
Promxy 在这个架构中承担查询聚合层的角色:
- 对上(Grafana / Nginx):统一的 PromQL API
- 对下(VM / Prometheus):scatter-gather 查询合并
- 配置来源:Consul KV,通过 consul-template 自动同步
注意事项
- Promxy 本身无本地存储:recording rules 输出必须配 remote_write 推到后端
- 性能开销:scatter-gather 模式,下游组多时有一定网络开销
- VM 必须设 remote_read=false:VM 不支持 remote_read API
- 集群版路径前缀:VM 集群版 vmselect 需要
path_prefix: /select/0/prometheus - 版本选择:避免
latesttag,用具体版本号
参考
- Promxy GitHub: https://github.com/jacksontj/promxy
- VictoriaMetrics 文档: https://docs.victoriametrics.com/
- Prometheus remote_read: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read