欢迎访问我的博客,你的支持,是我最大的动力!

prometheus操作指南

Linux 小马奔腾 780℃ 评论
目录:
[显示]

基础学习

电子书:Promethues操作指南

资料

Prometheus对标签的操作
http://www.51niux.com/?id=254

报警规则
https://awesome-prometheus-alerts.grep.to/rules

 

基础

四种指标类型

  • counter 计数器,只增不减 一般以_total作为后缀
    通过rate()可以求增长率, topk(n,xxx) 获取前n排行
  • gauge 仪表盘,值可上下变化
    delta() 可获取样本在一段时间内的变化情况;deriv() 计算线性回归模型;predict_linear() 对数据变化趋势预测
  • histogram 直方图 反映在不同区间样本个数
    histogram_quantile() 可以计算分位数
  • summary 摘要 反映分位数情况

without表达式,可以将特定的标签去除后聚合数据
avg without(cluster,host,instance,name) (rate(elasticsearch_os_cpu_percent[2m]))

指标 metric 名称可以使用冒号,可以用冒号和下划线开头 [a-zA-Z_:][a-zA-Z0-9_:]*

PromQL

匹配模式

  1. 完全匹配 = label=value
  2. 完全匹配 != label!=value
  3. 正则匹配 =~ label=~regx
  4. 正则匹配 !~ label!~regx
    多个正则表达式间使用|分隔 如 http_requests_total{environment=~"staging|testing|development",method!="GET"}

时间位移操作
http_request_total{} offset 5m

按照主机查询各个主机的CPU使用率
sum(sum(irate(node_cpu{mode!='idle'}[5m])) / sum(irate(node_cpu[5m]))) by (instance)

标量和字符串
count(http_requests_total)返回的依然是瞬时向量,可使用 scalar() 将单个瞬时向量转换为标量;标量没有时序,类似于普通数字

{method="get"} {job=~"a.*"} 是合法的PromQL表达式,不会匹配到空字符串的标签过滤器
{name=~"node_disk_bytes_read|node_disk_bytes_written"}

bool修饰符可以改变布尔运算符的行为
bool运算符可以实现对结果的修剪,但返回的依然是原时间序列,而不是bool值时间序列
使用bool修饰符则返回1 和 0 时间序列 ,如 http_requests_total > bool 1000

集合运算 and or unless
进行集合运算时,需要匹配两边的标签,on(label list) 限定要匹配的标签;ignoring(label list)忽略某些标签

group_left或者group_right来确定哪一个向量具有更高的基数(充当“多”的角色)

PromQL聚合操作
without用于从计算结果中移除列举的标签,而保留其它标签
by则正好相反,结果向量中只保留列出的标签,其余标签则移除

quantile(0.5, http_requests_total) 计算中位数

PromQL内置函数

计算Counter指标增长率

  • increase(v range-vector)函数 计算增长率
    increase(node_cpu[2m]) / 120
  • rate(v range-vector)函数
    rate(node_cpu[2m])
  • irate(v range-vector) 灵敏度更高 瞬时增长率
    irate(node_cpu[2m])
    在长期趋势分析或者告警中更推荐使用rate函数

预测Gauge指标变化趋势

  • predict_linear(v range-vector, t scalar) 函数 预测时间序列v在t秒后的值,基于简单线性回归
    predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0 基于2小时样本数据预测磁盘空间在4小时后被占满

动态标签替换
依次对v中的每一条时间序列进行处理,通过regex匹配src_label的值,并将匹配部分relacement写入到dst_label标签中
label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
label_replace(up, "host", "$1", "instance", "(.):.")

label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...)

告警处理

通过 $labels.<labelname> 变量可以访问当前告警实例中指定标签的值
$value则可以获取当前PromQL表达式计算的样本值

对于已经pending或者firing的告警,Prometheus会将它们存储到时间序列ALERTS{}中
当报警处于活动状态时,其值为1

alertmanager 配置文件
全局配置中需要注意的是 resolve_timeout
定义了当Alertmanager持续多长时间未接收到告警后标记告警状态为resolved(已解决)
可能会影响到告警恢复通知的接收时间

[ continue: | default = false ] 表示告警匹配到第一个子节点后直接停止,默认行为
[ send_resolved: | default = false ] 定义是否接收恢复通知;webhook方式默认是true

Exporter

Blackbox Exporter允许用户通过:HTTP、HTTPS、DNS、TCP以及ICMP的方式对网络进行探测
http://127.0.0.1:9115/probe?module=http_2xx&target=baidu.com
module指定要使用的探针(名称在exporter yaml中定义),target指定探测目标,探测结果以metrics形式返回

 

默认情况下HTTP探针会走IPV6的协议,可以使用preferred_ip_protocol=ip4强制通过IPV4的方式进行探测

数据可视化

Resolution选项,则可以控制Grafana自身渲染的数据量
如果Resolution的值为1/10,Grafana会将Prometeus返回的10个样本数据合并成一个点

如果允许用户多选在PromQL表达式中应该使用标签的正则匹配模式
变量会格式化为 value1|value2|value3

panel和row可以根据变量repeat

集群与高可用

remote_write和remote_read特性,支持将数据存储到远端和从远端读取数据

每个块中保存2小时数据,当前块保存在内存中,持久化到wal

远程读写与本地读写是否冲突?是否双读双写?

http://192.168.77.11:9090/federate?match[]={job%3D"prometheus"}&match[]={__name__%3D~"job%3A.*"}&match[]={__name__%3D~"node.*"}

服务发现

可以基于 文件,consul,dns,kubernetes等方式

基于文件的服务发现
file_sd_configs
默认每5m重新读取一次文件内容 可以通过refresh_interval进行设置

基于consul的服务发现
consul agent -dev 开发者模式单节点consul环境
默认情况下,所有的服务都可以使用NAME.service.consul域名的方式进行访问
dig @127.0.0.1 -p 8600 node_exporter.service.consul

Prometheus的Relabeling机制

target的默认标签

  • __address__:当前Target实例的访问地址<host>:<port>
  • __scheme__:采集目标服务访问地址的HTTP Scheme,HTTP或者HTTPS
  • __metrics_path__:采集目标服务访问地址的访问路径
  • __param_<name>:采集任务目标服务的中包含的请求参数

labelmap会根据regex的定义去匹配Target实例所有标签的名称,并且以匹配到的内容为新的标签名称,其值作为新标签的值
labelkeep或者labeldrop则可以对Target标签进行过滤,仅保留符合过滤条件的标签
keep/drop过滤Target实例
hashmod计算source_labels的Hash值,实现功能分区

用__tmp作为标签名的前缀,通过该前缀定义的标签就不会写入到Target或者采集到的样本的标签中

label_replace(up{job="api-server",service="a:c"}, "foo", "$1", "service", "(.*):.*")
label_replace(up{instance="172.16.45.178:10252",job="kube-controller-manager"}, "foo", "$1-aaa", "job", "(.*)")
scalar()
vector()

API接口

联邦集群指标 提供
http://172.16.47.17:9090/federate?match[]={job%3D~"node.*"}

Prometheus中使用模板函数

alerting rules中在labels字段和annotations字段,可以使用go template函数
详见:https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
除了go template自带函数 https://golang.org/pkg/text/template/#hdr-Functions
还额外添加了一些函数,详见:https://prometheus.io/docs/prometheus/latest/configuration/template_reference/#functions
模板函数语法可参考 https://gohugo.io/functions/printf/

alert中提供如下变量引用
.Value, .Labels, .ExternalLabels
$value, $labels, $externalLabels

用法示例:
{{$labels.env | toUpper}}
{{ printf "%0.2f" $value }}

 

转载请注明:轻风博客 » prometheus操作指南

喜欢 (0)or分享 (0)