Prometheus使用

suveng 运维监控 被围观了

Prometheus使用

环境

命令行入门实例

  • CPU使用率计算

CPU在t1到t2时间段总的使用时间 = ( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1) CPU在t1到t2时间段空闲使用时间 =(idle2 - idle1)

CPU在t1到t2时间段即时利用率 = 1 - CPU空闲使用时间 / CPU总的使用时间

increase() 函数:解决counter类型的时间增量

多核CPU计算

sum()结果求和

  • 获取CPU时间
  • 获取空闲时间idle

获取总的时间

  • 单台机器的CPU总利用率
  1-(sum(increase(node_cpu_seconds_total{instance="192.168.9.232:9100",mode="idle"}[1m]))/sum(increase(node_cpu_seconds_total{instance="192.168.9.232:9100"}[1m])))
  • by(instance): 区分不同实例

  • (1-( sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total{}[1m]) ) by(instance) )) * 100
    
    • 计算其他CPU状态时间的使用

    • iowait io等待时间

    sum(increase(node_cpu_seconds_total{mode="iowait"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total{}[1m]) ) by(instance)

    • irq 硬中断

    sum(increase(node_cpu_seconds_total{mode="irq"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total{}[1m]) ) by(instance)

    • soft irq 软中断

    sum(increase(node_cpu_seconds_total{mode="softirq"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total{}[1m]) ) by(instance)

    • steal 虚拟机的分片时间

    sum(increase(node_cpu_seconds_total{mode="steal"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total{}[1m]) ) by(instance)

    • nice 进程分配nice值的时间

    sum(increase(node_cpu_seconds_total{mode="nice"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total{}[1m]) ) by(instance)

    • idle空闲

    sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total{}[1m]) ) by(instance)

    • user用户态

    sum(increase(node_cpu_seconds_total{mode="user"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total{}[1m]) ) by(instance)

    • sytem内核态

    sum(increase(node_cpu_seconds_total{mode="system"}[1m])) by(instance) / sum(increase(node_cpu_seconds_total{}[1m]) ) by(instance)

    命令行扩展使用

    • 过滤

    • 标签过滤 key{label=""}

    • 模糊匹配 key{label=~"web.*"}

    • 数值过滤

    • 四则运算 key{.} > 400

    • 函数

    • rate(.[5m]) 搭配counter型数据, 按照设置的一个时间段,取counter在这个时间段的增量的平均每秒

    $value = ∆S/∆t$

    • 时间段的取值 要考虑采集数据的程序采集间隔

    • increase(.[5m])搭配counter型数据,取一个时间段的增量 $value=∆S$

    • sum()加和

    • 结合 by()

    • topk(x,key) 取最高前x位

    • 不适合 graph ; 适用于console 查看

    • 适合瞬时报警

    • count()

    • 模糊监控判断

    采集数据

    服务端启动-适用于生产

    > yum install -y kernel-devel 
    > yum groupinstall -y Development tools
    > git clone https://github.com/bmc/daemonize.git
    > cd daemonize
    > ./configure && make && make install 
    
  • 启动prometheus额外参数

    • –web.listen-address : 监听地址 0.0.0.0:9090
    • –web.read-timeout : 请求链接最大等待时间 2m
    • –web.max-connections: 最大连接数 10
    • –storage.tsdb.retention: 数据保存期限 90d
    • –storage.tsdb.path: 数据保存路径 /data/prometheus/server/data
    • –query.max-concurrency: 最大并发数 20
    • –query.timeout: 查询超时时间 2m
  • 存储结构

  server/
  └── data
      ├── 01DM9HP1PHHK2BD1MGC7J1C0YC
      │   ├── chunks
      │   │   └── 000001
      │   ├── index
      │   ├── meta.json
      │   └── tombstones
      ├── 01DM9ZDG8QKWTPYZ86K7XW6FKZ
      │   ├── chunks
      │   │   └── 000001
      │   ├── index
      │   ├── meta.json
      │   └── tombstones
      ├── 01DMAM0NM51YSQ4EVRRV46X2E1
      │   ├── chunks
      │   │   └── 000001
      │   ├── index
      │   ├── meta.json
      │   └── tombstones
      ├── 01DMAM0P4CGJWSSA15QPWJGZXF
      │   ├── chunks
      │   │   └── 000001
      │   ├── index
      │   ├── meta.json
      │   └── tombstones
      ├── lock
      ├── queries.active
      └── wal
          ├── 00000011
          ├── 00000012
          ├── 00000013
          ├── 00000014
          ├── 00000015
          ├── 00000016
          ├── 00000017
          ├── 00000018
          └── checkpoint.000010
              └── 00000000
  • 近期数据保存在wal/目录中,防止突然断电或者重启,以用来恢复内存中的数据

服务端配置文件写法

global:
  scrape_interval:     5s #抓取频率
  evaluation_interval: 1s 



alerting:
  alertmanagers:
  - static_configs:
    - targets:



rule_files:

scrape_configs:	

  - job_name: 'prometheus'

    static_configs:
    - targets: ['localhost:9090']

  - job_name: '233-node-exporter'

    static_configs:
    - targets: ['192.168.9.233:9100']

  - job_name: '232-node-exporter'

    static_configs:
    - targets: ['192.168.9.232:9100']

  - job_name: '239-node-exporter'

    static_configs:
    - targets: ['192.168.9.239:9200']

node_exporter

github地址

  • 采集服务器的指标
  • 有足够多的默认采集项
  • 可以通过启动时,开启或者禁用某些指标

pushgateway

  • 介绍 主动推送数据到prometheus server

可以单独运行在不同节点上,并不要求是监控节点

  • 安装

  • 自定义采集脚本发送到pushgateway

    #!/bin/bash
    instance_name=instance_name
        
    label=label
    value=123
        
    echo "$label $value" | curl --data-binary @- http://192.168.9.233:9091/metrics/job/test/instance/$instance_name
    
    • 缺点
    • 单点瓶颈
    • 没有数据过滤

    自定义exporter

    界面可视化

    grafana

    • 添加dashboard image-20190910175959926

    • 建立Dashboard

    • 数据源配置 image-20190910175917439

    • 图形配置

    • Visualization image-20190910175754722

    • Axes image-20190910175814132

    • Legend image-20190910175830342

    • Thresholds & Time Regions image-20190910175852153

    • Data link

    • 通用配置 image-20190910180031703

    • 告警配置 image-20190910180042705

    • 备份

    • 导出json

    • save as

    • 还原

    • 导入json/粘贴json

    • 报警功能 报警是 grafana 4.0 的新功能

    • 钉钉告警

    • pageduty

    实践

    • 内存使用率
    • 数据来源 node_exporter
    • 计算公式 $value=available/Sum$ 实际可用内存=free+buffers+cached
    • 公式实现 ((node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes)/node_memory_MemTotal_bytes)*100

    • 硬盘io监控

    • 数据来源 node_exporter

    • 计算公式 $value=读速度+写速度$

    • 公式实现 函数: predict_linear(), 预测趋势 (rate(node_disk_read_bytes_total[1m])+rate(node_disk_written_bytes_total[1m]))

    • 网络监控

    • 数据来源 bash脚本+pushgateway

    • 脚本编写 采集内网流量ping延迟和丢包率

    instance=`hostname -f`
    #外网联通
    lostpk=`timeout 5 ping -q -A -s 500 -W 1000 -c 100 baidu.com | grep transmitted | awk '{print $6}'`
    #时间
    rrt=`timeout 5 ping -q -A -s 500 -W 1000 -c 100 baidu.com | grep transmitted | awk '{print $10}'`
        
    # value只允许数值型
    value_lostpk=${lostpk%%\%}
    value_rrt=${rrt%%ms}
        
    # 通过 pushgateway 发送给prometheus
    echo "lostpk_$instance : $value_lostpk"
    echo "lostpk_$instance $value_lostpk" | curl --data-binary @- http://192.168.9.233:9091/metrics/job/network-traffic/instance/$instance
        
    echo "rrt_$instance : $value_rrt"
    echo "rrt_$instance $value_rrt" | curl --data-binary @- http://192.168.9.233:9091/metrics/job/network-traffic/instance/$instance
        
    
    • 定时执行 资料 定时执行步骤:

    • 安装crontab

    • /etc/crontab配置cron运行对应可执行脚本

    • 查看结果

    • 在prometheus查看targets有没有在线,如果没有需要到prometheus配置,记得刷新配置 image-20190912115039938

    • 查看配置

    image-20190912115136770

    • 看指标,在命令行输入刚刚自定的key应该会有提示出现lostpk rrt image-20190912124023780
  • pingport监控问题,prometheus不适合

    • 如果在pushgateway到脚本之间 或者 prometheus 到 pushgateway之间出现网络问题, 那么数据就无法采集, 会出现误报情况
    • 使用nagios可以替换这种监控的缺点
suveng
Java服务端开发者