一、安装
打开https://prometheus.io/download/
解压,打开解压文件目录,执行./prometheus
打开以下网址ip:9090
下载node_explorter
解压,打开解压文件目录,执行./node_explorter
编辑prometheus.yml
重启prometheus,打开ip:9090
下载grafana, 图形管理平台
解压,进入bin目录,执行./grafana-server
打开ip:3000,进入平台
设置数据源,新建图表图形模板
二、工作原理
Prometheus用于管理数据
node_explore用于收集产生数据,可以有多个收集不同数据的插件
grafana用于将数据显示出来
三、函数用法
irate(v range-vector)函数, 输入:范围向量,输出:key: value = 度量指标: (last值-last前一个值)/时间戳差值。它是基于最后两个数据点,自动调整单调性, 如:服务实例重启,则计数器重置。
下面表达式针对范围向量中的每个时间序列数据,返回两个最新数据点过去5分钟的HTTP请求速率。
irate(http_requests_total{job="api-server"}[5m])
sum(irate(node_disk_written_bytes_total{instance==""}[1m]))
sum(irate(node_disk_read_bytes_total{instance==""}[1m]))
increase函数:该函数配合counter数据类型使用,获取区间向量中的第一个和最后一个样本并返回其增长量。如果除以一定时间就可以获取该时间内的平均增长率increase(node_cpu[2m]) / 120 #主机节点最近两分钟内的平均CPU使用率
rate()函数:该函数配合counter类型数据使用,取counter在这个时间段中的平均每秒增量。比如监控网络接受字节数的情况,在9:10到9:20期间累计量增加了1000bytes,加入rate([1m])函数后就会使用1000除以60秒,计算出数据大约为16bytes。rate(node_cpu[2m]) #直接计算区间向量在时间窗口内平均增长速率
sum函数:在实际工作中CPU大多是多核的,而node_cpu会将每个核的数据都单独显示出来,我们其实不会关注每个核的单独情况,而是关心总的CPU情况。使用sum()函数进行求和后可以得出一条总的数据,但sum()是将所有机器的数据都进行了求和,所以还要再使用by (instance)或者by (cluster_name)就可以取出单个服务器或者一组服务器的CPU数据。上面的公式可以进化为:sum( increase(node_cpu[1m]) )
count函数:该函数用于进行一些模糊判断,比如有100台服务器在监控,想实现当CPU使用率大于80%的机器达到N台就进行报警就可以使用它
count(count_netstat_wait_connections > 200)
topk函数:该函数可以从大量数据中取出排行前N的数值,N可以自定义。比如监控了100台服务器的320个CPU,用这个函数就可以查看当前负载较高的那几个,用于报警
topk(3,count_netstat_wait_connections) #Gauge类型
topk(3,,rate(node_network_receive_bytes[20m])) #Counter类型
predict_linear函数:对曲线变化速率进行计算,起到一定的预测作用。比如当前这1个小时的磁盘可用率急剧下降,这种情况可能导致磁盘很快被写满,这时可以使用该函数,用当前1小时的数据去预测未来几个小时的状态,实现提前告警
predict_linear( node_filesystem_free_bytes{mountpoint="/"}[1h],4*3600 ) < 0 #如果未来4小时后磁盘使用率为负数就会报
四、基础数据获取与分析
CPU
CPU使用率
(1-avg(irate(node_cpu_seconds_total{mode="idle",instance=""}[5m]))) * 100
监控内存RAM
总内存大小
node_memory_MemTotal_bytes{instance=""}
可用内存
node_memory_MemAvailable_bytes{instance=""}
Buffer缓存
node_memory_Buffers_bytes{instance=""}
Cached缓存
node_memory_Cached_bytes{instance=""} + node_memory_Slab_bytes{instance=""}
空闲内存
node_memory_MemFree{instance=""}
已用内存
node_memory_MemTotal_bytes{instance=""}-node_memory_MemFree{instance=""}-node_memory_Cached_bytes{instance=""}
内存使用率
1-((node_memory_MemFree{instance=""}+node_memory_Buffers_bytes{instance=""}+node_memory_Cached_bytes{instance=""})/ node_memory_MemTotal_bytes{instance=""})*100
磁盘性能分析(ROM)
磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。单位 iops
sum by (instance) (irate(node_disk_reads_completed_total{instace=""}[1m])) / 60
sum by (instance) (irate(node_disk_writes_completed_total{instace=""}[1m])) / 60
sum by (instance) (irate(node_disk_reads_completed_total{instace=""}[1m])) / 60+sum by (instance) (irate(node_disk_writes_completed_total{instace=""}[1m])) / 60
磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小,单位bytes
sum(irate(node_disk_read_bytes_total{instance=""}[1m]))/60
sum(irate(node_disk_written_bytes_total{instance=""}[1m]))/60
sum(irate(node_disk_read_bytes_total{instance=""}[1m]))/60+sum(irate(node_disk_written_bytes_total{instance=""}[1m]))/60
IO time 每个磁盘分区输入/输出操作花费的秒数
sum(irate(node_disk_io_time_seconds_total{instance=""}[5m]))/60 #每秒磁盘读写花费的秒数
total:总计物理内存的大小。
Free:空闲内存有多少。
Shared:多个进程共享的内存总额。
Buffers:表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。
Cached:表示page cached的内存数量,一般作文件系统的cached,频繁访问的文件都会被 cached。如果cached值较大,就说明cached文件数较多。如果此时IO中的bi比较小,就 说明文件系统效率比较好。
Slab:slab分配器不仅可以提供动态内存的管理功能,而且可以作为经常分配并释放的内存的缓存。
MemAvailable: Free + Buffers + Cached - 不可回收的部分。不可回收部分包括:共享内存段,tmpfs,ramfs等。
网络监控
发送流量
sum(irate(node_network_transmit_bytes_total{instance=""}[1m]))
接收流量
sum(irate(node_network_receive_bytes_total{instance=""}[1m]))
五、测试脚本
test_io.py
test_memory.py
网友评论