SSR dashboard: new errors-and-hit-rate tile fed by /__stats samples in vitec:ssr-health (stat_* columns in healthlog)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
bc2e031b0c
commit
cb53ff67ee
5 files changed
+232
No files matched your search
@@ -57,6 +57,36 @@ final class SsrHealthSampleCommand extends Command
|
||||
} catch (\Throwable $e) {
|
||||
$row['response_ms'] = (int)round((microtime(true) - $start) * 1000);
|
||||
}
|
||||
|
||||
// Cumulative node counters from /__stats (-1 = no data this sample,
|
||||
// e.g. node down or release without the endpoint). The errors tile
|
||||
// computes 24h deltas from these, skipping -1 rows; the counters
|
||||
// reset whenever the node restarts, which the delta logic clamps.
|
||||
$stats = [
|
||||
'stat_hit' => -1, 'stat_miss' => -1, 'stat_stale' => -1,
|
||||
'stat_bypass' => -1, 'stat_render_errors' => -1, 'stat_backend_errors' => -1,
|
||||
];
|
||||
if ($row['ok'] === 1 && ($statsEndpoint = $this->purgeService->getStatsEndpoint()) !== '') {
|
||||
try {
|
||||
$statsResponse = $this->requestFactory->request($statsEndpoint, 'GET', [
|
||||
'timeout' => 4, 'connect_timeout' => 2, 'http_errors' => false,
|
||||
]);
|
||||
if ($statsResponse->getStatusCode() === 200) {
|
||||
$s = json_decode((string)$statsResponse->getBody(), true) ?: [];
|
||||
$stats = [
|
||||
'stat_hit' => (int)($s['hit'] ?? -1),
|
||||
'stat_miss' => (int)($s['miss'] ?? -1),
|
||||
'stat_stale' => (int)($s['stale'] ?? -1),
|
||||
'stat_bypass' => (int)($s['bypass'] ?? -1),
|
||||
'stat_render_errors' => (int)($s['renderErrors'] ?? -1),
|
||||
'stat_backend_errors' => (int)($s['backendErrors'] ?? -1),
|
||||
];
|
||||
}
|
||||
} catch (\Throwable) {
|
||||
// Stats are optional - the health sample must never fail on them.
|
||||
}
|
||||
}
|
||||
$row = array_merge($row, $stats);
|
||||
// Previous samples, newest first, read BEFORE this one is inserted:
|
||||
// [0] is the state every transition decision compares against.
|
||||
$failoverAfter = $this->purgeService->getFailoverAfter();
|
||||
@@ -81,6 +111,17 @@ final class SsrHealthSampleCommand extends Command
|
||||
$row['cache_mb'],
|
||||
$row['response_ms']
|
||||
));
|
||||
if ($row['stat_hit'] >= 0) {
|
||||
$output->writeln(sprintf(
|
||||
'stats: hit=%d miss=%d stale=%d bypass=%d renderErrors=%d backendErrors=%d',
|
||||
$row['stat_hit'],
|
||||
$row['stat_miss'],
|
||||
$row['stat_stale'],
|
||||
$row['stat_bypass'],
|
||||
$row['stat_render_errors'],
|
||||
$row['stat_backend_errors']
|
||||
));
|
||||
}
|
||||
$prevOk = $previous === [] ? null : $previous[0];
|
||||
if ($prevOk !== null && $prevOk !== $row['ok']) {
|
||||
if ($row['ok'] === 1) {
|
||||
|
||||
Reference in new issue
Block a user