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:
parent
e9ca943425
commit
4887d2aee8
4 changed files with 109 additions and 0 deletions
|
|
@ -12,6 +12,8 @@ serveur_grafana_root_url: "https://{{ serveur_grafana_hostname }}/"
|
||||||
# Datasources (Prometheus + Loki, co-localises sur obs-01).
|
# Datasources (Prometheus + Loki, co-localises sur obs-01).
|
||||||
serveur_grafana_prometheus_url: "http://localhost:9090"
|
serveur_grafana_prometheus_url: "http://localhost:9090"
|
||||||
serveur_grafana_loki_url: "http://localhost:3100"
|
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).
|
# Secret OBLIGATOIRE (Ansible Vault).
|
||||||
serveur_grafana_admin_password: "{{ vault_grafana_admin | default('') }}" # rempli depuis la voute (vault_grafana_admin)
|
serveur_grafana_admin_password: "{{ vault_grafana_admin | default('') }}" # rempli depuis la voute (vault_grafana_admin)
|
||||||
|
|
|
||||||
66
roles/serveur_grafana/files/dashboards/journaux-flotte.json
Normal file
66
roles/serveur_grafana/files/dashboards/journaux-flotte.json
Normal 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\"" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -42,6 +42,33 @@
|
||||||
mode: "0640"
|
mode: "0640"
|
||||||
notify: Redemarrer grafana
|
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
|
- name: Assurer le repertoire de drop-in systemd
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: /etc/systemd/system/grafana-server.service.d
|
path: /etc/systemd/system/grafana-server.service.d
|
||||||
|
|
|
||||||
14
roles/serveur_grafana/templates/dashboards.yaml.j2
Normal file
14
roles/serveur_grafana/templates/dashboards.yaml.j2
Normal 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
|
||||||
Loading…
Reference in a new issue