Promethous

Promethous

概述

Prometheus 是一个开源的系统监控和告警工具套件,由 SoundCloud 开发并捐赠给 CNCF(云原生计算基金会),是 Kubernetes 生态中最常用的监控方案。

核心功能

  • 多维数据模型:基于指标名称和键值对标签的时间序列数据
  • PromQL 查询语言:灵活高效的数据查询和聚合能力
  • 拉取模式采集:通过 HTTP 主动拉取目标实例的监控数据
  • 服务发现支持:支持静态配置、Consul、Kubernetes 等多种发现机制
  • 告警管理:通过 Alertmanager 实现告警分组、抑制和路由

典型应用场景

  • Kubernetes 集群监控(配合 kube-state-metrics、node-exporter)
  • 微服务应用性能监控
  • 基础设施资源监控(CPU、内存、磁盘、网络)
  • 自定义业务指标采集

部署准备

1. 系统要求

项目 最低配置 推荐配置
CPU 1 核 2 核+
内存 1 GB 2 GB+
硬盘 20 GB 50 GB+
Docker 18.06+ 最新版

2. 创建 Docker Compose 编排文件

docker-compose.yaml

version: '3.8'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    restart: always
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "9090:9090"
    volumes:
      - prom_conf:/etc/prometheus
      - prom_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.enable-admin-api'
      - '--web.enable-lifecycle'
    deploy:
      resources:
        limits:
          cpus: "1"
          memory: "2G"

  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    restart: always
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "9093:9093"
    volumes:
      - alert_conf:/etc/alertmanager
    deploy:
      resources:
        limits:
          cpus: "1"
          memory: "1G"

volumes:
  prom_data:
  prom_conf:
  alert_conf:

3. 启动参数说明

参数 说明
--config.file 指定配置文件路径
--storage.tsdb.path 数据存储目录
--web.enable-admin-api 启用 Admin API(支持删除时间序列等操作)
--web.enable-lifecycle 启用热更新(支持 /-/reload 接口)

安全提示:生产环境中建议谨慎开启 --web.enable-admin-api,或配合反向代理增加认证保护。


启动服务

docker compose up -d

查看启动日志:

docker logs prometheus -f --tail=50
docker logs alertmanager -f --tail=50

验证访问

curl http://127.0.0.1:9090
curl http://127.0.0.1:9093

在浏览器中打开:

  • Prometheus:http://<服务器IP>:9090
  • Alertmanager:http://<服务器IP>:9093

配置示例

1. 基础配置(prometheus.yml)

global:
  scrape_interval: 15s      # 采集间隔
  evaluation_interval: 15s  # 告警规则计算间隔

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - alertmanager:9093

rule_files:
  - "alerts/*.yml"

scrape_configs:
  # 自监控
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # 监控 Node Exporter(主机指标)
  - job_name: 'node_exporter'
    static_configs:
      - targets:
          - '192.168.1.10:9100'
          - '192.168.1.11:9100'

  # 监控容器(cAdvisor)
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']

2. 告警规则示例(alerts/node.yml)

groups:
  - name: node_alerts
    interval: 30s
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU 使用率过高"
          description: "实例 {{ $labels.instance }} CPU 使用率超过 80%,当前值:{{ $value }}%"

      - alert: HighMemoryUsage
        expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "内存使用率过高"
          description: "实例 {{ $labels.instance }} 内存使用率超过 85%,当前值:{{ $value }}%"

      - alert: DiskUsageHigh
        expr: (node_filesystem_size_bytes{fstype!~"tmpfs|overlay"} - node_filesystem_free_bytes{fstype!~"tmpfs|overlay"}) / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"} * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "磁盘空间不足"
          description: "实例 {{ $labels.instance }} 磁盘使用率超过 85%,当前值:{{ $value }}%"

3. Alertmanager 配置(alertmanager.yml)

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'webhook'

receivers:
  - name: 'webhook'
    webhook_configs:
      - url: 'http://your-webhook-url:8080/alert'
        send_resolved: true

  - name: 'email'
    email_configs:
      - to: 'admin@example.com'
        smarthost: 'smtp.example.com:587'
        auth_username: 'alert@example.com'
        auth_password: 'password'
        from: 'alert@example.com'

热更新配置

修改配置文件后,无需重启服务,通过 API 热更新:

# 方式一:使用 POST 请求触发重载
curl -X POST http://127.0.0.1:9090/-/reload

# 方式二:向 Prometheus 进程发送 HUP 信号
kill -HUP <prometheus_pid>

常用管理命令

操作 命令
启动服务 docker compose up -d
停止服务 docker compose stop
重启服务 docker compose restart
查看状态 docker compose ps
查看 Prometheus 日志 docker logs prometheus -f --tail=100
查看 Alertmanager 日志 docker logs alertmanager -f --tail=100
进入 Prometheus 容器 docker exec -it prometheus /bin/sh
热更新配置 curl -X POST http://127.0.0.1:9090/-/reload

常见问题

Q:启动后无法访问 Web 界面?

  1. 确认容器正常运行:
docker ps | grep prometheus
  1. 检查端口是否被占用:
netstat -tlnp | grep 9090
  1. 查看日志排查错误:
docker logs prometheus --tail=50

Q:数据采集失败或目标不可达?

  1. 确认目标实例的监控端点(如 /metrics)是否正常:
curl http://192.168.1.10:9100/metrics
  1. 检查配置文件中的 targets 地址是否正确
  2. 检查防火墙是否放行对应端口

Q:磁盘空间不足如何处理?

# 查看数据占用
du -sh /var/lib/docker/volumes/*prom_data*

# 方式一:调整数据保留时间(启动参数)
--storage.tsdb.retention.time=15d

# 方式二:清理旧数据(通过 Admin API)
curl -X POST -g 'http://127.0.0.1:9090/api/v1/admin/tsdb/delete_series?match[]={__name__=~".+"}'

Q:如何备份 Prometheus 数据?

# 停止服务
docker compose down

# 备份数据目录
docker run --rm -v prometheus_prom_data:/data alpine tar czf /tmp/prometheus_data_backup.tar.gz -C /data .

# 重启
docker compose up -d

Q:如何添加新的采集目标?

修改 prometheus.yml 中的 scrape_configs,添加新的 job_nametargets,然后执行热更新:

curl -X POST http://127.0.0.1:9090/-/reload

参考链接