diff --git a/grafana/values.yaml b/grafana/values.yaml index 647c5dd..9abac77 100644 --- a/grafana/values.yaml +++ b/grafana/values.yaml @@ -724,6 +724,14 @@ grafana: &grafana_config editable: true options: path: /var/lib/grafana/dashboards/prospection + - name: 'kadans' + orgId: 1 + folder: 'Kadans' + type: file + disableDeletion: false + editable: true + options: + path: /var/lib/grafana/dashboards/kadans # - name: 'default' # orgId: 1 @@ -778,6 +786,121 @@ grafana: &grafana_config k8s-views-pods: url: https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-pods.json token: '' + # Jobs d'analyse Kadans : la file de la façade (pod kadans-jobs, annoté + # prometheus.io/*) + le worker du LAPTOP (cible statique kadans-worker-mac). + # Couleurs de STATUT sémantiques (pending/running/done/failed) — jamais + # recyclées pour de l'identité ; le sommeil du Mac est un ÉTAT, pas une + # alerte (« sa disponibilité n'impacte que la latence »). + kadans: + kadans-jobs: + json: | + { + "annotations": { "list": [] }, + "editable": true, + "graphTooltip": 1, + "schemaVersion": 39, + "tags": ["kadans", "jobs", "arcodange"], + "title": "Kadans — jobs d'analyse (façade + worker Mac)", + "uid": "kadans-jobs-analyse", + "time": { "from": "now-24h", "to": "now" }, + "panels": [ + { + "type": "stat", "title": "Worker Mac", "id": 1, + "gridPos": { "h": 5, "w": 6, "x": 0, "y": 0 }, + "targets": [{ "expr": "up{job=\"kadans-worker-mac\"}", "refId": "A" }], + "fieldConfig": { "defaults": { + "mappings": [ + { "type": "value", "options": { "1": { "text": "En écoute", "color": "green" }, "0": { "text": "Endormi", "color": "text" } } }, + { "type": "special", "options": { "match": "null", "result": { "text": "Endormi", "color": "text" } } } + ], + "thresholds": { "mode": "absolute", "steps": [{ "color": "text", "value": null }] } + }, "overrides": [] }, + "options": { "colorMode": "value", "graphMode": "none", "reduceOptions": { "calcs": ["lastNotNull"] } } + }, + { + "type": "stat", "title": "Dernier poll (il y a)", "id": 2, + "gridPos": { "h": 5, "w": 6, "x": 6, "y": 0 }, + "targets": [{ "expr": "time() - kadans_worker_dernier_poll_timestamp_seconds", "refId": "A" }], + "fieldConfig": { "defaults": { + "unit": "s", "decimals": 0, + "thresholds": { "mode": "absolute", "steps": [ + { "color": "green", "value": null }, { "color": "yellow", "value": 600 } + ] } + }, "overrides": [] }, + "options": { "colorMode": "value", "graphMode": "none", "reduceOptions": { "calcs": ["lastNotNull"] } } + }, + { + "type": "stat", "title": "Jobs en attente", "id": 3, + "gridPos": { "h": 5, "w": 6, "x": 12, "y": 0 }, + "targets": [{ "expr": "sum(kadans_jobs_jobs{statut=\"pending\"})", "refId": "A" }], + "fieldConfig": { "defaults": { + "thresholds": { "mode": "absolute", "steps": [{ "color": "text", "value": null }] } + }, "overrides": [] }, + "options": { "colorMode": "value", "graphMode": "area", "reduceOptions": { "calcs": ["lastNotNull"] } } + }, + { + "type": "stat", "title": "Plus ancien job en attente", "id": 4, + "gridPos": { "h": 5, "w": 6, "x": 18, "y": 0 }, + "targets": [{ "expr": "kadans_jobs_plus_ancien_pending_age_seconds", "refId": "A" }], + "fieldConfig": { "defaults": { + "unit": "s", "decimals": 0, + "thresholds": { "mode": "absolute", "steps": [ + { "color": "green", "value": null }, + { "color": "yellow", "value": 3600 }, + { "color": "red", "value": 86400 } + ] } + }, "overrides": [] }, + "options": { "colorMode": "value", "graphMode": "none", "reduceOptions": { "calcs": ["lastNotNull"] } } + }, + { + "type": "timeseries", "title": "La file, par statut", "id": 5, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 5 }, + "targets": [{ "expr": "kadans_jobs_jobs", "legendFormat": "{{statut}}", "refId": "A" }], + "fieldConfig": { "defaults": { + "custom": { "lineWidth": 2, "fillOpacity": 8, "pointSize": 4 }, "min": 0 + }, "overrides": [ + { "matcher": { "id": "byName", "options": "pending" }, "properties": [{ "id": "color", "value": { "mode": "fixed", "fixedColor": "yellow" } }] }, + { "matcher": { "id": "byName", "options": "running" }, "properties": [{ "id": "color", "value": { "mode": "fixed", "fixedColor": "blue" } }] }, + { "matcher": { "id": "byName", "options": "done" }, "properties": [{ "id": "color", "value": { "mode": "fixed", "fixedColor": "green" } }] }, + { "matcher": { "id": "byName", "options": "failed" }, "properties": [{ "id": "color", "value": { "mode": "fixed", "fixedColor": "red" } }] } + ] }, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } } + }, + { + "type": "timeseries", "title": "Publications (par heure)", "id": 6, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 5 }, + "targets": [{ "expr": "increase(kadans_jobs_publies_total[1h])", "legendFormat": "{{issue}}", "refId": "A" }], + "fieldConfig": { "defaults": { + "custom": { "lineWidth": 2, "fillOpacity": 8, "pointSize": 4 }, "min": 0, "decimals": 0 + }, "overrides": [ + { "matcher": { "id": "byName", "options": "done" }, "properties": [{ "id": "color", "value": { "mode": "fixed", "fixedColor": "green" } }] }, + { "matcher": { "id": "byName", "options": "failed" }, "properties": [{ "id": "color", "value": { "mode": "fixed", "fixedColor": "red" } }] } + ] }, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } } + }, + { + "type": "timeseries", "title": "Lanes exécutées par le worker (par heure)", "id": 7, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 13 }, + "targets": [{ "expr": "increase(kadans_worker_lanes_total[1h])", "legendFormat": "{{lane}} — {{issue}}", "refId": "A" }], + "fieldConfig": { "defaults": { + "custom": { "lineWidth": 2, "fillOpacity": 8, "pointSize": 4 }, "min": 0, "decimals": 0 + }, "overrides": [] }, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } } + }, + { + "type": "timeseries", "title": "Durée moyenne d'une lane", "id": 8, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 13 }, + "targets": [{ + "expr": "increase(kadans_worker_lane_duree_seconds_sum[1h]) / increase(kadans_worker_lane_duree_seconds_count[1h])", + "legendFormat": "{{lane}}", "refId": "A" + }], + "fieldConfig": { "defaults": { + "unit": "s", "custom": { "lineWidth": 2, "fillOpacity": 0, "pointSize": 5 }, "min": 0 + }, "overrides": [] }, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } } + } + ] + } prospection: prospection: json: | diff --git a/prometheus/values.yaml b/prometheus/values.yaml index a40bc7a..d062f75 100644 --- a/prometheus/values.yaml +++ b/prometheus/values.yaml @@ -819,6 +819,22 @@ prometheus: &prometheus_config static_configs: - targets: - localhost:9090 + # Le worker d'analyse Kadans sur le LAPTOP du fondateur (tier 1 VOLATILE, + # kadans-jobs cmd/worker, /metrics stdlib sur :9105). Un scrape en échec + # n'est PAS un incident : le Mac dort — `up == 0` raconte exactement ça + # (latence des analyses, jamais une indisponibilité produit). Ne PAS + # alerter sur cette cible. + # ⚠ IP DHCP : réserver 192.168.1.103 pour le Mac au routeur (ou remplacer + # par un nom résolvable du LAN) — sinon la cible dérive au renouvellement. + kadans-worker-mac: + enabled: true + job_name: "kadans-worker-mac" + static_configs: + - targets: + - 192.168.1.103:9105 + labels: + tier: laptop + app: kadans-worker kubernetes-api-servers: enabled: true job_name: ""