Prometheus Adapter 需通过 rules.yaml 显式配置才能识别 Go 服务自定义指标;seriesQuery 必须精确匹配指标名,resources 必须指定 template 或 overrides,metricQuery 应使用 rate() 等函数处理 Counter,name 字段需与 HPA 中 metric.name 完全一致。

怎么让 Prometheus Adapter 识别你写的 Go 服务自定义指标
它不会自动发现你的 http://localhost:8080/metrics,更不会猜你暴露的是 http_requests_total 还是 api_latency_seconds_bucket。必须显式告诉 Adapter 哪些指标能被 Kubernetes HPA 拿去用。
核心动作是写一份 rules.yaml,然后挂进 Adapter 的 ConfigMap。Adapter 启动时会加载它,把原始指标“翻译”成 HPA 能理解的资源格式(比如 custom.metrics.k8s.io/v1beta1)。
- 规则里
seriesQuery要精确匹配你 Go 服务暴露的指标名,大小写、下划线都不能错 -
resources字段必须指定template或overrides,否则 Adapter 启动报错:resource mapping not defined - 如果你用
promhttp.Handler()暴露指标,默认路径是/metrics,但 Adapter 默认只抓serviceMonitor或Prometheus配置的 targets——得确认你的 Go 服务已被 Prometheus 正确采集,否则 Adapter 查不到任何数据
Go 服务里暴露指标时,哪些写法会让 Adapter 解析失败
Adapter 不解析指标注释(# HELP / # TYPE),但它依赖指标名和标签结构做聚合。一旦命名不规范或标签缺失,HPA 就拿不到数值。
- 避免用动态 label 值做关键维度,比如
user_id="12345"——HPA 无法按此伸缩,Adapter 规则里也难写name匹配 - 计数器(
Counter)不能直接给 HPA 用,HPA 需要的是速率(rate())或当前值(gauge)。Adapter 规则里若写metricQuery: "my_app_http_requests_total",实际查出来是累计值,HPA 会误判 - 别漏掉
constLabels:如果 Go 代码里用promauto.NewCounterVec但没传nil或显式空 map,Adapter 可能因 label 数量不一致拒绝该时间序列
示例(正确):
httpRequests := promauto.NewCounterVec(prometheus.CounterOpts{
Name: "my_app_http_requests_total",
Help: "Total number of HTTP requests",
}, []string{"method", "status_code"})
这样 Adapter 才能通过 seriesQuery: "my_app_http_requests_total" + resources: {template: "pod{{.Resource}}"} 关联到 Pod 级别。
立即学习“go语言免费学习笔记(深入)”;
Adapter 查询超时或返回空数据,排查哪几处
不是 Go 服务没启,而是 Adapter 和 Prometheus 之间的链路断在某个环节。最常见是查询表达式语法错、Prometheus 返回空、或 Adapter 缓存未刷新。
- 先手动 curl Adapter 的 API:
curl "http://adapter/api/v1/namespaces/default/custom-metrics/pods/*/my_app_http_requests_total",看是否返回items: []还是直接 500 - 如果返回空,立刻去 Prometheus Web UI 执行相同
query(比如rate(my_app_http_requests_total[5m])),确认有数据且时间范围对得上 - 检查 Adapter 日志里的
error行,高频出现no metrics found for query多半是seriesQuery写成了带函数的表达式(如rate(...))——它只接受纯指标名,函数得写在metricQuery里 - Adapter 默认缓存 30 秒,改了规则后等太久?加
--log-level=debug启动,看日志里有没有reloading rules from configmap
为什么 HPA 显示 unknown 而不是具体数值
HPA controller 拿到 Adapter 返回的数据后,会校验字段完整性。只要 value 是空、类型不对、或单位不匹配,就标为 unknown,且不触发扩缩容。
- 确保 Adapter 规则中
metricQuery返回的是单个数字(scalar),不是 vector。例如写成sum(rate(my_app_http_requests_total[5m])) by (pod)是 OK 的;但rate(my_app_http_requests_total[5m])会返回多条,HPA 拒绝处理 - Go 服务暴露的指标类型要和查询语义一致:想按 QPS 扩容,就用
Counter+rate();想按当前连接数,就用Gauge直接查最新值 - HPA 要求
value字段是字符串格式的数字(如"123"),不是 JSON number。Adapter 一般自动处理,但如果用了自定义valueFactory,务必返回 string
最易忽略的一点:Adapter 的 rules.yaml 里 name 字段必须和 HPA 的 metrics[].metric.name 完全一致,包括大小写和下划线——差一个字符,HPA 就找不到对应指标,只能显示 unknown。










