Skip to content

Commit 95e2011

Browse files
committed
docker: replace Alloy by Vector for parsing logs
Alloy does not allow to turn the parsed metadata into actual metadata, without enumerating each of them. Also, Vector is far more versatile. And you can put unittests! Also, parse more logs. Everything should be there, except ClickHouse. Fix #1907
1 parent d9b2ee8 commit 95e2011

12 files changed

+713
-239
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ jobs:
5656
run: make test-race
5757
- name: JS tests
5858
run: make test-js
59+
- name: Vector tests
60+
run: docker compose -f docker/docker-compose-dev.yml run --quiet --rm vector test
5961
- name: Run coverage tests
6062
run: make test-coverage
6163
- name: Upload coverage results

docker/alloy/config.alloy

Lines changed: 0 additions & 8 deletions
This file was deleted.

docker/alloy/loki.alloy

Lines changed: 0 additions & 196 deletions
Original file line numberDiff line numberDiff line change
@@ -1,199 +1,3 @@
1-
loki.write "default" {
2-
endpoint {
3-
url = "http://loki:3100/loki/loki/api/v1/push"
4-
}
5-
}
6-
7-
discovery.relabel "loki" {
8-
targets = discovery.docker.docker.targets
9-
rule {
10-
source_labels = ["__meta_docker_container_label_com_docker_compose_service"]
11-
regex = `(.+)(?:-\d+)?`
12-
target_label = "service_name"
13-
}
14-
rule {
15-
source_labels = ["__address__"]
16-
regex = `(.+):\d+`
17-
target_label = "instance"
18-
}
19-
}
20-
21-
discovery.relabel "akvorado" {
22-
targets = discovery.relabel.loki.output
23-
rule {
24-
source_labels = ["service_name"]
25-
regex = "akvorado-.*"
26-
action = "keep"
27-
}
28-
}
29-
loki.source.docker "akvorado" {
30-
host = "unix:///var/run/docker.sock"
31-
targets = discovery.relabel.akvorado.output
32-
forward_to = [loki.process.akvorado.receiver]
33-
}
34-
loki.process "akvorado" {
35-
forward_to = [loki.write.default.receiver]
36-
stage.json {
37-
expressions = {
38-
level = "level",
39-
time = "time",
40-
caller = "caller",
41-
error = "error",
42-
module = "module",
43-
message = "message",
44-
}
45-
}
46-
stage.labels {
47-
values = {
48-
level = "",
49-
module = "",
50-
}
51-
}
52-
stage.structured_metadata {
53-
values = {
54-
caller = "",
55-
error = "",
56-
}
57-
}
58-
stage.timestamp {
59-
source = "time"
60-
format = "RFC3339"
61-
}
62-
stage.output {
63-
source = "message"
64-
}
65-
}
66-
67-
discovery.relabel "kafka" {
68-
targets = discovery.relabel.loki.output
69-
rule {
70-
source_labels = ["service_name"]
71-
regex = "kafka"
72-
action = "keep"
73-
}
74-
}
75-
loki.source.docker "kafka" {
76-
host = "unix:///var/run/docker.sock"
77-
targets = discovery.relabel.kafka.output
78-
forward_to = [loki.process.kafka.receiver]
79-
}
80-
loki.process "kafka" {
81-
forward_to = [loki.write.default.receiver]
82-
stage.multiline {
83-
firstline = `^\[\d{4}-\d{2}-\d{2} `
84-
max_wait_time = "3s"
85-
max_lines = 1000
86-
}
87-
stage.regex {
88-
expression = `^\[(?P<timestamp>[^\]]+)\]\s+(?P<level>\w+)\s+(?P<message>(?s:.*))$`
89-
}
90-
stage.timestamp {
91-
source = "timestamp"
92-
format = "2006-01-02 15:04:05,000"
93-
}
94-
stage.labels {
95-
values = {
96-
level = "",
97-
}
98-
}
99-
stage.output {
100-
source = "message"
101-
}
102-
}
103-
104-
discovery.relabel "redis" {
105-
targets = discovery.relabel.loki.output
106-
rule {
107-
source_labels = ["service_name"]
108-
regex = "redis"
109-
action = "keep"
110-
}
111-
}
112-
loki.source.docker "redis" {
113-
host = "unix:///var/run/docker.sock"
114-
targets = discovery.relabel.redis.output
115-
forward_to = [loki.process.redis.receiver]
116-
}
117-
loki.process "redis" {
118-
forward_to = [loki.write.default.receiver]
119-
// 1:C 28 Aug 2025 04:08:22.843 # Warning: no config file specified
120-
stage.regex {
121-
expression = `^(?P<pid>\d+):(?P<role>[XCSM])\s+(?P<timestamp>\d+\s+\w+\s+\d{4}\s+\d{2}:\d{2}:\d{2}\.\d{3})\s+(?P<level>[*#.-])\s+(?P<message>.*)$`
122-
}
123-
stage.template {
124-
source = "role_name"
125-
template = `{{ if eq .role "X" }}sentinel{{ else if eq .role "C" }}RDB{{ else if eq .role "S" }}slave{{ else if eq .role "M" }}master{{ end }}`
126-
}
127-
stage.template {
128-
source = "level_name"
129-
template = `{{ if eq .level "." }}debug{{ else if eq .level "-" }}info{{ else if eq .level "*" }}notice{{ else if eq .level "#" }}warning{{ end }}`
130-
}
131-
stage.labels {
132-
values = {
133-
level = "level_name",
134-
role = "role_name",
135-
}
136-
}
137-
stage.timestamp {
138-
source = "timestamp"
139-
format = "2 Jan 2006 15:04:05.000"
140-
}
141-
stage.output {
142-
source = "message"
143-
}
144-
}
145-
146-
discovery.relabel "alloy" {
147-
targets = discovery.relabel.loki.output
148-
rule {
149-
source_labels = ["service_name"]
150-
regex = "alloy"
151-
action = "keep"
152-
}
153-
}
154-
loki.source.docker "alloy" {
155-
host = "unix:///var/run/docker.sock"
156-
targets = discovery.relabel.alloy.output
157-
forward_to = [loki.process.alloy.receiver]
158-
}
159-
loki.process "alloy" {
160-
forward_to = [loki.write.default.receiver]
161-
// ts=2025-08-28T09:30:45.497277819Z level=info msg="Scraped metadata watcher stopped" component_path=/ component_id=prometheus.remote_write.default subcomponent=rw remote_name=0ffafb url=http://prometheus:9090/prometheus/api/v1/write
162-
stage.logfmt {
163-
mapping = {
164-
ts = "",
165-
level = "",
166-
msg = "",
167-
err = "",
168-
node = "",
169-
component_path = "",
170-
component_id = "",
171-
}
172-
}
173-
stage.labels {
174-
values = {
175-
level = "",
176-
}
177-
}
178-
stage.structured_metadata {
179-
values = {
180-
node = "",
181-
component_path = "",
182-
component_id = "",
183-
}
184-
}
185-
stage.template {
186-
source = "message"
187-
template = `{{ .msg }}{{ if .err }}: {{ .err }}{{ end }}`
188-
}
189-
stage.timestamp {
190-
source = "ts"
191-
format = "RFC3339"
192-
}
193-
stage.output {
194-
source = "message"
195-
}
196-
}
1971

1982
discovery.relabel "lokilogs" {
1993
targets = discovery.relabel.loki.output

docker/alloy/prometheus.alloy renamed to docker/config.alloy

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
discovery.docker "docker" {
2+
host = "unix:///var/run/docker.sock"
3+
refresh_interval = "30s"
4+
filter {
5+
name = "label"
6+
values = ["com.docker.compose.project=akvorado"]
7+
}
8+
}
9+
110
prometheus.remote_write "default" {
211
endpoint {
312
url = "http://prometheus:9090/prometheus/api/v1/write"

docker/docker-compose-alloy.yml

Lines changed: 0 additions & 26 deletions
This file was deleted.

docker/docker-compose-dev.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,16 @@ services:
182182
ports:
183183
- 127.0.0.1:57400:57400/tcp
184184
- 127.0.0.1:57401:22/tcp
185+
186+
vector:
187+
extends:
188+
file: versions.yml
189+
service: vector
190+
restart: "no"
191+
profiles: [manual]
192+
volumes:
193+
- /var/run/docker.sock:/var/run/docker.sock:ro
194+
- ./vector.yaml:/etc/vector/vector.yaml:ro
195+
- ./vector.tests.yaml:/etc/vector/vector.tests.yaml:ro
196+
environment:
197+
VECTOR_CONFIG_DIR: /etc/vector

docker/docker-compose-grafana.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@ services:
77
file: versions.yml
88
service: grafana
99
environment:
10-
GF_INSTALL_PLUGINS: marcusolsson-json-datasource 1.3.8
1110
GF_SERVER_ROOT_URL: /grafana
1211
GF_SERVER_SERVE_FROM_SUB_PATH: "true"
1312
depends_on:
1413
- prometheus
15-
- akvorado-console
1614
restart: unless-stopped
1715
volumes:
1816
- akvorado-grafana:/var/lib/grafana

docker/docker-compose-loki.yml

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ services:
1010
restart: unless-stopped
1111
volumes:
1212
- akvorado-loki:/loki
13-
- ./loki.yaml:/etc/loki/local-config.yaml
13+
- ./loki.yaml:/etc/loki/local-config.yaml:ro
1414
expose:
1515
- 3100/tcp
1616
labels:
@@ -19,11 +19,24 @@ services:
1919
- traefik.http.routers.loki.entrypoints=private
2020
- metrics.port=3100
2121

22-
alloy:
22+
vector:
2323
extends:
24-
file: docker-compose-alloy.yml
25-
service: alloy
24+
file: versions.yml
25+
service: vector
26+
restart: unless-stopped
27+
user: root # for access to /var/run/docker.sock
2628
volumes:
27-
- ./alloy/loki.alloy:/etc/alloy/loki.alloy
29+
- /var/run/docker.sock:/var/run/docker.sock:ro
30+
- ./vector.yaml:/etc/vector/vector.yaml:ro
2831
depends_on:
2932
- loki
33+
healthcheck:
34+
interval: 20s
35+
test: ["CMD",
36+
"wget", "-T", "1", "--spider", "--url=http://127.0.0.1:8686/health"]
37+
expose:
38+
- 9598 # metrics
39+
environment:
40+
VECTOR_CONFIG_DIR: /etc/vector
41+
labels:
42+
- metrics.port=9598

docker/docker-compose-prometheus.yml

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,33 @@ services:
3535
# Fetch metrics
3636
alloy:
3737
extends:
38-
file: docker-compose-alloy.yml
38+
file: versions.yml
3939
service: alloy
40+
restart: unless-stopped
41+
user: root # for access to /var/run/docker.sock
4042
volumes:
41-
- ./alloy/prometheus.alloy:/etc/alloy/prometheus.alloy
43+
- /var/run/docker.sock:/var/run/docker.sock:ro
44+
- ./config.alloy:/etc/alloy/config.alloy
45+
extra_hosts:
46+
- "host.docker.internal:host-gateway"
47+
expose:
48+
- 12345
49+
command:
50+
- run
51+
- /etc/alloy
52+
- --storage.path=/var/lib/alloy/data
53+
- --server.http.listen-addr=0.0.0.0:12345
54+
- --server.http.ui-path-prefix=/alloy
4255
depends_on:
4356
prometheus:
4457
condition: service_healthy
4558
kafka:
4659
condition: service_healthy
60+
labels:
61+
- traefik.enable=true
62+
- traefik.http.routers.alloy.rule=PathPrefix(`/alloy`)
63+
- traefik.http.routers.alloy.entrypoints=private
64+
- metrics.port=12345
4765

4866
# Node exporter for host metrics
4967
node-exporter:

0 commit comments

Comments
 (0)