Promethues系统指标监控
一个开源的系统监控和告警工具
Prometheus 入门教程
开源监控与告警系统 · 从安装部署到 PromQL 查询,一文搞定
什么是 Prometheus
Prometheus 是由 SoundCloud 开发、CNCF 毕业的开源监控与告警系统,采用 拉取(Pull)模型 定期抓取目标暴露的 HTTP 指标端点,将数据存储在内置时序数据库中,并通过 PromQL 提供强大的查询能力。
核心架构
Host Metrics
Server
可视化
业务指标
告警通知
| 概念 | 说明 |
|---|---|
| Metric(指标) | 带时间戳的数值样本,如 CPU 使用率 |
| Label(标签) | 键值对,用于多维度区分指标 |
| Scrape(抓取) | Prometheus 主动 HTTP 拉取目标数据 |
| TSDB | 内置时序数据库,本地高效存储 |
| PromQL | 查询 & 聚合指标的专用语言 |
安装与部署
方式 A — 二进制安装(推荐入门)
下载最新版本
# 下载 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
创建目录 & 移动文件
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)
[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
启动服务
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 快速体验
docker run -d \ --name prometheus \ -p 9090:9090 \ -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus
方式 C — Docker Compose(推荐生产)
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:
常用端口
| 端口 | 组件 | 用途 |
|---|---|---|
| 9090 | Prometheus | Web UI & API |
| 9100 | Node Exporter | 主机指标 |
| 9093 | Alertmanager | 告警管理 |
| 3000 | Grafana | 可视化面板 |
配置文件详解
Prometheus 使用 YAML 格式配置,默认路径为 /etc/prometheus/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 接口。
Exporters — 采集指标
Exporter 是暴露 /metrics 端点的小程序,Prometheus 定期抓取它。
安装 Node Exporter(主机指标)
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_exporter | Linux 主机 CPU/内存/磁盘 | 9100 |
| mysqld_exporter | MySQL / MariaDB | 9104 |
| redis_exporter | Redis | 9121 |
| nginx-prometheus-exporter | Nginx | 9113 |
| blackbox_exporter | HTTP/TCP 探针 | 9115 |
| cadvisor | Docker 容器 | 8080 |
| jmx_exporter | JVM 应用 | 自定义 |
验证 Exporter 是否正常:浏览器访问 http://<host>:9100/metrics 可看到原始指标文本。
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 |
基础查询语法
# 选择指标(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
常用函数
# 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)
实用查询速查
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
sum(rate(http_requests_total[5m])) by (job)
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
up{job="node"}
irate(node_network_receive_bytes_total[5m]) / 1024 / 1024
predict_linear(node_filesystem_free_bytes[6h], 4*3600)
告警规则文件
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 配置(钉钉/企微通知)
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
接入 Grafana
启动 Grafana(默认端口 3000,账号/密码 admin/admin)
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 | 用途 |
|---|---|
| 1860 | Node Exporter Full(主机全量监控) |
| 3119 | Kubernetes 集群监控 |
| 7362 | MySQL Overview |
| 11835 | Redis Dashboard |
至此你已完成 Prometheus 的安装、配置、指标采集、PromQL 查询和 Grafana 可视化全流程。更多内容参考 官方文档。