0x00 功能介绍

  • 首页:首页搜索框可以输入PromQL进行数据查询,其中Graph可以按照时间维度做简单可视化
  • Alert:预警配置
  • Status:查看Prometheus系统状态,包括数据库状态,配置信息,监控目标状态等
Status->Target可以查看所有监控目标的情况,up表示运行正常,DOWN表示服务未启动

0x01 PromQL

介绍

PromQL是prometheus数据查询语言,类似SQL,通过SQL语句可以查询SQL数据库,同样,我们也可以通过PromQL查询prometheus数据库数据,prometheus数据库为时序数据库,指标数据存储都会带上时间标签,指标数据就是一组类似key-value的数据,比如以下是node-exporter部分metric数据
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
go_gc_duration_seconds{quantile="0.25"} 0
go_gc_duration_seconds{quantile="0.5"} 0
go_gc_duration_seconds{quantile="0.75"} 0
go_gc_duration_seconds{quantile="1"} 0
go_gc_duration_seconds_sum 0
go_gc_duration_seconds_count 0

go_gc_duration_seconds{quantile="0.25"} 0为例

  • go_gc_duration_seconds:指标名称
  • quantile:标签名称
  • 0.25:标签值
  • 0:指标值

为什么一个指标在同一时间会有多个不同标签的指标值呢,以cpu使用率来说,如果主机是2个cpu那么就得分别列出两个cpu的使用率,并且cpu使用率又分用户和系统,因此需要两个标签进行区分

node_cpu_guest_seconds_total{cpu="0",mode="sys"} 0
node_cpu_guest_seconds_total{cpu="0",mode="user"} 0
node_cpu_guest_seconds_total{cpu="1",mode="sys"} 0
node_cpu_guest_seconds_total{cpu="1",mode="user"} 0

语法

我们以node-exporter的指标为例,假设我们想知道当前各个节点剩余的内存大小,首先你得知道指标名称,有几个方法获得指标名称

  • 直接访问node-exporter指标接口比如http://10.66.222.8:9100/metrics,通过关键字memory进行搜索
  • prometheus的搜索框有自动完成功能,输入关键字可以对当前prometheus系统指标进行模糊搜索,比如输入memory就能显示当前系统所有包含memory的指标
  • 后续我们会讲grafana,可以导入别人做好的面板,根据面板找到相关指标名称

我们找到了剩余内存的指标名称node_memory_MemFree_bytes在prometheus输入框进行搜索

  • ① PromQL输入框
  • ② 可以切换到图形模式
  • ③ 指标列表,包括指标标签
  • ④ 指标值

这里有几个常见的标签

  • job:表示这个指标是那个任务写入,job列表可以在Status->Targets中进行查看
  • instance:表示该指标所代表的实例,实例有可能是主机,也有可能是应用等
  • node:在kubernetes中会经常碰到,表示节点名称

如果我们只想查询10.66.222.11:9100这个主机的数据,可以使用以下查询语句

node_memory_MemFree_bytes{instance="10.66.222.11:9100"}
{instance="10.66.222.11:9100"}表示过滤instance为10.66.222.11:9100数据,类似SQL中的where instance='10.66.222.11:9100'效果

当然,也可以添加多个条件

node_memory_MemFree_bytes{instance="10.66.222.11:9100",node="node-sit2"}

除了等于号,PromQL支持以下四种操作符

  • =: 精确地匹配标签给定的值
  • !=: 不等于给定的标签值
  • =~: 正则表达匹配给定的标签值
  • !~: 给定的标签值不符合正则表达式
样例
#查找instance为10.66.222.11:9100数据
node_memory_MemFree_bytes{instance="10.66.222.11:9100"}
#查找instance不等于10.66.222.11:9100数据
node_memory_MemFree_bytes{instance!="10.66.222.11:9100"}
#查找所有以10.66.222开头的instance
node_memory_MemFree_bytes{instance=~"10.66.222.*"}
#在查询标签有多个值的场景可以用正则匹配
node_memory_MemFree_bytes{instance=~"10.66.222.11:9100|10.66.222.17:9100"}
#查找所有不以10.66.222开头的instance
node_memory_MemFree_bytes{instance!~"10.66.222.*"}

范围

前面提到prometheus是时序数据库,所有指标数据都是带时间标签,有些指标单从指标值上看是没意义的,比如cpu使用时间,指标不会记录cpu的使用率,cpu记录的是cpu从开机到收集指标时运行的时长

比如上面这个返回的是cpu0的空闲时间,如果只有这一个数据是没有任何意义的,需要拿到一段范围内数据进行计算才能计算cpu的使用率,这时候我们就需要查询范围数据,语法如下

node_cpu_seconds_total{cpu="0",instance="10.66.222.11:9100",mode="idle"}[1m]
image-20210716164547511

在查询后面加上[1m]表示查询1分钟内的数据,因为prometheus设置15s采集一次,因此总共可以查到一分钟内4条指标数据,除了分钟,也可以指定其他时间单位

  • ms – milliseconds
  • s – seconds
  • m – minutes
  • h – hours
  • d – days
  • w – weeks
  • y – years

函数

比如我们需要统计结果数量,类似SQL中select count(1)功能,我们可以这么写

count(node_memory_MemFree_bytes{})

当然我们也可以在内部加过滤条件

count(node_memory_MemFree_bytes{instance="10.66.222.11:9100"})

prometheus函数很多,这里就不一一讲,可以在这里查到所有函数,这里需要重点讲irate这个函数,因为后面我们计算很多xx率的数据时会经常用到这个函数,比如cpu使用率等,前面说到,prometheus指标中是没有cpu使用率,原因也很简单,cpu使用率计算其实是跟时间范围有关,一个cpu在9点cpu使用时长是1000s,9点05分是1100s,9点10分是1110s,那么怎么计算cpu使用率,如果是以5分钟为单位,那么前五分钟就是(1100-1000/5×60)=33.33%,后五分钟是(1110-1100)/5*x60=3.333%,如果以10分钟为单位,就是(1110-1000)/10×60=18.333%,irate的计算逻辑和上面计算逻辑差不多,irate会根据相邻两个点计算速率,其实就是(指标2-指标1)/间隔时间。

计算cpu空闲率

irate(node_cpu_seconds_total{cpu="0",instance="10.66.222.11:9100",mode="idle"}[1m])

稍微变化下就能变为cpu使用率

100-irate(node_cpu_seconds_total{cpu="0",instance="10.66.222.11:9100",mode="idle"}[1m])*100

对于这种数据我们更喜欢通过图来看一段时间范围内变化情况,我们可以点击Grahpprometheus会根据结果自动绘制图形

,
Trackback

no comment untill now

Add your comment now