这个是我一直不想写的,嫌麻烦。还有就是这么多大神,我还差得远,不过是为了通过输出更好的理解这些知识。

介绍

Prometheus 是一个时序数据库,可以存储它通过 exporters 抓取回来的监控数据。那这些数据怎么去查询呢?比如MySQL有SQL语句,那Prometheus有啥呢?PromQL (Prometheus Query Language) ,这是Prometheus开发的数据查询DSL语言,日常的可视化以及告警规则都要用到它。这个很重要,一定得好好学一下。

举个例子

浏览器打开Prometheus的web界面,http://localhost:9090/graph。可以看到有个输入框, 就是输 PromQL语句的地方,下方有个 Execute 按钮。

先拿Nginx的指标举个例子,Nginx如何监控,请查看我之前的文章Prometheus监控nginx

查看一台Nginx的活跃连接数,即active指标,如何看呢?

在服务器上查看完整的指标语句是:

[wonders@node1 ~]$ curl http://172.18.11.192:9145/metrics
# HELP nginx_http_connections Number of HTTP connections
# TYPE nginx_http_connections gauge
nginx_http_connections{state="active"} 1349
nginx_http_connections{state="reading"} 0
nginx_http_connections{state="waiting"} 1341
nginx_http_connections{state="writing"} 5
......

那我只想看 active 怎么办呢?在输 PromQL 语句的地方输入

nginx_http_connections{state="active"}

会输出所有Nginx机器的 active

nginx_http_connections{instance="172.18.11.192:9145",job="Nginx",state="active"}  1459
nginx_http_connections{instance="172.18.11.193:9145",job="Nginx",state="active"}   1456

当我只想看其中一台比如192这台的时候呢?

nginx_http_connections{instance="172.18.11.192:9145",state="active"}

会输出192的指标

nginx_http_connections{instance="172.18.11.192:9145",job="Nginx",state="active"}    1358

是不是有点明白了?

当然线上不可能只有一台Nginx,那我想算总和呢?就是所有Nginx的active相加,这个基本需求PromQL早已实现。

sum(nginx_http_connections{state="active"})

输出结果如下

{} 2900

同样的 PromQL 还有sum (求和);min (最小值);max (最大值);avg (平均值);stddev (标准差);stdvar (标准差异);count (计数);count_values (对 value 进行计数);bottomk (样本值最小的 k 个元素);topk (样本值最大的k个元素);quantile (分布统计),等等各种计算函数。这种在Prometheus叫做聚合操作。


这时有人说我不想看某一台机器的指标怎么办呢?使用 !=

nginx_http_connections{instance!="172.18.11.192:9145",state="active"}

这种操作符还有算数二次元运算符(加减乘除)、布尔运算符(= ,!= ,< , > ,<= ,>= )、集合运算符(and,or,unless)、匹配模式等等

看了上面的例子,应该有同学已经开窍了,下面的都是理论知识了。

理论知识

基本上是翻译了官方的https://prometheus.io/docs/prometheus/latest/querying/basics/

查询结果类型

PromQL 查询结果有下面4种类型:

  • 即时数据 (Instant vector): 一组时间序列,每个时间序列包含一个样本,所有样本共享相同的时间戳,例如:http_requests_total
  • 区间数据 (Range vector): 组时间序列,其中包含每个时间序列随时间的一系列数据点,例如:http_requests_total[5m]
  • 纯量数据 (Scalar): 纯量只有一个数字,没有时序,例如:count(http_requests_total)
  • String-一个简单的字符串值;目前未使用

查询条件

Prometheus 存储的是时序数据,而它的时序是由名字和一组标签构成的,其实名字也可以写出标签的形式,例如 http_requests_total 等价于 {name="http_requests_total"}。

一个简单的查询相当于是对各种标签的筛选,例如:

http_requests_total{code="200"} // 表示查询名字为 http_requests_total,code 为 "200" 的数据

查询条件支持正则匹配,例如:

http_requests_total{code!="200"}  // 表示查询 code 不为 "200" 的数据
http_requests_total{code=~"2.."} // 表示查询 code 为 "2xx" 的数据
http_requests_total{code!~"2.."} // 表示查询 code 不为 "2xx" 的数据

操作符

Prometheus 查询语句中,支持常见的各种表达式操作符,例如

算术运算符:

支持的算术运算符有 +,-,*,/,%,^, 例如 http_requests_total * 2 表示将 http_requests_total 所有数据 double 一倍。

比较运算符:

支持的比较运算符有 ==,!=,>,<,>=,<=, 例如 http_requests_total > 100 表示 http_requests_total 结果中大于 100 的数据。

逻辑运算符:

支持的逻辑运算符有 and,or,unless, 例如 http_requests_total == 5 or http_requests_total == 2 表示 http_requests_total 结果中等于 5 或者 2 的数据。

聚合运算符:

支持的聚合运算符有 sum,min,max,avg,stddev,stdvar,count,count_values,bottomk,topk,quantile,, 例如 max(http_requests_total) 表示 http_requests_total 结果中最大的数据。

注意,和四则运算类型,Prometheus 的运算符也有优先级,它们遵从(^)> (*, /, %) > (+, -) > (==, !=, <=, <, >=, >) > (and, unless) > (or) 的原则。

内置函数

Prometheus 内置不少函数,方便查询以及数据格式化,例如将结果由浮点数转为整数的 floor 和 ceil,

floor(avg(http_requests_total{code="200"}))
ceil(avg(http_requests_total{code="200"}))

查看 http_requests_total 5分钟内,平均每秒数据

rate(http_requests_total[5m])

告警规则

看了前面的知识,现在知道如何取指标了,那告警怎么做呢?还是先举个例子

在 Zabbix上告警怎么做的?比如单台Nginx active指标超过1w就要发出告警,触发器那里选的是Nginx active项,然后选大于10000,触发告警。

Prometheus 也是一样啊,你用如下语句获取当前值

nginx_http_connections{instance="172.18.11.192:9145",state="active"}

前面说了PromQL支持比较运算符,那告警规则就这么写

nginx_http_connections{instance="172.18.11.192:9145",state="active"} > 10000

简单吧。。。如下为完整的告警规则

 groups:- name: Nginxrules:- alert: HighErrorRateexpr: nginx_http_connections{instance="172.18.11.192:9145",state="active"} > 10000for: 5mlabels:severity: pageannotations:summary: "啊啊啊啊啊,(instance {{ $labels.instance }}) 连接数超1w了"description: "Nginx 连接数现在 VALUE = {{ $value }}n  LABELS: {{ $labels }}"#group:定义一组相关规则#alert:告警规则名称#expr:基于PromQL的触发条件#for 等待评估时间#label 自定义标签#annotation:指定一组附加信息Alertmanger特性

下一篇写 Prometheus 如何做告警。。。

怎么查看ingress的规则_Prometheus PormQL语法及告警规则写法相关推荐

  1. Prometheus告警规则

    完整译文请访问:http://www.coderdocument.com/docs/prometheus/v2.14/prometheus/configuration/alerting_rules.h ...

  2. prometheus告警规则管理

    微型公众号:运维开发故事,作者:夏老师 什么是Rule Prometheus支持用户自定义Rule规则. Rule分为两类,一类是Recording Rule,另一类是Alerting Rule.Re ...

  3. 怎么查看ingress的规则_有机合成中常见的基础理论规则

    本文总结了本号以往发布的一些有机合成中常见的基础理论规则,方便大家学习交流,点击下方标题链接链接可以查看详细内容,内容不全,小编后面还会更新.在下方菜单"知识技能"中也可以点击查看 ...

  4. android中SELINUX规则分析和语法简介

    点击打开链接 1. SELINUX是可以理解为一种Android上面的安全机制,是有美国国家安全局和一些公司设计的一个针对linux的安全加强系统 我们可以通过配置SELINUX的相关policy,来 ...

  5. CSS大会 | 打破常“规”:挖掘语法解析器规则漏洞

    2019年7月30-31日,第五届互联网安全领袖峰会(CSS 2019)在北京开幕.作为前沿技术安全研究团队代表,Tencent Blade Team两位高级安全研究员受邀登台,探讨如何挖掘语法解析器 ...

  6. markdown语法与markdlint规则讲解

    Markdown-基本语法及markdownlint规则 一.概述 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. Markdow ...

  7. 规则引擎—Drools 语法第一天[学习笔记]

    1.为什么要用规则引擎? eg:商场商品打折(逻辑与规则如下表) 规则编号 购买总金额 折扣 1 total<100 0.9 2 100<= total <500 0.8 3 tot ...

  8. abp过滤规则android,撰写 Adblock Plus 过滤规则

    当前的 Adblock Plus 版本允许您通过许多不同的方法来优化过滤规则.本文档就是告诉您如何做. 声明:这里给出的过滤规则只是示例,不一定能直接使用. AdBlock Plus 过滤规则介绍 本 ...

  9. java 规则引擎_GitHub - javaso/rulegin: 分布式规则引擎系统,重构于开源IOT项目thingboard...

    一.背景 规则引擎是一种根据规则中包含的指定条件,判断其能否匹配运行时刻的实时条件来执行规则中所规定的动作, 用户可通过规则引擎设定消息处理规则, 对指定的消息采取相应的措施来对设备进行监控和处理,如 ...

  10. drools规则引擎技术指南_物联网规则引擎技术

    物联网应用程序设计与典型的IT解决方案大不相同,因为它将物理操作技术(OT)与传感器.致动器和通信设备连接起来,并将数字信息技术(IT)与数据.分析和工作流连接起来. 在企业环境中,物联网非常复杂,这 ...

最新文章

  1. 菲波那切数列php实现,php实现菲波那切数列和杨辉三角
  2. 【Linux】一步一步学Linux——uptime命令(76)
  3. 小功能隐藏着大学问---windows的ACL带来的挑战
  4. 行健设计_行健要闻|“第四届‘天行健创新创业设计大赛”培训班成功举办
  5. 毕业后想成为一名软件开发工程师,应该如何学习,大牛给出建议!
  6. Memchache 总结
  7. 软件研发管理体系建设
  8. 手机通达信正在连接服务器,通达信服务器全部连接超时
  9. 百度2023校招 内推码IVV4AS
  10. IEEEtran Latex模板五作者排版问题
  11. android 版本号 7.0 O,微信全面上线64位7.0.9版本:运行速度更快,你更新了吗?(附下载)...
  12. 使用搜狗浏览器的教育网代理进行下载
  13. 免费易混实词辨析456组(1)
  14. Python算法之旅元组的风暴之最长上升子序列
  15. C语言小例子【基础】
  16. mlops_电影在mlops上
  17. 语言学c刊,完整版|最新版C刊(2021-2022版)目录发布!新增和踢出了哪些?
  18. java物流网站的设计与实现
  19. 电脑无法打开网页,但可以使用客户端软件如何解决?
  20. BrainNet Viewer:人类大脑连接的网络可视化工具

热门文章

  1. php 给图片加水印
  2. Amoeba Architecture
  3. Zabbix Server安装部署
  4. HTML contenteditable 属性
  5. 1. thinkphp (1)
  6. 缓存算法及Redis、Memcached、Guava、Ehcache中的算法
  7. 12. nc/netcat 用法举例
  8. java7-3 继承
  9. 《sort命令的k选项大讨论》-linux命令五分钟系列之二十七
  10. 什么是js面向对象??