1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?php
require_once __DIR__ . '/config.php';
$errors = load_json(ERRORS_FILE);
$sessions = load_json(SESSIONS_FILE);
$lastError = !empty($errors) ? end($errors) : null;
// Self-referential rows mean the debug pipeline is counting itself: the failure mode that
// turned 33 real errors into 116,696 "occurrences" before 2026-10-23. Surface it instead of
// reporting a poisoned dataset as healthy.
$selfRef = 0;
$occurrences = 0;
foreach ($errors as $e) {
if (stripos($e['message'] ?? '', '/api/debug/') !== false) $selfRef++;
$occurrences += (int)($e['count'] ?? 1);
}
json_response([
'success' => true,
'status' => $selfRef > 0 ? 'degraded' : 'ok',
'uptime' => filemtime(__FILE__) ? (time() - filemtime(__FILE__)) : 0,
'total_errors' => $occurrences,
'total_occurrences' => $occurrences,
'unique_errors' => count($errors),
'self_referential' => $selfRef,
'total_sessions' => count($sessions),
'errors_file_size_kb' => file_exists(ERRORS_FILE) ? round(filesize(ERRORS_FILE) / 1024, 1) : 0,
'sessions_file_size_kb' => file_exists(SESSIONS_FILE) ? round(filesize(SESSIONS_FILE) / 1024, 1) : 0,
'last_ingest' => $lastError ? ($lastError['ingested_at'] ?? null) : null,
'last_ingest_message' => $lastError ? substr($lastError['message'] ?? '', 0, 100) : null,
'generated_at' => date('c'),
]);
|