Grafana : dashboard provisionné « Journaux de la flotte » (Loki, Viewer-friendly)

Provisioning de dashboards (provider + JSON) : un dashboard logs avec
sélecteur d'hôte + filtre regex + panneau logs + débit. Référence Loki par
une VARIABLE de datasource (ds_loki), pas un UID codé en dur.

Leçon : ajouter un uid explicite à une datasource déjà provisionnée casse
le démarrage de Grafana (« data source not found ») → variable de datasource.

Permet aux Viewers (dont testmail) de voir les logs sans accès Explore.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-07-04 16:10:59 -04:00
parent e9ca943425
commit 4887d2aee8
4 changed files with 109 additions and 0 deletions

View file

@ -12,6 +12,8 @@ serveur_grafana_root_url: "https://{{ serveur_grafana_hostname }}/"
# Datasources (Prometheus + Loki, co-localises sur obs-01).
serveur_grafana_prometheus_url: "http://localhost:9090"
serveur_grafana_loki_url: "http://localhost:3100"
# Dashboards provisionnés (fichiers) — répertoire lu par le provider Grafana.
serveur_grafana_dashboards_dir: "/var/lib/grafana/dashboards"
# Secret OBLIGATOIRE (Ansible Vault).
serveur_grafana_admin_password: "{{ vault_grafana_admin | default('') }}" # rempli depuis la voute (vault_grafana_admin)

View file

@ -0,0 +1,66 @@
{
"uid": "setops-journaux",
"title": "Journaux de la flotte",
"tags": ["set-ops", "logs"],
"timezone": "browser",
"schemaVersion": 39,
"version": 1,
"refresh": "30s",
"time": { "from": "now-1h", "to": "now" },
"templating": {
"list": [
{
"name": "ds_loki",
"label": "Source Loki",
"type": "datasource",
"query": "loki",
"hide": 2,
"current": {}
},
{
"name": "host",
"label": "Hôte",
"type": "query",
"datasource": { "type": "loki", "uid": "${ds_loki}" },
"query": "label_values(host)",
"definition": "label_values(host)",
"includeAll": true,
"multi": true,
"current": { "text": "All", "value": "$__all" },
"refresh": 2,
"sort": 1
},
{
"name": "filtre",
"label": "Filtre (regex, insensible à la casse)",
"type": "textbox",
"query": "",
"current": { "text": "", "value": "" }
}
]
},
"panels": [
{
"id": 1,
"type": "timeseries",
"title": "Débit des journaux (lignes/s) par hôte",
"datasource": { "type": "loki", "uid": "${ds_loki}" },
"gridPos": { "h": 7, "w": 24, "x": 0, "y": 0 },
"fieldConfig": { "defaults": { "custom": { "drawStyle": "bars", "fillOpacity": 40, "stacking": { "mode": "normal" } } } },
"targets": [
{ "refId": "A", "datasource": { "type": "loki", "uid": "${ds_loki}" }, "expr": "sum by (host) (rate({host=~\"$host\"} |~ \"(?i)$filtre\" [$__interval]))", "legendFormat": "{{host}}" }
]
},
{
"id": 2,
"type": "logs",
"title": "Journaux",
"datasource": { "type": "loki", "uid": "${ds_loki}" },
"gridPos": { "h": 18, "w": 24, "x": 0, "y": 7 },
"options": { "showTime": true, "wrapLogMessage": true, "prettifyLogMessage": false, "enableLogDetails": true, "sortOrder": "Descending" },
"targets": [
{ "refId": "A", "datasource": { "type": "loki", "uid": "${ds_loki}" }, "expr": "{host=~\"$host\"} |~ \"(?i)$filtre\"" }
]
}
]
}

View file

@ -42,6 +42,33 @@
mode: "0640"
notify: Redemarrer grafana
- name: Assurer le repertoire des dashboards
ansible.builtin.file:
path: "{{ serveur_grafana_dashboards_dir }}"
state: directory
owner: root
group: grafana
mode: "0750"
- name: Deployer le provisioning des dashboards
ansible.builtin.template:
src: dashboards.yaml.j2
dest: /etc/grafana/provisioning/dashboards/setops.yaml
owner: root
group: grafana
mode: "0640"
notify: Redemarrer grafana
- name: Deployer les dashboards Set-OPS
ansible.builtin.copy:
src: dashboards/
dest: "{{ serveur_grafana_dashboards_dir }}/"
owner: root
group: grafana
mode: "0640"
directory_mode: "0750"
notify: Redemarrer grafana
- name: Assurer le repertoire de drop-in systemd
ansible.builtin.file:
path: /etc/systemd/system/grafana-server.service.d

View file

@ -0,0 +1,14 @@
# Gere par Set-OPS (role serveur_grafana). Ne pas editer a la main.
apiVersion: 1
providers:
- name: setops
orgId: 1
folder: Set-OPS
type: file
disableDeletion: false
updateIntervalSeconds: 30
allowUiUpdates: false
options:
path: {{ serveur_grafana_dashboards_dir }}
foldersFromFilesStructure: false