From 4bedebfab19e3e431fae3383f04e3eb5eb17482c Mon Sep 17 00:00:00 2001 From: f Date: Thu, 28 May 2026 20:33:36 -0300 Subject: [PATCH 1/8] BREAKING CHANGES: replace promtail and cadvisor for alloy --- abra.sh | 1 + compose.yml | 88 +++++++++-------------------------------------- config.alloy.tmpl | 4 +++ 3 files changed, 21 insertions(+), 72 deletions(-) create mode 100644 config.alloy.tmpl diff --git a/abra.sh b/abra.sh index 173b6d9..8598793 100644 --- a/abra.sh +++ b/abra.sh @@ -12,6 +12,7 @@ export PROMETHEUS_YML_VERSION=v2 export MATRIX_ALERTMANAGER_CONFIG_VERSION=e export MATRIX_ALERTMANAGER_ENTRYPOINT_VERSION=a export GRAFANA_ALERTS_NODE_VERSION=v1c +export CONFIG_ALLOY_VERSION=v1 # creates a default prometheus scrape config for a given node add_node(){ diff --git a/compose.yml b/compose.yml index 3383d91..37c350b 100644 --- a/compose.yml +++ b/compose.yml @@ -3,89 +3,33 @@ version: "3.8" services: app: - image: prom/node-exporter:v1.10.2 - user: root - environment: - - NODE_ID={{.Node.ID}} - volumes: - - /proc:/host/proc:ro - - /sys:/host/sys:ro - - /:/rootfs:ro - - /etc/hostname:/etc/nodename:ro - command: - - "--path.sysfs=/host/sys" - - "--path.procfs=/host/proc" - - "--path.rootfs=/rootfs" - - "--collector.textfile.directory=/etc/node-exporter/" - - "--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)" - - "--no-collector.ipvs" + image: grafana/alloy:v1.16.1 configs: - - source: entrypoint - target: /entrypoint.sh + - source: config_alloy + target: /etc/alloy/config.alloy + volumes: + - alloy-data:/var/lib/alloy/data + command: + - "run" + - "--storage.path=/var/lib/alloy/data" + - "/etc/alloy/config.alloy" networks: - internal - - proxy - entrypoint: [ "/bin/sh", "-e", "/entrypoint.sh" ] deploy: restart_policy: condition: on-failure labels: - "backupbot.backup=${ENABLE_BACKUPS:-true}" - - "traefik.enable=true" - - "traefik.docker.network=proxy" - - "traefik.http.services.${STACK_NAME}-node.loadbalancer.server.port=9100" - - "traefik.http.routers.${STACK_NAME}-node.rule=Host(`node.${DOMAIN}`)" - - "traefik.http.routers.${STACK_NAME}-node.entrypoints=web-secure" - - "traefik.http.routers.${STACK_NAME}-node.tls=true" - - "traefik.http.routers.${STACK_NAME}-node.tls.certresolver=${LETS_ENCRYPT_ENV}" - - "traefik.http.routers.${STACK_NAME}-node.middlewares=basicauth@file" + - "traefik.enable=false" - "coop-cloud.${STACK_NAME}.version=1.6.0+v1.8.1" - - "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT}" - - cadvisor: - image: gcr.io/cadvisor/cadvisor:v0.55.1 - command: - - "-logtostderr" - - "--enable_metrics=cpu,cpuLoad,disk,diskIO,process,memory,network" - # all possible metrics: advtcp,app,cpu,cpuLoad,cpu_topology,cpuset,disk,diskIO,hugetlb,memory,memory_numa,network,oom_event,percpu,perf_event,process,referenced_memory,resctrl,sched,tcp,udp. - - "--housekeeping_interval=120s" - - "--docker_only=true" - volumes: - - /var/lib/docker/:/var/lib/docker:ro - - /dev/disk/:/dev/disk:ro - - /sys:/sys:ro - - /var/run:/var/run:ro - - /:/rootfs:ro - networks: - - internal - - proxy - deploy: - restart_policy: - condition: on-failure - labels: - - "traefik.enable=true" - - "traefik.docker.network=proxy" - - "traefik.http.services.${STACK_NAME}-cadvisor.loadbalancer.server.port=8080" - - "traefik.http.routers.${STACK_NAME}-cadvisor.rule=Host(`cadvisor.${DOMAIN}`)" - - "traefik.http.routers.${STACK_NAME}-cadvisor.entrypoints=web-secure" - - "traefik.http.routers.${STACK_NAME}-cadvisor.tls=true" - - "traefik.http.routers.${STACK_NAME}-cadvisor.tls.certresolver=${LETS_ENCRYPT_ENV}" - - "traefik.http.routers.${STACK_NAME}-cadvisor.middlewares=basicauth@file" - healthcheck: - test: wget --quiet --tries=1 --spider http://localhost:8080/healthz || exit 1 - interval: 15s - timeout: 15s - retries: 5 - start_period: 30s - configs: - entrypoint: - name: ${STACK_NAME}_entrypoint_${ENTRYPOINT_VERSION} - file: node-exporter-entrypoint.sh - - - + config_alloy: + template_driver: golang + name: ${STACK_NAME}_config_alloy_${CONFIG_ALLOY_VERSION} + file: config.alloy.tmpl networks: proxy: external: true internal: +volumes: + alloy-data: diff --git a/config.alloy.tmpl b/config.alloy.tmpl new file mode 100644 index 0000000..1592326 --- /dev/null +++ b/config.alloy.tmpl @@ -0,0 +1,4 @@ +logging { + level = "info" + format = "logfmt" +} -- 2.49.0 From 6c3308907870f40aa6e33f02d355132f809d27bb Mon Sep 17 00:00:00 2001 From: f Date: Thu, 28 May 2026 20:38:50 -0300 Subject: [PATCH 2/8] feat: cadvisor --- abra.sh | 2 +- compose.yml | 1 + config.alloy.tmpl | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/abra.sh b/abra.sh index 8598793..6ba5581 100644 --- a/abra.sh +++ b/abra.sh @@ -12,7 +12,7 @@ export PROMETHEUS_YML_VERSION=v2 export MATRIX_ALERTMANAGER_CONFIG_VERSION=e export MATRIX_ALERTMANAGER_ENTRYPOINT_VERSION=a export GRAFANA_ALERTS_NODE_VERSION=v1c -export CONFIG_ALLOY_VERSION=v1 +export CONFIG_ALLOY_VERSION=v2 # creates a default prometheus scrape config for a given node add_node(){ diff --git a/compose.yml b/compose.yml index 37c350b..5f03571 100644 --- a/compose.yml +++ b/compose.yml @@ -9,6 +9,7 @@ services: target: /etc/alloy/config.alloy volumes: - alloy-data:/var/lib/alloy/data + - /var/run/docker.sock:/var/run/docker.sock command: - "run" - "--storage.path=/var/lib/alloy/data" diff --git a/config.alloy.tmpl b/config.alloy.tmpl index 1592326..4b4b921 100644 --- a/config.alloy.tmpl +++ b/config.alloy.tmpl @@ -2,3 +2,6 @@ logging { level = "info" format = "logfmt" } + +prometheus.exporter.cadvisor "docker" { +} -- 2.49.0 From 349df122048718350cc9517e42afe969fd1d52f5 Mon Sep 17 00:00:00 2001 From: f Date: Thu, 28 May 2026 20:44:00 -0300 Subject: [PATCH 3/8] feat: enable prometheus remote write receiver --- compose.prometheus.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/compose.prometheus.yml b/compose.prometheus.yml index eb3f5ce..312a86d 100644 --- a/compose.prometheus.yml +++ b/compose.prometheus.yml @@ -16,6 +16,7 @@ services: - "--web.console.libraries=/usr/share/prometheus/console_libraries" - "--web.console.templates=/usr/share/prometheus/consoles" - "--storage.tsdb.retention.time=${PROMETHEUS_RETENTION_TIME}" + - "--enable-feature=remote-write-receiver" networks: - proxy - internal -- 2.49.0 From d9aa05a4b5ae0db9f2eda61b667003b348fa5d7b Mon Sep 17 00:00:00 2001 From: f Date: Thu, 28 May 2026 21:00:10 -0300 Subject: [PATCH 4/8] feat: send metrics to prometheus --- .env.sample | 1 + abra.sh | 2 +- compose.yml | 6 ++++++ config.alloy.tmpl | 23 +++++++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/.env.sample b/.env.sample index 11f6563..3850f0f 100644 --- a/.env.sample +++ b/.env.sample @@ -19,6 +19,7 @@ ENABLE_BACKUPS=true # ## Prometheus # COMPOSE_FILE="$COMPOSE_FILE:compose.prometheus.yml" +# PROMETHEUS_REMOTE_WRITE_URL=https://prometheus.$DOMAIN/api/v1/write # PROMETHEUS_RETENTION_TIME=1y # ## Prometheus Pushgateway diff --git a/abra.sh b/abra.sh index 6ba5581..e99c190 100644 --- a/abra.sh +++ b/abra.sh @@ -12,7 +12,7 @@ export PROMETHEUS_YML_VERSION=v2 export MATRIX_ALERTMANAGER_CONFIG_VERSION=e export MATRIX_ALERTMANAGER_ENTRYPOINT_VERSION=a export GRAFANA_ALERTS_NODE_VERSION=v1c -export CONFIG_ALLOY_VERSION=v2 +export CONFIG_ALLOY_VERSION=v4 # creates a default prometheus scrape config for a given node add_node(){ diff --git a/compose.yml b/compose.yml index 5f03571..5cbc951 100644 --- a/compose.yml +++ b/compose.yml @@ -16,6 +16,8 @@ services: - "/etc/alloy/config.alloy" networks: - internal + secrets: + - basic_auth deploy: restart_policy: condition: on-failure @@ -34,3 +36,7 @@ networks: internal: volumes: alloy-data: +secrets: + basic_auth: + external: true + name: ${STACK_NAME}_basic_auth_${SECRET_BASIC_AUTH_VERSION} diff --git a/config.alloy.tmpl b/config.alloy.tmpl index 4b4b921..1b09113 100644 --- a/config.alloy.tmpl +++ b/config.alloy.tmpl @@ -5,3 +5,26 @@ logging { prometheus.exporter.cadvisor "docker" { } + +prometheus.scrape "default" { + targets = array.concat( + [{ + job = "alloy", + __address__ = "127.0.0.1:12345", + }], + prometheus.exporter.cadvisor.docker.targets, + ) + + forward_to = [prometheus.remote_write.prometheus.receiver] +} + +prometheus.remote_write "prometheus" { + endpoint { + url = "{{ env "PROMETHEUS_REMOTE_WRITE_URL" }}" + + basic_auth { + username = "admin" + password = "{{ secret "basic_auth" }}" + } + } +} -- 2.49.0 From 8dc84c591ce94183fc76e97c1fb3140f47b0fd36 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 29 May 2026 15:38:52 -0300 Subject: [PATCH 5/8] fixup! feat: enable prometheus remote write receiver --- compose.prometheus.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/compose.prometheus.yml b/compose.prometheus.yml index 312a86d..db94c60 100644 --- a/compose.prometheus.yml +++ b/compose.prometheus.yml @@ -17,6 +17,7 @@ services: - "--web.console.templates=/usr/share/prometheus/consoles" - "--storage.tsdb.retention.time=${PROMETHEUS_RETENTION_TIME}" - "--enable-feature=remote-write-receiver" + - "--web.enable-remote-write-receiver" networks: - proxy - internal -- 2.49.0 From a713f98ffb1fb4f4cc8258a7bd3f6d59abc3a2b2 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 29 May 2026 16:03:59 -0300 Subject: [PATCH 6/8] feat: instance name is domain --- compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/compose.yml b/compose.yml index 5cbc951..2e96401 100644 --- a/compose.yml +++ b/compose.yml @@ -4,6 +4,7 @@ version: "3.8" services: app: image: grafana/alloy:v1.16.1 + hostname: "${DOMAIN}" configs: - source: config_alloy target: /etc/alloy/config.alloy -- 2.49.0 From e83433cebd5d90090740edea82fcec297f54bff3 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 29 May 2026 16:04:19 -0300 Subject: [PATCH 7/8] feat: node exporter --- abra.sh | 2 +- compose.yml | 1 + config.alloy.tmpl | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/abra.sh b/abra.sh index e99c190..6bf0f1a 100644 --- a/abra.sh +++ b/abra.sh @@ -12,7 +12,7 @@ export PROMETHEUS_YML_VERSION=v2 export MATRIX_ALERTMANAGER_CONFIG_VERSION=e export MATRIX_ALERTMANAGER_ENTRYPOINT_VERSION=a export GRAFANA_ALERTS_NODE_VERSION=v1c -export CONFIG_ALLOY_VERSION=v4 +export CONFIG_ALLOY_VERSION=v5 # creates a default prometheus scrape config for a given node add_node(){ diff --git a/compose.yml b/compose.yml index 2e96401..72d3e2e 100644 --- a/compose.yml +++ b/compose.yml @@ -11,6 +11,7 @@ services: volumes: - alloy-data:/var/lib/alloy/data - /var/run/docker.sock:/var/run/docker.sock + - /:/rootfs:ro command: - "run" - "--storage.path=/var/lib/alloy/data" diff --git a/config.alloy.tmpl b/config.alloy.tmpl index 1b09113..cc14836 100644 --- a/config.alloy.tmpl +++ b/config.alloy.tmpl @@ -6,12 +6,18 @@ logging { prometheus.exporter.cadvisor "docker" { } +prometheus.exporter.unix "default" { + include_exporter_metrics = true + rootfs_path = "/rootfs" +} + prometheus.scrape "default" { targets = array.concat( [{ job = "alloy", __address__ = "127.0.0.1:12345", }], + prometheus.exporter.unix.default.targets, prometheus.exporter.cadvisor.docker.targets, ) -- 2.49.0 From 777b1355dddd596009dcab112d395cb010e734d8 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 29 May 2026 16:16:08 -0300 Subject: [PATCH 8/8] fixup! feat: node exporter --- compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/compose.yml b/compose.yml index 72d3e2e..1b6007f 100644 --- a/compose.yml +++ b/compose.yml @@ -10,7 +10,6 @@ services: target: /etc/alloy/config.alloy volumes: - alloy-data:/var/lib/alloy/data - - /var/run/docker.sock:/var/run/docker.sock - /:/rootfs:ro command: - "run" -- 2.49.0