Prometheus基本使用

31 阅读6分钟

Prometheus基本使用

背景

很多云服务都在使用Prometheus 监控应用指标, 恰当前springboot应用有监控需求

组成部分

被监控目标(K8s Pod/Service/节点/数据库)
    ↓(Exporter 采集/自身暴露 metrics)
Prometheus Server(Pull 采集指标 → 时序存储 → 规则评估)
    ↓(告警触发时推送)
AlertManager(处理告警 → 发送通知到钉钉/微信/邮件)
    ↓(数据查询)
Grafana(可视化监控大盘 → 支持告警展示)

docker 单机安装

  • 自定义挂载目录

mkdir -p ./prometheus/{prometheus,node-exporter,grafana,data/prometheus,data/grafana}

  • prometheus/prometheus.yml 配置文件
# global 全局配置
global:
  scrape_interval: 15s    # 全局采集间隔(15秒拉取一次指标)
  evaluation_interval: 15s # 告警规则评估间隔
  scrape_timeout: 10s     # 采集超时时间

# 告警规则文件(本次暂不配置,留空即可)
rule_files:
  # - "alert_rules.yml"

# 采集配置(定义需要监控的目标)
scrape_configs:
  # 1. 监控 Prometheus 自身
  - job_name: "prometheus"
    static_configs:
      - targets: ["prometheus:9090"]  # 容器内服务名+端口(Docker Compose 内网可解析)

  # 2. 监控 Node Exporter(服务器系统指标)
  - job_name: "node-exporter"
    static_configs:
      - targets: ["node-exporter:9100"]  # Node Exporter 容器地址

# 告警管理器配置(本次暂不部署 AlertManager,留空)
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - "alertmanager:9093"
docker-compose.yml

docker-compose up -d

自定义网络
  • 自定义docker-网络 ,如有docker-网络冲突时,见下 引用其他已有docker-net
version: '3.8'  # 兼容大部分 Docker 版本
services:
  # 1. Prometheus 核心服务
  prometheus:
    image: prom/prometheus:v2.52.0  # 固定版本,避免自动更新出问题
    container_name: prometheus
    restart: always  # 开机自启,容器异常自动重启
    ports:
      - "9090:9090"  # 宿主机端口:容器端口(访问 Prometheus UI 用)
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml  # 挂载配置文件
      - ./data/prometheus:/prometheus  # 挂载数据目录(持久化指标数据)
      - /etc/localtime:/etc/localtime:ro  # 同步宿主机时间
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'  # 指定配置文件路径
      - '--storage.tsdb.path=/prometheus'  # 指定数据存储路径
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'  # 支持通过API热加载配置(无需重启容器)
    networks:
      - prom-net  # 加入自定义网络,服务间内网通信
​
  # 2. Node Exporter 系统指标采集
  node-exporter:
    image: prom/node-exporter:v1.8.2
    container_name: node-exporter
    restart: always
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro  # 只读挂载,采集系统进程信息
      - /sys:/host/sys:ro    # 采集系统内核信息
      - /:/rootfs:ro         # 采集根目录信息
      - /etc/localtime:/etc/localtime:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
    networks:
      - prom-net
    privileged: true  # 提升权限,确保能采集所有系统指标
​
  # 3. Grafana 可视化工具
  grafana:
    image: grafana/grafana:10.2.2
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"  # 访问 Grafana UI 用(默认端口3000)
    volumes:
      - ./data/grafana:/var/lib/grafana  # 持久化 Grafana 配置/仪表盘/用户数据
      - /etc/localtime:/etc/localtime:ro
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123  # 配置 Grafana 初始管理员密码(可自定义)
      - GF_USERS_ALLOW_SIGN_UP=false        # 禁止注册新用户
      - GF_SERVER_ROOT_URL=http://localhost:3000  # 访问根地址
    depends_on:
      - prometheus  # 依赖 Prometheus,确保 Prometheus 先启动
    networks:
      - prom-net
​
# 自定义桥接网络(所有服务在同一网络,通过服务名互相访问)
networks:
  prom-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16  # 自定义网段,避免与宿主机冲突
# 快速查看当前服务器下所有docker-net 对应的网络情信息如 网段
docker network inspect $(docker network ls -q) | grep -E 'Name|Subnet|Gateway|Driver'
引用其他网络
version: '3.8'  # 兼容大部分 Docker 版本
services:
  # 1. Prometheus 核心服务
  prometheus:
    image: prom/prometheus:v2.52.0  # 固定版本,避免自动更新出问题
    container_name: prometheus
    restart: always  # 开机自启,容器异常自动重启
    ports:
      - "9090:9090"  # 宿主机端口:容器端口(访问 Prometheus UI 用)
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml  # 挂载配置文件
      - ./data/prometheus:/prometheus  # 挂载数据目录(持久化指标数据)
      - /etc/localtime:/etc/localtime:ro  # 同步宿主机时间
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'  # 指定配置文件路径
      - '--storage.tsdb.path=/prometheus'  # 指定数据存储路径
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'  # 支持通过API热加载配置(无需重启容器)
    networks:
      - dev_net  # 加入自定义网络,服务间内网通信
​
  # 2. Node Exporter 系统指标采集
  node-exporter:
    image: prom/node-exporter:v1.8.2
    container_name: node-exporter
    restart: always
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro  # 只读挂载,采集系统进程信息
      - /sys:/host/sys:ro    # 采集系统内核信息
      - /:/rootfs:ro         # 采集根目录信息
      - /etc/localtime:/etc/localtime:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
    networks:
      - dev_net
    privileged: true  # 提升权限,确保能采集所有系统指标
​
  # 3. Grafana 可视化工具
  grafana:
    image: grafana/grafana:10.2.2
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"  # 访问 Grafana UI 用(默认端口3000)
    volumes:
      - ./data/grafana:/var/lib/grafana  # 持久化 Grafana 配置/仪表盘/用户数据
      - /etc/localtime:/etc/localtime:ro
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123  # 配置 Grafana 初始管理员密码(可自定义)
      - GF_USERS_ALLOW_SIGN_UP=false        # 禁止注册新用户
      - GF_SERVER_ROOT_URL=http://localhost:3000  # 访问根地址
    depends_on:
      - prometheus  # 依赖 Prometheus,确保 Prometheus 先启动
    networks:
      - dev_net
​
# 自定义桥接网络(所有服务在同一网络,通过服务名互相访问)  ### 引用其他的网络 
networks:
  dev_net:
    external: true

查看Prometheus服务

访问地址:http://<宿主机IP>:9090(如本地访问:http://localhost:9090)
点击顶部 Status → Targets,查看采集目标状态:prometheus 和 node-exporter 的 State 均为 UP(表示采集正常)。

image-20260201112144533

查看Grafana服务

1. 登录 Grafana

访问地址:http://<宿主机IP>:3000,首次登录使用默认账号:

  • 用户名:admin
  • 密码:admin123(已在 docker-compose.yml 中自定义,若修改过则用自己的密码)

2. 添加 Prometheus 数据源(Grafana 关联监控数据)

  1. 登录后,点击左侧齿轮图标(Configuration)Data sourcesAdd data source
  2. 搜索并选择 Prometheus
  3. 配置 Prometheus 地址:http://prometheus:9090(Docker Compose 内网服务名,无需填宿主机 IP)。 此处需要访问宿主机时,见上图
  4. 其余配置保持默认,点击底部 Save & test,提示 Data source is working 表示配置成功。

3. 导入官方 Node Exporter 仪表盘(一键生成系统监控大盘)

Grafana 有丰富的官方 / 社区仪表盘,本次导入最常用的 Node Exporter 系统监控大盘(ID: 1860) ,包含 CPU、内存、磁盘、网络、负载等全维度监控:

  1. 点击左侧 + 号(Create)Import
  2. Import via grafana.com 输入仪表盘 ID:1860,点击 Load
  3. 选择数据源:下拉框选择刚才添加的 Prometheus,点击 Import
  4. 导入成功后,直接进入监控大盘,可实时查看服务器所有系统指标(数据每 15 秒刷新一次,与采集间隔一致)。

常用的二个springboot

12900 SpringBoot 2.x/3.x + Micrometer 最常用、数据最全、界面清晰,包含 JVM/HTTP/GC/ 线程全监控 4701 SpringBoot 2.x 经典版 轻量、简洁,专注 JVM 核心指标

image-20260201113929163

image-20260201114114804

增加服务时

# global 全局配置
global:
  scrape_interval: 15s    # 全局采集间隔(15秒拉取一次指标)
  evaluation_interval: 15s # 告警规则评估间隔
  scrape_timeout: 10s     # 采集超时时间

# 告警规则文件(本次暂不配置,留空即可)
rule_files:
  # - "alert_rules.yml"

# 采集配置(定义需要监控的目标)
scrape_configs:
  # 1. 监控 Prometheus 自身
  - job_name: "prometheus"
    static_configs:
      - targets: ["prometheus:9090"]  # 容器内服务名+端口(Docker Compose 内网可解析)

  # 2. 监控 Node Exporter(服务器系统指标)
  - job_name: "node-exporter"
    static_configs:
      - targets: ["node-exporter:9100"]  # Node Exporter 容器地址

  - job_name: 'spring-boot-app'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    static_configs:
      # - targets: ['192.168.65.2:8080']  #  host.docker.internal---> 192.168.65.2
      - targets: ['host.docker.internal:8080']   # docker访问宿主机服务时,可以使用的访问方式
      # - targets: ['192.168.31.238:8080']  宿主机Ip 无法连接问题 !!!!!
      # - targets: ['mengfh.mynatapp.cc']   #内网穿透形式,或是其他可访问方式

  - job_name: 'spring-boot-app2'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['host.docker.internal:8082']

# 告警管理器配置(本次暂不部署 AlertManager,留空)
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - "alertmanager:9093"

- job_name: "springboot-app"
  metrics_path: "/actuator/prometheus"
  static_configs:
    - targets: ["192.168.3.100:8080", "192.168.3.100:8081", "192.168.3.100:8082"]
      labels:
        env: "prod"
    # 或分开配置,每个应用独立标签(更清晰)
    - targets: ["192.168.3.100:8080"]
      labels:
        app: "user-service"
        env: "prod"
    - targets: ["192.168.3.100:8081"]
      labels:
        app: "order-service"
        env: "prod"

增加了新的服务时,需让其立即生效方式:

curl -X POST http://127.0.0.1:9090/-/reload # 不可用 curl -X POST http://192.168.31.238:9090/-/reload # 可用

springboot集成

http://192.168.31.238:8080/actuator/prometheus 有结果输出,即说明集成成功。

pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>

application.yml


# 增加暴露点
management:
  endpoints:
    web:
      exposure:
        include: "*" # 生产环境建议按需开启,如: prometheus,health,info
  metrics:
    tags:
      application: ${spring.application.name} # 添加应用名称标签

测试

-- 并发10 共发10000条

ab -c 10 -n 10000 -T application/json http://localhost:8080/api/event/bigReq

-- 并发1 发1条

ab -c 1 -n 1 -T application/json http://localhost:8080/api/event/bigReq

---并发50 持续300s

ab -c 50 -t 300 -T application/json http://localhost:8080/api/event/bigReq