如何设置Promtail配置中regular的默认值



我有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_configspipeline_stages之前执行。首先,我解析了devstg从这个配置的容器名:

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从容器所在的节点传递到容器。所以它的主机名是集群中的一个节点名。

相关内容

  • 没有找到相关文章

最新更新