Prometheus
一、基础简介
1.1.prometheus简介
1.2.数据模型
1.3.指标类型
1.4.Jobs和Instances
二、安装部署
2.1.rpm部署监控组件
2.2.docker部署监控组件
三、PromSQL
3.1.PromQL基本使用
3.2.Prometheus基础查询
3.3.查询操作符
3.4.内置函数
3.5.在HTTPAPI中使用PromQL
3.6.最佳实践
四、告警处理
4.1.告警简介
4.2.自定义Prometheus告警规则
4.3.常见告警规则
4.4.部署Alertmanager
4.5.Alertmanager配置概述
4.6.基于标签的告警处理路由
4.7.使用Receiver接收告警信息
4.8.自定义告警模板
4.9.屏蔽告警通知
4.10.使用RecodingRules优化性能
五、Exporter
5.1.exporter
5.2.NodeExporter
5.3.ProcessExporter
5.4.cAdvisor
5.5.MysqlExporter
5.6.BlackboxExporter
5.7.ProcessExporter
5.8.Ipmiexport
5.9.Pushgateway
PostgresExporter
六、Grafana
6.1.grafana基本概念
6.2.创建dashboard与Panel
6.3.变化趋势:Graph面板
6.4.graph面板常用操作
6.5.分布统计:Heatmap面板
6.6.当前状态:SingleStat面板
6.7.变量
6.8.grafana报警
七、集群高可用
7.1.本地存储
7.2.远程存储
7.3.联邦集群
7.4.prometheus高可用
7.5.Alertmanager高可用
八、服务发现
8.1.Prometheus与服务发现
8.2.基于文件的服务发现
8.3.标签管理
九、Operator
9.1.什么是PrometheusOperator
9.2.PrometheusOperator自定义监控项
9.3.配置PrometheusRule
十、AlterManager
10.1.基础入门
10.2.配置详解
本文档使用 MrDoc 发布
-
+
home page
3.3.查询操作符
# 二元操作符 ## 计算二元操作符 普罗米修斯中存在以下二进制运算符: - + (加) - -(减) - *(乘法) - /(除法) - %(取余) - ^(取幂) 二元算术运算符定义在标量/标量、向量/标量和向量/向量值对之间。<br />在两个标量之间,行为是明显的,它们计算到另一个标量,该标量是应用于两个标量操作数的操作符的结果。<br />在瞬时向量和标量之间,该运算符应用于向量中的每个数据样本的值。例如,如果一个时间序列瞬时向量乘以 2,则结果是另一个向量,其中原始向量的每个样本值都乘以 2。指标名称将被删除。<br />在两个瞬时向量之间,对左边向量中的每一项和右边向量中的匹配元素应用一个二元算术运算符。结果被传播到结果向量中,分组标签成为输出标签集。指标名称将被删除。在右边向量中找不到匹配条目的条目不属于结果的一部分。 ## 比较二元操作符 Prometheus 中存在以下二进制比较运算符: - == (等于) - != (不等于) - > (大于) - < (小于) - >= (大于等于) - <= (小于等于) 比较运算符定义在标量/标量、向量/标量和向量/向量值对之间。默认情况下,它们进行过滤。它们的行为可以通过在操作符后提供 bool 来修改,这将返回值 0 或 1,而不是过滤。<br />在两个标量之间,必须提供 bool 修饰符,这些操作符会产生另一个标量,根据比较结果,标量要么为 0 (false),要么为 1 (true)<br />在瞬时向量和标量之间,这些操作符被应用到向量中的每个数据样本的值,而比较结果为假的向量元素将从结果向量中删除。如果提供了 bool 修饰符,则要删除的向量元素的值为 0,而要保留的向量元素的值为 1。如果提供了 bool 修饰符,则删除指标名称。<br />在两个瞬时向量之间,这些操作符默认情况下作为过滤器,应用于匹配的条目。表达式不为真或在表达式的另一端没有找到匹配的向量元素将从结果中删除,而其他元素将传播到结果向量中,分组标签将成为输出标签集。如果提供了 bool 修饰符,那么将被删除的向量元素的值为 0,而将被保留的向量元素的值为 1,分组标签再次成为输出标签集。如果提供了 bool 修饰符,则删除指标名称。 ## 逻辑/二元操作符 这些逻辑/集合二元运算符只在瞬时向量之间定义: - and (与) - or (或) - unless (非) Vector1 和 vector2 的结果是一个由 Vector1 中的元素组成的向量,而 vector2 中的元素具有完全匹配的标签集。其他元素被删除。指标名称和值是从左边的向量传递过来的。<br />Vector1 或 vector2 的结果是包含 Vector1 的所有原始元素(标签集+值)和 vector2 中没有匹配标签集的所有元素的 vector。<br />除非 vector2 的结果是由 Vector1 的元素组成的向量,而在 vector2 中没有完全匹配的标签集。删除两个向量中所有匹配的元素。 ## 二元运算符优先级 下面这个列表列举了 Prometheus 二进制操作符的优先顺序,按照从高到低的顺序排列。 ``` 1. ^2. *, /, %3. +, -4. ==, !=, <=, <, >=, >5. and, unless6. or ``` 相同优先级的操作符是从左向右进行计算的。例如,2 * 3 % 2相当于(2 * 3)% 2。但是^是从右向左的,所以2 ^ 3 ^ 2等于2 ^ (3 ^ 2) 。 # 向量匹配 向量与向量之间进行运算操作时会基于默认的匹配规则:依次找到与左边向量元素匹配(标签完全一致)的右边向量元素进行运算,如果没找到匹配元素,则直接丢弃。<br />接下来将介绍在 PromQL 中有两种典型的匹配模式:一对一(one-to-one),多对一(many-to-one)或一对多(one-to-many)。 ## 一对一向量匹配 一对一的向量匹配会从操作符的每一边表达式找到一对唯一的样本值。在默认情况下,这是遵循vector1 <operator> vector2 格式的操作。<br />在操作符两边表达式标签不一致的情况下,可以使用 on(label list)或者 ignoring(label list)来修改便签的匹配行为。ignoring 关键字允许在匹配时忽略某些标签,而 on 关键字允许将考虑的标签集减少到提供的列表: ``` <vector expr> <bin-op> ignoring(<label list>) <vector expr><vector expr> <bin-op> on(<label list>) <vector expr> ``` 比如这样的数据样本: ``` method_code:http_errors:rate5m{method="get", code="500"} 24method_code:http_errors:rate5m{method="get", code="404"} 30method_code:http_errors:rate5m{method="put", code="501"} 3method_code:http_errors:rate5m{method="post", code="500"} 6method_code:http_errors:rate5m{method="post", code="404"} 21 method:http_requests:rate5m{method="get"} 600method:http_requests:rate5m{method="del"} 34method:http_requests:rate5m{method="post"} 120 ``` 下面我们看一个查询的例子。 ``` method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m ``` 这该表达式会返回在过去 5 分钟内,HTTP 请求状态码为 500 的在所有请求中的比例。如果没有使用 ignoring(code),操作符两边表达式返回的瞬时向量中将找不到任何一个标签完全相同的匹配项。<br />同时由于 method 为 put 和 del 的样本找不到匹配项,因此不会出现在结果当中。 ``` {method="get"} 0.04 // 24 / 600{method="post"} 0.05 // 6 / 120 ``` ## 一对多或者多对一向量匹配 多对一和一对多匹配是指“一”上的每个向量元素都可以与“多”上的多个元素匹配。这必须使用 group_left 或 group_right 确定哪一个向量具有更高的基数(充当“多”的角色)。 ``` <vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr><vector expr> <bin-op> ignoring(<label list>) group_right(<label list>) <vector expr><vector expr> <bin-op> on(<label list>) group_left(<label list>) <vector expr><vector expr> <bin-op> on(<label list>) group_right(<label list>) <vector expr> ``` 多对一和一对多两种模式一定是出现在操作符两侧表达式返回的向量标签不一致的情况。因此需要使用 ignoring 和 on 修饰符来排除或者限定匹配的标签列表。 ``` method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m ``` 该表达式中,左向量 method_code:http_errors:rate5m 包含两个标签 method 和 code。而右向量 method:http_requests:rate5m 中只包含一个标签 method,因此匹配时需要使用 ignoring 限定匹配的标签为 code。 在限定匹配标签后,右向量中的元素可能匹配到多个左向量中的元素 因此该表达式的匹配模式为多对一,需要使用 group 修饰符 group_left 指定左向量具有更好的基数。<br />最终的运算结果如下: ``` {method="get", code="500"} 0.04 // 24 / 600{method="get", code="404"} 0.05 // 30 / 600{method="post", code="500"} 0.05 // 6 / 120{method="post", code="404"} 0.175 // 21 / 120 ``` 多对一和一对多匹配是应该仔细考虑的高级用例。通常,正确使用 ignoring(<labels>) 可以得到预期的结果。 # 聚合运算符 Prometheus 支持以下内置聚合操作符,这些操作符可用于聚合单个瞬时向量的元素,从而生成一个包含更少元素、具有聚合值的新向量: - sum (在当前维度求和) - min (在当前维度取最小值) - max (在当前维度取最大值) - avg (在当前维度计算平均值) - group (结果向量中的所有值都是 1) - stddev (在当前维度计算标准差) - stdvar (在当前维度计算标准方差) - count (计算向量中元素的个数) - count_values (等于某值的元素个数) - bottomk (按样本值计算的最小 k 个元素) - topk (按样本值计算的最大 k 个元素) - quantile (计算φ-quantile(0≤φ≤1)的值,也就是百分位数) 这些操作符既可以用于对所有标签维度进行聚合,也可以通过包含 without 或 by 子句来保留不同的维度。这些子句可以用在该查询的前面或后面。 ``` <aggr-op> [without|by (<label list>)] ([parameter,] <vector expression>) # 或者<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)] ``` Label list是一个未加引号的标签列表,后面可能包含一个逗号,即(label1, label2)和(label1, label2,)都是有效的语法。<br />without删除结果向量中列出的标签,并且保留输出中的其他标签。by则相反,删除by子句中没有列出的标签,即使它们的标签值在向量的所有元素中是相同的。<br />parameter参数仅用于 count_values、quantile、topk 和 bottomk。<br />count_values为每个唯一的样本值输出一个时间序列。每个系列都有一个附加标签。该标签的名称由聚合参数给出,标签值是唯一的样本值。每个时间序列的值是该样本值出现的次数。<br />topk和bottomk与其他聚合器不同的是,在结果向量中返回输入样本的子集(包括原始标签)。by和without仅用于抽取输入向量。<br />quantile计算φ-quantile,即在所有维度的 N 个度量值中排名为φ*N 的值。以φ为聚合参数。例如,分位数(0.5,…)计算中位数,分位数(0.95,…)第 95 个百分位。 # 查询示例 ## 运算操作符 ``` #算数操作符+ (加法) - (减法)* (乘法)/ (除法)% (求余)^ (幂运算) ``` 上边基本都是常规的运算,幂运算比较少用,我们看一下幂运算<br />比如下列指标 的值为 5 ``` process_open_fds ``` 我们来求一下 3 次方,也就是 3 次幂 ,最后的结果是 125 。 ``` process_open_fds ^ 3 ``` ## 比较运算符 ``` == (等于)!= (不等于)> (大于)< (小于)>= (大于等于)<= (小于等于 ``` 这些运算符大部分是单独使用,个别情况下可以同时使用,类似大于小于这种情况可以同时使用,枚举一下大约是这么几种情况,其他情况下存在冲突。 ``` > 、 < >= 、 < > 、 <= ``` 比如 ``` process_open_fds > 3 and process_open_fds < 7 ``` ## 聚合运算符 ``` sum #求和min #最小值max #最大值avg #平均值count #元素个数count_values #等于某值的元素个数bottomk #最小的 k 个元素topk #最大的 k 个元素 ``` 这些函数适合于这个语法 ``` <聚合函数>([parameter,] <指标查询语句>) [without|by (<label list>)] ``` without⽤于从计算结果中移除列举的标签,⽽保留其它标签。<br />by 则正好相反,结果向量中只保留列出的标签,其余标签则移除。<br />通过without和by可以根据指标的 label 对数据进⾏聚合。<br />其中只有 count_values , quantile , topk , bottomk ⽀持参数(parameter)。<br />sum 、max、min、avg 这些都是常见的聚合函数了,我们一起举例就好。 ``` sum(http_request_total)max(http_request_total)min(http_request_total)avg(http_request_total) ``` 对这些指标使用 without和by 就是这样, ``` sum(http_request_total) without (instance, job) sum(http_request_total) by (instance, job) ``` count 是统计指标数值的个数, count_values 是统计含有某个参数或值的数量。<br />比如 ``` # 统计文件打开数的值的个数count(process_open_fds) # 统计 Instance 有多少个值。count_values("instance",process_open_fds) ``` bottomk 和 topk ``` # 最小的 5 个值bottomk(5, process_open_fds)# 最大的 5 个值,Top 5topk(5, process_open_fds) ```
Nathan
Aug. 24, 2024, 3:09 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password