163 lines
10 KiB
HTML
163 lines
10 KiB
HTML
{% extends "layout.html" %}
|
|
|
|
{% block title %}System Diagnostics - BZOD{% endblock %}
|
|
|
|
{% block active_status %}active{% endblock %}
|
|
|
|
{% block header_title %}Server Status & Diagnostics{% endblock %}
|
|
|
|
{% block content %}
|
|
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; align-items: start;">
|
|
|
|
<!-- Left Column: Core Performance Metrics -->
|
|
<div class="card">
|
|
<h3 style="font-size: 1.1rem; margin-bottom: 1.25rem; display: flex; align-items: center; gap: 0.5rem;">
|
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"/><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>
|
|
System Status
|
|
</h3>
|
|
|
|
<div style="display: flex; flex-direction: column; gap: 1.25rem;">
|
|
<div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 0.75rem; border-bottom: 1px solid rgba(255,255,255,0.03);">
|
|
<span style="color: var(--text-secondary);">Application Status</span>
|
|
<span class="badge badge-healthy" style="font-size: 0.85rem;">{{ app_status }}</span>
|
|
</div>
|
|
|
|
<div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 0.75rem; border-bottom: 1px solid rgba(255,255,255,0.03);">
|
|
<span style="color: var(--text-secondary);">Uptime</span>
|
|
<span style="font-weight: 600; font-family: monospace;">{{ uptime }}</span>
|
|
</div>
|
|
|
|
<div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 0.75rem; border-bottom: 1px solid rgba(255,255,255,0.03);">
|
|
<span style="color: var(--text-secondary);">Memory Usage</span>
|
|
<span style="font-weight: 600; font-family: monospace;">{{ memory_usage }}</span>
|
|
</div>
|
|
|
|
<div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 0.75rem; border-bottom: 1px solid rgba(255,255,255,0.03);">
|
|
<span style="color: var(--text-secondary);">Analytics Memory Queue Size</span>
|
|
<span style="font-weight: 600; font-family: monospace; color: {% if queue_size > 100 %}var(--warning-color){% else %}var(--success-color){% endif %};">
|
|
{{ queue_size }} items
|
|
</span>
|
|
</div>
|
|
|
|
<div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 0.75rem; border-bottom: 1px solid rgba(255,255,255,0.03);">
|
|
<span style="color: var(--text-secondary);">Build Version</span>
|
|
<span style="font-weight: 600; font-family: monospace;">v{{ version }}</span>
|
|
</div>
|
|
|
|
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
<span style="color: var(--text-secondary);">Git Commit Hash</span>
|
|
<span style="font-weight: 600; font-family: monospace; color: var(--text-muted);">{{ git_commit }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Right Column: Database Storage info -->
|
|
<div class="card">
|
|
<h3 style="font-size: 1.1rem; margin-bottom: 1.25rem; display: flex; align-items: center; gap: 0.5rem;">
|
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22c5.523 0 10-2.239 10-5V5c0-2.761-4.477-5-10-5S2 2.239 2 5v12c0 2.761 4.477 5 10 5z"/><path d="M2 5c0 2.761 4.477 5 10 5s10-2.761 10-5"/><path d="M2 11c0 2.761 4.477 5 10 5s10-2.761 10-5"/></svg>
|
|
Database Status
|
|
</h3>
|
|
|
|
<div style="background-color: rgba(15, 23, 42, 0.4); border-radius: 12px; padding: 1.25rem; border: 1px solid rgba(255, 255, 255, 0.03); white-space: pre-wrap; font-family: monospace; font-size: 0.85rem; color: var(--text-secondary); line-height: 1.6;">{{ db_status }}</div>
|
|
|
|
<p style="font-size: 0.8rem; color: var(--text-muted); margin-top: 1rem; line-height: 1.4;">
|
|
All SQLite databases are running with Write-Ahead Logging (WAL) enabled, providing concurrent reads and high transactional throughput.
|
|
</p>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Full Width: Link Health Dashboard Section -->
|
|
<div class="card" style="margin-top: 1.5rem; padding: 0; overflow: hidden;">
|
|
<div style="padding: 1.25rem 1.5rem; border-bottom: 1px solid var(--border-color); display: flex; justify-content: space-between; align-items: center;">
|
|
<h3 style="font-size: 1.1rem; display: flex; align-items: center; gap: 0.5rem;">
|
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 12h-4l-3 9L9 3l-3 9H2"/></svg>
|
|
Link Health Registry
|
|
</h3>
|
|
</div>
|
|
|
|
<div class="table-container">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Short Link</th>
|
|
<th>Destination URL</th>
|
|
<th>General Status</th>
|
|
<th>Detailed Diagnostic</th>
|
|
<th>Latency</th>
|
|
<th>Last Checked</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% if urls.is_empty() %}
|
|
<tr>
|
|
<td colspan="6" style="text-align: center; color: var(--text-secondary); padding: 3rem;">
|
|
No shortened links registered to monitor.
|
|
</td>
|
|
</tr>
|
|
{% else %}
|
|
{% for url in urls %}
|
|
<tr>
|
|
<td>
|
|
<a href="/{{ url.code }}" target="_blank" style="color: var(--accent-color); font-weight: 700; text-decoration: none; font-family: monospace; font-size: 0.95rem;">
|
|
/{{ url.code }}
|
|
</a>
|
|
<div style="font-size: 0.75rem; color: var(--text-secondary); margin-top: 0.1rem;">
|
|
{{ url.title.as_deref().unwrap_or("") }}
|
|
</div>
|
|
</td>
|
|
<td style="max-width: 250px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 0.85rem; color: var(--text-secondary);">
|
|
{{ url.destination }}
|
|
</td>
|
|
<td>
|
|
{% if url.status == "healthy" %}
|
|
<span class="badge badge-healthy">Healthy</span>
|
|
{% else if url.status == "suspect" %}
|
|
<span class="badge badge-suspect">Suspect</span>
|
|
{% else %}
|
|
<span class="badge badge-dead">Dead</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if let Some(last_status) = url.last_status %}
|
|
{% if last_status == "healthy" %}
|
|
<span class="badge" style="background-color: rgba(16, 185, 129, 0.15); color: #10b981; border: 1px solid rgba(16, 185, 129, 0.2);">HTTP OK</span>
|
|
{% else if last_status == "timeout" %}
|
|
<span class="badge" style="background-color: rgba(245, 158, 11, 0.15); color: #f59e0b; border: 1px solid rgba(245, 158, 11, 0.2);">Timeout</span>
|
|
{% else if last_status == "dns_failure" %}
|
|
<span class="badge" style="background-color: rgba(59, 130, 246, 0.15); color: #3b82f6; border: 1px solid rgba(59, 130, 246, 0.2);">DNS Error</span>
|
|
{% else if last_status == "tls_error" %}
|
|
<span class="badge" style="background-color: rgba(139, 92, 246, 0.15); color: #8b5cf6; border: 1px solid rgba(139, 92, 246, 0.2);">TLS Error</span>
|
|
{% else if last_status == "connection_refused" %}
|
|
<span class="badge" style="background-color: rgba(239, 68, 68, 0.15); color: #ef4444; border: 1px solid rgba(239, 68, 68, 0.2);">Refused</span>
|
|
{% else if last_status == "redirect_loop" %}
|
|
<span class="badge" style="background-color: rgba(236, 72, 153, 0.15); color: #ec4899; border: 1px solid rgba(236, 72, 153, 0.2);">Redirect Loop</span>
|
|
{% else if last_status.starts_with("http_") %}
|
|
<span class="badge" style="background-color: rgba(245, 158, 11, 0.15); color: #f59e0b; border: 1px solid rgba(245, 158, 11, 0.2);">{{ last_status.replace("http_", "HTTP ") }}</span>
|
|
{% else %}
|
|
<span class="badge" style="background-color: rgba(107, 114, 128, 0.15); color: #9ca3af; border: 1px solid rgba(107, 114, 128, 0.2);">{{ last_status }}</span>
|
|
{% endif %}
|
|
{% else %}
|
|
<span style="color: var(--text-muted); font-size: 0.85rem;">Pending</span>
|
|
{% endif %}
|
|
</td>
|
|
<td style="font-family: monospace; font-size: 0.85rem; color: var(--text-secondary);">
|
|
{% if let Some(latency) = url.last_latency_ms %}
|
|
{{ latency }} ms
|
|
{% else %}
|
|
-
|
|
{% endif %}
|
|
</td>
|
|
<td style="font-size: 0.8rem; color: var(--text-secondary);">
|
|
{{ url.updated_at[0..10] }} {{ url.updated_at[11..16] }}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
{% endif %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|