4NK_vault/storage/dev/generate_grafana_dashboards.sh
2025-10-02 16:38:58 +00:00

655 lines
16 KiB
Bash
Executable File

#!/bin/bash
# Script pour générer automatiquement les dashboards Grafana
# basés sur les modules définis dans les variables d'environnement
# Fonction pour charger les variables d'environnement
load_env_files() {
local env_files=(".env.secrets" ".env" ".env.auto" ".env.post")
for env_file in "${env_files[@]}"; do
if [ -f "$env_file" ]; then
echo "📄 Chargement de $env_file..."
source "$env_file" 2>/dev/null || true
else
echo "⚠️ Fichier $env_file non trouvé, ignoré."
fi
done
}
# Fonction pour générer un dashboard de base pour un service
generate_service_dashboard() {
local SERVICE="$1"
local SERVICE_NAME="$2"
local DASHBOARD_TYPE="$3"
echo "🔧 Génération du dashboard pour $SERVICE ($SERVICE_NAME)"
# Créer le répertoire si nécessaire
mkdir -p "4NK_modules/grafana/dashboards"
# Générer le nom du fichier
local DASHBOARD_FILE="4NK_modules/grafana/dashboards/${SERVICE_NAME}.json"
# Générer le contenu JSON du dashboard
cat > "$DASHBOARD_FILE" << EOF
{
"annotations": {
"list": []
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": null,
"links": [],
"liveNow": false,
"panels": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 10,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"vis": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "never",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum(rate({container=\"\$${SERVICE}_DOCKER_NAME\"} |= \"INFO\" [5m])) by (container)",
"queryType": "",
"refId": "A"
}
],
"title": "Logs INFO - $SERVICE_NAME",
"type": "timeseries"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 10,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"vis": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "never",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 0
},
"id": 2,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum(rate({container=\"\$${SERVICE}_DOCKER_NAME\"} |= \"ERROR\" [5m])) by (container)",
"queryType": "",
"refId": "A"
}
],
"title": "Erreurs - $SERVICE_NAME",
"type": "timeseries"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 4,
"w": 6,
"x": 0,
"y": 8
},
"id": 3,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "auto"
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "count_over_time({container=\"\$${SERVICE}_DOCKER_NAME\"} |= \"ERROR\" [1h])",
"queryType": "",
"refId": "A"
}
],
"title": "Erreurs (1h)",
"type": "stat"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 12
},
"id": 4,
"options": {
"showTime": false,
"showLabels": false,
"showCommonLabels": false,
"wrapLogMessage": false,
"prettifyLogMessage": false,
"enableLogDetails": true,
"dedupStrategy": "none",
"sortOrder": "Descending"
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{container=\"\$${SERVICE}_DOCKER_NAME\"} |= \"ERROR\" | line_format \"{{.timestamp}} - {{.message}}\"",
"queryType": "",
"refId": "A"
}
],
"title": "Logs d'Erreur - $SERVICE_NAME",
"type": "logs"
}
],
"refresh": "5s",
"schemaVersion": 37,
"style": "dark",
"tags": [
"$SERVICE_NAME",
"auto-generated"
],
"templating": {
"list": []
},
"time": {
"from": "now-1h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "$SERVICE_NAME - Monitoring",
"uid": "$(echo $SERVICE_NAME | tr '[:upper:]' '[:lower:]' | tr '_' '-')",
"version": 1,
"weekStart": ""
}
EOF
echo "✅ Dashboard généré: $DASHBOARD_FILE"
}
# Fonction pour générer un dashboard overview
generate_overview_dashboard() {
echo "🔧 Génération du dashboard overview"
mkdir -p "4NK_modules/grafana/dashboards"
cat > "4NK_modules/grafana/dashboards/services-overview.json" << EOF
{
"annotations": {
"list": []
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": null,
"links": [],
"liveNow": false,
"panels": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 10,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"vis": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "never",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum by (container) (count_over_time({container=~\"\$${BITCOIN}_DOCKER_NAME|\$${BLINDBIT_ORACLE}_DOCKER_NAME|\$${SDK_RELAY}_DOCKER_NAME|\$${SDK_STORAGE}_DOCKER_NAME|\$${IHM_CLIENT}_DOCKER_NAME|\$${LECOFFRE_FRONT}_DOCKER_NAME\"} |= \"ERROR\" [5m]))",
"queryType": "",
"refId": "A"
}
],
"title": "Erreurs par Service (5 dernières minutes)",
"type": "timeseries"
}
],
"refresh": "30s",
"schemaVersion": 36,
"style": "dark",
"tags": ["overview", "auto-generated"],
"templating": {
"list": []
},
"time": {
"from": "now-1h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "Services Overview - Auto Generated",
"uid": "services-overview-auto",
"version": 1,
"weekStart": ""
}
EOF
echo "✅ Dashboard overview généré"
}
# Fonction pour générer le fichier promtail.yml
generate_promtail_config() {
echo "🔧 Génération du fichier promtail.yml"
# Créer le répertoire si nécessaire
mkdir -p "4NK_modules/promtail"
# Générer le fichier promtail.yml
cat > "4NK_modules/promtail/promtail.yml" << 'EOF'
server:
http_listen_port: $PROMTAIL_PORT
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: $LOKI_URL/loki/api/v1/push
scrape_configs:
EOF
# Générer les configurations pour chaque service
for SERVICE_VAR in "${SERVICES[@]}"; do
# Ajouter la configuration pour ce service
cat >> "4NK_modules/promtail/promtail.yml" << EOF
# ${SERVICE_VAR} Logs
- job_name: \$${SERVICE_VAR}_DOCKER_NAME
static_configs:
- targets:
- localhost
labels:
job: \$${SERVICE_VAR}_DOCKER_NAME
service: \$${SERVICE_VAR}_DOCKER_NAME
__path__: \$${SERVICE_VAR}_LOGS_DIR/*.log
EOF
done
# Ajouter la configuration Docker
cat >> "4NK_modules/promtail/promtail.yml" << 'EOF'
# Docker Container Logs
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
filters:
- name: label
values: ["com.centurylinklabs.watchtower.enable=true"]
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/?(.*)'
target_label: 'container_name'
- source_labels: ['__meta_docker_container_log_stream']
target_label: 'logstream'
- source_labels: ['__meta_docker_container_label_logging_job_name']
target_label: 'job'
EOF
echo "✅ Configuration promtail.yml générée"
}
# Fonction pour générer les fichiers de configuration logrotate
generate_logrotate_configs() {
echo "🔧 Génération des configurations logrotate"
# Créer le répertoire si nécessaire
mkdir -p "logrotade"
# Générer les configurations pour chaque service
for SERVICE_VAR in "${SERVICES[@]}"; do
local CONFIG_FILE="logrotade/${SERVICE_VAR,,}.conf"
echo "📄 Génération de $CONFIG_FILE"
cat > "$CONFIG_FILE" << EOF
\$${SERVICE_VAR}_LOGS_DIR/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart \$${SERVICE_VAR}_DOCKER_NAME 2>/dev/null || true
endscript
}
EOF
done
echo "✅ Configurations logrotate générées pour ${#SERVICES[@]} services"
}
# Fonction pour déterminer le type de service
get_service_type() {
local service="$1"
case "$service" in
"BITCOIN"|"BLINDBIT_ORACLE") echo "blockchain" ;;
"SDK_RELAY"|"SDK_STORAGE") echo "sdk" ;;
"IHM_CLIENT"|"LECOFFRE_FRONT") echo "frontend" ;;
"4NK_MINER") echo "mining" ;;
"REDIS"|"POSTGRESQL"|"LOKI"|"PROMTAIL"|"GRAFANA") echo "infrastructure" ;;
*) echo "service" ;;
esac
}
# Fonction pour déterminer le nom du dashboard
get_dashboard_name() {
local service="$1"
case "$service" in
"BITCOIN") echo "bitcoin" ;;
"BLINDBIT_ORACLE") echo "blindbit-oracle" ;;
"SDK_RELAY") echo "sdk-relay" ;;
"SDK_STORAGE") echo "sdk-storage" ;;
"IHM_CLIENT") echo "ihm-client" ;;
"LECOFFRE_FRONT") echo "lecoffre-front" ;;
"4NK_MINER") echo "4nk-miner" ;;
"4NK_CERTIFICATOR") echo "4nk-certificator" ;;
"4NK_WEB_STATUS") echo "4nk-web-status" ;;
"4NK_VAULT") echo "4nk-vault" ;;
*) echo "${service,,}" ;; # Convertir en minuscules
esac
}
# Fonction principale
main() {
echo "🚀 GÉNÉRATION AUTOMATIQUE DES DASHBOARDS GRAFANA"
echo "=================================================="
# Charger les variables d'environnement
load_env_files
# Créer le répertoire des dashboards
mkdir -p "4NK_modules/grafana/dashboards"
echo "📋 Génération des dashboards pour ${#SERVICES[@]} services..."
# Générer les dashboards en boucle depuis la variable SERVICES
for SERVICE_VAR in "${SERVICES[@]}"; do
# Déterminer le nom du dashboard et le type de service
local DASHBOARD_NAME=$(get_dashboard_name "$SERVICE_VAR")
local SERVICE_TYPE=$(get_service_type "$SERVICE_VAR")
echo "🔄 Traitement de $SERVICE_VAR -> $DASHBOARD_NAME ($SERVICE_TYPE)"
# Générer le dashboard pour ce service
generate_service_dashboard "$SERVICE_VAR" "$DASHBOARD_NAME" "$SERVICE_TYPE"
done
# Générer le dashboard overview
echo "🔄 Génération du dashboard overview..."
generate_overview_dashboard
# Générer la configuration Promtail
echo "🔄 Génération de la configuration Promtail..."
generate_promtail_config
# Générer les configurations logrotate
echo "🔄 Génération des configurations logrotate..."
generate_logrotate_configs
echo ""
echo "✅ GÉNÉRATION TERMINÉE !"
echo "📁 Dashboards générés dans: 4NK_modules/grafana/dashboards/"
echo "📁 Configuration Promtail: 4NK_modules/promtail/promtail.yml"
echo "📁 Configurations logrotate: logrotade/*.conf"
echo "🔧 Les dashboards utilisent les variables d'environnement pour les noms de containers"
echo "📊 Services traités: ${#SERVICES[@]}"
}
# Exécuter le script principal
main "$@"