[TOC]
## **Target的Label**
Prometheus的Target都是有Label的,比如说,我们让Prometheus只监控自己,即配置文件如下:
```
scrape_configs:
- job_name: prometheus
static_configs:
- targets: [localhost:9090]
```
那么我们在页面上可以看到这个Target的有两个Label:`job="prometheus"`及`instance="localhost:9090"`
![](https://img.kancloud.cn/5c/bf/5cbfa734700c96f5bb41d7bdf9982fd9_1035x263.png)
## **Target的初始Label**
Target可以是静态配置的,也可以是通过服务发现的。但是,它们有一些公共的配置,比如`jobd_name`、`scheme`、`metrics_path`等,如下:
```
scrape_configs:
- job_name: xxx
scheme: http # http或https,默认http
metrics_path: /metrics # 默认/metrics
...
static_configs:
...
kubernetes_sd_configs:
...
```
#### **静态配置的Target**
对于静态配置的Target,最开始的时候,Target固定会有这几个标签:
* `job`
* `__scheme__`、
* `__metrics_path__`
* `__address__`
如果还有一些其他的配置不为空,比如说公共配置`params`或私有配置`labels`,那么这些配置中的key-value也会被加入到初始标签中。
比如说Promtheus有如下的配置
```
scrape_configs:
- job_name: prometheus
metrics_path: /metrics
static_configs:
- targets: ['localhost:9090']
labels:
label1: xxxx
```
那么最开始的时候,该Target会有如下的初始标签:
```
job="prometheus"
__address__="localhost:9090"
__scheme__="http"
__metrics_path__="/metrics"
label1="xxxx"
```
我们可以从`Service Discovery`页面看到初始标签(Discoverd Labels)及最后的标签(Target Labels)
![](https://img.kancloud.cn/81/e1/81e1218495c8ea1fcb084d37b21b98f1_980x408.png)
#### **服务发现的Target**
假设k8s集群有两个节点,如下:
```
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
peng01 Ready master 37d v1.17.3 192.168.2.101 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://18.9.9
peng02 Ready <none> 43h v1.17.3 192.168.2.102 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.12
```
然后,我们通过服务发现的方式,去监控kubelet的指标。配置k8s中的prometheus如下:
```
scrape_configs:
- job_name: kubelet
k8s_sd_configs:
- role: node
```
那么,会自动发现两个Target,如下:
![](https://img.kancloud.cn/2f/c2/2fc22415b0df4805ca2a7447b8027900_1355x293.png)
我们在`Service Discovery`中查看其中一个节点的初始标签集,如下:
公共配置中的`job`、`__scheme__`、`__metrics_path__` 这些标签依然存在,有以下几点不同:
* `__address__`也存在,值默认为node的IP加10250端口
* 初始标签集中多了`instance`标签,值为node的名字
* 多了很多以`__meta_`开头的标签
![](https://img.kancloud.cn/b5/c3/b5c3d84efb9ee49137370d4593b0acfa_817x562.png)
## **Relabel流程**
在得到Target的初始Label集后,Relabel模块就会对初始Label集进行操作,操作如下:
* 如果初始Label集中没有key为`instance`的标签,则添加key为`instance`的标签,值为`__address__`的值
* 执行`relabel_configs`中的操作(见下面的"`relabel_configs`的操作")
* 去掉以`__`开头的标签
一般来说,对于静态Target,我们很少配置`relabel_configs`,主要是用在服务发现当中。
## **`relabel_configs`的操作**
`relabel_configs`的位置如下:
```
scrape_configs:
- job_name: xxxx
relabel_configs:
...
kubernetes_sd_configs:
...
```
Relabel操作的配置语法如下:
```
# Action to perform based on regex matching.
[ action: <relabel_action> | default = replace ]
# The source labels select values from existing labels. Their content is concatenated
# using the configured separator and matched against the configured regular expression
# for the replace, keep, and drop actions.
[ source_labels: '[' <labelname> [, ...] ']' ]
# Separator placed between concatenated source label values.
[ separator: <string> | default = ; ]
# Label to which the resulting value is written in a replace action.
# It is mandatory for replace actions. Regex capture groups are available.
[ target_label: <labelname> ]
# Regular expression against which the extracted value is matched.
[ regex: <regex> | default = (.*) ]
# Modulus to take of the hash of the source label values.
[ modulus: <int> ]
# Replacement value against which a regex replace is performed if the
# regular expression matches. Regex capture groups are available.
[ replacement: <string> | default = $1 ]
```
接下来,我们对每一类操作(`<relabel_action>`)进行详细的讲解
#### **replace**
replace的语法如下:
```
- action: replace
source_labels: [ <oldlabelname>, ... ]
regex: <regex> # 默认为 (.*)
separator:string # regex的分隔符,默认为 ;
target_label: <newlabelname>
replacement: xxxx # 默认为${1}
```
接下来举一个例子,比如说上面我们监控k8s的kubelet,如果没有做任何配置,我们发现每个Target都报400的错误 。这是因为,kubelet的10250端口,提供的是https服务。我们知道,kubelet的10255只读端口是http协议,而且不需要认证授权;所以,我们把`__address__`的值设置成 `ip:10255`端口即可。配置如下:
```
scrape_configs:
- job_name: kubelet
k8s_sd_configs:
- role: node
relabel_configs:
- action: replace
source_labels: ["__meta_kubernetes_node_address_InternalIP"]
regex: (.*)
target_label: __address__
replacement: ${1}:10255
```
解释一下上面的配置:
* `target_label`:我们需要增加或重置的标签,这里我们需要重置`__address__`标签
* `source_labels`:`__address__`标签的目标值是`nodeip:10255`,`nodeip`需要从初始标签中的`__meta_kubernetes_node_address_InternalIP`获取;如果目标标签的值需要从多个初始标签中获取,则这里应该设置多个
* `regex`:匹配规则,只有`source_labels`的值匹配这个正则表达式的Target,才会执行这个操作;比如说,如果把`regex`的值设置为`192.168.2.101`,那么只有`192.168.2.101:10250`这个Target的`__address__`才会被重置为10255端口;默认值为`(.*)`,表示匹配所有
* `replacement`:`target_label`的目标值;在这里,`${1}`就是表示`source_labels[1]`,即`__meta_kubernetes_node_address_InternalIP`的值
效果如下:
![](https://img.kancloud.cn/f2/2c/f22c83107835d9da3cc358992c7678ae_1356x285.png)
接下来给一个例子,当`source_labels`中有多个label,比如如下的配置:
```
scrape_configs:
- job_name: kubelet
k8s_sd_configs:
- role: node
relabel_configs:
- action: replace
source_labels: ["__meta_kubernetes_node_address_InternalIP", "__meta_kubernetes_node_name"]
regex: (.*);peng01
separator: ;
target_label: __address__
replacement: ${1}:10255
```
* `separator`:`regex`的分隔符,这里设置为分号
* `regex`:分号前面为`(.*),表示`__meta_kubernetes_node_address_InternalIP`的值的匹配规则; 分号后面为`peng01`,表示`__meta_kubernetes_node_name`的值的匹配规则
整个配置的意思就是:只有`peng01`这个Target的`__address__`才会被替换。效果如下:
![](https://img.kancloud.cn/67/dc/67dcf470d31551bbecb0af1ed97d8463_1356x297.png)
#### **labelmap**
举一个例子,在前面的k8s服务发现中,每个Target的初始标签集中出现了很多以`__meta_`开头的标签,由于`__`开头的标签在Relabel之后会被删掉,而我们想要保存上述这些标签,那么这时候就可以使用`labelmap`操作了。
配置如下:
```
scrape_configs:
- job_name: kubelet
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_(.+)
```
那么,名字为`__meta_<xxx>`初始标签,都会生成一个名字为`xxx`的标签,比如初始标签集中有:
```
__meta_kubernetes_node_address_Hostname="peng01"
__meta_kubernetes_node_address_InternalIP="192.168.2.101"
...
```
那么最终的标签集中会有(实验已验证):
```
kubernetes_node_address_Hostname="peng01"
kubernetes_node_address_InternalIP="192.168.2.101"
...
```
#### **drop**
`drop`操作,会丢弃掉那些匹配上`regex`规则的Target。
举个例子,
#### **keep**
#### **labelkeep**
#### **labeldrop**
- (一)快速开始
- 安装Prometheus
- 使用NodeExporter采集数据
- AlertManager进行告警
- Grafana数据可视化
- (二)探索PromQL
- 理解时间序列
- Metrics类型
- 初识PromQL
- PromQL操作符
- PromQL内置函数
- rate和irate
- 常见指标的PromQL
- 主机CPU使用率
- 主机内存使用率
- 主机磁盘使用率
- 主机磁盘IO
- 主机网络IO
- API的响应时间
- (三)Promtheus告警处理
- 自定义告警规则
- 示例-对主机进行监控告警
- 部署AlertManager
- 告警的路由与分组
- 使用Receiver接收告警信息
- 集成邮件系统
- 屏蔽告警通知
- 扩展阅读
- AlertManager的API
- Prometheus发送告警机制
- 实践:接收Prometheus的告警
- 实践:AlertManager
- (四)监控Kubernetes集群
- 部署Prometheus
- Kubernetes下的服务发现
- 监控Kubernetes集群
- 监控Kubelet的运行状态
- 监控Pod的资源(cadvisor)
- 监控K8s主机的资源
- KubeStateMetrics
- K8S及ETCD常见监控指标
- ETCD监控指标
- Kube-apiserver监控指标
- (五)其他
- Prometheus的relabel-config
- Target的Endpoint
- Prometheus的其他配置
- (六)BlackboxExporter
- 安装
- BlackboxExporter的应用场景
- 在Promtheus中使用BlackboxExporter
- 参考