{#- GENERE par Set-OPS (role serveur_grafana). Ne pas editer a la main. UN TABLEAU PAR ROLE, ASSEMBLE DEPUIS SON `meta/metriques.yml`. C'EST LA MOITIE QUI MANQUAIT. Les roles declaraient leurs panneaux, Prometheus collectait les series, les expressions repondaient — et rien ne les assemblait. Un panneau declare que personne ne peut regarder n'est pas une observabilite, c'est une intention. POURQUOI UN TABLEAU PAR ROLE ET PAS UN GRAND. Parce que la question qu'on se pose est « comment va PostgreSQL », pas « comment va la flotte » — celle-la est deja repondue par Icinga, et par le tableau des journaux. Un tableau par role suit la meme ligne de partage que tout le reste ici : le role est l'unite qui declare, donc l'unite qui s'affiche. LA `raison` DEVIENT LA DESCRIPTION DU PANNEAU. Elle est le seul champ obligatoire qui ne produit aucun pixel de graphe, et c'est le plus important : sans elle, celui qui regarde a six mois de distance voit une courbe sans savoir ce qu'elle annonce. Grafana l'affiche au survol du titre. -#} {%- set roles_unites = serveur_grafana_unites -%} { "uid": {{ ("setops-" ~ tableau_role | replace("serveur_", "") | replace("_", "-")) | truncate(40, true, "") | tojson }}, "title": {{ ("Set-OPS — " ~ tableau_role | replace("serveur_", "") | replace("_", " ")) | tojson }}, "tags": ["set-ops", "derive", {{ tableau_role | tojson }}], "timezone": "browser", "refresh": "1m", "time": { "from": "now-6h", "to": "now" }, "schemaVersion": 39, "version": 1, "templating": { "list": [ { "name": "ds_prom", "label": "Source Prometheus", "type": "datasource", "query": "prometheus", "hide": 2, "current": {} } ] }, "panels": [ {%- for p in tableau_panneaux %} { "id": {{ loop.index }}, "type": "timeseries", "title": {{ p.titre | tojson }}, {#- LA RAISON, TELLE QUELLE. On ne la resume pas : c'est le texte que le role a ecrit pour expliquer ce que la courbe annonce. #} "description": {{ (p.raison | default("") | trim) | tojson }}, "datasource": { "type": "prometheus", "uid": "${ds_prom}" }, {#- DEUX PAR RANGEE. Une expression PromQL rend souvent plusieurs series ; a pleine largeur on ne compare rien, a un quart de largeur on ne lit rien. #} "gridPos": { "h": 8, "w": 12, "x": {{ 0 if loop.index0 % 2 == 0 else 12 }}, "y": {{ (loop.index0 // 2) * 8 }} }, "fieldConfig": { "defaults": { {#- L'UNITE VIENT DU ROLE, TRADUITE EN UNITE GRAFANA. Un `unite:` inconnu retombe sur `short` — et P77 refuse de laisser ce cas passer inapercu. #} "unit": {{ roles_unites.get(p.unite | default("") | string, "short") | tojson }}, "custom": { "drawStyle": "line", "fillOpacity": 10, "showPoints": "never" } } }, "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, "targets": [ { "refId": "A", "datasource": { "type": "prometheus", "uid": "${ds_prom}" }, {#- L'EXPRESSION EST CELLE DU ROLE, non reecrite. Repliee sur une ligne parce que `>-` en YAML laisse des retours que JSON refuse. #} "expr": {{ (p.expr | trim | replace("\n", " ")) | regex_replace("\\s+", " ") | tojson }} } ] }{{ "," if not loop.last else "" }} {%- endfor %} ] }