一、prometheus抓取生命周期
prometheus server在interval间隔内检查job,生成target,这就是服务发现的过程;服务发现返回一个target列表,服务发现会根据target的配置来设置其标签,默认会有三个标签:
__scheme__: 目标的模式,默认为http
__address__:目标的地址,通常为instance标签的内容
__metrics_path__:目标的指标访问路径,默认为/metrics
注意:
1)这些__标签,在web端看不见,因为标签在生命周期后期被删除了
2) 标签可以在配置中被覆盖
- job_name: "docker"
scheme: https
metrics_path: /testmetrics
static_configs:
- targets: ["192.168.161.118:8080"]
3) prometheus提供了重新标记目标的机会,你可以通过过滤目标,以删除或保留特定的条目
1.1 生命周期简化流程:
流程简单说明:
1. 服务发现:通过服务发现,可以获取target列表
2. 通过服务发现中的target列表配置,生成标签
3. 在服务发现过程配置中,可以对标签进行重新标记,可覆盖、删除、过滤标签
4. 指标抓取
5. 在指标被抓取后,存入存储系统之前,可以对标签再次进行重新标记,可覆盖、删除
二、标签生命周期
标签的定义: prometheus中标签提供了时间序列数据的维度,可以定义目标。
标签结合指标名称,构成了时间序列数据的唯一标识;添加或修改标签,会创建新的时间序列
prometheus_build_info{branch="HEAD", goversion="go1.19.2", instance="192.168.161.118:9090", job="prometheus", revision="dcd6af9e0d56165c6f5c6", version="2.39.1"}
说明:
1)对于先前存在的时间序列,如果抓取不再返回数据,那么该时间序列会被标识为陈旧;同样,被删除的时间序列,也会被标识为陈旧,图像中不会显示陈旧的数据
2) 重新标记:我们说过了,添加或修改标签,会创建新的时间序列,那为何还要对时间序列数据进行重新标记?因为我们要控制该生命周期;
重新标记常见的场景:
1. 删除不必要的标签
2. 删除敏感的标签
3. 添加或便捷、修改指标的标标签值
重新标记只有两个阶段可以操作:
1. 服务发现过程中,对目标进行重新标记;在job中的relabel_configs块中完成
2. 指标抓取后存入存储系统之前。在job内的metric_relabel_configs块中完成
案例一:
- job_name: "docker"
static_configs:
- targets: ["192.168.161.118:8080"]
metric_relabel_configs:
- source_labels: [__name__]
regex: '(container_tasks_state|container_memory_failures_total)'
action: drop说明:
source_labels选择要操作的指标并且还需要一组标签名称
__name__: 标识指标名称的预留标签
regex: 匹配的指标名称
action: #匹配后执行的动作
drop: 数据存储之前删除指标
keep:保留与正则表达式匹配的指标,并删除所有其他的指标
replace: 默认操作
labeldrop: 删除标签
replacement: 替换标签默认action就是replace
案例二:
我们运行一个nginx的docker容器
container_cpu_load_average_10s{container_label_maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>",id="/system.slice/docker-aea232c9cb058438bc4920a06afa7de387fd11faad023b8c26503e338f38e575.scope",image="nginx",name="nginx-test"} 0其中: id=""/system.slice/docker-aea232c9cb058438bc4920a06afa7de387fd11faad023b8c26503e338f38e575.scope"比较长,我们进行替换下
- job_name: "docker"
static_configs:
- targets: ["192.168.161.118:8080"]
metric_relabel_configs:
- source_labels: [id]
regex: '/system.slice/([a-z0-9]+)'
replacement: "$1"
target_label: container_id说明:
源标签为ID,通过regexp进行正则匹配,replacement包含新标签的值,target_label指定捕获信息的目标