开发者学堂课程【3天吃透 Prometheus:记录规则和 Grafana 的使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1244/detail/18449
记录规则和 Grafana 的使用
查询持久化
经过之前的学习了解到在Prometheus的表达式浏览器进行的查询会页码生成时间序列,能够帮助绘图,但这种查询语句书写起来并不容易,例如刚刚写的
rate(prometheus http_requests_total(code="404"[6h) > on (handler)0.05 * sum by (handler)(rate(prometheus _http_requests_totallGhj,但下次写的时候就消失了。
关掉页面,再次打开时查询的语句就不存在了。语句被暂时储存下来时,过段时间也会被清除。所以存储的一个方法是有一个界面,在填写完表达时候,有一个页面能够保存这个界面,下次打开时这个界面依然存在。Prometheus也提供了这样一个接口,但并不是任意表达或者任意存储的接口,生成的新的数据序列,但其结果仅临时保存于Prometheus Server上;
在样本数据量较大、工作较为繁忙的Prometheus Server上,对于那些查询频率较高且运算较为复杂的查询来说,实时查询可能会存在一定程度的响应延迟;
提供了另外一种作用,比如说在样本数据量较大,工作较为繁忙的Pro server上,对于那些查询率较高,而且运算又较复杂的查询来讲,那这种实时查询它可能会存在一定程度的响应延迟,像这种情况下,要么数入量较大,工作比较繁忙,表达式又很复杂,可以用promise内建的一种功能,记录规则予以保留好了,记录规则是一种什么东西呢?它就是能够预先运行频繁被用到。或者表达式较为复杂,计算消耗较大的时候,它可以自己周期性的运算,这种表达式,而把表达式的结果存储为一个时间序列。很多时候可能会表达这种计算很复杂的,写起来很复杂的,这种表达的式,这种表达式很有可能将来需要被格,这样的图形展示界面所展示的,就算能够把它记录到格当中,但是对Pro服务端来讲,那计算代价非常高,很有可能延迟也会非常大,尤其是在server上数据量非常大的时候,而要去聚合一个非常长的时间,那段的一个数据,还要对它做逐一进行连接,运算的时候, Pro server可能会。过个三五秒才能输出结果,而每隔五秒钟要计算一次,那很显然,Protedserver就可以让preserver把这种规则给它保存下来,然后在后台周期性的运算,随后用户用到这个数据结果的时候不要实时发给Pro去计算了,而是直接查询过去保存的计算结果就行了,就叫做记录规则。记住规则,怎么定义?本身其实就是保存了pre配置文件中的查询语句,在preserver启动的时候。有四位加载以后,能够类似于批处理的任务,在后台周期性执行,执行结果还会被记录下来,回头客户端,只需要查询这个结果就行了,所以这种查询速度是远快于实时查询的,例如写了一个表达式,对于这个表达式而言,它需要在一堆的时间去列,在表达式之上,做一个非常非常复杂的计算这个计算结果。很有可能需要一秒钟才能生成假设,于是在表达式浏览器当中填入这个表达式算一次需要一秒钟才能得到结果,到那时需要每隔五秒钟就算一次,或者每隔五分钟。计算一次算一次,对服务器来说算一秒,其实是一个很大的压力,表达式可能会有很多。为了避免实时计算,就是在这边填一下一点,它才会计算,为了避免这种问题,可以把这个表达式写在Pro的配置文件中,然后让permitserver自每隔比如15秒,就在上面计算一次,每计算。
1、记录规则(Recording rule))能够预先运行频繁用到或计算消耗较大的表达式,并将其结果保存为一组新的时间序列;
记录规则是定义在Prometheus配置文件中的查询语句,由Server加载后,它能够于以类似批处理任务的方式在后台周期性的执行并记录查询结果;
客户端只需要查询由记录规则生成的结果序列上的样本数据即可,速度远快于实时查询;常用于跨多个时间序列生成聚合数据,或者计算消耗较大的查询等场景中;
多见于同可视化工具结合使用的需求中,也可用于生成可产生告警信息的时间序列;
2、告警规则(Alert rule)是另一种定义在Prometheus配置文件中的PromQL表达式它通常是一个基于查询语句的布尔表达式,该表达式负责触发告警;
告警规则中用的查询语句较为复杂时,可将其保存为记录规则,而后通过查询该记录规
则生成的时间序列来参与比较,从而避免实时查询导致的较长时间延迟;
生成一个新的时间序列,当用户在表达式浏览器时候再填这个表达式计算的时候怎么办?不会去计算,而直接去查即时样本,取来就完成,而不是实时计算,而是取即时样本,至少用户在用到的时候就会比较快,但是对于实时计算有一个必竟有一个区别,拿到的样本可能并不是对用户而言,并不是浏览器当中的表达,执行的一刻提醒的一刻,结果,而有可能是过去一段时间,但是最长不超过这么长时间,因为假定是这么多周期抓的,而保存了15秒以内的一个即时样本。
对于promise来讲,就叫做记录规则,因为把规则保存下来了,而且保存以后生成一个记录,所以这种多见于同可视化工具结合使用的需求当中,比如跟gra结合起来,用gra展示的时候绘图。为了让这个图形的动态展示,可能真的每隔五秒钟或者每隔15秒钟就插一次,对这种复杂性上来讲,显然不可用,需要用记录规则来加速这种图形展示的结果,好的,那另外除了记录规则之外,还有一种规则,也可以保存下来的,叫告警规则。告警规则是另外一种定义,在Pro配置文件中的problemql表达式,而且通常是一种for型表达式,它的返回值要么为真,要么为假,为真的时候呢,就意味着要告警,但它的表达式结果主要是负责出发,告诫我们,这里的持久化,虽然也是一种持久化机制,但是它的生成,结果是为了告诫。
3、配置Recording rule
记录规则将生成新的时间序列,因而其名称必须是规范的指标名称格式;记录规则必须定义在规则组(rule group)中,各规则按给定的顺序依次运行;规则组的定义语法如下:
groups:[ - <rule_group> ]<rule_group># The name of the group. Must be unique within a file.name: <string># How often rules in the group are evaluated.
Pre当中的命名规范所指定的这个取名格式,如果有多条规则的话,各个规则按给定的顺序,确定一个顺序进行,而定义时,主要设计两个维度,第一,定义规则,定个规则组,在每一个组当中定义一条一条的规则,每一个规则应该有个名称。底下可以定义表达式,接着,需要在配置文件中去载入所写的表达式,正常情况下,应该把规则写在一个独立的文件中,这让pre再去加载它,这跟此前那个定义基于文件的服务发现很相像。只不过这加载有一个特殊位置,专门来制定,以提前部署的Pre的为例,主推文件pre一定往下有一个顶级配置,这叫rollelses可以看到这叫规则文件,顶级配置段,在这底下以列表项目格式给定加载哪些文件就行了,比如有一个目录,就叫做record recording rules命名为ecord,使用相对路径相对路径,它表示就在promise的安装目录下。或者加目录表下都写recording rule,如何记录,所有以点ya结尾的文件,都包含进来
[ interval: <duration> | default = global.evaluation_interval ]- recording_rules/* . yamlconsole_libraries consoles data LICENSE NOTIcE prometheus prometheus .yml prometheu .ymi-v1 promtool targets[ root@mastere1 prometheus]# vim prometheus.yml[root@mastere1prometheus]#mkdir recording_rules[root@mastere1prometheus]#cdrecording_rules/[ root@mastere1 recording_rules]# ls[root@mastere1recording_rules]#vimprometheus-requests.yaml
通常需要让Pro重载配置文件的,现在还没有准备任何规则,要准备的规则,需要创建叫做right的目录,Recording recording rule recording rule,导recording rule目录下,比如创建一个一。点YM结果的文件来一个复杂的404响应码的错误比例,假设取名为pro.yellow吧,或者叫promirequestrequest.yellow在里面可以定义假设的取名PreMiss。
定义配置,不过定义格式,这里是个事例,要使用group groups先先定一个组,说明这个。
4、Recording rule使用示例Recording rule示例,通常要保存于单独的文件中,如rules /
recording_rules.yamlgroups:- name: custom_rulesinterval: 5srules:- record: instance:node_cpu:avg_rate5mexpr: 100 - avg(irate(node_cpu_seconds_totaljob="node" , mode="idle"][5m]) by (instance)* 100- record: instace:node_memory_MemFree_percentexpr: 100 - (100 * node_memory_MemFree_bytes / node_memory_MemTotal_bytes)- record: instance:root:node_filesystem_free_percentexpr: 100 * node_filesystem_free_bytes{mountpoint="/"/ node_filesystem_size_bytes[mountpoint="/"}而后在prometheus.yml中通过rule_files加载该文件scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.--…"#Load rules once and periodically evaluate them according to the global 'evaluation_interval'.rule_files:- "rules/*.yaml"
先定一个组,说明这个组底下的每个规则,每个多长时间运行一次使用rules来制定每个rule,每个rule使用record record是每个 rule,使用record冒号制定它的名称,这个名称使用通常使用冒号的分割。来表达它的意义,然后使用EXPR来指定规则的格式如实例所示,第一个计算sense那个实例上nocpuavg.Fileminutes,就计算什么接单上的cpu,平均五分钟的不是没有五分钟的平均使用的增长率,也可能是负增长啊,使用内内部函数average对seconds,这个指标,这是用nopo到load,而后呢,Job等于nono,等于idol,再到model等于iol,对于每一个节点上的空闲比例以五分钟为范围。做速率计算计算完以后,求平均值,求平均值的时候,By instance就以每个节点上的所有cpu实例求平均值,求完以后乘100,这就表示空闲比例。100减去空闲比例,剩下的就是占用比例。意思就是,每个阶段的cpu平均五份的比例,instance not memory free person叫内存的空闲比例,那就使用内存的空闲字节比上总的内存大小第一笔。这应该是一个分数,是一个小数,应该是大于零,小于等于一,乘以100再用100减,那就说占用比例不对,所以这里应该不是free person,应该是叫use the person需要用100减,不减的话就才是for percent。Recording instance说,Not fforpercent表是找好看跟文件系统根文件系统的空间空弦比例,找出来空弦字节数,刚才边根的文件系统除以总字节数。乘以100所以是它的空弦比例,然后就可以加载该文件,所以将计算放入,可能这个计算可能比例偏小。所以计算不出结果,所以应用实例来进行。复制出来,用文本处理复制可以不用再写。Site case
Memory修改成memused不再是空闲比例的,不是member for,而是member used person
instance:node_cpu:avg_rate5mexpr: 100 - avg(irate是自己定义的名字,以后用这个查询就可以,
重新启动
[ rootamasterAl recordina rulecl kill 1381[ root@masterei recording_rules]# clear[ root@mastere1 recording_rules]# cd ..l[root@mastere1 prometheus]# ./prometheus
启动完成,定义每隔五秒钟报错一次,将rainstance:node cpuavg rate5m作为我们要使用的过滤器。虽然每隔五秒钟评估一次,但每次加载完成需要时间。
确认主配置文件[ root@mastere1 prometheus]# vim prometheus.yml
recording_rules/, yaml[root@mastere1 prometheusj# ls recording_rules/prometheus- requests.yaml
确认主配置文件加载
[root@mastere1 prometheus]# vim prometheus.yml[root@mastero1 prometheus]# ls recording_rules/prometheus-requests.yaml
加载路径为:recording_rules/t.yaml
检查没有问题后进行查询,
Recording rule使用示例
Web UI中的/rules路径下可展示加载的所有rules
Rulescustom_rules10.630s ago 2.270ms Rule StateError Last Evaluation Evaluation Timerecord: instance:node_cpu: avg_rate5a ok10.631s ago 0.914ms expr:100 - avg by(instance) (irate (node_cpu_seconde_totalljob "nodo " node "idlo"”][5]))·100reeord:instace: node_memory_MesFree_percentok 10.630s ago 0.546ms expr:100 - (100 * node_memory_MeFree_bytes / node_ncnory_MleaTotal_bytez)record:instance: root: node_filesystem_free_percentok 10.630s ago0.782ms expr:100 * node_filesystem_free_bytes inountpoint"/]/ node_filesystem_size_bytes lnountpoint "/"1
相关指标的使用方式与常规指标并无不同
instance:rootinode_filesystem_free_percentExecute Table Load time 6ms Resolutione 7s Pesulilt seriesGraph Evaluation timeinstancerootrnode fleystem frepecentapp= 'nodexporer ,app.name='node expoter ,device "/devsda3 , endpoint="http/1ocahocts10.ymetisfatype=*ds-,81.30091928228302instance=""localhost910o . job="node" . job_name="node" , mountpoint="//“
在record rule使用数据当中来看,Web UI当中直接看加载的rule就可以,如果现在不能到指标来访问,判定它是不是已经被加载的规则。表达式浏览器下有是ro,只能看到信息,显示state为OK,而且已经评过一次了,这就说明,一定抓到小的指标,那这一次再看看excuse仍旧为空,就说明它的抓的值可能是空的,因为它也没有错,状态也是OK的,说明表达式浏览器有问题。
这个表达式就会有问题,人为查询一下,注意一下,系统就知道了。
没有为空的这个标签,没有空,那它就只能计算了,否则not写错了,叫notes。
第二个节点应该没有什么问题,
鼠标点击处为跟文件系统的使用比例,应该为系统比例。之后就可以当作指标应用了,现在也没什么问题了。也有数据了,之前是有个标签引用错了。
Grafana
Grafana是一款基于go语言开发的通用可视化工具,支持从多种不同的数据源加载并展示数据,可作为其数据源的部分存储系统如下所示
TSDB: Prometheus、IfluxDB、OpenTSDB和Graphit
日志和文档存储;Loki和ElasitchSearch
口分布式请求跟踪:Zipkin、Jaeger和Tempo
SQL DB: MySQL、PostgreSQL和Microsoft SQL Server…
Grafana基础
默认监听于TCP协议的3000端口,支持集成其他认证服务,且能够通过/metrics输出内建指标;
几个基本概念
数据源(Data Source):提供用于展示的数据的存储系统;
仪表盘(Dashboard):组织和管理数据的可视化面板(Pancl) ;团队和用户:提供了面向企业组织层级的管理能力;
部署Grafana◆Ubuntu/Debian系统上的部署步骤0 ~# apt-get install -y adduser
libfontconfig10 ~# VERSION=7.3.60 ~# wget https:/ /mirrors.huaweicloud.com/ grafana/$ {VERSION}/ grafana_ S{VERSION} _amd64.deb0 ~# dpkg -i grafana_ ${VERSION}_ _amd64.deb◆RHEL/CentOS系统上的部署步骤0 ~]# VERSION=7.3.60 ~]# wget https:/ /mirrors.huaweicloud.com/ grafana/S {VERSION}/ grafana-${VERSION}-1.x86_ 64.rpm0 ~]# yum install grafana-7.3.6-1.x86_ _64.rpm◆Docker容器运行方式0 ~]# VERSION=7.3.60 ~]# docker run _d - name=grafana -p 3000:3000 grafana/ grafana0 ~]# docker run -d -ame=grafana -P 3000:3000 grafana/ grafana:S {VERSION}-ubuntu