Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
625e479c3d | ||
|
|
779dee5a0d | ||
|
|
0eab632ec4 | ||
|
|
e5f57c97f1 |
+4
-7
@@ -53,6 +53,10 @@ SECRET_BASIC_AUTH_VERSION=v1
|
||||
# Not needed if you just want to read local log files — use SYSLOG_FILES instead.
|
||||
# SYSLOG=1
|
||||
# COMPOSE_FILE="$COMPOSE_FILE:compose.syslog.yml"
|
||||
#
|
||||
# Scrape Docker-Events via official docker-cli image using docker socket
|
||||
# COMPOSE_FILE="$COMPOSE_FILE:compose.docker-events.yml"
|
||||
|
||||
|
||||
# Monitoring Server
|
||||
#
|
||||
@@ -126,10 +130,3 @@ SECRET_BASIC_AUTH_VERSION=v1
|
||||
|
||||
# Node memory usage alert will trigger when memory usage is above the given number in percent
|
||||
#ALERT_NODE_MEMORY_USAGE=85
|
||||
|
||||
# Tell Traefik to keep access logs (could be very verbose). See Access
|
||||
# logs on Traefik recipe.
|
||||
#ALLOY_ACCESS_LOGS=true
|
||||
#PROMETHEUS_ACCESS_LOGS=true
|
||||
#LOKI_ACCESS_LOGS=true
|
||||
#GRAFANA_ACCESS_LOGS=true
|
||||
|
||||
@@ -54,6 +54,14 @@ This is what a gathering host pushes into. It also runs its own Alloy, so it mon
|
||||
|
||||
## Additional features
|
||||
|
||||
### Scrape docker events
|
||||
|
||||
Just uncomment the following line in your .env to collect docker events using
|
||||
the official docker-cli image and the docker socket:
|
||||
```
|
||||
COMPOSE_FILE="$COMPOSE_FILE:compose.docker-events.yml"
|
||||
```
|
||||
|
||||
### Discovering metrics from other apps
|
||||
|
||||
Alloy auto-discovers and scrapes other Docker Swarm services running on the same host, on the `proxy` network, that opt in via labels. No manual scrape config needed. On the app's `compose.yml`:
|
||||
|
||||
@@ -10,7 +10,7 @@ export PROMETHEUS_YML_VERSION=v2
|
||||
export MATRIX_ALERTMANAGER_CONFIG_VERSION=v1
|
||||
export MATRIX_ALERTMANAGER_ENTRYPOINT_VERSION=v1
|
||||
export GF_ALERTS_NODE_VERSION=v3
|
||||
export CONFIG_ALLOY_VERSION=v2
|
||||
export CONFIG_ALLOY_VERSION=v3
|
||||
|
||||
# migrates secrets from old names to new names by reading values from the
|
||||
# running containers on the server and re-inserting them under the new names.
|
||||
|
||||
@@ -14,4 +14,3 @@ services:
|
||||
- "traefik.http.routers.${STACK_NAME}-alloy.tls=true"
|
||||
- "traefik.http.routers.${STACK_NAME}-alloy.tls.certresolver=${LETS_ENCRYPT_ENV}"
|
||||
- "traefik.http.routers.${STACK_NAME}-alloy.middlewares=basicauth@file"
|
||||
- "traefik.http.routers.${STACK_NAME}-alloy.observability.accesslogs=${ALLOY_ACCESS_LOGS:-false}"
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
docker-events:
|
||||
image: docker:29.8.1-cli
|
||||
command: >
|
||||
docker events
|
||||
--format '{{json .}}'
|
||||
--filter type=container
|
||||
--filter event=start
|
||||
--filter event=die
|
||||
--filter event=kill
|
||||
--filter event=oom
|
||||
--filter event=restart
|
||||
--filter event=stop
|
||||
--filter event=health_status
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
deploy:
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
@@ -43,7 +43,6 @@ services:
|
||||
- "traefik.http.routers.${STACK_NAME}-grafana.entrypoints=web-secure"
|
||||
- "traefik.http.routers.${STACK_NAME}-grafana.tls=true"
|
||||
- "traefik.http.routers.${STACK_NAME}-grafana.tls.certresolver=${LETS_ENCRYPT_ENV}"
|
||||
- "traefik.http.routers.${STACK_NAME}-grafana.observability.accesslogs=${GRAFANA_ACCESS_LOGS:-false}"
|
||||
healthcheck:
|
||||
test: "wget -q http://localhost:3000/healthz -O/dev/null"
|
||||
interval: 5s
|
||||
|
||||
@@ -34,7 +34,6 @@ services:
|
||||
- "traefik.http.routers.${STACK_NAME}-loki.tls=true"
|
||||
- "traefik.http.routers.${STACK_NAME}-loki.tls.certresolver=${LETS_ENCRYPT_ENV}"
|
||||
- "traefik.http.routers.${STACK_NAME}-loki.middlewares=basicauth@file"
|
||||
- "traefik.http.routers.${STACK_NAME}-loki.observability.accesslogs=${LOKI_ACCESS_LOGS:-false}"
|
||||
|
||||
|
||||
configs:
|
||||
|
||||
@@ -38,7 +38,6 @@ services:
|
||||
- "traefik.http.routers.${STACK_NAME}-prometheus.tls=true"
|
||||
- "traefik.http.routers.${STACK_NAME}-prometheus.tls.certresolver=${LETS_ENCRYPT_ENV}"
|
||||
- "traefik.http.routers.${STACK_NAME}-prometheus.middlewares=basicauth@file"
|
||||
- "traefik.http.routers.${STACK_NAME}-prometheus.observability.accesslogs=${PROMETHEUS_ACCESS_LOGS:-false}"
|
||||
|
||||
configs:
|
||||
prometheus_yml:
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@ services:
|
||||
condition: on-failure
|
||||
labels:
|
||||
- "backupbot.backup=${ENABLE_BACKUPS:-true}"
|
||||
- "coop-cloud.${STACK_NAME}.version=2.0.0+v1.18.1"
|
||||
- "coop-cloud.${STACK_NAME}.version=2.2.0+v1.18.1"
|
||||
configs:
|
||||
config_alloy:
|
||||
template_driver: golang
|
||||
|
||||
@@ -52,7 +52,32 @@ prometheus.scrape "default" {
|
||||
prometheus.exporter.cadvisor.docker.targets,
|
||||
)
|
||||
|
||||
forward_to = [prometheus.relabel.container_meta.receiver]
|
||||
}
|
||||
|
||||
prometheus.relabel "container_meta" {
|
||||
forward_to = [prometheus.remote_write.prometheus.receiver]
|
||||
|
||||
// remove sha tail: nginx:1.31.1@sha256:608a... -> nginx:1.31.1
|
||||
rule {
|
||||
source_labels = ["image"]
|
||||
regex = "([^@]+)@sha256:.*"
|
||||
target_label = "image"
|
||||
replacement = "$1"
|
||||
}
|
||||
// split image in name and tag
|
||||
rule {
|
||||
source_labels = ["image"]
|
||||
regex = "(.+):[^:/]+"
|
||||
target_label = "image_name"
|
||||
replacement = "$1"
|
||||
}
|
||||
rule {
|
||||
source_labels = ["image"]
|
||||
regex = ".+:([^:/]+)"
|
||||
target_label = "image_tag"
|
||||
replacement = "$1"
|
||||
}
|
||||
}
|
||||
|
||||
prometheus.remote_write "prometheus" {
|
||||
@@ -290,7 +315,35 @@ loki.source.docker "docker" {
|
||||
loki.source.journal "journal" {
|
||||
path = "/rootfs/var/log/journal"
|
||||
labels = { job = "{{ env "DOMAIN" }}" }
|
||||
relabel_rules = loki.relabel.journal.rules
|
||||
forward_to = [loki.process.journal.receiver]
|
||||
}
|
||||
|
||||
loki.relabel "journal" {
|
||||
forward_to = []
|
||||
|
||||
rule {
|
||||
source_labels = ["__journal__systemd_unit"]
|
||||
target_label = "unit"
|
||||
}
|
||||
rule {
|
||||
source_labels = ["__journal_syslog_identifier"]
|
||||
target_label = "ident"
|
||||
}
|
||||
rule {
|
||||
source_labels = ["__journal_priority_keyword"]
|
||||
target_label = "priority"
|
||||
}
|
||||
}
|
||||
|
||||
// drop network db stats (15-20% of kernel logs)
|
||||
loki.process "journal" {
|
||||
forward_to = [loki.write.loki.receiver]
|
||||
|
||||
stage.drop {
|
||||
expression = ".*NetworkDB stats.*"
|
||||
drop_counter_reason = "networkdb_stats"
|
||||
}
|
||||
}
|
||||
{{ end }}
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
alloy: split image label in "image_name" and "image_tag", relabel journald logs and drop NetworkDB stats
|
||||
@@ -0,0 +1 @@
|
||||
allow scraping of docker events via new compose.docker-events.yml
|
||||
Reference in New Issue
Block a user