运维实战课程
运维实战课程
举例
查询例子
简单的时间序列选择
返回度量指标名称是http_requests_total的所有时间序列样本数据:
http_requests_total
返回度量指标名称是http_requests_total, 标签分别是job=“apiserver, handler=”/api/comments的所有时间序列样本数据:
http_requests_total{job=“apiserver”, hanlder="/api/comments"}
返回度量指标名称是http_requests_total, 标签分别是job=“apiserver, handler=”/api/comments,且是5分钟内的所有时间序列样本数据:
http_requests_total{job=“apiserver”, handler="/api/comments"}[5m]
注意:一个范围向量表达式结果不能直接在Graph图表中,但是可以在"console"视图中展示。
使用正则表达式,你可以通过特定模式匹配标签为job的特定任务名,获取这些任务的时间序列。在下面这个例子中, 所有任务名称以server结尾。
http_requests_total{job=~“server$”}
返回度量指标名称是http_requests_total, 且http返回码不以4开头的所有时间序列数据:
http_requests_total{status!~"^4…$"}
使用函数,操作符等
返回度量指标名称http_requests_total,且过去5分钟的所有时间序列数据值速率:
rate(http_requests_total[5m])
假设度量名称是http_requests_total,且过去5分钟的所有时间序列数据的速率和,速率的维度是job:
sum(rate(http_requests_total)[5m]) by (job)
如果我们有相同维度标签,我们可以使用二元操作符计算样本数据,返回值:key: value=标签列表:计算样本值。
例如,下面这个表达式返回每一个实例剩余内存,单位是M, 如果不同,则需要使用ignoring(label_lists),如果多对一,则采用group_left, 如果是一对多,则采用group_right。
(instance_memory_limit_byte - instant_memory_usage_bytes) / 1024 / 1024
相同表达式,求和可以采用下面表达式:
sum( instance_memory_limit_bytes - instance_memory_usage_bytes) by (app, proc) / 1024 / 1024
如果相同集群调度器任务,显示CPU使用率度量指标的话,如下所示:
instance_cpu_time_ns{app=“lion”, pro=“web”, rev=“34d0f99”, env=“prod”, job=“cluster-manager”}instance_cpu_time_ns{app=“elephant”, proc=“worker”, rev=“34d0f99”, env=“prod”, job=“cluster-manager”}instance_cpu_time_ns{app=“turtle”, proc=“api”, rev=“4d3a513”, env=“prod”, job=“cluster-manager”} …
我们可以获取最高的3个CPU使用率,按照标签列表app和proc分组:
topk(3, sum(rate(instance_cpu_time_ns[5m])) by(app, proc))
假设一个服务实例只有一个时间序列数据,那么我们通过下面表达式,可以统计出每个应用的实例数量:
count(instance_cpu_time_ns) by (app)
记录规则
定义recording rules
配置规则
Prometheus支持可以配置,然后定期执行的两种规则: recording rules(记录规则)和alerting rules(警告规则)。
为了在Prometheus系统中包括规则,我们需要创建一个包含规则语句的文件,并通过在Prometheus配置的rule_fields字段加载这个记录规则文件。
这些规则文件可以通过像Prometheus服务发送SIGNUP信号量,实时重载记录规则。如果所有的记录规则有正确的格式和语法,则这些变化能够生效。
语法检查规则
在没有启动Prometheus服务之前,想快速知道一个规则文件是否正确,可以通过安装和运行Prometheus的promtool命令行工具检验:
当记录规则文件是有效的,则这个检查会打印出解析到规则的文本表示,并以返回值0退出程序。
如果有任何语法错误的话,则这个命令行会打印出一个错误信息到标准输出,并以返回值1退出程序。无效的输入参数,则以返回值2退出程序。
记录规则
记录规则允许你预先计算经常需要的,或者计算复杂度高的表达式,并将结果保存为一组新的时间序列数据。
查询预计算结果通常比需要时进行计算表达式快得多。对于dashboard是非常有用的,因为dashboard需要实时刷新查询表达式的结果。
为了增加一个新记录规则,增加下面的记录规则到你的规则文件中:
[{}] =
例子:
计算每个job的http请求总数,保存到新的度量指标中:
job:http_inprogree_requests:sum = sum(http_inprogress_requests) by (job)
放弃老标签,写入新标签的结果时间序列数据:
new_time_series{label_to_change=“new_value”, label_to_drop=""} = old_time_series
记录规则的执行周期有Prometheus的配置文件中的evaluate_interval指定。
规则语句的右侧表达式一旦被执行,则新的时间戳key为当前时间,value为右边表达式的样本值,新的度量指标名称和标签列表为左边名称。
HTTP API访问
在Prometheus服务上/api/v1版本api是稳定版。
格式概述
这个API返回是JSON格式。每个请求成功的返回值都是以2xx开头的编码。
到达API处理的无效请求,返回一个JSON错误对象,并返回下面的错误码:
400 Bad Request。当参数错误或者丢失时。
422 Unprocessable Entity。当一个表达式不能被执行时。
503 Service Unavailable。当查询超时或者中断时。
在请求到达API之前,其他非2xx的错误码可能会被返回。
JSON返回格式如下所示:
"status": "success" | "error",
"data": <data>,
// 如果status是"error", 这个数据字段还会包括下面的数据
"errorType": ",
"error": "
}
输入时间戳可以被RFC3339格式或者Unix时间戳提供。输出时间戳以Unix时间戳的方式呈现。
查询参数名称可以用[]中括号重复次数。
占位符提供像http_requests_total或者http_requests_total{method=~"^GET|POST$"}的Prometheus时间序列选择器,并需要在URL中编码传输。
占位符涉及到[0-9]-[smhdwy]。例如:5m表示5分钟的持续时间。
表达式查询
查询语言表达式可以在瞬时向量或者范围向量中执行。
Instant queries(即时查询)
瞬时向量的http restful api查询:
GET /api/v1/query
URL查询参数:
query=: Prometheus表达式查询字符串。
time=:执行时间戳,可选项。
timeout=:执行超时时间设置,默认由-query.timeout标志设置。
如果time缺省,则用当前服务器时间表示执行时刻。
这个查询结果的data部分有下面格式:
是一个查询结果数据,依赖于这个resultType格式, 不同的结果类型,则会有不同的结果数据格式。见表达式查询结果格式。
下面例子执行了在时刻是2015-07-01T20:10:51.781Z的up表达式:
范围查询
下面评估了一个范围时间的查询表达式:
GET /api/v1/query_range
URL查询参数
query=: Prometheus表达式查询字符串。
start=<rfc3339 | unix_timestamp>:开始时间戳。
end=:结束时间戳。
step=:查询时间步长,范围时间内每step秒执行一次。
下面查询结果格式的data部分:
对于占位符的格式,下面例子执行了在时刻是2015-07-01T20:10:51.781Z的up表达式:
范围查询
下面评估了一个范围时间的查询表达式:
GET /api/v1/query_range
URL查询参数
query=: Prometheus表达式查询字符串。
start=:开始时间戳。
end=<rfc3339 | unix_timestamp>:结束时间戳。
step=:查询时间步长,范围时间内每step秒执行一次。
下面查询结果格式的data部分:
对于占位符的格式,下面例子评估的查询条件up,且30s范围的查询,步长是15s。
查询元数据
通过标签匹配器找到度量指标列表。
下面例子返回了度量指标列表,且不返回时间序列数据值:
GET /api/v1/series
URL查询参数:
match[]=:选择器是series_selector。这个参数个数必须大于等于1。
start=:开始时间戳。
end=:结束时间戳。
返回结果的data部分,是由key-value键值对的对象列表组成的。
下面这个例子返回时间序列数据,选择器是up或者process_start_time_seconds{job=“prometheus”}
查询标签值
下面这个例子,返回了带有指定标签的标签值列表。
GET /api/v1/label//values
这个返回JSON结果的data部分是带有label_name=job的值列表:
删除时间序列
下面的例子,是从Prometheus服务中删除匹配的度量指标和标签列表:
DELETE /api/v1/series
URL查询参数
match[]=:删除符合series_selector匹配器的时间序列数据。参数个数必须大于等于1。
返回JSON数据中的data部分有以下的格式:
{ “numDeleted”: }
下面的例子删除符合度量指标名称是up或者时间序列为process_start_time_seconds{job=“prometheus”}:
表达式查询结果格式
表达式查询结果,在data部分的result部分中,返回下面的数据。占位符有数值样本值。
JSON不支持特殊浮点值,例如:NaN, Inf和-Inf。因此样本值返回结果是字符串,不是原生的数值。
范围向量
范围向量返回的result类型是一个matrix矩阵。下面返回的结果是result部分的数据格式:
瞬时向量
瞬时向量的result类型是vector。下面是result部分的数据格式:
Scalars标量
标量查询返回result类型是scalar。下面是result部分的数据格式:
[ , “” ]
字符串
字符串的result类型是string。下面是result部分的数据格式:
[ , “” ]
推荐阅读
>>>Linux运维零基础入门第一课 - 云计算是什么,如何定义
>>>Docker容器使用-Linux运维红帽RHCE零基础入门课
>>>Linux运维工程师年薪30w?为什么他可以我不行?行业概述
运维界升职加薪必备的云计算技术,你学了吗?
学完高级运维云计算课程之后,你可以:
跨越90%企业的招聘硬门槛
增加70%就业机会
拿下BAT全国TOP100大厂敲门砖
体系化得到运维技术硬实力
技术大佬年薪可达30w+
资源放送
2021新版Linux运维高级云计算-红帽RHCE实战课程合集,扫描下方二维码即可领取!