L'API exposait /metrics, mais aucun collecteur ne le lisait : monitoring/ ne contenait que des .gitkeep. Sous le profil Compose `monitoring` : prometheus, alertmanager, grafana, postgres-exporter, node-exporter et cadvisor. Tous ont un mem_limit, pour environ 700 Mo au total sur la VM de 8 Go, et leurs interfaces n'écoutent que sur 127.0.0.1. Le profil est actif en prod via COMPOSE_PROFILES, donc à chaque déploiement, et se lance à la demande ailleurs (make monitoring-up). - Neuf règles d'alerte (API, base, hôte, cibles). Chacune a un cas dans les tests joués par `promtool test rules`, en CI comme par make monitoring-check. - Alertmanager route les alertes par courriel vers Mailpit ; un critical masque le warning de la même cible. - Grafana est provisionné : sources Prometheus et TimescaleDB, et trois tableaux de bord (API, données et dérive du modèle, infrastructure). - Le rôle PostgreSQL `supervision` est en lecture seule sur les seules tables métier (db/roles/supervision.sql), posé par make db-ensure-supervision et par stack-up quand le profil est actif. - Le jeton de /metrics passe à Prometheus en secret Compose (APP_METRICS_TOKEN) ; provision-host.sh génère ce secret et les deux autres. Backend : - un APP_METRICS_TOKEN vide vaut absent ; - les sondes de santé ne comptent plus dans les métriques ; - seaux de latence fins autour de 500 ms ; - un registre Prometheus par application, sans quoi toute application créée après la première (dans les tests) ne mesurait rien. Réf : #26
103 lines
3.7 KiB
YAML
103 lines
3.7 KiB
YAML
name: Infra
|
|
|
|
# Pourquoi : rien de ce qui décrit l'infrastructure ne s'exécute avant le déploiement. Terraform est
|
|
# resté cassé sans que rien ne le dise, faute de job qui le joue : ce workflow n'applique rien, il
|
|
# vérifie le Terraform, les fichiers Compose et les workflows eux-mêmes - jobs terraform, compose,
|
|
# workflows. ci.yml choisit par ses entrées ceux qui tournent (ADR 0014).
|
|
# Piège : la boucle Terraform parcourt `environments/*`, pour qu'une racine ajoutée soit couverte
|
|
# sans toucher à ce fichier.
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
terraform:
|
|
type: boolean
|
|
default: false
|
|
compose:
|
|
type: boolean
|
|
default: false
|
|
workflows:
|
|
type: boolean
|
|
default: false
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
terraform:
|
|
name: Formatage et validation Terraform
|
|
if: inputs.terraform
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
# Action tierce, épinglée sur le commit du tag (règle Sonar githubactions:S7637).
|
|
- name: Installe Terraform
|
|
uses: hashicorp/setup-terraform@dfe3c3f87815947d99a8997f908cb6525fc44e9e # v4.0.1
|
|
with:
|
|
terraform_version: 1.16.3
|
|
terraform_wrapper: false
|
|
|
|
- name: Vérifie le formatage
|
|
run: terraform fmt -check -recursive infra/terraform
|
|
|
|
- name: Valide chaque racine
|
|
run: |
|
|
for racine in infra/terraform/environments/*/; do
|
|
echo "::group::${racine}"
|
|
terraform -chdir="${racine}" init -backend=false -input=false
|
|
terraform -chdir="${racine}" validate
|
|
echo "::endgroup::"
|
|
done
|
|
|
|
compose:
|
|
name: Validation des fichiers Compose et de la supervision
|
|
if: inputs.compose
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
# Compose interpole tout le fichier : les `:?` exigent une valeur, pas un vrai secret.
|
|
- name: Prépare un .env d'exemple
|
|
run: cp .env.example .env
|
|
|
|
- name: Valide la stack de développement
|
|
run: docker compose config --quiet
|
|
|
|
- name: Valide la stack déployée, profils compris
|
|
run: docker compose -f docker-compose.yml -f docker-compose.prod.yml --profile acme --profile monitoring --profile load config --quiet
|
|
|
|
# Mêmes commandes que `make monitoring-check` : images et montages viennent du fichier Compose.
|
|
- name: Valide la configuration de Prometheus et ses règles
|
|
run: docker compose --profile monitoring run --rm --no-deps --entrypoint promtool prometheus check config /etc/prometheus/prometheus.yml
|
|
|
|
- name: Joue les tests unitaires des règles d'alerte
|
|
run: docker compose --profile monitoring run --rm --no-deps --entrypoint promtool prometheus test rules /etc/prometheus/tests/enervision.test.yml
|
|
|
|
- name: Valide la configuration d'Alertmanager
|
|
run: docker compose --profile monitoring run --rm --no-deps --entrypoint amtool alertmanager check-config /etc/alertmanager/alertmanager.yml
|
|
|
|
- name: Valide les tableaux de bord Grafana
|
|
run: for tableau in monitoring/grafana/dashboards/*.json; do jq empty "$tableau"; done
|
|
|
|
workflows:
|
|
name: Analyse des workflows
|
|
if: inputs.workflows
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
# Image épinglée par tag, comme les images des fichiers Compose. Elle embarque shellcheck,
|
|
# qui analyse aussi les blocs `run:`.
|
|
- name: actionlint
|
|
run: docker run --rm -v "$PWD:/repo" --workdir /repo rhysd/actionlint:1.7.12 -color
|