You need to enable JavaScript to run this app.
文档中心
托管 Prometheus

托管 Prometheus

复制全文
下载 pdf
常见问题
无法正确查看到预期的指标?
复制全文
下载 pdf
无法正确查看到预期的指标?
托管 Prometheus 支持监控容器服务等云服务,也支持通过 ServiceMonitor、PodMonitor、Service/Pod annotation 进行服务发现。但是,有时候当您完成配置后,却无法正确检索到预期指标。本文为您介绍如何进行此类故障的排除。
故障现象
使用托管 Prometheus 进行容器服务集群监控时,开启资源监控或配置 ServiceMonitor 或 PodMonitor 后,并未采集到期望的指标数据。
原因分析
造成您无法查看到期望指标的可能原因有:
  1. 查询语句错误,导致无法查询出正确的结果。
  1. 确认 Target 被发现且正常采集。
  • 服务发现配置错误,导致 Target 未被正确发现。
  • 业务 Pod 自身和采集端点异常。
  1. 查询的指标有误。
整体排障流程如下图所示。其中,Target、Exporter 端口均为示例。
Image
排障步骤
步骤一:确认指标查询和写入
确认指标是否存在
  1. 登录 VMP 服务控制台
  1. 在顶部导航栏,选择目标地域。
  1. 单击左侧导航栏的 Explore,进入 Explore 页面。
  1. 在右上角的配置项中,配置需要查询指标的 工作区,并在 指标检索 文本框内,输入对应的指标名称,确认指标是否已经被采集和存储。
  • Image
确认指标查询语句
查询指标时,请首先确认您使用的查询语句正确。错误的查询语句会导致查询出的指标错误,或者干脆查询不出任何结果。
如果查询语句有问题,请及时修改。查询语句的使用方法,请参见 PromQL 基本用法
检查写入指标
  1. 登录 VMP 服务控制台
  1. 单击左侧导航栏的 工作区,在工作区列表中选择需要查看监控数据的 的工作区,单击 工作区名称,进入工作区配置界面。
  1. 在左侧导航栏中单击 监控。
  1. 在监控页面,检查工作区的自监控,查看是否有被限流或者丢点的流量。
Image
步骤二:确认 Target 被发现且正常采集
您可以采用如下步骤,确定采集器是否正确发现 Target 且正常采集:
(推荐)方式一:通过 prometheus-agent dashboard 确认 Target 状态
prometheus-agent 提供了一个使用便捷的排障页面,大部分场景下都可以依赖该页面排查出问题。
  1. 访问 prometheus-agent dashboard。
  • 通过本地浏览器访问
  1. 通过 port-forward 方式本地访问 prometheus-agent 的端口。
  • # 本地执行
    kubectl -nkube-system port-forward svc/vmagent-prometheus-agent 8429:8429
说明
  • 需要确保本地可以通过 kubeconfig 公网访问。如果有其他类似隧道的方式,也可以打通本地到 K8s prometheus-agent 网络。
  • 默认监听本地 localhost 端口,如果需要全网卡,请在命令行中添加 --address 0.0.0.0
  • kubectl -nkube-system port-forward svc/vmagent-prometheus-agent 8429:8429 --address 0.0.0.0
  1. 本地访问 localhost:8429
  • 您需要关注 targetsservice-discovery 这两个模块。首页如下所示。
  • Image
  • 无法本地访问的替代方式
  • 某些场景下无法本地访问 dashboard,比如临时排查问题申请了线上用户的 kubectl 读权限后,虽然可以执行 kubectl port-forward,但是无法通过本地浏览器访问 dashboard,只能通过手动 curl prometheus-agent API 查看返回的 JSON 内容。
  • curl 命令
    说明
    curl localhost:8429/targets
    查询 target 抓取状态,会返回类似如下的打印信息。您可以通过 grep 的方式过滤具体的 job。对应 dashboard 的 target 列表。
    job=nodeScrape/kube-system/kubelet-cadvisor/1 (3/3 up)
    state=up, endpoint=https://192.168.XX.XX:10250/metrics/cadvisor, labels={ecs="i-ydh********9xk",instance="192.168.XX.XX",job="kubelet-cadvisor",machine="ncsd********ibkg",machinepool="pcsd********if30",node="192.168.XX.XX"}, scrapes_total=85661, scrapes_failed=5, last_scrape=6229ms ago, scrape_duration=41ms, samples_scraped=1603, error=
    state=up, endpoint=https://192.168.XX.XX:10250/metrics/cadvisor, labels={ecs="i-ydh********rfb",instance="192.168.XX.XX",job="kubelet-cadvisor",machine="ncsc********h3j0",machinepool="pcsc********h3ig",node="192.168.XX.XX"}, scrapes_total=85661, scrapes_failed=1, last_scrape=3407ms ago, scrape_duration=47ms, samples_scraped=1483, error=
    state=up, endpoint=https://192.168.XX.XX:10250/metrics/cadvisor, labels={ecs="i-ydg********0p6",instance="192.168.XX.XX",job="kubelet-cadvisor",machine="ncs3********islg",machinepool="pcs3********ssv0",node="192.168.XX.XX"}, scrapes_total=85660, scrapes_failed=3, last_scrape=14092ms ago, scrape_duration=92ms, samples_scraped=4593, error=
    在命令 curl -H 'accept:text/html' 'http://localhost:8429/targets' 中加上 accept header,可以返回 html 的格式。
    curl localhost:8429/api/v1/targets
    查询较为详细的 JSON 形式的 target 信息,分为 activeTargets 和 droppedTargets,每个 targets 里包括 meta labels。
    {
    "status": "success",
    "data": {
    "activeTargets": [
    ],
    "droppedTargets": [
    ]
    }
    }
    具体返回示例如下:
    "activeTargets": [
    {
    "discoveredLabels": {
    "__address__": "192.168.XX.XX:10250",
    "__meta_kubernetes_node_address_Hostname": "192.168.XX.XX",
    "__meta_kubernetes_node_address_InternalIP": "192.168.XX.XX",
    ...
    "__metrics_path__": "/metrics/cadvisor",
    "__scheme__": "https",
    "__scrape_interval__": "15s",
    "__scrape_timeout__": "10s",
    "instance": "192.168.XX.XX",
    "job": "nodeScrape/kube-system/kubelet-cadvisor/1"
    },
    "labels": {
    "ecs": "i-ydh9hrtxxcr9cxx9j9xk",
    "instance": "192.168.XX.XX",
    "job": "kubelet-cadvisor",
    "machine": "ncsd********ibkg",
    "machinepool": "pcsd********if30",
    "node": "192.168.XX.XX"
    },
    "scrapePool": "kubelet-cadvisor",
    "scrapeUrl": "https://192.168.XX.XX:10250/metrics/cadvisor",
    "lastError": "",
    "lastScrape": "2024-12-06T14:20:02.71+08:00",
    "lastScrapeDuration": 0.054,
    "lastSamplesScraped": 1603,
    "health": "up"
    }
    ...
    ]
    curl localhost:8429/config
    查看 prometheus-agent 读取到的原始配置。一般用 servicemonitor 等 CR 配置采集,operator 会自动加上一些 relabel,可以通过这个命令查看到实际被 prometheus-agent 读取到的完整的 scrape 采集配置。
  1. 单击 prometheus-agent dashboard 的 targets,检查采集 Target 是否正常。
  • Image
  • Taget 的名称来自配置的 job name,但是如果用 CR 的方式来配置,job 的命名格式为:
  • 采集方式
    对应格式
    servicemonitor 采集
    serviceScrape/<namespace>/<servicemonitor-name>/n
    podmonitor 采集
    podScrape/<namespace>/<servicemonitor-name>/n
    vmnodescrape 采集
    nodeScrape/<namespace>/<servicemonitor-name>/n
    通过 pod 的 annotation 采集
    pod
方式二:通过控制台确认 Target 状态
注意
通过 prometheus-agent dashboard 可以查看对应的服务是否被正确发现,控制台无法查看。
  1. 登录 VMP 服务控制台
  1. 在顶部导航栏,选择目标地域。
  1. 单击左侧导航栏的 Explore,进入 Explore 页面。
  1. 在右上角的配置项中,配置需要查询指标的 工作区,并在 指标检索 文本框内,输入up{job="xxxx"},查看对应的服务是否被正确发现。
  • Image
验证结果和解决方案
验证结果
解决方案
Target 未被识别
如果在 dashboard 上未找到对应的 Target 配置,通常是因为自定义的配置里有问题。
  • 使用 CR 采集
  • 请检查 ServiceMonitor 或者 PodMonitor 配置是否正确。具体请参见 服务发现
  • 注意事项:
  • ServiceMonitor 或者 PodMonitor 带有火山标识的 label volcengine.vmp: "true",才会被 Prometheus-agent 发现。
  • kind: ServiceMonitor
    metadata:
    labels:
    volcengine.vmp: "true"
    ...
  • ServiceMonitor 或者 PodMonitor 默认采集当前 namespace下的 pod。您可以加一个 namespaceSelector 指定 namespace 或者如下述运行采集所有的 namespace。
  • namespaceSelector:
    any: true
  • ServiceMonitor 里的 selector 匹配的是 service 本身的 label,与 service spec 里的 selector 无关。
  • 使用 Pod Annotation 采集
  • 添加 Pod annotation 的格式参考如下:
  • prometheus.io/path: /metrics
    prometheus.io/port: "8888"
    prometheus.io/scrape: "true"
注意
  • kube-system 命名空间下的 Pod 默认不会被采集。
  • 如果 Pod Yaml 里没有定义和 prometheus.io/port 定义一致的 port,则不会被采集。
  • ports:
    - containerPort: 8888
    name: metrics
Target DROPPED
在 prometheus-agent dashboard 的 discovered targets 里,如果检查到有 Target 被 DROPPED,通常是因为错误使用 relabel 配置导致过滤了该指标。
Image
  1. 单击右边的 debug 链接进行排查。
  1. 查看带有原始 meta label 的 original labels 指标。
  • Image
  1. 查看每一个 relabel 的 step 前后的结果。
  • Image
  • 如果是红色,表示 drop 掉的 label。
  • 如果是蓝色,表示 add 上的 label。
  1. 找到非预期的 step,和自定义的 relabel 配置进行对比,检查是否有问题。
Target UP
如果 Target 状态是 UP,通常是其他原因导致的。通过以下步骤排障。
  • 检查 prometheus-agent 日志
  • 部分指标未暴露
  • 检查基础指标
  • 大部分的常见指标,可以在 VKE 控制台 观测配置 查看,是否开启组件将指标 drop。
  • Image
  • 自定义指标
  • 检查自定义 serviceMonitor/podMonitor 里的 relabel 配置,是否过滤了该指标。
Target DOWN
如果 Target DOWN,请查看 last error 字段,通常可能原因为:
  • 网络问题:prometheus-agent 到 exporter 端口网络不通导致 connection refused。
  • 请检查网络问题,可能为安全组配置错误等。
  • 配置问题:比如 http 写成 https 等,导致请求直接返回 EOF 等。
  • Image
步骤三:检查采集器状态
方式一:使用 kubectl 检查采样器状态
# 查看pod是否存在
kubectl -nkube-system get po |grep vmagent
# 查看pod事件
kubectl -nkube-system describe po vmagent-prometheus-agent-0
# 查看pod日志
kubectl -nkube-system logs vmagent-prometheus-agent-0 -cvmagent --tail=100
方式二:使用控制台检查采样器状态
  1. 在左侧菜单栏中选择 集群,并在右侧集群列表中选择采集器所在集群。
  1. 单击集群名称,进入集群配置页面。
  1. 在左导航栏中选择 工作负载 > 有状态负载,在 kube-system 命名空间下,查看采集器 vmagent-prometheus-agent 的 Pod 状态和日志。
  • Image
验证结果和解决方案
检查 prometheus-agent 状态
可能原因
解决方案
状态异常只有初始化 Job
如果 prometheus-agent 状态异常,仅有一个 pre-install Job。
可能有 pre-delete Job,因为 vke addon 检测部署超时后会自动卸载。
请查看 Job 对应 pod 的日志,查看 pod 的状态和事件等。
  • 部署 VKE 集群时,如果勾选了部署 prometheus-agent,但是部署的时间很长,可能是待部署 agent 的资源没运行,导致 prometheus-agent 组件部署超时(无法调度等),展示状态为异常。
  • pre-install Job 会调用 VKE 的 OpenAPI 接口获取默认指标列表,请检查 VKE pod 子网的安全组规则。
没有 prometheus-agent
  1. 检查 VKE 总览 里的 运维配置,确认已经开启 Prometheus 工作区。
  1. 请检查集群里有 monitoring-config configMap。
  • 只有集群里有该 configMap,才会创建出 prometheus-agent。如果不存在,请单击 此处 提交工单。
  • # 检查是否有该configMap
    kubectl -nkube-system get cm monitoring-config
prometheus-agent OOM
建议在 prometheus-agent 的参数配置里完成以下操作:
  • 增大资源内存上限
  • 开启 组件扩缩容
采集发送链路异常
可能的原因有:
  • exporter 和 prometheus-agent 的网络问题
说明
请先确保 exporter 状态正常和安全组配置正确。
  • prometheus-agent 本身有问题
  • prometheus-agent 到 vmp workspace 的问题
请结合 检查 prometheus-agent 日志prometheus-agent 基础指标 监控面板进行排查,具体操作步骤请参见 检查 prometheus-agent 状态
步骤四:检查采集对象中的指标
您可以采用如下步骤,确认 Target 中确实存在您需要的指标:
  1. 在本地环境中,使用 kubectl 连接采集器所在集群,检查 Exporter 状态异常。
  1. 确认是否 Metrics 接口异常或者指标未暴露。
  • 在 prometheus-agent dashboard 上,单击 Active targets 页签,查看对应的 target response。
  • Image
  • 如果端口不通,不会为 UP 状态,请查看对应展示的 Error 状态。
  • 如果要确认是否个别指标没有获取到,请在返回的指标页面里,直接搜索对应指标 metric 名。
  • 通过 curl 手动检查
  1. 执行以下命令,将采集对象(例如 Exporter)的端口映射到本地。
  • kubectl port-forward pod/rabbitmq-exporter-5fxxxx 9419:9419 -n volcano-metrics
说明
  • 采集对象可能部署在集群中,也可能部署在集群外部(例如部署在 ECS 主机上),本例以采集对象部署在集群中举例。如果采集对象部署在集群外部,您可以直接使用 curl http://target-ip:port/metrics 的方式访问到采集对象。
  • rabbitmq-exporter-5fxxxx 为采集对象的实例名称,本例中以 RabbitMQ-Exporter 为例,您需要在实际操作中替换成您的采集对象的实例名称。
  • 9419 为该采集对象暴露指标的端口号。不同采集对象的端口号不同,您需要在实际操作中替换成正确的端口号。
  • -n volcano-metrics 为采集对象所在的命名空间,您需要在实际操作中替换成采集对象所在的命名空间。
  1. 在本地环境(Linux/Mac)中打开浏览器,在地址栏中输入 localhost:9419,进入采集对象页面,查看您查询的指标是否被正常采集到。
  • Image
  1. 如果您的查询指标依然没有被正确采集到,有如下几种可能:
  • 您所查询的指标已被废弃,请查看该采集对象的官方文档,进行确认。
  • 您还没有完成指标对应的配置。例如:在 Kafka 中,如果您没有配置 Topic,则无法查询 kafka_topic_partitions 等关于 Topic 的指标项。
相关文档
最近更新时间:2025.07.01 14:36:48
这个页面对您有帮助吗?
有用
有用
无用
无用