diff --git a/apps/zabbix/templates/flowercore-remotedesktop.yaml b/apps/zabbix/templates/flowercore-remotedesktop.yaml new file mode 100644 index 0000000..d6fc752 --- /dev/null +++ b/apps/zabbix/templates/flowercore-remotedesktop.yaml @@ -0,0 +1,174 @@ +zabbix_export: + version: '7.2' + template_groups: + - uuid: 2ce6df1168bd4797aa5374fd19438746 + name: Templates/FlowerCore + templates: + - uuid: 5b20d8f9d3c346f7b1c7fe6922e9d4d1 + template: FlowerCore RemoteDesktop + name: FlowerCore RemoteDesktop + description: Optional RemoteDesktop observability import. This template reads the Prometheus exposition from FlowerCore.RemoteDesktop and extracts launch/connect/disconnect/recording counters plus warm-pool gauges. Adjust the metrics URL if the Zabbix host should scrape a different endpoint than the public desktop host. + groups: + - name: Templates/FlowerCore + items: + - uuid: 357ab8ec721a4d31a5488bdd60a6679d + name: RemoteDesktop metrics snapshot + type: HTTP_AGENT + key: flowercore.remotedesktop.metrics + delay: 30s + history: 7d + trends: '0' + value_type: TEXT + url: https://desktop.iamworkin.lan/metrics + timeout: 10s + description: Raw Prometheus exposition from FlowerCore.RemoteDesktop. + - uuid: 59af4d77fbb54dc6a733f8dc86d73c3d + name: RemoteDesktop launch events total + type: DEPENDENT + key: flowercore.remotedesktop.launch.total + delay: '0' + history: 30d + trends: 365d + value_type: FLOAT + preprocessing: + - type: JAVASCRIPT + parameters: + - | + var lines = String(value || '').split(/\r?\n/); + var sum = 0; + for (var i = 0; i < lines.length; i += 1) { + var line = lines[i]; + if (line.indexOf('fc_desktop_session_events_total{') !== 0 || line.indexOf('event="launch"') === -1) { + continue; + } + var parts = line.trim().split(/\s+/); + var metricValue = Number(parts[parts.length - 1]); + if (!isNaN(metricValue)) { + sum += metricValue; + } + } + return sum; + master_item: + key: flowercore.remotedesktop.metrics + - uuid: 479e5d87f8e14e9cb4c45f1832723a34 + name: RemoteDesktop connect events total (json datasource) + type: DEPENDENT + key: flowercore.remotedesktop.connect.json.total + delay: '0' + history: 30d + trends: 365d + value_type: FLOAT + preprocessing: + - type: JAVASCRIPT + parameters: + - | + var lines = String(value || '').split(/\r?\n/); + var sum = 0; + for (var i = 0; i < lines.length; i += 1) { + var line = lines[i]; + if (line.indexOf('fc_desktop_session_events_total{') !== 0 + || line.indexOf('event="connect"') === -1 + || line.indexOf('browser_datasource="json"') === -1) { + continue; + } + var parts = line.trim().split(/\s+/); + var metricValue = Number(parts[parts.length - 1]); + if (!isNaN(metricValue)) { + sum += metricValue; + } + } + return sum; + master_item: + key: flowercore.remotedesktop.metrics + - uuid: 8ad073699ca74a99ab36ef1e4a4b06b8 + name: RemoteDesktop disconnect events total + type: DEPENDENT + key: flowercore.remotedesktop.disconnect.total + delay: '0' + history: 30d + trends: 365d + value_type: FLOAT + preprocessing: + - type: JAVASCRIPT + parameters: + - | + var lines = String(value || '').split(/\r?\n/); + var sum = 0; + for (var i = 0; i < lines.length; i += 1) { + var line = lines[i]; + if (line.indexOf('fc_desktop_session_events_total{') !== 0 || line.indexOf('event="disconnect"') === -1) { + continue; + } + var parts = line.trim().split(/\s+/); + var metricValue = Number(parts[parts.length - 1]); + if (!isNaN(metricValue)) { + sum += metricValue; + } + } + return sum; + master_item: + key: flowercore.remotedesktop.metrics + - uuid: 0a50ab8cd4ab4c97ac52f3d94b02ff8f + name: RemoteDesktop recording events total + type: DEPENDENT + key: flowercore.remotedesktop.recording.total + delay: '0' + history: 30d + trends: 365d + value_type: FLOAT + preprocessing: + - type: JAVASCRIPT + parameters: + - | + var lines = String(value || '').split(/\r?\n/); + var sum = 0; + for (var i = 0; i < lines.length; i += 1) { + var line = lines[i]; + if (line.indexOf('fc_desktop_session_events_total{') !== 0 || line.indexOf('event="recording"') === -1) { + continue; + } + var parts = line.trim().split(/\s+/); + var metricValue = Number(parts[parts.length - 1]); + if (!isNaN(metricValue)) { + sum += metricValue; + } + } + return sum; + master_item: + key: flowercore.remotedesktop.metrics + - uuid: 5d4d5e7b38d14c68a72877e37d7f1bde + name: RemoteDesktop warm pools ready + type: DEPENDENT + key: flowercore.remotedesktop.pool.ready + delay: '0' + history: 30d + trends: 365d + value_type: FLOAT + preprocessing: + - type: JAVASCRIPT + parameters: + - | + var lines = String(value || '').split(/\r?\n/); + var sum = 0; + for (var i = 0; i < lines.length; i += 1) { + var line = lines[i]; + if (line.indexOf('fc_desktop_pool_ready{') !== 0) { + continue; + } + var parts = line.trim().split(/\s+/); + var metricValue = Number(parts[parts.length - 1]); + if (!isNaN(metricValue)) { + sum += metricValue; + } + } + return sum; + master_item: + key: flowercore.remotedesktop.metrics + valuemaps: [] + triggers: + - uuid: 5ef71c752fa94d2e8ce3ced79fcfe0f4 + expression: nodata(/FlowerCore RemoteDesktop/flowercore.remotedesktop.metrics,10m)=1 + name: FlowerCore RemoteDesktop metrics unavailable + priority: WARNING + description: FlowerCore.RemoteDesktop /metrics has not returned data for 10 minutes. Check the web deployment, ingress, or the scrape URL configured in this template. + manual_close: 'YES'