';
}
public static function pill(string $tone, string $text, string $title = ''): string
diff --git a/packages/vitec/Classes/Widgets/SsrErrorsWidget.php b/packages/vitec/Classes/Widgets/SsrErrorsWidget.php
index ceb4ea1..20446a0 100644
--- a/packages/vitec/Classes/Widgets/SsrErrorsWidget.php
+++ b/packages/vitec/Classes/Widgets/SsrErrorsWidget.php
@@ -33,7 +33,8 @@ final class SsrErrorsWidget implements WidgetInterface, AdditionalCssInterface
if ($latest === null) {
return $h::wrap('
No /__stats samples yet. They arrive with the next '
. 'vitec:ssr-health cron run (every 5 minutes) once the node release '
- . 'provides /__stats.
');
+ . 'provides /__stats.', 'Cache hit rate and error counters of the SSR node, '
+ . 'filled by the health cron every 5 minutes.', 'errors');
}
$hit = (int)$latest['stat_hit'];
@@ -76,7 +77,11 @@ final class SsrErrorsWidget implements WidgetInterface, AdditionalCssInterface
. '';
$html .= '
Totals count since the node last started; a deploy resets them. '
. 'Error details: journalctl -u vitec-ssr on the VPS.
';
- return $h::wrap($html);
+ return $h::wrap($html, 'How well the SSR cache works and whether the node has problems. The ring is the '
+ . 'share of requests answered from the cache since the node last started; the bar splits them into '
+ . 'served from cache, stale and refreshed in the background, and rendered fresh. Render errors are pages '
+ . 'the node could not render, backend errors are failed requests to TYPO3. Down samples are failed '
+ . 'health checks in the last 24 hours.', 'errors');
}
public function getOptions(): array
diff --git a/packages/vitec/Classes/Widgets/SsrStatsWidget.php b/packages/vitec/Classes/Widgets/SsrStatsWidget.php
index 76c0001..14ac9b3 100644
--- a/packages/vitec/Classes/Widgets/SsrStatsWidget.php
+++ b/packages/vitec/Classes/Widgets/SsrStatsWidget.php
@@ -66,7 +66,10 @@ final class SsrStatsWidget implements WidgetInterface, AdditionalCssInterface
$html .= '
No samples yet: the cron job vitec:ssr-health fills this every 5 minutes.
';
}
$html .= '
' . $h::moduleLink('Charts and protocol in the cockpit') . '
';
- return $h::wrap($html);
+ return $h::wrap($html, 'Availability of the SSR node over the last 24 hours, one bar per 15 minutes: '
+ . 'green ok, yellow slower than 400 ms, red down, grey no sample. Below are counts from the purge and '
+ . 'health logs: purges, full purges and failed purges, average response time, the largest cache size '
+ . 'and the browser errors reported by the frontend.', 'stats');
}
public function getOptions(): array
diff --git a/packages/vitec/Classes/Widgets/SsrStatusWidget.php b/packages/vitec/Classes/Widgets/SsrStatusWidget.php
index 4e8f874..ac3e7cc 100644
--- a/packages/vitec/Classes/Widgets/SsrStatusWidget.php
+++ b/packages/vitec/Classes/Widgets/SsrStatusWidget.php
@@ -84,7 +84,10 @@ final class SsrStatusWidget implements WidgetInterface, AdditionalCssInterface
}
$html .= '
' . $h::moduleLink() . '
';
- return $h::wrap($html);
+ return $h::wrap($html, 'Live state of the SSR node on the VPS: whether it answers and how fast, '
+ . 'how full its page cache is against the limit, whether SSR delivery is switched on, which frontend '
+ . 'release runs, and the most recent cache purge. The link opens the cockpit with charts, protocol '
+ . 'and the purge and warm buttons.', 'status');
}
public function getOptions(): array
diff --git a/packages/vitec/Resources/Private/Templates/Ssr/Index.html b/packages/vitec/Resources/Private/Templates/Ssr/Index.html
index 4e5cc2c..eebc096 100644
--- a/packages/vitec/Resources/Private/Templates/Ssr/Index.html
+++ b/packages/vitec/Resources/Private/Templates/Ssr/Index.html
@@ -14,6 +14,7 @@
+ Live state of the SSR node on the VPS. The dot pulses green while the node answers its health check. Delivery shows whether visitors get server-rendered pages; the switch is in the Site settings. The strip shows the last 24 hours in 15-minute windows: green ok, yellow slower than 400 ms, red down, grey no sample. After {failoverAfter} failed checks in a row the cron switches back to the SPA and sends an alert mail.
@@ -84,6 +85,7 @@
+ Share of page requests in the last 24 hours that the node answered from its cache, either fresh or stale and refreshed in the background. All others had to be rendered first. Higher is better. It drops after a full purge until the cache is warm again. The arrow compares with the 24 hours before.
@@ -95,6 +97,7 @@
+ How long TYPO3 needs to reach the node, measured when this page loads and every 15 seconds after. Median and p95 come from the cron samples of the last 24 hours, taken every 5 minutes. The curve shows the last 4 hours. Values above 400 ms turn the availability strip yellow.
Response time
{health.responseMs}–ms
median 24 h – · p95 –
@@ -102,6 +105,7 @@
+ How much of the node page cache is in use: pages and megabytes against the configured limit (SSR_CACHE_LIMIT_MB). When the cache is full, the pages used least recently drop out. After “Purge everything” it falls to almost zero until “Warm cache” fills it again.
@@ -113,6 +117,7 @@
+ Errors that visitor browsers reported from the React frontend in the last 24 hours. A chunk reload happens when an open tab still runs an older bundle after a deploy; that is usually harmless. JS errors point to a real bug. The bars show reports per hour, details are in the Client errors card below.
@@ -121,6 +126,7 @@
+ Requests per hour, or per 4 hours in the 7-day view, split by how the node answered: served from cache, stale and refreshed in the background, or rendered fresh. The orange line is the response time, red triangles mark purges. Spikes of fresh renders usually follow a purge or a warm run. Source: node counters sampled every 5 minutes.
Traffic and cache
@@ -147,6 +153,7 @@
+ Warm cache renders every sitemap page in advance, and the ring shows the progress live. Purge paths drops single pages from the cache, for example after a change the auto-purge did not catch. Purge everything empties the whole cache, which is needed after menu or footer changes and after a deploy; run Warm cache right after. Both heavy actions ask for confirmation.
Actions
@@ -193,6 +200,7 @@
+ Every cache purge, newest first. The colour shows the trigger: auto-purge when an editor saves, manual from this module, context menu from the page tree, cli for commands and deploys, switch-on when SSR delivery was turned on. Result and duration are on the right. Switch between 30, 100 and 500 entries.
Purge activity
@@ -253,6 +261,7 @@
+ Every report from visitor browsers in the last 24 hours, newest first. Open an entry for release, URL, browser, anonymized IP and stack trace. “old bundle” means the tab ran an older release than the node. Reports are limited to 30 per minute and IP and are kept for 30 days.