Compare commits

..

2 Commits

Author SHA1 Message Date
Andrew Stoltz
fc0b67f670 ttsreader: bump image to v202604232334 for iTunes RSS + ID3 tags
Pulls in FlowerCore.TtsReader@9e2497f: P2.3 iTunes-namespace podcast
feed (author, summary, category, cover art, episode numbering,
duration, atom:self link, serial channel type for Bible projects) and
P2.4 ID3v2 tags on MP3 export + Vorbis comments on OGG (title, artist
with Piper voice humanized, album, track N/M, genre defaulting to
Religion & Spirituality for Bible or Audiobook for text sources,
date). Phones and podcast apps now show proper track info instead of
"Unknown - Unknown".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:37:53 -05:00
Andrew Stoltz
223e9a9232 feat(zabbix): add RemoteDesktop monitoring template
New Zabbix 7.2 template under `Templates/FlowerCore` that scrapes
the `/metrics` exposition from FlowerCore.RemoteDesktop and extracts:

- `fc_desktop_session_events_total` split by event (launch/connect/
  disconnect/recording), with a dedicated datapoint for the
  `browser_datasource="json"` slice to track delegated-auth launches.
- `fc_desktop_pool_ready` gauge sum for warm pools.

Trigger: `nodata(flowercore.remotedesktop.metrics,10m)=1` warns when
the public desktop host stops exposing metrics.

Follows the existing `flowercore-print-ollama.yaml` pattern — import
manually into Zabbix and link to the Print/Desktop host. Not a K8s
manifest; ArgoCD ignores.

Grafana dashboard JSON is drafted at
`apps/monitoring/flowercore-remotedesktop-grafana-dashboard.json`
but still needs a ConfigMap wrap + Grafana Deployment volume mount
in noc-monitoring.yaml before it ships (follow-up).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:30:32 -05:00
2 changed files with 175 additions and 1 deletions

View File

@@ -142,7 +142,7 @@ spec:
fsGroupChangePolicy: OnRootMismatch fsGroupChangePolicy: OnRootMismatch
containers: containers:
- name: web - name: web
image: localhost/fc-ttsreader-web:v202604232310 image: localhost/fc-ttsreader-web:v202604232334
imagePullPolicy: Never imagePullPolicy: Never
ports: ports:
- containerPort: 5217 - containerPort: 5217

View File

@@ -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'