chore: replace Promtail with Grafana Alloy for log collection (refs #97)
Promtail 2.9.0 embeds Docker client API v1.42 which is incompatible with Docker Engine v29 (minimum API v1.44). Grafana Alloy v1.12.2 resolves this by using a compatible Docker client. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -171,7 +171,7 @@ jobs:
|
|||||||
# Start shared infrastructure services (database, cache, logging)
|
# Start shared infrastructure services (database, cache, logging)
|
||||||
# These persist across blue-green deployments
|
# These persist across blue-green deployments
|
||||||
docker compose -f $COMPOSE_FILE -f $COMPOSE_BLUE_GREEN -f $COMPOSE_PROD up -d \
|
docker compose -f $COMPOSE_FILE -f $COMPOSE_BLUE_GREEN -f $COMPOSE_PROD up -d \
|
||||||
mvp-postgres mvp-redis mvp-loki mvp-promtail mvp-grafana
|
mvp-postgres mvp-redis mvp-loki mvp-alloy mvp-grafana
|
||||||
|
|
||||||
- name: Start target stack
|
- name: Start target stack
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# MotoVaultPro
|
# MotoVaultPro
|
||||||
|
|
||||||
Single-tenant vehicle management application with 9-container architecture (6 application: Traefik, Frontend, Backend, OCR, PostgreSQL, Redis + 3 logging: Loki, Promtail, Grafana).
|
Single-tenant vehicle management application with 9-container architecture (6 application: Traefik, Frontend, Backend, OCR, PostgreSQL, Redis + 3 logging: Loki, Alloy, Grafana).
|
||||||
|
|
||||||
## Files
|
## Files
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ Issues are the source of truth. See `.ai/workflow-contract.json` for complete wo
|
|||||||
## Architecture Context for AI
|
## Architecture Context for AI
|
||||||
|
|
||||||
### 9-Container Architecture
|
### 9-Container Architecture
|
||||||
**MotoVaultPro uses a unified architecture:** A single-tenant application with 9 containers - 6 application (Traefik, Frontend, Backend, OCR, PostgreSQL, Redis) + 3 logging (Loki, Promtail, Grafana). Application features in `backend/src/features/[name]/` are self-contained modules within the backend service, including the platform feature for vehicle data and VIN decoding. See `docs/LOGGING.md` for unified logging system documentation.
|
**MotoVaultPro uses a unified architecture:** A single-tenant application with 9 containers - 6 application (Traefik, Frontend, Backend, OCR, PostgreSQL, Redis) + 3 logging (Loki, Alloy, Grafana). Application features in `backend/src/features/[name]/` are self-contained modules within the backend service, including the platform feature for vehicle data and VIN decoding. See `docs/LOGGING.md` for unified logging system documentation.
|
||||||
|
|
||||||
### Key Principles for AI Understanding
|
### Key Principles for AI Understanding
|
||||||
- **Feature Capsule Organization**: Application features are self-contained modules within the backend
|
- **Feature Capsule Organization**: Application features are self-contained modules within the backend
|
||||||
|
|||||||
29
config/alloy/config.alloy
Normal file
29
config/alloy/config.alloy
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
discovery.docker "containers" {
|
||||||
|
host = "unix:///var/run/docker.sock"
|
||||||
|
refresh_interval = "5s"
|
||||||
|
}
|
||||||
|
|
||||||
|
discovery.relabel "containers" {
|
||||||
|
targets = discovery.docker.containers.targets
|
||||||
|
rule {
|
||||||
|
source_labels = ["__meta_docker_container_name"]
|
||||||
|
regex = "/(.*)"
|
||||||
|
target_label = "container"
|
||||||
|
}
|
||||||
|
rule {
|
||||||
|
source_labels = ["__meta_docker_container_label_com_docker_compose_service"]
|
||||||
|
target_label = "service"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loki.source.docker "containers" {
|
||||||
|
host = "unix:///var/run/docker.sock"
|
||||||
|
targets = discovery.relabel.containers.output
|
||||||
|
forward_to = [loki.write.default.receiver]
|
||||||
|
}
|
||||||
|
|
||||||
|
loki.write "default" {
|
||||||
|
endpoint {
|
||||||
|
url = "http://mvp-loki:3100/loki/api/v1/push"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
server:
|
|
||||||
http_listen_port: 9080
|
|
||||||
grpc_listen_port: 0
|
|
||||||
|
|
||||||
positions:
|
|
||||||
filename: /tmp/positions.yaml
|
|
||||||
|
|
||||||
clients:
|
|
||||||
- url: http://mvp-loki:3100/loki/api/v1/push
|
|
||||||
|
|
||||||
scrape_configs:
|
|
||||||
- job_name: containers
|
|
||||||
docker_sd_configs:
|
|
||||||
- host: unix:///var/run/docker.sock
|
|
||||||
refresh_interval: 5s
|
|
||||||
relabel_configs:
|
|
||||||
- source_labels: ['__meta_docker_container_name']
|
|
||||||
regex: '/(.*)'
|
|
||||||
target_label: 'container'
|
|
||||||
- source_labels: ['__meta_docker_container_label_com_docker_compose_service']
|
|
||||||
target_label: 'service'
|
|
||||||
@@ -286,16 +286,20 @@ services:
|
|||||||
max-size: "10m"
|
max-size: "10m"
|
||||||
max-file: "3"
|
max-file: "3"
|
||||||
|
|
||||||
# Log Aggregation - Promtail
|
# Log Aggregation - Alloy (replaces Promtail)
|
||||||
mvp-promtail:
|
mvp-alloy:
|
||||||
image: ${REGISTRY_MIRRORS:-git.motovaultpro.com/egullickson/mirrors}/grafana/promtail:2.9.0
|
image: ${REGISTRY_MIRRORS:-git.motovaultpro.com/egullickson/mirrors}/grafana/alloy:v1.12.2
|
||||||
container_name: mvp-promtail
|
container_name: mvp-alloy
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- ./config/promtail/config.yml:/etc/promtail/config.yml:ro
|
- ./config/alloy/config.alloy:/etc/alloy/config.alloy
|
||||||
- /var/lib/docker/containers:/var/lib/docker/containers:ro
|
- /var/lib/docker/containers:/var/lib/docker/containers:ro
|
||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||||
command: -config.file=/etc/promtail/config.yml
|
command:
|
||||||
|
- run
|
||||||
|
- --server.http.listen-addr=0.0.0.0:12345
|
||||||
|
- --storage.path=/var/lib/alloy/data
|
||||||
|
- /etc/alloy/config.alloy
|
||||||
networks:
|
networks:
|
||||||
- backend
|
- backend
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|||||||
@@ -102,14 +102,14 @@ This creates `.env.logging` which is sourced by docker-compose.
|
|||||||
+-----------------------------------------------------------------------+
|
+-----------------------------------------------------------------------+
|
||||||
|
|
|
|
||||||
v
|
v
|
||||||
Promtail --> Loki (30-day retention) --> Grafana
|
Alloy --> Loki (30-day retention) --> Grafana
|
||||||
```
|
```
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
### Logs not appearing in Grafana
|
### Logs not appearing in Grafana
|
||||||
|
|
||||||
1. Check Promtail is running: `docker logs mvp-promtail`
|
1. Check Alloy is running: `docker logs mvp-alloy`
|
||||||
2. Check Loki is healthy: `curl http://localhost:3100/ready`
|
2. Check Loki is healthy: `curl http://localhost:3100/ready`
|
||||||
3. Verify log rotation is not too aggressive
|
3. Verify log rotation is not too aggressive
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user