Prometheus 监控:核心概念、应用场景与实战指南
在现代云原生和微服务架构中,对系统和应用的实时可观测性(Observability)变得至关重要。Prometheus 作为一款领先的开源监控系统,凭借其独特的拉取(Pull)模型、强大的时间序列数据模型以及灵活的查询语言 PromQL,成为了DevOps和SRE团队的首选。本文将围绕“是什么、为什么、哪里、多少、如何、怎么”等核心疑问,深入探讨Prometheus监控的方方面面,旨在提供一份详细而具体的实践指南。
是什么?Prometheus 监控的核心概念
Prometheus 是一个开源的系统监控和警报工具包,最初由 SoundCloud 开发。它采用一种独特的、基于拉取(Pull)的度量(Metrics)收集模型,其核心是一个时间序列数据库(TSDB),用于存储收集到的所有指标数据。
Prometheus 的核心组件:
- Prometheus Server:
- 度量收集器(Scraper):定期从配置的目标(Targets)拉取指标数据。
- 时间序列数据库(TSDB):将收集到的数据存储为时间序列数据。每个时间序列由一个度量名称(Metric Name)和一组键值对标签(Labels)唯一标识。
- HTTP Server:提供PromQL查询接口、Web UI以及API接口。
- Exporters(数据暴露器):
- 一种轻量级代理,运行在被监控的服务或主机上。
- 负责将目标服务的内部指标数据转换成Prometheus可识别的格式(通常是HTTP暴露的文本格式)。
- 例如:
- Node Exporter:用于收集主机的操作系统和硬件指标(CPU、内存、磁盘、网络等)。
- cAdvisor:用于收集容器运行时的资源使用情况。
- JMX Exporter:用于收集Java应用程序通过JMX暴露的指标。
- 各种特定应用 Exporter:如MySQL Exporter、Redis Exporter、Kafka Exporter等。
- Pushgateway(推送网关):
- Prometheus 采用拉取模型,但对于一些短生命周期(Short-lived)的批处理作业或无法被Prometheus直接拉取的场景,Pushgateway 提供了一个中间件。
- 作业可以将指标推送到Pushgateway,然后Prometheus再从Pushgateway拉取这些指标。
- Alertmanager(告警管理器):
- 独立的组件,接收Prometheus Server发送的告警信息。
- 负责对告警进行去重、分组、抑制(Inhibition)和静默(Silences)处理,然后根据路由配置发送到不同的通知渠道(如邮件、Slack、PagerDuty、Webhook等)。
- Grafana(可视化工具):
- 虽然不是Prometheus项目的一部分,但它是Prometheus数据可视化的事实标准。
- Grafana 可以将Prometheus作为数据源,通过其丰富的图表和仪表盘功能,将Prometheus收集到的原始时间序列数据以直观、易懂的方式呈现出来,帮助用户进行监控和分析。
数据模型:时间序列与标签
Prometheus 的核心是多维数据模型。所有数据都以时间序列的形式存储:由度量名称和一组键值对标签组成。
例如:
http_requests_total{method="post", path="/api/v1/users", status="200"} 100
这里http_requests_total是度量名称,{method="post", path="/api/v1/users", status="200"}是标签集。标签允许您在维度上细分指标,例如按HTTP方法、路径或状态码来查看请求总数。
查询语言:PromQL
PromQL(Prometheus Query Language)是Prometheus强大且灵活的查询语言,专门为时间序列数据设计。它支持:
- 选择器:根据度量名称和标签过滤时间序列。
- 操作符:算术、比较、逻辑操作符。
- 聚合函数:
sum(),avg(),max(),min(),count()等,支持by或without关键字进行维度聚合。 - 范围向量操作:
rate(),irate(),increase()等,用于计算时间序列在一段时间内的变化率或增长量。 - 函数:丰富的内置函数,用于数据处理(如预测、排序等)。
为什么?选择 Prometheus 的关键优势
选择Prometheus作为您的监控解决方案,有诸多理由。
1. 强大的多维数据模型与PromQL
- 细粒度洞察:标签允许您根据任何维度(例如:实例、服务版本、区域、租户ID)对数据进行切片和聚合,提供比传统监控系统更细粒度的洞察。
- 灵活查询:PromQL 是其核心优势之一。它不仅可以查询原始数据,还能进行复杂的聚合、计算和预测,帮助您快速定位问题、分析趋势,甚至预测潜在问题。例如,您可以轻松计算过去5分钟的请求成功率,或找出CPU使用率最高的10个实例。
2. 云原生友好
- 服务发现:Prometheus 原生支持多种服务发现机制(如Kubernetes、Consul、DNS、文件等),能够动态发现和监控短暂或频繁变化的微服务实例,非常适合云原生环境。
- 容器化部署:Prometheus 及其组件本身就可以很好地运行在容器和Kubernetes集群中,易于部署、管理和扩展。
3. 高效的拉取模型
- 简化部署与管理:Prometheus 主动从目标拉取数据,避免了在每个被监控实例上维护推送配置的复杂性。只需配置Prometheus Server,让它知道去哪里拉取即可。
- 故障弹性:当被监控服务短暂不可用时,Prometheus 会重试拉取,而不是丢失数据。它还能够更直观地展示哪些目标是不可达的。
- 目标身份发现:拉取模型使得Prometheus能够更容易地与服务发现集成,自动发现和监控新上线或下线的服务实例。
4. 丰富的生态系统与活跃的社区
- 广泛的 Exporter 支持:几乎所有主流应用和系统都有现成的 Exporter,使得集成变得非常简单。即使没有,也可以通过Prometheus客户端库轻松为自定义应用开发 Exporter。
- 与 Grafana 的深度集成:Grafana 提供了卓越的可视化体验,可以方便地构建复杂的仪表盘,结合PromQL的强大功能,实现高度定制化的监控视图。
- 强大的社区支持:Prometheus 拥有庞大而活跃的社区,这意味着您可以轻松找到文档、教程、问题解决方案和持续的软件更新。
5. 内置告警功能
- Prometheus Server 负责评估告警规则,并将触发的告警发送给 Alertmanager。Alertmanager 提供了高级的告警处理功能,如分组、抑制和静默,有效减少告警风暴,确保只有重要且可操作的告警被发送出去。
哪里?Prometheus 系统的部署与组件分布
Prometheus 系统通常由多个独立组件协同工作,它们的部署位置和方式会根据您的基础设施规模和复杂性而异。
1. Prometheus Server 的部署位置
- 独立服务器/虚拟机:对于中小型环境,可以将 Prometheus Server 部署在一台专用的Linux服务器或虚拟机上。这提供了良好的性能隔离和管理便利性。
- 容器化部署(Docker/Podman):将 Prometheus 及其配置打包成 Docker 镜像,通过 `docker run` 或 `docker-compose` 进行部署。适用于快速启动和测试环境。
- Kubernetes 集群内部(推荐):在云原生环境中,将 Prometheus 部署为 Kubernetes Pod 是最常见的做法。通常会使用 Prometheus Operator 或 Helm Charts 来自动化部署和管理。
- 优势:利用 Kubernetes 的编排能力进行自动扩缩容、高可用、服务发现。
- 存储:通常使用持久卷(Persistent Volume)来存储时间序列数据。
2. Exporters 的部署位置
Exporters 运行在它们所监控的服务或主机上,是 Prometheus 拉取数据的源头。
- 物理/虚拟机主机:将 Node Exporter、MySQL Exporter 等直接安装在相应的服务器上,作为后台服务运行。
- 容器/Pod 内部:
- Sidecar 模式:对于应用程序的 Exporter(如 JMX Exporter、Redis Exporter),可以将其作为同一个 Pod 中的 Sidecar 容器运行,与主应用程序容器共享网络命名空间和生命周期。这是 Kubernetes 环境中的常见模式。
- DaemonSet 模式:对于需要监控每个节点本身的指标(如 Node Exporter、cAdvisor),可以在 Kubernetes 中以 DaemonSet 的形式部署,确保每个节点上都有一个 Exporter Pod 运行。
3. Pushgateway 的部署位置
Pushgateway 通常用于短生命周期作业的指标收集。
- 可以部署在独立的服务器或虚拟机上,作为共享的指标接收点。
- 在 Kubernetes 中,可以作为 Deployment 部署,暴露一个 ClusterIP Service 供内部作业推送。
- 通常不需要每个作业都部署一个 Pushgateway,一个或少数几个实例足以服务大量作业。
4. Alertmanager 的部署位置
Alertmanager 独立于 Prometheus Server 运行,接收来自一个或多个 Prometheus Server 的告警。
- 独立服务器/虚拟机:同 Prometheus Server,可以部署在专用机器上。
- 容器化部署:通过 Docker 或 Kubernetes Deployment 部署。
- 高可用部署:Alertmanager 支持集群模式,可以部署多个实例以实现高可用性,它们之间会互相通信以同步状态和抑制信息。
5. Grafana 的部署位置
Grafana 负责数据可视化,它也通常作为独立服务部署。
- 独立服务器/虚拟机:最常见的部署方式。
- 容器化部署:Docker 镜像部署方便快捷。
- Kubernetes 集群内部:作为 Deployment 部署,并暴露一个 Ingress 或 NodePort Service 供外部访问。
- Grafana 只需要通过 HTTP(S) 协议访问 Prometheus Server 的 API 即可获取数据,因此它们可以部署在不同的网络或安全域中,只要网络可达即可。
多少?资源需求与规模考量
Prometheus 的资源消耗主要取决于它收集的指标数量、时间序列的基数(Cardinality)、抓取频率以及数据的保留时长。
1. 磁盘空间
- 主要消耗:Prometheus 的数据存储在本地磁盘上。磁盘 I/O 性能至关重要,强烈建议使用 SSD。
- 估算方法:
- 一个时间序列样本(Sample)通常占用 1-2 字节。
- 一个活跃时间序列每秒产生 1/抓取间隔 个样本。
- 粗略估算:对于大约 100 万个活跃时间序列,以 15 秒的抓取间隔(每秒约 6.6 万个样本),每天大约产生 5.7 * 10^9 个样本。如果每个样本平均占用 1.5 字节,则每天需要约 8.5 GB 的存储空间。
- 高基数影响:如果您的指标包含大量独特的标签组合(即高基数),活跃时间序列的数量会急剧增加,从而导致存储需求和内存需求大幅上升。例如,如果您的服务版本、租户ID、请求路径等标签组合数量非常大,需要特别注意。
- 数据保留策略:Prometheus 默认保留 15 天数据。您可以通过配置 `storage.tsdb.retention.time` 参数来调整。保留时间越长,所需磁盘空间越大。
2. 内存(RAM)
- 主要消耗:Prometheus 的 TSDB 会将部分索引和活跃时间序列数据缓存在内存中以提高查询性能。
- 影响因素:活跃时间序列的数量是内存消耗的主要驱动因素。高基数指标会显著增加内存使用。
- 估算:通常,每 100 万个活跃时间序列可能需要几 GB 到十几 GB 不等的内存,具体取决于标签复杂度和查询模式。
- 告警规则和记录规则:复杂的告警规则和记录规则计算也会占用一定内存。
3. CPU
- 主要消耗:数据抓取(Scraping)、数据摄取(Ingestion)、TSDB 压缩、PromQL 查询计算以及告警规则评估都会消耗 CPU。
- 影响因素:抓取目标的数量、抓取间隔、数据量、查询复杂度及频率、告警规则的数量和复杂性。
- 建议:通常,对于中等规模的部署(数十万活跃时间序列),一个具有 4-8 核 CPU 的实例就足够。对于大规模部署,可能需要更多核心或分布部署。
4. 网络带宽
- 出站(Outbound):Prometheus Server 向 Exporters 拉取数据,产生出站流量。
- 入站(Inbound):Exporters 响应 Prometheus Server 的拉取请求,产生入站流量。
- 通常,单个抓取目标的指标响应包大小不会太大,但如果抓取目标数量巨大且频率较高,累计带宽需求也会上升。告警通知(如发送到 Slack 或邮件)也会产生少量网络流量。
5. Alertmanager 资源
- Alertmanager 相对于 Prometheus Server 来说,资源需求通常较小。
- 主要消耗在于处理告警、与通知接收方通信。
- 通常 1-2 核 CPU 和 1-2 GB RAM 即可满足大部分需求。
6. Grafana 资源
- Grafana 的资源消耗取决于并发用户数、仪表盘的复杂度和查询频率。
- 对于大部分场景,一个 2-4 核 CPU 和 2-4 GB RAM 的实例即可满足需求。
如何?Prometheus 的基本操作与配置
本节将详细介绍 Prometheus 的安装、基本配置、数据抓取、PromQL 查询以及告警设置。
1. 安装 Prometheus
有多种方式可以安装 Prometheus Server:
方法一:通过二进制包安装(Linux)
- 下载:从 Prometheus 官方网站下载最新稳定版的二进制包。
wget https://github.com/prometheus/prometheus/releases/download/vX.Y.Z/prometheus-X.Y.Z.linux-amd64.tar.gz将 `X.Y.Z` 替换为实际版本号。
- 解压:
tar xvfz prometheus-X.Y.Z.linux-amd64.tar.gz cd prometheus-X.Y.Z.linux-amd64 - 运行:
./prometheus --config.file=prometheus.ymlPrometheus 会在默认端口 9090 启动其 Web UI。
方法二:使用 Docker 容器
这是最推荐的安装方式,尤其是在测试和开发环境中。
docker run -d \
-p 9090:9090 \
-v /path/to/your/prometheus.yml:/etc/prometheus/prometheus.yml \
--name prometheus \
prom/prometheus
请将 `/path/to/your/prometheus.yml` 替换为您本地的配置文件路径。
方法三:在 Kubernetes 中使用 Helm Charts
对于 Kubernetes 环境,使用 Prometheus Community Helm Chart 是最便捷的方式。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/prometheus
这将部署包括 Prometheus Server、Node Exporter、Kube-State-Metrics、Pushgateway、Alertmanager 和 Grafana 在内的完整监控栈。
2. Prometheus 的基本配置 (prometheus.yml)
Prometheus 的核心配置通过 YAML 文件完成。一个基本的 `prometheus.yml` 文件如下:
global:
scrape_interval: 15s # 抓取数据的时间间隔
evaluation_interval: 15s # 评估告警规则的时间间隔
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093'] # Alertmanager 的地址
rule_files:
- "alert.rules.yml" # 告警规则文件
scrape_configs:
- job_name: 'prometheus'
# 抓取 Prometheus 自身指标
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
# 抓取 Node Exporter 的指标
static_configs:
- targets: ['your_server_ip:9100'] # 替换为您的服务器IP及Node Exporter端口
- job_name: 'my_application'
# 抓取您自定义应用的指标
# 如果应用内部直接暴露了 /metrics 接口,或者使用了客户端库
static_configs:
- targets: ['your_app_ip:8080']
metrics_path: '/metrics' # 如果不是默认的 /metrics 路径
- job_name: 'kubernetes-nodes'
# Kubernetes 服务发现示例 (需要 Prometheus 运行在 K8s 中并有相应权限)
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250' # 匹配 Kubelet 的默认端口
target_label: __address__
replacement: '${1}:9100' # 将地址重写为 Node Exporter 的端口
- action: labelmap
regex: __meta_kubernetes_node_label_(.+) # 将节点标签添加到指标中
关键配置项:
global:定义全局参数,如默认的抓取间隔和告警规则评估间隔。alerting:配置 Alertmanager 的连接信息。rule_files:指定包含告警和记录规则的文件的路径。scrape_configs:定义 Prometheus 需要抓取的目标。job_name:定义一个作业名称,通常用于标识一组相关的目标。static_configs:最简单的配置方式,直接列出目标地址。kubernetes_sd_configs:利用 Kubernetes 的 API 自动发现目标。relabel_configs:强大的重贴标签机制,可以在抓取前对目标或指标的标签进行修改、过滤或添加。这对于动态环境和服务发现至关重要。
3. PromQL 查询示例
通过 Prometheus Web UI (通常在 `http://localhost:9090/graph`) 或 Grafana 来执行 PromQL 查询。
- 查询所有 CPU 使用率指标:
node_cpu_seconds_total - 查询特定实例的 CPU 使用率:
node_cpu_seconds_total{instance="your_server_ip:9100"} - 计算过去 5 分钟的平均 CPU 使用率(按 CPU 模式聚合):
sum by (mode) (rate(node_cpu_seconds_total[5m])) - 计算 HTTP 请求总量的 1 分钟平均增长率:
rate(http_requests_total[1m]) - 找出内存使用率超过 80% 的主机:
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 80
4. 告警规则配置 (alert.rules.yml)
告警规则通常定义在单独的 YAML 文件中,并在 `prometheus.yml` 中通过 `rule_files` 引用。
groups:
- name: general.rules
rules:
- alert: HostHighCpuUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m # 持续 5 分钟以上
labels:
severity: critical
annotations:
summary: "主机 {{ $labels.instance }} CPU 使用率过高"
description: "主机 {{ $labels.instance }} 的 CPU 使用率已超过 80% (当前值: {{ $value }}%) 持续 5 分钟。"
- alert: InstanceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Prometheus 目标 {{ $labels.instance }} 已宕机"
description: "Prometheus 无法从 {{ $labels.instance }} 拉取指标数据。"
告警规则的关键字段:
alert:告警的名称。expr:用于评估的 PromQL 表达式。当表达式结果为真时,告警可能被触发。for:指定告警条件需要持续多长时间才会被触发。这有助于避免短暂的瞬时问题引起告警风暴。labels:附加到告警上的自定义标签,可用于 Alertmanager 的路由、分组和抑制。severity是常用标签。annotations:用于提供告警的额外信息,如摘要、描述、修复建议等。支持模板变量(如{{ $labels.instance }},{{ $value }})。
5. Alertmanager 配置 (alertmanager.yml)
Alertmanager 有自己的配置文件,通常位于 `/etc/alertmanager/alertmanager.yml`。
global:
resolve_timeout: 5m
route:
receiver: 'default-receiver' # 默认接收器
group_by: ['alertname', 'severity'] # 按告警名称和严重级别分组
group_wait: 30s # 等待新告警加入组的时间
group_interval: 5m # 相同组的告警发送间隔
repeat_interval: 1h # 相同告警重复发送间隔
routes:
- match:
severity: 'critical'
receiver: 'critical-receiver'
group_wait: 10s
repeat_interval: 30m
receivers:
- name: 'default-receiver'
webhook_configs: # 例如发送到 Slack 的 Webhook
- url: 'http://localhost:9099/webhook' # 替换为实际的 webhook 地址
- name: 'critical-receiver'
email_configs: # 例如发送邮件
- to: '[email protected]'
send_resolved: true # 告警恢复时也发送通知
# ... 其他邮件配置,如 smarthost, auth_username, auth_password
inhibit_rules: # 抑制规则,避免相关告警重复发送
- source_match:
alertname: 'InstanceDown'
target_match:
alertname: 'HostHighCpuUsage'
equal: ['instance', 'job'] # 如果同一实例的 InstanceDown 告警触发,则抑制 HostHighCpuUsage 告警
Alertmanager 关键配置项:
global:全局设置,如告警解决超时时间。route:定义告警的路由树。receiver:默认的接收器。group_by:告警分组的标签。当这些标签相同的告警出现时,它们会被合并成一个通知。group_wait、group_interval、repeat_interval:控制告警分组和发送的频率。routes:基于标签匹配的路由规则,可以将告警发送到不同的接收器。
receivers:定义通知的接收方,支持多种类型(email_configs,webhook_configs,slack_configs,pagerduty_configs等)。inhibit_rules:抑制规则。当一个告警(源告警)被触发时,可以抑制另一个或一组相关告警(目标告警)的发送。这对于减少告警风暴非常重要。silences:静默规则。通过 Alertmanager Web UI 配置,可以在特定时间段内或基于特定标签匹配来静默告警。
怎么?高级应用、部署策略与最佳实践
掌握 Prometheus 的基本操作后,进一步的优化、扩展和维护是确保其长期稳定运行的关键。
1. 部署策略与高可用(HA)
a. 单机部署
- 优点:部署简单,资源消耗集中。
- 缺点:单点故障,数据保留时间有限。
- 适用场景:小型环境、测试、开发。
b. 高可用部署
- Prometheus Server HA:
- 双活模式:部署两个或更多独立的 Prometheus Server 实例,它们抓取相同的目标。每个实例可以有自己的 Alertmanager。当一个实例故障时,另一个可以继续提供监控和告警。缺点是数据存储不共享,历史查询需要区分。
- Thanos 或 Cortex:这是实现 Prometheus 高可用的主流方案。
- Thanos:
- Sidecar:与每个 Prometheus Server 并行运行,将 Prometheus 的数据块上传到对象存储(如S3、GCS)。
- Querier:提供一个统一的查询接口,从所有连接的 Prometheus 实例和对象存储中聚合数据。
- Compactor:优化对象存储中的数据。
- Receiver:用于接收远程写入的数据。
- 优点:提供全球视图、长期存储和高可用。
- Cortex:
- 一个多租户、高可用、可扩展的 Prometheus 兼容的长期存储系统。
- Prometheus 通过远程写入(Remote Write)将数据发送到 Cortex。
- 优点:适用于大规模多租户环境,提供数据持久化和全球查询。
- Thanos:
- Alertmanager HA:
- Alertmanager 本身支持集群模式。部署多个 Alertmanager 实例,它们通过 Gossip 协议互相发现并同步状态,确保告警只发送一次。
c. 联邦(Federation)
- 高层级的 Prometheus Server 从低层级的 Prometheus Server 拉取聚合后的指标。
- 适用于跨数据中心或大型组织的层次化监控。
- 注意:联邦通常用于聚合已经汇总的指标,不适合作为高可用或长期存储的解决方案。
2. 性能优化与最佳实践
a. 标签管理与基数控制
- 低基数原则:时间序列的基数(Cardinality,即标签组合的数量)是影响 Prometheus 性能和存储消耗最关键的因素。避免在标签中使用高基数的值,如用户ID、请求ID、时间戳等。
- 合理使用标签:标签应该用于可以聚合和过滤的维度。例如,实例名、服务版本、环境、地域等是合适的标签。
- 清理不必要的标签:使用 `relabel_configs` 在抓取阶段移除不必要的标签。
b. 抓取间隔与数据保留
- 合理设置抓取间隔:根据监控需求调整 `scrape_interval`。对变化不频繁的指标(如主机硬件状态)可以设置较长的间隔,而对关键业务指标可以设置较短间隔(如 5s 或 10s)。
- 数据保留策略:根据业务需求设置 `storage.tsdb.retention.time`。对于需要长期分析的数据,考虑使用 Thanos 或 Cortex 进行外部存储。
c. 告警规则与记录规则
- 记录规则(Recording Rules):对于频繁查询或计算开销大的 PromQL 表达式,可以将其定义为记录规则,让 Prometheus 定期计算并将结果存储为新的时间序列。这可以显著提升仪表盘加载速度和告警评估效率。
# 示例:记录每分钟的 HTTP 请求速率 groups: - name: application_rates rules: - record: job:http_requests_total:rate1m expr: rate(http_requests_total[1m]) - 告警规则设计:
- 可操作性:确保每个告警都是可操作的,即触发后知道如何响应。避免“噪音”告警。
- 聚合与阈值:结合 `for` 子句和适当的聚合函数,减少瞬时峰值造成的误报。
- 告警抑制(Inhibition):在 Alertmanager 中配置抑制规则,例如,当整个服务器宕机时,抑制该服务器上所有应用程序相关的告警。
- 告警分组(Grouping):合理分组,避免同一事件产生大量独立通知。
d. 监控 Prometheus 自身
- Prometheus 本身也暴露了一个 `/metrics` 端点,包含其自身的运行指标(如抓取成功率、TSDB 吞吐量、查询延迟等)。
- 务必配置 Prometheus 抓取自身的指标,并创建相应的仪表盘和告警,以确保监控系统本身的健康。
3. 数据接入与自定义指标
- 客户端库(Client Libraries):Prometheus 提供了多种编程语言的客户端库(如 Go, Java, Python, Ruby),您可以使用它们在应用程序中直接暴露自定义业务指标。这是将应用程序内部状态暴露给 Prometheus 的最直接和推荐的方式。
# Python 示例 from prometheus_client import start_http_server, Counter, Gauge import random import time REQUESTS = Counter('http_requests_total', 'Total HTTP Requests', ['method', 'endpoint']) IN_PROGRESS_REQUESTS = Gauge('http_requests_in_progress', 'Number of active HTTP requests') if __name__ == '__main__': start_http_server(8000) # 启动一个HTTP服务,暴露 /metrics while True: method = random.choice(['GET', 'POST']) endpoint = random.choice(['/users', '/products', '/orders']) IN_PROGRESS_REQUESTS.inc() REQUESTS.labels(method=method, endpoint=endpoint).inc() time.sleep(random.random()) # Simulate work IN_PROGRESS_REQUESTS.dec() - 文本文件 Exporter(Textfile Collector):Node Exporter 包含一个文本文件收集器,可以从指定目录下的文本文件中读取指标。这适用于一些定期生成指标但又不想运行完整 Exporter 的脚本。
4. 故障排除常见问题
- 目标不可达(`up == 0`):
- 检查 Prometheus Server 到目标机器的网络连通性。
- 确认 Exporter 服务是否正在运行。
- 检查 Exporter 的监听端口是否正确且未被防火墙阻挡。
- 查看 Prometheus Server 的日志,是否有抓取错误。
- 指标缺失或不正确:
- 确认 `scrape_configs` 中的 `job_name`, `targets`, `metrics_path` 是否正确。
- 在 Prometheus Web UI 的 `Status -> Targets` 页面检查目标状态和上次抓取时间。
- 直接访问 Exporter 的 `/metrics` 路径,查看是否暴露了正确的指标。
- 如果使用了服务发现,检查服务发现配置和 Prometheus 的权限。
- 告警不发送或发送错误:
- 检查 `prometheus.yml` 中 `rule_files` 是否正确加载了告警规则。
- 在 Prometheus Web UI 的 `Alerts` 页面检查告警状态是否为 `PENDING` 或 `FIRING`。
- 检查 `prometheus.yml` 中 Alertmanager 的配置地址是否正确。
- 检查 Alertmanager 的日志,看是否有发送通知的错误。
- 检查 `alertmanager.yml` 中的路由和接收器配置是否正确,特别是 `match` 条件。
- Prometheus 性能问题(CPU/内存高):
- 检查活跃时间序列数量和基数,是否产生了意外的高基数指标。
- 优化 PromQL 查询,避免过于复杂的即时查询。
- 考虑使用记录规则预聚合数据。
- 增加 Prometheus 实例的资源(CPU/内存)。
- 考虑引入 Thanos 或 Cortex 进行水平扩展和长期存储。
结语
Prometheus 作为一个强大的云原生监控解决方案,其灵活性和可扩展性使其能够适应从小型项目到大规模企业级系统的监控需求。深入理解其核心概念、合理规划部署、精细化配置以及遵循最佳实践,将帮助您的团队构建一个高效、可靠且富有洞察力的监控体系,为系统的稳定运行提供坚实保障。通过不断学习和实践 PromQL,您将能够从海量的监控数据中挖掘出有价值的信息,为业务决策和故障排查提供强有力的支持。