feat(promtail): switch to docker_sd opt-in scraping
This commit is contained in:
@@ -625,10 +625,14 @@ services:
|
|||||||
- observability
|
- observability
|
||||||
volumes:
|
volumes:
|
||||||
- ./infra/loki/promtail-config.yml:/etc/promtail/config.yml:ro
|
- ./infra/loki/promtail-config.yml:/etc/promtail/config.yml:ro
|
||||||
- /home/kert/.local/share/docker/containers:/var/lib/docker/containers:ro
|
- ${DOCKER_SOCK:-/run/user/1000/docker.sock}:/var/run/docker.sock:ro
|
||||||
command: -config.file=/etc/promtail/config.yml
|
command: -config.file=/etc/promtail/config.yml
|
||||||
depends_on:
|
depends_on:
|
||||||
- loki
|
- loki
|
||||||
|
group_add:
|
||||||
|
- "${DOCKER_GID:-985}"
|
||||||
|
security_opt:
|
||||||
|
- no-new-privileges:true
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
otel-collector:
|
otel-collector:
|
||||||
|
|||||||
@@ -9,30 +9,32 @@ clients:
|
|||||||
- url: http://loki:3100/loki/api/v1/push
|
- url: http://loki:3100/loki/api/v1/push
|
||||||
|
|
||||||
scrape_configs:
|
scrape_configs:
|
||||||
# Scrape Docker container logs
|
- job_name: docker
|
||||||
- job_name: containers
|
docker_sd_configs:
|
||||||
static_configs:
|
- host: unix:///var/run/docker.sock
|
||||||
- targets:
|
refresh_interval: 15s
|
||||||
- localhost
|
relabel_configs:
|
||||||
labels:
|
- source_labels: ['__meta_docker_container_label_promtail']
|
||||||
job: containerlogs
|
regex: 'true'
|
||||||
__path__: /var/lib/docker/containers/*/*log
|
action: keep
|
||||||
|
- source_labels: ['__meta_docker_container_name']
|
||||||
|
regex: '/?(.*)'
|
||||||
|
target_label: container
|
||||||
|
- source_labels: ['__meta_docker_container_name']
|
||||||
|
regex: '/?(.*)'
|
||||||
|
target_label: job
|
||||||
|
- source_labels: ['__meta_docker_container_label_com_docker_compose_service']
|
||||||
|
target_label: service
|
||||||
|
- source_labels: ['__meta_docker_container_label_com_docker_compose_project']
|
||||||
|
target_label: project
|
||||||
pipeline_stages:
|
pipeline_stages:
|
||||||
- json:
|
- docker: {}
|
||||||
expressions:
|
|
||||||
output: log
|
|
||||||
stream: stream
|
|
||||||
attrs:
|
|
||||||
- json:
|
|
||||||
expressions:
|
|
||||||
tag:
|
|
||||||
source: attrs
|
|
||||||
- regex:
|
- regex:
|
||||||
expression: (?P<container_name>(?:[a-zA-Z0-9][a-zA-Z0-9_.-]+))
|
expression: '(?i)(?P<level>error|warn|info|debug|fatal|critical|trace)'
|
||||||
source: tag
|
|
||||||
- labels:
|
- labels:
|
||||||
stream:
|
level:
|
||||||
container_name:
|
- regex:
|
||||||
- output:
|
expression: '(?P<remote_ip>\d+\.\d+\.\d+\.\d+) .* "(?P<http_method>GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS) (?P<http_path>[^ ]*) [^"]*" (?P<http_status>\d{3}) (?P<http_bytes>\d+)'
|
||||||
source: output
|
- labels:
|
||||||
|
http_method:
|
||||||
|
http_status:
|
||||||
|
|||||||
@@ -81,3 +81,23 @@ class TestLokiRetention:
|
|||||||
cfg = yaml.safe_load((ROOT / "infra/loki/loki-config.yml").read_text())
|
cfg = yaml.safe_load((ROOT / "infra/loki/loki-config.yml").read_text())
|
||||||
assert cfg["compactor"]["retention_enabled"] is True
|
assert cfg["compactor"]["retention_enabled"] is True
|
||||||
assert cfg["limits_config"]["retention_period"] == "168h"
|
assert cfg["limits_config"]["retention_period"] == "168h"
|
||||||
|
|
||||||
|
|
||||||
|
class TestPromtailRewire:
|
||||||
|
def test_promtail_uses_docker_sock(self):
|
||||||
|
svc = _services()["promtail"]
|
||||||
|
vols = [v for v in svc["volumes"] if isinstance(v, str)]
|
||||||
|
# New: docker.sock; old filesystem mount must be gone.
|
||||||
|
assert any("docker.sock" in v for v in vols)
|
||||||
|
assert not any("/var/lib/docker/containers" in v for v in vols)
|
||||||
|
|
||||||
|
def test_promtail_has_docker_gid(self):
|
||||||
|
svc = _services()["promtail"]
|
||||||
|
assert "group_add" in svc
|
||||||
|
|
||||||
|
def test_promtail_config_is_docker_sd(self):
|
||||||
|
cfg = yaml.safe_load((ROOT / "infra/loki/promtail-config.yml").read_text())
|
||||||
|
jobs = cfg["scrape_configs"]
|
||||||
|
docker_jobs = [j for j in jobs if j.get("job_name") == "docker"]
|
||||||
|
assert docker_jobs, "expected job_name=docker"
|
||||||
|
assert "docker_sd_configs" in docker_jobs[0]
|
||||||
|
|||||||
Reference in New Issue
Block a user