企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[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**