一、prometheus_config
配置热加载:
#1. kill -HUP pid
#2. curl -X POST http://IP/-/reload
job_name
- 如果一个job里有多台主机,只需要在targets里配置多个ip和端口即可,使用逗号隔开
- 过滤不需要收集的指标。 如下,只收集和返回cpu和内存相关的指标
- job_name: 'node'
static_configs:
- targets: ['192.168.68.17:9100']
params:
collect[]:
- cpu
- meminfo
- 每次增加 Target 时会自动增加一个 instance 标签,而 instance 标签的内容刚好对应 Target 实例的 address 值
- honor_labels主要用于解决prometheus server的label与exporter端用户自定义label冲突的问题
看看官方怎么说:
#If honor_labels is set to "true", label conflicts are resolved by keeping label
# values from the scraped data and ignoring the conflicting server-side labels.
#
# If honor_labels is set to "false", label conflicts are resolved by renaming
# conflicting labels in the scraped data to "exported_<original-label>" (for
# example "exported_instance", "exported_job") and then attaching server-side
# labels. This is useful for use cases such as federation, where all labels
# specified in the target should be preserved.
relabel_config
看官网说明 看官网例子
路人理解:relabel_config发生在抓取之前,metric_relabel_configs发生在抓取之后
重新标记,可以在目标的标签集被抓取之前重写它,每个采集配置可以配置多个重写标签设置,并按照配置的顺序来应用于每个目标的标签集。
Relabel 的配置允许你选择你想抓取的目标和这些目标的标签是什么。所以说如果你想要抓取这种类型的服务器而不是那种,可以使用relabel_configs
source_labels指定需要处理的源标签
target_labels指定要replace后的标签名字
action指定relabel动作,这里使用replace替换动作
regex去匹配源标签(__hostname__)的值,"(.*)"代表__hostname__这个标签是什么值都匹配的
replacement指定的替换后的标签(target_label)对应的数值
系统使用的标签
__address__: 当前Target实例的访问地址[host]:[port]
__scheme__: 采集目标服务访问地址的HTTP Scheme,HTTP或者HTTPS
__metrics_path__: 采集目标服务访问地址的访问路径
__param_: 采集任务目标服务的中包含的请求参数
__name__: 此标签是标识指标名称的预留标签
action:
replace: 对标签和标签值进行替换。
keep: 满足特定条件的实例进行采集,其他的不采集。
drop: 满足特定条件的实例不采集,其他的采集。
hashmod: 将 target_label 设置为关联的 source_label 的哈希模块。
labelmap: 根据 regex 去匹配 Target 实例所有标签的名称(注意是名称),并且将捕获到的内容作为为新的标签名称,regex 匹配到标签的的值作为新标签的值。
labeldrop:对抓取的实例特定标签进行删除。
labelkeep:对抓取的实例特定标签进行保留,其他标签删除。
标签其实可以理解是一个key-value对组成。
默认的:
target的job标签设置为配置文件里的job_name的值;
__address__设置为配置里的targets的值;
而instance标签的值,是重定义标签操作之后__address__的值,instance的值会比__address__多一个端口号 ;
__scheme__和__metrics_path__标签的值,也是从配置里取值的;
__param_<name>标签的值,是传给URL的查询参数<name>的值;
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.56.200:9116 # snmp_exporter 服务IP地址
上面example的作用就是把 __address__标签替换成__param_target,value不变,只不过是key变了,
最后的 replacement 表示把标签__address__的value替换成 192.168.56.200:9116
在scrape_configs标签下,params.module中可以配置需要抓取的模块,不配置表示全部抓取。
二、rule_config
需要将指标做相应计算后再进行返回。这时候我们就需要添加记录规则
- 坑1:这背后与 rate() 的实现方式有关:
rate() 在设计上假定对应的指标是一个 Counter,也就是只有 incr(增加) 和 reset(归0) 两种行为。
而做了 sum() 或其他聚合之后,得到的就不再是一个 Counter 了,举个例子,比如 sum() 的计算对象中有一个归0了,
那整体的和会下降,而不是归零,这会影响 rate() 中判断 reset(归0) 的逻辑,从而导致错误的结果。写 PromQL 时这个坑容易避免,
但碰到 Recording Rule 就不那么容易了,因为不去看配置的话大家也想不到 new_metric 是怎么来的。
要完全规避这个坑,可以遵守一个原则:Recording Rule 一步到位,直接算出需要的值,避免算出一个中间结果再拿去做聚合。
三、alert_config
- global
全局配置,主要配置告警方式,如邮件、webhook
- route
prometheus的告警先是到达alertmanager的根路由(route),alertmanager的根路路由不能包含任何匹配项,因为根路由是所有告警的入口点。另外,根路由需要匹配一个接收器(receiver),用来处理哪些没有匹配到任何子路由的告警(如果没有配置子路由,则全部由根路由发送告警)
- group_by
用于分组聚合,对告警通知按标签(label)进行分组,将具有相同标签或相同告警名称(alertname)的告警通知
聚合在一个组,然后作为一个通知发送。如果想完全禁用聚合,可以设置为group_by:[…]
- group_wait
当一个新的告警组被创建时,需要等待’group_wait’后才发送初始通知。这样可以确保在发送等待前能收集更
多具有相同标签的告警,最后合并为一个通知发送
坑1:用于控制同一个 group 内的警报最快多久通知一次
这里有一个问题是 firing(激活) 和 resolved(已消除) 的警报通知是共享同一个 group 的。也就是说,假设我们的 group_interval 是默认的 5 分钟,那么一条警报激活十几秒后立马就消除了,它的消除通知会在报警通知的 5 分钟之后才到,因为在发完报警通知之后,这个 Group 需要等待 5 分钟的 group_interval 才能进行下一次通知。
cat > alertmanager.yml <<EOF
global:
resolve_timeout: 5m
route:
receiver: webhook
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
group_by: [alertname]
routes:
- receiver: webhook
group_wait: 10s
match:
team: node
receivers:
- name: webhook
webhook_configs:
- url: 'http://apollo/hooks/dingtalk/'
send_resolved: true
- url: 'http://apollo/hooks/prome/'
send_resolved: true
EOF
cat > /usr/lib/systemd/system/alertmanager.service <<EOF
[Unit]
Description=alertmanager
[Service]
ExecStart=/root/go/bin/alertmanager --config.file=/root/go/bin/config.yml --storage.path=/usr/local/alertmanager/data --web.listen-address=:9093 --data.retention=120h
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
四、time
- 为了避免时区的混乱,prometheus所有的组件内部都强制使用Unix时间,对外展示使用UTC时间。如果想改变时区,可以在UI改为合适的时区时间。