所以我有这样的配置:
scrape_configs:
- job_name: flog_scrape
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: 'container'
一切都很好,但在目标机器上我有有趣的容器和垃圾容器,我只想要来自名为interesting_something
的容器的日志如何删除容器标签不以“interesting_”开头/与“interesting_.*”不匹配的所有行?
我找到了有条件地删除标签“容器”的方法;我还找到了根据内容过滤日志消息的方法;我还找到了一种稍后在管道阶段删除标签的方法;但我还没有找到任何方法来根据标签内容过滤/保留/删除整个日志行,这就是我问的原因。
除此之外,我经常被错误“管道阶段必须只包含一个键”所困扰 - 其中有许多报告解释它实际上是一个 YAML 缩进错误,但从未描述实际的格式化解决方案是什么。所以我真的在寻找一种在逐字复制时有效的解决方案。
我通过根据容器名称进行过滤实现了类似的效果:
scrape_configs:
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
filters:
- name: name
# Filter logging to just our containers
values: ["cosmos-openc3-*"]
relabel_configs:
- source_labels: ["__meta_docker_container_name"]
regex: "/(.*)"
target_label: "container"
您还可以按标签过滤:
filters:
- name: label
values: ["logging=promtail"]
这需要您的泊坞窗中具备以下内容:
services:
nginx-app:
container_name: nginx-app
image: nginx
labels:
logging: "promtail"
基于 Promtail 文档的我的解决方案:https://grafana.com/docs/loki/latest/clients/promtail/configuration/#docker_sd_config 其中列出了可用的过滤选项:https://docs.docker.com/engine/api/v1.41/#tag/Container/operation/ContainerList
由于在我的例子中所有有趣的容器都是由单个 docker-compose 带来的,所以我刚刚通过 docker-compose 项目名称过滤了
docker_sd_configs
:
scrape_configs:
- job_name: flog_scrape
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 1s
filters:
- name: label
values: ['com.docker.compose.project=compose-web']
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: 'container'
pipeline_stages:
- static_labels: # Needs four whitespace indentation below, will complain otherwise
host: ${VMHOST} # Env var defined externally, passed via -config.expand-env=true
仍然不知道它是否有 Pipeline 解决方案。