我有3个节点的Docker群,每个环境(dev, stg和prd)运行监控应用程序(出口商,grafana等)。Devstg容器名称中包含_<env>_
,因此对于dev它的_dev_
和stg它是_stg_
。Prd容器名称中没有包含环境
我正在从环境名称中解析正则表达式,并将其设置为标签:
relabel_configs:
...
- source_labels: ['__meta_docker_container_name']
regex: '/.*_(dev|stg)_.*'
target_label: 'env'
我想设置prd作为默认环境。我尝试将其设置为static_label
:
pipeline_stages:
- static_labels:
env: prd
但是,所有的容器都有env标签设置为prd. 看起来首先使用relabel配置,然后应用静态标签。是否有一种方法如何正确配置它?所以,看起来relabel_configs
在pipeline_stages
之前执行。首先,我解析了dev或stg从这个配置的容器名:
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/.*_(dev|stg)_.*'
target_label: 'env'
然后,使用模板阶段与go模板,如果条件检查,如果标签env
存在,保留它。如果没有,使用默认值创建它。:
pipeline_stages:
- template:
source: env
template: '{{ if .Value }}{{ .Value }}{{ else }}prd{{ end }}'
- labels:
env:
同样重要的部分是labels
。模板阶段只会创建键envwith valueprd(if在前一步中不存在),但不从它创建标签。这就是为什么必须有这个标签阶段(标签阶段从消息中的键创建标签)。
这是我的最后一个管道:
scrape_configs:
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 30s
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/.*.([0-9]{1,2})..*'
target_label: 'replica'
- source_labels: ['__meta_docker_container_label_com_docker_swarm_service_name']
regex: '(.*)'
target_label: 'service'
- source_labels: ['__meta_docker_container_label_com_docker_stack_namespace']
regex: '(.*)'
target_label: 'stack'
- source_labels: ['__meta_docker_container_name']
regex: '/.*_(dev|stg)_.*'
target_label: 'env'
pipeline_stages:
- template:
source: env
template: '{{ if .Value }}{{ .Value }}{{ else }}prd{{ end }}'
- labels:
env:
- static_labels:
hostname: ${NODE_HOSTNAME}
变量NODE_HOSTNAME
从容器所在的节点传递到容器。所以它的主机名是集群中的一个节点名。