From d4210c819f4464ce1ae875d611d5bdcd5e1d04a7 Mon Sep 17 00:00:00 2001 From: Andrew Stoltz Date: Fri, 24 Apr 2026 00:20:40 -0500 Subject: [PATCH] feat(monitoring): RemoteDesktop Grafana dashboard ConfigMap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wraps apps/monitoring/flowercore-remotedesktop-grafana-dashboard.json as a ConfigMap manifest so ArgoCD syncs it into the cluster alongside the existing grafana-dashboard-* ConfigMaps. Standalone file — does NOT modify noc-monitoring.yaml. That keeps the CRLF churn on noc-monitoring.yaml (sibling files apps/intranet/intranet.yaml and apps/agent-zero/configmaps-bluejay.yaml also carry CRLF churn) out of this commit. Dashboard will be synced into the cluster but NOT loaded by Grafana until a matching `volumes:` entry lands in the Grafana Deployment in noc-monitoring.yaml: - name: dashboard-remotedesktop configMap: name: grafana-dashboard-remotedesktop Plus a `volumeMounts:` entry in the grafana container: - name: dashboard-remotedesktop mountPath: /etc/grafana/provisioning/dashboards/remotedesktop readOnly: true Those edits are deferred to the CRLF-normalization pass on bluejay-infra so the review diff stays reviewable. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../grafana-dashboard-remotedesktop.yaml | 249 ++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 apps/monitoring/grafana-dashboard-remotedesktop.yaml diff --git a/apps/monitoring/grafana-dashboard-remotedesktop.yaml b/apps/monitoring/grafana-dashboard-remotedesktop.yaml new file mode 100644 index 0000000..9f7d23d --- /dev/null +++ b/apps/monitoring/grafana-dashboard-remotedesktop.yaml @@ -0,0 +1,249 @@ +# Grafana dashboard ConfigMap for FlowerCore.RemoteDesktop. +# +# Inlines the JSON from flowercore-remotedesktop-grafana-dashboard.json. +# Kept as a standalone file (not inlined in noc-monitoring.yaml) so the +# CRLF-dirty state of noc-monitoring.yaml doesn't have to be normalized +# in the same pass. To actually load the dashboard, the Grafana Deployment +# in noc-monitoring.yaml needs a matching 'volumes:' entry: +# +# - name: dashboard-remotedesktop +# configMap: +# name: grafana-dashboard-remotedesktop +# +# ArgoCD will sync this ConfigMap automatically through the bluejay-infra +# ApplicationSet (infra-monitoring App). The dashboard just won't load +# until the Grafana Deployment mount is wired. +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-remotedesktop + namespace: monitoring +data: + remotedesktop.json: | + { + "annotations": { + "list": [] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "editorMode": "code", + "expr": "sum by (event) (increase(fc_desktop_session_events_total[$__rate_interval]))", + "legendFormat": "{{event}}", + "range": true, + "refId": "A" + } + ], + "title": "RemoteDesktop Session Events", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true + }, + "targets": [ + { + "editorMode": "code", + "expr": "sum by (template, event) (increase(fc_desktop_session_events_total[24h]))", + "legendFormat": "{{template}} {{event}}", + "range": true, + "refId": "A" + } + ], + "title": "24h Session Events By Template", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 3, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "editorMode": "code", + "expr": "fc_desktop_pool_ready", + "legendFormat": "{{template}} ready", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "expr": "fc_desktop_pool_desired", + "legendFormat": "{{template}} desired", + "range": true, + "refId": "B" + } + ], + "title": "Warm Pool Ready vs Desired", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 1 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 4, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "editorMode": "code", + "expr": "sum(increase(fc_desktop_session_events_total{event=\"connect\",browser_datasource=\"json\"}[24h])) - sum(increase(fc_desktop_session_events_total{event=\"disconnect\"}[24h]))", + "range": true, + "refId": "A" + } + ], + "title": "24h Connect Minus Disconnect", + "type": "stat" + } + ], + "refresh": "30s", + "schemaVersion": 39, + "style": "dark", + "tags": [ + "flowercore", + "remotedesktop", + "guacamole" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timezone": "browser", + "title": "FlowerCore RemoteDesktop", + "uid": "flowercore-remotedesktop", + "version": 1 + }