Prometheus系列教程

1.1 安装部署

1.1.1 下载

  • 操作如下

    • 访问Prometheus官网,下载最新版
    # 官网下载地址
    https://prometheus.io/download/
    # 方式一:直接下载
    wget https://github.com/prometheus/prometheus/releases/download/v2.50.1/prometheus-2.50.1.linux-amd64.tar.gz
    # 方式二:从加速地址下载
    wget https://mirror.ghproxy.com/https://github.com/prometheus/prometheus/releases/download/v2.50.1/prometheus-2.50.1.linux-amd64.tar.gz
    • 解压到指定目录
    # 本文解压到/data, 可以使用 -C 指定路径
    tar -zxvf prometheus-2.50.1.linux-amd64.tar.gz
    mv prometheus-2.50.1.linux-amd64 prometheus2.50.1

1.1.2 配置

  • 操作如下

    • Prometheus 服务本身对外暴露了/metrics 指标接口,所以可以配置prometheus 监控自身。
    # 路径:/data/prometheus2.50.1
    # 备份原配置
    cp -ar prometheus.yml prometheus.yml.bak_default && > prometheus.yml
    # vim prometheus.yml 新加入以下内容
    global:
    scrape_interval: 15s
    
    scrape_configs:
    - job_name: "prometheus"
      metrics_path: "/metrics"
      static_configs:
      - targets: ["prom.dev1.hkf56.com:9090"]

1.1.3 启动

  • 操作如下

    • 方式一:命令直接启动
    /data/prometheus2.50.1/prometheus --config.file=/data/prometheus2.50.1/prometheus.yml
    • 方式二:使用system管理启停
    # vim /usr/lib/systemd/system/prometheus.service
    [Unit]
    Description=Prometheus Server
    Documentation=https://prometheus.io/
    
    [Service]
    User=root
    Restart=always
    ExecStart=/data/prometheus2.50.1/prometheus 
    --config.file=/data/prometheus2.50.1/prometheus.yml 
    --storage.tsdb.path=/data/prometheus2.50.1/data 
    --storage.tsdb.retention.time=60d 
    --web.enable-lifecycle
    ExecReload=/bin/kill -HUP $MAINPID
    Restart=on-failure
    RestartSec=20
    TimeoutStopSec=20
    SendSIGKILL=no
    LimitNOFILE=8192
    
    [Install]
    WantedBy=multi-user.target
    • 启动
    # 重载配置
    systemctl daemon-reload
    # 启动
    systemctl start prometheus
    systemctl enable prometheus
  • 启动参数说明

    • --config.file:指定prometheus配置文件路径
    • --storage.tsdb.path:设置prometheus时间序列数据存储路径
    • --storage.tsdb.retention.time:时间序列数据存储期限,超过期限则删除旧数据
    • --web.enable-lifecycle:允许通过 http 请求方式来更新Prometheus配置

1.1.4 访问

  • 操作如下

    • 添加如下nginx配置 prom.dev1.hkf56.com.conf
    server {
    listen 80;
    listen 443 ssl;
    server_name prom.dev1.hkf56.com;
    ssl_certificate certs/dev1.hkf56.com.crt;
    ssl_certificate_key certs/dev1.hkf56.com.key;
    access_log logs/prometheus_access.log main;
    error_log  logs/prometheus_error.log notice;
    
    location / {
      proxy_pass http://127.0.0.1:9090;
      proxy_set_header Host $host;
      proxy_set_header X-Forward-For $remote_addr;
      proxy_set_header X-Real-IP $remote_addr;
    }
    location /robots.txt {
      root /usr/local/nginx/html;
      index index.html;
    }
    }
    • 本地添加hosts解析域名
    # C:WindowsSystem32driversetchosts
    192.168.26.21  prom.dev1.hkf56.com
    • 如出现如下页面告警提示,则需要同步下prometheus服务所在节点的时间即可
    # 在服务器端执行时间同步命令
    ntpdate ntp.aliyun.com

1.2 RocketMQ Exporter

  • 简介

    • 用于监控 RocketMQ broker 端和客户端所有相关指标的系统
    • 通过 mqAdmin 从 broker 端获取指标值后封装成 87 个 cache
    • 获取监控指标的流程如下图所示
    Expoter 通过 MQAdminExt 向 MQ 集群请求数据,请求到的数据通过 MetricService 规范化成 Prometheus 需要的格式,然后通过 /metics 接口暴露给 Prometheus
    • 官方相关
    # 官方文档
    https://rocketmq.apache.org/zh/docs/deploymentOperations/05Exporter/
    # 开源地址
    https://github.com/apache/rocketmq-exporter
    • 泛支持调整
    ## 官方源码调整说明
    1:翻译README.md文档为中文,额外增加项目支持的指标说明
    2:支持启动参数传入namesrv地址 -Drocketmq.namesrv.addr=127.0.0.1:9876;192.168.1.100:9876
    3: 增加健康接口/health
    ## 开源地址
    https://gitee.com/hukanfa/rocketmq-exporter

1.2.1 编译构建

  • 操作如下

    • 方式一:一般本地用 IntelliJ IDEA 工具编译,命令行编译如下
    mvn clean install
    mvn package -Dmaven.test.skip=true docker:build
    • 方式二:创建Docker镜像
    ## Dockerfile
    FROM rockylinux:9.3
    
    LABEL maintainer="hukanfa" 
        description="RocketMQ Exporter for Prometheus" 
        version="0.0.2"
    
    # 安装OpenJDK 8(包括开发工具包)
    RUN dnf install -y 
      java-1.8.0-openjdk 
      java-1.8.0-openjdk-devel 
      && dnf clean all
    
    # 设置JAVA_HOME环境变量(OpenJDK 8默认安装路径)
    ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk
    # 将Java加入PATH
    ENV PATH $PATH:$JAVA_HOME/bin
    
    # 替换为阿里云镜像源并安装工具
    RUN dnf -y install net-tools telnet 
      && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
      && echo "Asia/Shanghai" > /etc/timezone 
      && dnf clean all
    
    # 工作目录
    WORKDIR /app
    
    # 复制jar包
    COPY rocketmq-exporter-0.0.2-exec.jar rocketmq-exporter.jar
    
    # 暴露端口
    EXPOSE 5557
    
    # 启动命令
    ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar rocketmq-exporter.jar --rocketmq.config.namesrvAddr=${ROCKETMQ_NAMESRV_ADDR}"]
    
    ## 创建镜像
    docker build -t rocketmq-exporter:v0.0.2 .

1.2.2 创建服务

  • 操作如下

    • 方式一:通过 systemd 管理服务
    # vim /usr/lib/systemd/system/rocketmq_exporter.service
    [Unit]
    Description=RocketMQ Prometheus Exporter
    Documentation=https://rocketmq.apache.org/zh/docs/deploymentOperations/05Exporter/
    After=network.target
    
    [Service]
    ExecStart=java 
    -Drocketmq.namesrv.addr="192.168.26.21:9876;192.168.26.22:9876;192.168.26.23:9876" 
    -jar rocketmq-exporter-0.0.2-exec.jar
    ExecReload=/bin/kill -HUP
    TimeoutStopSec=20s
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
    # 启动 node-exporter
    systemctl daemon-reload
    systemctl start rocketmq_exporter
    systemctl enable rocketmq_exporter
    systemctl status rocketmq_exporter
    • 方式二:通过容器创建服务
    # docker-compose.yaml
    services:
    rocketmq-exporter:
      image: registry.dachensky.com/rocketmq-exporter:v0.0.2
      container_name: rocketmq-exporter
      restart: unless-stopped
      ports:
        - "5557:5557"
      environment:
        - JAVA_OPTS=-Xms256m -Xmx1024m
        - ROCKETMQ_NAMESRV_ADDR=192.168.26.21:9876;192.168.26.22:9876;192.168.26.23:9876
      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:5557/health"]
        interval: 30s
        timeout: 5s
        retries: 3
    
    # 启动
    docker-compose up -d

1.2.3 接入 Prometheus

  • 操作如下

    • 调整 Prometheus 配置文件
    vim /etc/prometheus/prometheus.yml
    scrape_configs:
    - job_name: "rocketmq_exporter"
      metrics_path: "/metrics"
      static_configs:
        - targets: ["192.168.26.11:5557"]
    • 重载 Prometheus 配置
    curl -X POST http://prometheus-server:9090/-/reload

1.2.4 配置监控大盘

  • 操作如下

    • 官方提供了监控模板,地址如下
    # 模板ID: 14612
    https://grafana.com/grafana/dashboards/14612-rocketmq/

1.3 Sql Exporter

  • 简要说明
    • sql_exporter 主要对接诸如 Mysql、PostgreSql 等数据库,允许用户通过 select 语句把查询结果作为metrics暴露
    • 主要用来监控标准模板中不提供的一些参数或者标准模板中不提供的一些功能
    • 例如,领导想通过运营大盘查看当天的交易信息:如订单数、营业额、再细化到每个类目的经营数据等等
    • 开源地址 https://github.com/free/sql_exporter

1.3.1 准备模拟数据

  • 操作如下,以Mysql示例

    • 创建数据库表
    # 账号密码
    root  123456
    # 订单库
    CREATE DATABASE order_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    # 订单表
    CREATE TABLE tb_orders (
      order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
      order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单编号',
      user_id BIGINT NOT NULL COMMENT '用户ID',
      order_status TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态(0:待支付,1:已支付,2:已发货,3:已完成,4:已取消)',
      total_amount DECIMAL(10,2) NOT NULL COMMENT '订单总金额',
      payment_amount DECIMAL(10,2) NOT NULL COMMENT '实际支付金额',
      discount_amount DECIMAL(10,2) DEFAULT 0.00 COMMENT '优惠金额',
      payment_method TINYINT COMMENT '支付方式(1:支付宝,2:微信,3:银行卡)',
      payment_time DATETIME COMMENT '支付时间',
      shipping_address VARCHAR(255) NOT NULL COMMENT '收货地址',
      shipping_name VARCHAR(50) NOT NULL COMMENT '收货人姓名',
      shipping_phone VARCHAR(20) NOT NULL COMMENT '收货人电话',
      shipping_code VARCHAR(50) COMMENT '物流单号',
      shipping_company VARCHAR(50) COMMENT '物流公司',
      order_remark VARCHAR(255) COMMENT '订单备注',
      create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      INDEX idx_user_id (user_id),
      INDEX idx_create_time (create_time),
      INDEX idx_order_status (order_status)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
    • 插入模拟数据
    INSERT INTO tb_orders (
      order_no, user_id, order_status, total_amount, payment_amount, 
      discount_amount, payment_method, payment_time, shipping_address, 
      shipping_name, shipping_phone, shipping_code, shipping_company, order_remark
    ) VALUES 
    ('ORD20230001', 1001, 3, 2999.00, 2799.00, 200.00, 1, '2023-05-15 14:30:22', '北京市朝阳区建国路88号', '张三', '13800138001', 'SF123456789', '顺丰速运', '请工作日配送'),
    ('ORD20230002', 1002, 2, 1598.00, 1598.00, 0.00, 2, '2023-05-16 09:15:43', '上海市浦东新区张江高科技园区', '李四', '13900139002', 'YT987654321', '圆通快递', '尽快发货'),
    ('ORD20230003', 1003, 1, 899.00, 899.00, 0.00, 3, '2023-05-17 19:45:12', '广州市天河区体育西路', '王五', '13700137003', NULL, NULL, '周末配送'),
    ('ORD20230004', 1001, 0, 1299.00, 1299.00, 0.00, NULL, NULL, '北京市海淀区中关村大街', '张三', '13800138001', NULL, NULL, '需要发票'),
    ('ORD20230005', 1004, 4, 599.00, 0.00, 0.00, NULL, NULL, '深圳市南山区科技园', '赵六', '13600136004', NULL, NULL, '用户取消订单');

1.3.2 部署方式一:Systemd

  • 操作如下

    • 从开源地址,下载最新版本的程序包
    # https://github.com/free/sql_exporter/releases/tag/0.5 下面用了加速地址
    wget https://dl.hukanfa.cn/https://github.com/free/sql_exporter/releases/download/0.5/sql_exporter-0.5.linux-amd64.tar.gz
    • 解压
    tar -zxvf sql_exporter-0.5.linux-amd64.tar.gz
    mv sql_exporter-0.5.linux-amd64 /usr/local/sql_exporter
    
    # 查看,sql_exporter.yml 是默认的配置文件,如果指定自定义配置文件需使用 -config.file /path/xxx.yml 
    [root@hukanfa sql_exporter]# ls
    LICENSE  README.md  mssql_standard.collector.yml  sql_exporter  sql_exporter.yml
    • order.config.yml 示例配置
    ## 创建目录
    mkdir -p /usr/local/sql_exporter/mysql_configs
    ## 创建配置文件
    vim /usr/local/sql_exporter/mysql_configs/order.config.yml
    # 全局设置和默认值。
    global:
    # 从 Prometheus 的 scrape_timeout 中减去,给我们一些余量并防止 Prometheus 首先超时。
    scrape_timeout_offset: 500ms
    # 收集器运行之间的最小间隔:默认情况下(0s)收集器在每次抓取时执行。
    min_interval: 0s
    # 对任何一个目标的最大打开连接数。指标查询将在多个连接上并发运行。
    max_connections: 3
    # 对任何一个目标的最大空闲连接数。
    max_idle_connections: 3
    
    # 要监控的目标和要在其上执行的收集器列表。
    target:
    # 数据源名称始终具有与驱动程序名称匹配的 URI 模式。在某些情况下(例如 MySQL)
    # 模式会被删除或替换以匹配驱动程序预期的 DSN 格式。
    data_source_name: 'mysql://root:123456@tcp(192.168.26.11:3307)/order_db'
    
    # 要在目标上执行的收集器(按名称引用)。
    collectors: [mysql_order_collector]
    
    # 收集器定义文件,如果和配置文件同目录可以这样写,或者写通配 - "*.collector.yml"
    collector_files: 
    - "order.collector.yml"
    • mysql_configs/order.collector.yml
    # 此收集器将在导出器配置中引用为 `mysql_order_collector`。
    collector_name: mysql_order_collector
    
    # 一个 Prometheus 指标,带有(可选的)附加标签,值和标签从一个查询中填充。
    # 下面的收集器定义生成形式为 total_revenue{order_status="xxx"} 的指标。
    metrics:
    # 第一个指标:total_revenue(订单总金额)
    - metric_name: total_revenue
      type: gauge
      help: "每笔订单的金额"
      key_labels:
        - order_status  # 动态标签,从查询结果获取
      values: [total_amount]  # 指标值对应的列
      query: |
        SELECT order_no, total_amount, order_status
        FROM tb_orders
    
    # 第二个指标:order_count(订单数量)
    - metric_name: order_count
      type: counter
      help: "每种状态订单数量"
      key_labels:
        - order_status
      values: [count]  # 指标值对应的列
      query: |
        SELECT COUNT(*) as count, order_status
        FROM tb_orders
        GROUP BY order_status
    
    # 第三个指标:avg_order_value(平均订单金额)
    - metric_name: avg_order_value
      type: gauge
      help: "每种状态平均订单金额"
      key_labels:
        - order_status
      values: [avg_amount]  # 指标值对应的列
      query: |
        SELECT AVG(total_amount) as avg_amount, order_status
        FROM tb_orders
        GROUP BY order_status
    • 配置开机自启
    vim /usr/lib/systemd/system/sql-exporter-order.service
    [Unit]
    Description=Database agnostic SQL exporter for Prometheus⁠
    Documentation=https://github.com/free/sql_exporter
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    User=root
    Restart=always
    ExecStart=/usr/local/sql_exporter/sql_exporter 
    -config.file=/usr/local/sql_exporter/mysql_configs/order.config.yml 
    -web.listen-address 0.0.0.0:9399
    ExecReload=/bin/kill -HUP $MAINPID
    
    [Install]
    WantedBy=multi-user.target
    
    ## 重载配置,开机自启
    systemctl daemon-reload
    systemctl start sql-exporter-order
    systemctl status sql-exporter-order
    systemctl enable sql-exporter-order

1.3.3 部署方式二:Docker

  • 操作如下

    • 准备目录和相关配置文件
    # 官方在 hub.docker.com 提供了镜像,可直接使用
    mkdir sql_exporter && cd sql_exporter
    # 目录结构如下
    sql_exporter
    ├── docker-compose.yaml
    └── mysql_configs
      ├── order.collector.yml
      └── order.config.yml
    • docker-compose.yaml
    services:
    sql-exporter:
      image: githubfree/sql_exporter:0.5
      container_name: order_sql_exporter
      restart: unless-stopped
      ports:
        - "9399:9399"
      volumes:
        - ./mysql_configs:/etc/sql_exporter
      command:
        - "--config.file=/etc/sql_exporter/order.config.yml"
    • 创建容器
    docker-compose up -d

1.3.4 测试获取指标数据

  • 操作如下

    • 使用curl命令
    $ curl -l localhost:9399/metrics
    # HELP avg_order_value 每种状态平均订单金额
    # TYPE avg_order_value gauge
    avg_order_value{order_status="0"} 1299
    avg_order_value{order_status="1"} 899
    avg_order_value{order_status="2"} 1598
    avg_order_value{order_status="3"} 2999
    avg_order_value{order_status="4"} 599
    # HELP order_count 每种状态订单数量
    # TYPE order_count counter
    order_count{order_status="0"} 1
    order_count{order_status="1"} 1
    order_count{order_status="2"} 1
    order_count{order_status="3"} 1
    order_count{order_status="4"} 1
    # HELP total_revenue 每笔订单的金额
    # TYPE total_revenue gauge
    total_revenue{order_status="0"} 1299
    total_revenue{order_status="1"} 899
    total_revenue{order_status="2"} 1598
    total_revenue{order_status="3"} 2999
    total_revenue{order_status="4"} 599
    • 浏览器访问 http://192.168.26.11:9399/metrics

1.3.5 接入 Prometheus

  • 操作如下

    • 调整 Prometheus 配置文件
    vim /etc/prometheus/prometheus.yml
    scrape_configs:
    - job_name: "sql_exporter_order"
      metrics_path: "/metrics"
      static_configs:
        - targets: ["192.168.26.11:9399"]
    • 重载 Prometheus 配置
    curl -X POST http://prometheus-server:9090/-/reload