2026.05.26 云计算

Promethues系统指标监控

一个开源的系统监控和告警工具

Promethues系统指标监控
Prometheus 入门教程
v2.x 入门

Prometheus 入门教程

开源监控与告警系统 · 从安装部署到 PromQL 查询,一文搞定

时序数据库 Pull 模型 PromQL Grafana 集成 Alertmanager
1

什么是 Prometheus

Prometheus 是由 SoundCloud 开发、CNCF 毕业的开源监控与告警系统,采用 拉取(Pull)模型 定期抓取目标暴露的 HTTP 指标端点,将数据存储在内置时序数据库中,并通过 PromQL 提供强大的查询能力。

核心架构

🖥Node Exporter
Host Metrics
🔥Prometheus
Server
📊Grafana
可视化

⚙️App Exporter
业务指标
🔔Alertmanager
告警通知
概念说明
Metric(指标)带时间戳的数值样本,如 CPU 使用率
Label(标签)键值对,用于多维度区分指标
Scrape(抓取)Prometheus 主动 HTTP 拉取目标数据
TSDB内置时序数据库,本地高效存储
PromQL查询 & 聚合指标的专用语言
2

安装与部署

方式 A — 二进制安装(推荐入门)

下载最新版本

bash
# 下载 Prometheus(以 Linux amd64 为例)
wget https://github.com/prometheus/prometheus/releases/download/v2.52.0/prometheus-2.52.0.linux-amd64.tar.gz

tar -xzf prometheus-2.52.0.linux-amd64.tar.gz
cd prometheus-2.52.0.linux-amd64

创建目录 & 移动文件

bash
sudo mkdir -p /etc/prometheus /var/lib/prometheus

sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo cp prometheus.yml /etc/prometheus/

创建系统服务(systemd)

ini — /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Monitoring
After=network.target

[Service]
User=prometheus
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=15d
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动服务

bash
sudo useradd --no-create-home --shell /bin/false prometheus
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
sudo systemctl status prometheus
✅ 验证

启动成功后,浏览器访问 http://<IP>:9090 即可看到 Prometheus Web UI。

方式 B — Docker 快速体验

bash
docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

方式 C — Docker Compose(推荐生产)

yaml — docker-compose.yml
version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=30d'

  node_exporter:
    image: prom/node-exporter:latest
    ports:
      - "9100:9100"

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"

volumes:
  prometheus_data:

常用端口

端口组件用途
9090PrometheusWeb UI & API
9100Node Exporter主机指标
9093Alertmanager告警管理
3000Grafana可视化面板
3

配置文件详解

Prometheus 使用 YAML 格式配置,默认路径为 /etc/prometheus/prometheus.yml

yaml — prometheus.yml
# 全局配置
global:
  scrape_interval:     15s   # 每15秒抓取一次
  evaluation_interval: 15s   # 每15秒评估告警规则
  scrape_timeout:      10s

# 告警规则文件
rule_files:
  - "rules/*.yml"

# Alertmanager 地址
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

# 抓取目标配置
scrape_configs:
  # Prometheus 自监控
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # 主机监控
  - job_name: 'node'
    static_configs:
      - targets:
          - 'server1:9100'
          - 'server2:9100'
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance

  # 动态发现(Kubernetes 示例)
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
⚠️ 配置热加载

修改配置后无需重启,发送 SIGHUP 信号即可热加载:sudo kill -HUP $(pidof prometheus) 或访问 POST /-/reload 接口。

4

Exporters — 采集指标

Exporter 是暴露 /metrics 端点的小程序,Prometheus 定期抓取它。

安装 Node Exporter(主机指标)

bash
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.0/node_exporter-1.8.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.8.0.linux-amd64.tar.gz
sudo cp node_exporter-1.8.0.linux-amd64/node_exporter /usr/local/bin/

# 创建 systemd 服务
sudo tee /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter

[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
EOF

sudo useradd -rs /bin/false node_exporter
sudo systemctl enable --now node_exporter

常用 Exporter 列表

Exporter监控对象默认端口
node_exporterLinux 主机 CPU/内存/磁盘9100
mysqld_exporterMySQL / MariaDB9104
redis_exporterRedis9121
nginx-prometheus-exporterNginx9113
blackbox_exporterHTTP/TCP 探针9115
cadvisorDocker 容器8080
jmx_exporterJVM 应用自定义
💡 提示

验证 Exporter 是否正常:浏览器访问 http://<host>:9100/metrics 可看到原始指标文本。

5

PromQL 查询语言

PromQL 是 Prometheus 的专用查询语言,支持 即时查询(Instant)和 范围查询(Range),结果可用于图表、告警。

数据类型

类型说明
Instant Vector每个时间序列的单一样本(最常用)
Range Vector时间范围内的多个样本,用于 rate/increase 等
Scalar单一浮点数

指标类型

类型说明典型示例
Counter单调递增计数器,只增不减http_requests_total
Gauge可升可降的瞬时值memory_usage_bytes
Histogram采样分布 + 分位数http_request_duration_seconds
Summary客户端计算分位数rpc_duration_seconds

基础查询语法

promql
# 选择指标(Instant Vector)
up

# 标签过滤(= 等于, != 不等于, =~ 正则, !~ 正则排除)
node_cpu_seconds_total{mode="idle", cpu="0"}

# 范围查询(过去5分钟的数据)
http_requests_total[5m]

# 位移(1小时前的数据)
http_requests_total offset 1h

# 算术运算
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100

常用函数

promql — 函数示例
# rate:每秒平均增长率(用于 Counter)
rate(http_requests_total[5m])

# irate:瞬时增长率(最近两个数据点)
irate(http_requests_total[5m])

# increase:时间段内的增量
increase(http_requests_total[1h])

# sum:按标签聚合求和
sum(http_requests_total) by (status_code)

# avg, max, min:平均/最大/最小
avg(node_load1) by (instance)

# topk / bottomk:前N个
topk(5, rate(http_requests_total[5m]))

# histogram_quantile:分位数(P99延迟)
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

# predict_linear:线性预测
predict_linear(node_filesystem_free_bytes[6h], 3600)

实用查询速查

CPU 使用率 (%)
100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
内存使用率 (%)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
磁盘使用率 (%)
(node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100
HTTP 请求速率 (QPS)
sum(rate(http_requests_total[5m])) by (job)
P99 请求延迟
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
实例存活状态
up{job="node"}
网络入流量 (Mb/s)
irate(node_network_receive_bytes_total[5m]) / 1024 / 1024
磁盘剩余预测 (4h后)
predict_linear(node_filesystem_free_bytes[6h], 4*3600)

告警规则文件

yaml — rules/node_alerts.yml
groups: - name: node_alerts rules: # CPU 使用率告警 - alert: HighCpuUsage expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85 for: 5m labels: severity: warning annotations: summary: "实例 {{ $labels.instance }} CPU 使用率过高" description: "CPU 使用率: {{ $value | humanizePercentage }}" # 内存不足告警 - alert: LowMemory expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.1 for: 2m labels: severity: critical annotations: summary: "{{ $labels.instance }} 内存不足 10%" # 实例下线告警 - alert: InstanceDown expr: up == 0 for: 1m labels: severity: critical annotations: summary: "实例 {{ $labels.instance }} 已下线"

Alertmanager 配置(钉钉/企微通知)

yaml — alertmanager.yml
global: resolve_timeout: 5m route: group_by: ['alertname', 'instance'] group_wait: 30s group_interval: 5m repeat_interval: 4h receiver: 'webhook' routes: - match: { severity: critical } receiver: 'pagerduty' receivers: - name: 'webhook' webhook_configs: - url: 'https://your-webhook-url' send_resolved: true
💡 验证规则语法

使用官方工具检查规则文件语法:promtool check rules /etc/prometheus/rules/*.yml

7

接入 Grafana

启动 Grafana(默认端口 3000,账号/密码 admin/admin)

bash
docker run -d -p 3000:3000 --name grafana grafana/grafana

添加数据源:Connections → Data Sources → Add data source → Prometheus
URL 填写 http://prometheus:9090,点击 Save & Test。

导入社区 Dashboard:Dashboards → Import → 输入 ID

Dashboard ID用途
1860Node Exporter Full(主机全量监控)
3119Kubernetes 集群监控
7362MySQL Overview
11835Redis Dashboard
🎉 完成!

至此你已完成 Prometheus 的安装、配置、指标采集、PromQL 查询和 Grafana 可视化全流程。更多内容参考 官方文档