Prometheus安装以及基础使用

一、安装

打开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