$ oc exec <sample_pod> -n <sample_namespace> -- curl <target_pod_IP>:<port>/metrics
查找用户定义的项目监控常见问题的故障排除步骤。
如果监控用户定义的项目时指标未显示,请按照以下步骤对问题进行故障排除。
查询指标名称并验证项目是否正确
在 Web 控制台的**开发者**视角中,单击**观察**,然后转到**指标**选项卡。
在**项目:**列表中选择要查看其指标的项目。
从**选择查询**列表中选择现有查询,或通过向**表达式**字段添加 PromQL 查询来运行自定义查询。
指标将显示在图表中。
必须按项目进行查询。显示的指标与您选择的项目相关。
验证您想要从中获取指标的 Pod 是否正在主动提供指标。运行以下oc exec
命令进入 Pod 以定位podIP
、port
和/metrics
。
$ oc exec <sample_pod> -n <sample_namespace> -- curl <target_pod_IP>:<port>/metrics
您必须在安装了 |
以下示例输出显示具有有效版本指标的结果。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
# HELP version Version information about this binary-- --:--:-- --:--:-- 0
# TYPE version gauge
version{version="v0.1.0"} 1
100 102 100 102 0 0 51000 0 --:--:-- --:--:-- --:--:-- 51000
无效输出表示相应的应用程序存在问题。
如果您使用的是PodMonitor
CRD,请验证PodMonitor
CRD 是否已配置为使用标签匹配指向正确的 Pod。有关更多信息,请参阅 Prometheus Operator 文档。
如果您使用的是ServiceMonitor
CRD,并且 Pod 的/metrics
端点显示指标数据,请按照以下步骤验证配置
验证服务是否指向正确的/metrics
端点。此输出中的服务labels
必须与服务监控labels
和后续步骤中服务定义的/metrics
端点匹配。
$ oc get service
apiVersion: v1
kind: Service (1)
metadata:
labels: (2)
app: prometheus-example-app
name: prometheus-example-app
namespace: ns1
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
name: web
selector:
app: prometheus-example-app
type: ClusterIP
1 | 指定这是一个服务 API。 |
2 | 指定此服务正在使用的标签。 |
查询serviceIP
、port
和/metrics
端点,查看是否与您之前在 Pod 上运行的curl
命令中的相同指标。
运行以下命令查找服务 IP
$ oc get service -n <target_namespace>
查询/metrics
端点
$ oc exec <sample_pod> -n <sample_namespace> -- curl <service_IP>:<port>/metrics
有效的指标将在以下示例中返回。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 102 100 102 0 0 51000 0 --:--:-- --:--:-- --:--:-- 99k
# HELP version Version information about this binary
# TYPE version gauge
version{version="v0.1.0"} 1
使用标签匹配来验证ServiceMonitor
对象是否已配置为指向所需的服务。为此,请将oc get service
输出中的Service
对象与oc get servicemonitor
输出中的ServiceMonitor
对象进行比较。标签必须匹配才能显示指标。
例如,从前面的步骤中,请注意Service
对象如何具有app: prometheus-example-app
标签,以及ServiceMonitor
对象如何具有相同的app: prometheus-example-app
匹配标签。
如果一切看起来都有效但指标仍然不可用,请联系支持团队以获取更多帮助。
开发人员可以创建标签以键值对的形式定义指标的属性。潜在的键值对数量对应于属性的可能值数量。具有无限数量潜在值的属性称为无界属性。例如,customer_id
属性是无界的,因为它具有无限数量的可能值。
每个分配的键值对都具有唯一的时间序列。在标签中使用许多无界属性会导致创建的时间序列数量呈指数级增长。这会影响 Prometheus 的性能,并可能占用大量磁盘空间。
当 Prometheus 占用大量磁盘空间时,您可以使用以下措施
**使用 Prometheus HTTP API 检查时间序列数据库 (TSDB) 状态**,以获取有关哪些标签正在创建最多时间序列数据的更多信息。这样做需要集群管理员权限。
**检查正在收集的抓取样本数量**。
**减少创建的唯一时间序列的数量**,方法是减少分配给用户定义指标的无界属性的数量。
使用绑定到有限可能值集的属性可以减少潜在的键值对组合的数量。 |
**对跨用户定义项目可以抓取的样本数量强制执行限制**。这需要集群管理员权限。
您可以作为具有dedicated-admin
角色的用户访问集群。
您已安装 OpenShift CLI (oc
)。
在**管理员**视角中,导航到**观察**→**指标**。
在**表达式**字段中输入 Prometheus 查询语言 (PromQL) 查询。以下示例查询有助于识别可能导致高磁盘空间消耗的高基数指标
通过运行以下查询,您可以识别具有最高抓取样本数量的十个作业
topk(10, max by(namespace, job) (topk by(namespace, job) (1, scrape_samples_post_metric_relabeling)))
通过运行以下查询,您可以通过识别在过去一小时内创建了最多时间序列数据的十个作业来查明时间序列波动
topk(10, sum by(namespace, job) (sum_over_time(scrape_series_added[1h])))
调查分配给具有高于预期抓取样本计数的指标的无界标签值的數量
**如果指标与用户定义的项目相关**,请查看分配给您的工作负载的指标键值对。这些是在应用程序级别通过 Prometheus 客户端库实现的。尝试限制标签中引用的无界属性的数量。
**如果指标与 AWS 项目上的核心 Red Hat OpenShift 服务相关**,请在Red Hat 客户门户上创建一个 Red Hat 支持案例。
以dedicated-admin
身份登录后,请按照以下步骤使用 Prometheus HTTP API 查看 TSDB 状态
运行以下命令获取 Prometheus API 路由 URL
$ HOST=$(oc -n openshift-monitoring get route prometheus-k8s -ojsonpath={.status.ingress[].host})
运行以下命令提取身份验证令牌
$ TOKEN=$(oc whoami -t)
运行以下命令查询 Prometheus 的 TSDB 状态
$ curl -H "Authorization: Bearer $TOKEN" -k "https://$HOST/api/v1/status/tsdb"
"status": "success","data":{"headStats":{"numSeries":507473,
"numLabelPairs":19832,"chunkCount":946298,"minTime":1712253600010,
"maxTime":1712257935346},"seriesCountByMetricName":
[{"name":"etcd_request_duration_seconds_bucket","value":51840},
{"name":"apiserver_request_sli_duration_seconds_bucket","value":47718},
...
作为集群管理员,您可以解决为 Prometheus 触发的KubePersistentVolumeFillingUp
警报。
当openshift-monitoring
项目中由prometheus-k8s-*
pod 声明的持久卷 (PV) 的剩余空间少于 3% 时,此关键警报会触发。这可能会导致 Prometheus 运行异常。
存在两个
|
要解决此问题,您可以删除 Prometheus 时间序列数据库 (TSDB) 块,为 PV 创建更多空间。
您可以作为具有dedicated-admin
角色的用户访问集群。
您已安装 OpenShift CLI (oc
)。
运行以下命令列出所有 TSDB 块的大小,按从旧到新的顺序排序
$ oc debug <prometheus_k8s_pod_name> -n openshift-monitoring \(1)
-c prometheus --image=$(oc get po -n openshift-monitoring <prometheus_k8s_pod_name> \(1)
-o jsonpath='{.spec.containers[?(@.name=="prometheus")].image}') \
-- sh -c 'cd /prometheus/;du -hs $(ls -dt */ | grep -Eo "[0-9|A-Z]{26}")'
1 | 将<prometheus_k8s_pod_name> 替换为KubePersistentVolumeFillingUp 警报说明中提到的 pod。 |
308M 01HVKMPKQWZYWS8WVDAYQHNMW6
52M 01HVK64DTDA81799TBR9QDECEZ
102M 01HVK64DS7TRZRWF2756KHST5X
140M 01HVJS59K11FBVAPVY57K88Z11
90M 01HVH2A5Z58SKT810EM6B9AT50
152M 01HV8ZDVQMX41MKCN84S32RRZ1
354M 01HV6Q2N26BK63G4RYTST71FBF
156M 01HV664H9J9Z1FTZD73RD1563E
216M 01HTHXB60A7F239HN7S2TENPNS
104M 01HTHMGRXGS0WXA3WATRXHR36B
确定可以删除哪些块以及要删除多少块,然后删除这些块。以下示例命令从prometheus-k8s-0
pod 中删除三个最旧的 Prometheus TSDB 块
$ oc debug prometheus-k8s-0 -n openshift-monitoring \
-c prometheus --image=$(oc get po -n openshift-monitoring prometheus-k8s-0 \
-o jsonpath='{.spec.containers[?(@.name=="prometheus")].image}') \
-- sh -c 'ls -latr /prometheus/ | egrep -o "[0-9|A-Z]{26}" | head -3 | \
while read BLOCK; do rm -r /prometheus/$BLOCK; done'
运行以下命令验证已挂载的 PV 的使用情况,并确保有足够的可用空间
$ oc debug <prometheus_k8s_pod_name> -n openshift-monitoring \(1)
--image=$(oc get po -n openshift-monitoring <prometheus_k8s_pod_name> \(1)
-o jsonpath='{.spec.containers[?(@.name=="prometheus")].image}') -- df -h /prometheus/
1 | 将<prometheus_k8s_pod_name> 替换为KubePersistentVolumeFillingUp 警报说明中提到的 pod。 |
以下示例输出显示由prometheus-k8s-0
pod 声明的已挂载 PV,剩余空间为 63%
Starting pod/prometheus-k8s-0-debug-j82w4 ...
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p4 40G 15G 40G 37% /prometheus
Removing debug pod ...