refactor: each observability service's config sits in a root folder named after it, out of backend/
Summary
backend/ held the config of six other containers. None of it goes into the backend image, but CI's backend/** filter counted a dashboard edit as a backend change: #431 changed one datasource line and ran 13 jobs, image builds and all E2E included.
Changes
Each config moves with git mv to a root folder named after its compose service (grafana/, host-metrics/, loki/, opensearch/, otel-collector/, victoria-metrics/), and .trivyignore to the root, since it covers both images. Mounts, the deploy's restart paths, the labeler and the docs follow. The contract test gets its own CI job, so a dashboard edit runs only that and the docs build.
The first release recreates the six services and then restarts them once more. OpenSearch misses lines during both gaps; Loki keeps them.
Type of Change
- Bug fix (non-breaking change that fixes an issue)
- New feature (non-breaking change that adds functionality)
- Breaking change (fix or feature that would cause existing functionality to change)
- Documentation update
- Refactoring (no functional changes)
- CI/CD or tooling changes
Test Plan
- Backend unit tests pass (
cd backend && uv run pytest tests/unit) - Frontend unit tests pass (
cd frontend && npm run test) - Backend E2E tests pass (
docker compose exec -T backend sh -c 'uv sync --group test --no-dev --frozen --no-install-project --no-build && pytest tests/e2e') - Frontend E2E tests pass (
cd frontend && npm run test:e2e) - API spec and client regenerated if routes or schemas changed (
./deploy.sh openapi, then./deploy.sh types), never edited by hand - Manual testing performed
Validation: the contract tests read all 13 dashboards, the alert rules and the collector config from the new paths and pass, mkdocs build --strict passes, and actionlint finds nothing new. The services started from the branch loaded their configs: 13 dashboards, 13 alert rules and 4 datasources in Grafana, OpenSearch's template and policy, Loki's 30-day retention, the VictoriaMetrics scrape job and 8 host series.
Checklist
- My code follows the project's style guidelines
- I have run
pre-commit run --all-filesand all checks pass - I have added tests that prove my fix/feature works
- I have updated documentation if needed
- My changes don't introduce new warnings
Summary by cubic
Moves each observability service's config out of backend/ into a root folder named after its compose service (grafana/, host-metrics/, loki/, opensearch/, otel-collector/, victoria-metrics/). A dashboard edit under backend/ previously counted as a backend change and ran every CI job, from image builds to all E2E; now it triggers only the docs build and the contract tests.
- Grafana contract tests get their own CI job, run only when
backend/or a service config folder changes. .trivyignoremoves to the repo root, since it covers both images.- Compose mounts, the deploy restart paths, the labeler and the docs follow the new locations.
Deployment
- The first release recreates the six services and then restarts them once more; OpenSearch misses lines during both gaps while Loki keeps them.