美文网首页大数据
sql_exporter的使用

sql_exporter的使用

作者: huan1993 | 来源:发表于2021-03-13 13:59 被阅读0次

    一、背景

    有些时候,我们想看每天系统的登录人数、或者系统中订单的数据,比如:成功的订单、异常的订单等等。这些数据都在我们的数据库中,通过sql_exporter我们可以将这些数据接入到prometheus中,进行监控告警。

    二、sql-exporter的使用

    1、下载

    1、访问下载地址:https://github.com/free/sql_exporter/releases

    # 下载
    wget https://github.com/free/sql_exporter/releases/download/0.5/sql_exporter-0.5.darwin-amd64.tar.gz
    # 解压
    tar -zxvf sql_exporter-0.5.darwin-amd64.tar.gz
    # 重命名
    mv 
    

    2、配置文件

    1、sql_exporter.yml

    # 全局配置
    global:
      # 可以理解为执行sql语句的超时时间,这个值需要比prometheus的 `scrape_timeout` 值要小。如果配置了下方的 scrape_timeout_offset 值,那么最终的超时时间为, min(scrape_timeout, X-Prometheus-Scrape-Timeout-Seconds - scrape_timeout_offset)
      # X-Prometheus-Scrape-Timeout-Seconds 为 prometheus 的超时时间,从请求头中获取的
      scrape_timeout: 10s
      # 从 prometheus 的超时时间中减去一个偏移量,防止 prometheus 先超时。
      scrape_timeout_offset: 500ms
      # 各个sql收集器之间运行间隔的秒数
      min_interval: 0s
      # 允许获取到的数据库最大的连接数, <=0 表示不限制。
      max_connections: 3
      # 允许空闲连接数的个数,<=0 不做限制
      max_idle_connections: 3
    
    # 配置监控的数据库和抓取信息
    target:
      # 配置数据库链接信息
      # mysql://root(用户名):root(密码)@tcp(localhost:3306)/temp_work(库名)
      data_source_name: 'mysql://root:root@tcp(localhost:3306)/temp_work'
      # 收集器的名字, 对应者下方 collector_files 中具体的文件的 collector_name 的值
      collectors: [collector_user,collector_payment_orders]
    collector_files: 
      - "collectors/*.collector.yml"
    

    2、collectors 目录中的配置文件

    1、collector_user的配置

    cat  collectors/collector_user.collector.yml
    

    统计的是 某个字段 的值,该行只有一个单个的值,比如注册数等等,对应sql 类似 select count(*) from table

    # 收集器的名字
    collector_name: collector_user
    
    metrics:
      - metric_name: every_day_register_users # 指标的名字
        type: counter # 类型
        help: '统计每天的注册人数.' # 描述
        values: [register_users] # 值
        query: |
          select count(*) register_users from t_users where create_date between concat(curdate(),' 00:00:00') and concat(curdate(),' 23:59:59')
    

    2、collector_payment_orders的配置

    cat collectors/collector_payment_orders.collector.yml
    

    1、统计的是 一行只有一个值。 比如 统计每个用户(需要有一个指标名称) 的订单数量(值) 对应sql 类似 select count(1), user_name from table group by user_name 。
    2、统计的是一行可以有多个值。比如 统计每个用户(需要有指标名称) 的订单数量(指标名称和值)或订单金额(指标名称和值) 对应sql 类似 select user_name,count(1),sum(1) from table group by user_name。

    
    # 收集器的名字
    collector_name: collector_payment_orders
    
    metrics:
      - metric_name: every_day_order_cnt
        type: gauge 
        help: '每个人每天的订单数量和订单数量.'
        key_labels:
        - user_name # 会存在 {"user_name"="列user_name的值"}的标签
        values: 
        - order_cnt # 指标的值是 order_cnt 的值
        query: |
          select user_name as user_name,
           count(*) as order_cnt,
           sum(amount) as order_amount from payment_order
          where create_date between concat(curdate(),' 00:00:00') and concat(curdate(),' 23:59:59')
          group by user_name
    
      - metric_name: user_order_cnt_or_amount
        type: counter 
        help: '统计每个人(user_name)在每种订单状态(order_status)下的下单数量(order_cnt)或下单金额(order_amount)'
        key_labels: ["user_name","order_status"] # 每一行数据上会增加 {"user_name"="列user_name的值","order_status"="列order_status的值"} 标签
        value_label: 'operation' # 随便取一个名字,比如operation ,那么根据下方的 values 会存在 {"operation"="order_cnt"}或者{"operation"="order_amount"} 标签
        values: ["order_cnt","order_amount"]
        query: |
          select user_name as user_name,
           status as order_status,
           count(*) as order_cnt,
           sum(amount) as order_amount from payment_order
          group by user_name,status
    

    3、集成到prometheus中

    scrape_configs:
      - job_name: 'sql-exporter'
        static_configs:
        - targets: ['localhost:9089']
          labels:
            nodename: 'sql-exporter'
    

    4、启动

    #!/usr/bin
    
    nohup /Users/huan/soft/prometheus/sql_exporter/sql_exporter \
    --config.file="/Users/huan/soft/prometheus/sql_exporter/sql_exporter.yml" \
    --web.listen-address="0.0.0.0:9089" \
    > logs/sql_exporter.out 2>&1 &
    

    5、访问看是否有指标数据抓取

    指标抓取结果
    我的一个简单的理解:
    1、every_day_register_users 5 就是查询出来一个值
    但行数据,单个值
    2、every_day_order_cnt {user_name="lisi"} 2 多了一个自定义的label,它的值是values指定的值。
    一行数据,多加一个label
    3、user_order_cnt_or_amount{operation="order_amount",order_status="2",user_name="lisi"} 3
    user_order_cnt_or_amount{operation="order_amount",order_status="2",user_name="wangwu"} 4
    user_order_cnt_or_amount{operation="order_cnt",order_status="1",user_name="lisi"} 1 可以看到每个多了 user_name和order_status和operation 这3个label,该时间序列的是 operation标签对应的列的值。
    一行数据对应多个值

    三、建表语句

    CREATE TABLE `t_users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `create_date` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `payment_order` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `status` tinyint(4) DEFAULT NULL,
      `create_date` datetime DEFAULT NULL,
      `user_name` varchar(30) DEFAULT NULL,
      `amount` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO temp_work.t_users (id, create_date) VALUES (1, '2021-03-13 10:11:35');
    INSERT INTO temp_work.t_users (id, create_date) VALUES (2, '2021-03-13 10:11:39');
    INSERT INTO temp_work.t_users (id, create_date) VALUES (3, '2021-03-13 10:11:41');
    INSERT INTO temp_work.t_users (id, create_date) VALUES (4, '2021-03-13 10:11:44');
    INSERT INTO temp_work.t_users (id, create_date) VALUES (5, '2021-03-13 10:11:45');
    INSERT INTO temp_work.payment_order (id, status, create_date, user_name, amount) VALUES (1, 1, '2021-03-13 10:12:49', 'zhangsan', 1);
    INSERT INTO temp_work.payment_order (id, status, create_date, user_name, amount) VALUES (2, 1, '2021-03-13 10:12:51', 'zhangsan', 2);
    INSERT INTO temp_work.payment_order (id, status, create_date, user_name, amount) VALUES (3, 2, '2021-03-13 10:12:53', 'lisi', 3);
    INSERT INTO temp_work.payment_order (id, status, create_date, user_name, amount) VALUES (4, 2, '2021-03-13 10:12:54', 'wangwu', 4);
    INSERT INTO temp_work.payment_order (id, status, create_date, user_name, amount) VALUES (5, 1, '2021-03-13 10:12:55', 'lisi', 5);
    

    四、参考链接

    1、sql-exporter下载链接
    2、sql_exporter默认的配置文件

    相关文章

      网友评论

        本文标题:sql_exporter的使用

        本文链接:https://www.haomeiwen.com/subject/cijxcltx.html