15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
30.10.2024
2 +1

Prometheus 监控系统:基础设施与应用监控完整配置指南

随着现代基础设施日益复杂——涵盖微服务、容器和分布式系统——强大的监控已不再是可选项,而是维护性能、可靠性和可扩展性的基本要求。Prometheus 是一款开源监控与告警工具包,已成为在各种环境中收集和可视化时间序列指标最广泛采用的解决方案之一。

Prometheus 最初由 SoundCloud 开发,现已成为 云原生计算基金会(CNCF) 的毕业项目,受到全球工程团队的信赖。本综合指南涵盖您需要了解的一切:Prometheus 是什么、它的工作原理、核心组件,以及完整的分步安装流程——包括 Node Exporter、Grafana 仪表板和告警配置。

什么是 Prometheus?

Prometheus 是一款功能强大的开源监控系统,专为收集、存储和查询时间序列数据而设计——即带有高精度时间戳的随时间追踪的测量值或事件。它使团队能够可视化系统健康状况、分析趋势,并在小问题演变为严重故障之前触发智能告警。

Prometheus 的主要特性

特性描述
时间序列数据模型指标以带时间戳的序列形式存储,支持趋势分析和历史对比
拉取式监控Prometheus 主动从目标端点抓取指标,而非等待系统推送数据
PromQL一种灵活、表达力强的查询语言,用于实时过滤、聚合和分析指标
Alertmanager 集成定义基于阈值的规则,并将通知路由至电子邮件、Slack、PagerDuty 等渠道
服务发现在 Kubernetes 集群等动态环境中自动发现并抓取目标
多维数据标签允许您按区域、实例或服务名称等维度对指标进行切片和分析

这些功能使 Prometheus 成为在 VPS 托管、裸金属基础设施或容器化平台上运行工作负载的团队的理想选择。

Prometheus 的工作原理

Prometheus 遵循围绕时间序列数据收集与存储构建的清晰、定义明确的架构。在生产环境中部署之前,理解这一架构至关重要。

核心工作流程

  1. 指标收集(抓取):Prometheus 定期向已配置的目标端点(即 *exporter*)发送 HTTP 请求以收集指标。抓取间隔可完全自定义配置。
  1. 时间序列存储:收集到的指标持久化存储在 Prometheus 内置的时间序列数据库(TSDB)中。每个数据点携带一个 Unix 时间戳和一组用于标识的键值标签。
  1. 使用 PromQL 查询:工程师使用 PromQL 查询存储的指标、生成图表、构建仪表板,或基于实时和历史数据定义告警条件。
  1. 告警流水线:当某项指标超过预定义阈值时,Prometheus 向 Alertmanager 触发告警,后者对告警进行去重、分组,并将通知路由至相应渠道。

拉取式模型是一种经过深思熟虑的架构选择。它简化了网络安全(目标无需向中央服务器进行出站访问),使配置透明化,并在分布式环境中具有良好的扩展性。

Prometheus 核心组件

Prometheus 是一个模块化生态系统,每个组件承担特定职责:

1. Prometheus Server

核心引擎,负责抓取目标、将指标存储至 TSDB、评估告警规则,以及提供 PromQL API 和 Web UI。

2. Exporter

Exporter 是轻量级代理或适配器,以 Prometheus 兼容格式暴露指标。主要 Exporter 包括:

  • Node Exporter — 收集硬件和操作系统级指标:CPU、内存、磁盘 I/O、网络吞吐量、文件系统使用情况
  • Blackbox Exporter — 通过 HTTP、HTTPS、DNS、TCP 和 ICMP 探测外部端点的可用性和延迟
  • 数据库 Exporter — 为 PostgreSQL、MySQL、Redis、MongoDB 等提供专用 Exporter
  • 应用专用 Exporter — 大多数现代应用和框架原生暴露 /metrics 端点

3. Alertmanager

处理完整的告警生命周期:接收来自 Prometheus 的告警、对其进行去重和分组、应用静默和抑制规则,并将通知路由至 Slack、电子邮件、PagerDuty 或 OpsGenie 等接收方。

4. PromQL(Prometheus 查询语言)

专为时间序列数据构建的函数式查询语言。PromQL 支持即时向量、范围向量、聚合运算符、数学函数和子查询——赋予您对指标深度分析的能力。

5. Pushgateway

专为临时或批处理作业设计,这类作业无法被直接抓取(例如运行 30 秒的 cron 作业)。这些作业将指标推送至 Pushgateway,Prometheus 再按常规间隔对其进行抓取。

6. Grafana

虽然不属于 Prometheus 本身,但 Grafana 是 Prometheus 数据事实上的可视化层。它将 Prometheus 作为数据源连接,支持创建包含面板、变量和注释的丰富交互式仪表板。

在 Linux 上分步安装 Prometheus

以下指南将引导您完成在 Linux 服务器上的完整 Prometheus 部署,包括用于系统指标的 Node Exporter、用于可视化的 Grafana,以及用于通知的 Alertmanager。

> 前提条件:一台 Linux 服务器(Ubuntu 20.04/22.04 或 CentOS/RHEL 8+)、sudo 或 root 访问权限,以及基本的命令行操作能力。如需可靠的服务器环境,可考虑使用 AlexHost VPS 托管,获得高性能、低延迟的基础环境。

第一步:安装 Prometheus

下载并解压最新版 Prometheus:

wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
tar -xvf prometheus-2.47.0.linux-amd64.tar.gz
cd prometheus-2.47.0.linux-amd64

> 提示:下载前请务必查看 Prometheus 官方发布页面,获取最新稳定版本。

创建专用系统用户和目录结构:

sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

为 Prometheus 创建 systemd 服务:

sudo nano /etc/systemd/system/prometheus.service

粘贴以下内容:

[Unit]
Description=Prometheus Monitoring System
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus 
  --config.file=/etc/prometheus/prometheus.yml 
  --storage.tsdb.path=/var/lib/prometheus/ 
  --web.console.templates=/etc/prometheus/consoles 
  --web.console.libraries=/etc/prometheus/console_libraries 
  --storage.tsdb.retention.time=30d

[Install]
WantedBy=multi-user.target

启用并启动 Prometheus:

sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
sudo systemctl status prometheus

Prometheus 现在可通过 http://your-server-ip:9090 访问。

第二步:配置 Prometheus

主配置文件为 /etc/prometheus/prometheus.yml,该文件定义全局设置以及 Prometheus 监控的抓取目标。

基本配置示例:

global:
  scrape_interval: 15s        # Default scrape frequency
  evaluation_interval: 15s    # How often alerting rules are evaluated
  scrape_timeout: 10s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - localhost:9093

rule_files:
  - "/etc/prometheus/rules/*.yml"

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

修改此文件后,在重启前务必验证配置:

promtool check config /etc/prometheus/prometheus.yml
sudo systemctl restart prometheus

第三步:安装 Node Exporter 以收集系统指标

Node Exporter 从主机系统暴露详细的硬件和操作系统指标——对于监控 CPU 负载、内存压力、磁盘利用率和网络吞吐量至关重要。

下载并安装 Node Exporter:

wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar -xvf node_exporter-1.6.1.linux-amd64.tar.gz
sudo cp node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /bin/false node_exporter
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

为 Node Exporter 创建 systemd 服务:

sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter

Node Exporter 现在在 http://your-server-ip:9100/metrics 暴露指标。

prometheus.yml 中将 Node Exporter 添加为抓取目标:

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node_exporter"
    static_configs:
      - targets: ["localhost:9100"]

重启 Prometheus,并在 Prometheus UI 的状态 → 目标下验证目标显示为 UP

第四步:使用 Grafana 可视化指标

Grafana 将原始 Prometheus 指标转化为可操作的、视觉丰富的仪表板,是 Prometheus 部署的标准可视化层。

在 Ubuntu/Debian 上安装 Grafana:

sudo apt-get install -y apt-transport-https software-properties-common
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana
sudo systemctl enable grafana-server
sudo systemctl start grafana-server

将 Prometheus 连接为数据源:

  1. http://your-server-ip:3000 打开 Grafana(默认凭据:admin / admin
  2. 导航至配置 → 数据源 → 添加数据源
  3. 选择 Prometheus
  4. 将 URL 设置为 http://localhost:9090
  5. 点击保存并测试

导入预构建仪表板:

  • 前往仪表板 → 导入
  • 输入仪表板 ID 1860(Node Exporter Full),来自 Grafana 市场
  • 选择您的 Prometheus 数据源并点击导入

您将立即获得一个全面的交互式仪表板,涵盖 CPU 使用率、内存消耗、磁盘 I/O、网络统计和系统负载。

第五步:配置告警规则和 Alertmanager

Prometheus 告警由两部分组成:在 Prometheus 中定义的告警规则,以及处理路由和投递的 Alertmanager

创建告警规则文件:

sudo mkdir -p /etc/prometheus/rules
sudo nano /etc/prometheus/rules/system_alerts.yml
groups:
  - name: system_alerts
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
          description: "CPU usage has exceeded 80% for more than 5 minutes. Current value: {{ $value }}%"

      - alert: LowDiskSpace
        expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 15
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "Low disk space on {{ $labels.instance }}"
          description: "Available disk space on / is below 15%. Immediate action required."

      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High memory usage on {{ $labels.instance }}"
          description: "Memory usage has exceeded 85% for more than 5 minutes."

      - alert: InstanceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Instance {{ $labels.instance }} is down"
          description: "Prometheus target {{ $labels.instance }} has been unreachable for more than 1 minute."

验证规则文件:

promtool check rules /etc/prometheus/rules/system_alerts.yml

安装并配置 Alertmanager:

wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
tar -xvf alertmanager-0.26.0.linux-amd64.tar.gz
sudo cp alertmanager-0.26.0.linux-amd64/alertmanager /usr/local/bin/
sudo mkdir /etc/alertmanager

创建 Alertmanager 配置:

sudo nano /etc/alertmanager/alertmanager.yml
global:
  smtp_smarthost: 'smtp.yourdomain.com:587'
  smtp_from: 'alerts@yourdomain.com'
  smtp_auth_username: 'alerts@yourdomain.com'
  smtp_auth_password: 'your_password'

route:
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'email-notifications'

receivers:
  - name: 'email-notifications'
    email_configs:
      - to: 'admin@yourdomain.com'
        send_resolved: true

> 注意:如需在告警流水线中实现专业的电子邮件投递,可考虑将 Prometheus 与 AlexHost 邮件托管配合使用,获得可靠的 SMTP 基础设施。

高级配置:服务发现

对于动态环境——例如 Kubernetes 集群或自动扩缩容服务器集群——静态目标列表很快会变得难以管理。Prometheus 开箱即支持多种服务发现机制

scrape_configs:
  - job_name: "kubernetes-pods"
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true

支持的服务发现后端包括 Kubernetes、Consul、EC2、Azure、GCE、基于 DNS 的发现和基于文件的发现——使 Prometheus 能够适应几乎任何基础设施拓扑。

Prometheus 使用场景

Prometheus 在广泛的监控场景中表现出色:

基础设施监控

从集群中的每个节点收集服务器级指标——CPU、内存、磁盘、网络。无论您运行的是单台独立服务器还是大型集群,Prometheus 都能提供跨所有主机的统一可见性。

应用性能监控(APM)

追踪 Web 应用和 API 的请求速率、错误率、响应延迟(RED 方法)和资源消耗。Prometheus 客户端库支持 Go、Python、Java、Ruby、Node.js 等多种语言。

Kubernetes 和容器监控

Prometheus 通过 kube-state-metricscAdvisor Exporter 与 Kubernetes 原生集成,提供对 Pod 健康状况、资源配额、部署状态和集群级指标的深度可见性。

数据库监控

使用专用 Exporter 监控 PostgreSQL、MySQL 和 Redis 等数据库的查询性能、连接池利用率、复制延迟和缓存命中率。

自定义业务指标

对您自己的应用进行埋点,暴露特定领域的指标——例如每秒处理的订单数、活跃用户会话数或支付交易速率——在技术指标之外实现业务层面的可观测性。

GPU 工作负载监控

对于运行机器学习或高性能计算工作负载的团队,Prometheus 可与 DCGM Exporter 集成,监控 GPU 利用率、内存和温度。这与 AlexHost GPU 托管配合使用,非常适合 AI 和 ML 基础设施。

Prometheus 与其他监控解决方案对比

特性PrometheusNagiosZabbixDatadog
数据模型带标签的时间序列基于检查基于条目带标签的时间序列
采集模型拉取(+ Pushgateway)主动/被动检查基于 Agent基于 Agent
查询语言PromQL自定义自定义
Kubernetes 原生支持是(一等公民)有限有限是(付费)
费用免费 / 开源免费 / 开源免费 / 开源商业 SaaS
可扩展性高(配合 Thanos/Cortex)中等中等

生产环境最佳实践

在生产环境中部署 Prometheus 需要关注以下几个运维要点:

  • 数据保留:默认保留期为 15 天。根据存储容量和合规要求调整 --storage.tsdb.retention.time。如需长期存储,可考虑使用 ThanosCortex
  • 安全性:使用带身份验证的反向代理(Nginx 或 Caddy)限制对 Prometheus Web UI 和 API 的访问。Prometheus 本身不包含内置身份验证。
  • 高可用性:运行多个 Prometheus 实例抓取相同目标以实现冗余。使用 Alertmanager 的集群功能防止重复通知。
  • 基数管理:避免在指标名称中使用高基数标签(如用户 ID、请求 ID),因为这可能导致内存和性能问题。
  • TLS 加密:为抓取端点和 Prometheus API 启用 TLS。配合 SSL 证书保护 Prometheus 各组件之间的所有通信。
  • 资源规划:Prometheus 对内存消耗较大。根据活跃时间序列的数量分配足够的 RAM。一般规则是内存中每个样本约占 1–2 字节。

常见问题解答

问:Prometheus 和 Grafana 有什么区别?

Prometheus 是监控和告警后端——负责收集、存储和查询指标。Grafana 是可视化前端,连接到 Prometheus(及其他数据源)以渲染仪表板。两者是互补工具,而非替代关系。

问:Prometheus 能监控 Windows 服务器吗?

可以。Windows Exporter(前身为 WMI Exporter)以 Prometheus 兼容格式暴露 Windows 系统指标,涵盖 CPU、内存、磁盘、网络、IIS 等。

问:Prometheus 如何实现高可用性?

Prometheus 本身设计为每个集群运行单个实例。如需高可用,可运行两个相同的 Prometheus 服务器抓取相同目标。Alertmanager 支持原生集群,可对多个 Prometheus 实例的告警进行去重。

问:PromQL 有什么用途?

PromQL(Prometheus 查询语言)用于查询存储在 Prometheus 中的时间序列数据。它支持即时查询、范围查询、聚合、数学运算和函数——从简单的指标查找到复杂的异常检测表达式,无所不能。

总结

Prometheus 是一款经过生产环境验证的监控解决方案,能够对整个基础设施栈的健康状况和性能提供深度实时可见性。其拉取式架构、多维数据模型、强大的 PromQL 查询语言,以及与 Grafana 和 Alertmanager 等工具的无缝集成,使其成为现代可观测性的黄金标准。

无论您是在监控单台 Linux 服务器、一批独立服务器、Kubernetes 集群,还是复杂的微服务应用,Prometheus 都能扩展以满足您的需求。按照本指南的步骤——安装 Prometheus、部署 Node Exporter、配置 Grafana 仪表板并设置智能告警规则——您将拥有一个强大的监控基础,帮助您及早发现异常、更快响应事故,并持续提升系统可靠性。

从基础开始,随着对系统正常行为的深入了解不断迭代仪表板和告警阈值,逐步将监控覆盖扩展至整个技术栈的每一层。Prometheus 不仅仅是一款监控工具——它是现代站点可靠性工程的基石。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用