Performance Monitor

Host: {{ dashboard.host }} | Uptime: {{ "{:,}".format(dashboard.uptime_seconds // 3600) }}h {{ (dashboard.uptime_seconds % 3600) // 60 }}m

{{ "%.1f"|format(dashboard.system.cpu_percent) }}%
CPU Usage
💻
{{ dashboard.system.cpu_count }} cores
{{ "%.1f"|format(dashboard.system.memory_percent) }}%
Memory
🧠
{{ "{:,}".format(dashboard.system.memory_used_mb) }} / {{ "{:,}".format(dashboard.system.memory_total_mb) }} MB
{{ dashboard.gunicorn.workers_active }}/{{ dashboard.gunicorn.workers_total }}
Workers
👷
{% set worker_pct = (dashboard.gunicorn.workers_active / dashboard.gunicorn.workers_total * 100) if dashboard.gunicorn.workers_total > 0 else 0 %}
{{ dashboard.gunicorn.workers_idle }} idle
{{ "%.1f"|format(dashboard.requests.requests_per_second) }}
Req/sec
🚀
{{ "{:,}".format(dashboard.requests.requests_total) }} total requests

Response Time (ms)

{% set max_rt = [dashboard.requests.response_time_p99_ms, 1] | max %}
Avg
{% set avg_width = [dashboard.requests.response_time_avg_ms / max_rt * 100, 100] | min %}
{{ "%.1f"|format(dashboard.requests.response_time_avg_ms) }}
P50
{% set p50_width = [dashboard.requests.response_time_p50_ms / max_rt * 100, 100] | min %}
{{ "%.1f"|format(dashboard.requests.response_time_p50_ms) }}
P95
{% set p95_width = [dashboard.requests.response_time_p95_ms / max_rt * 100, 100] | min %}
{{ "%.1f"|format(dashboard.requests.response_time_p95_ms) }}
P99
{% set p99_width = [dashboard.requests.response_time_p99_ms / max_rt * 100, 100] | min %}
{{ "%.1f"|format(dashboard.requests.response_time_p99_ms) }}

HTTP Status Distribution

2xx Success {{ "{:,}".format(dashboard.requests.requests_2xx) }}
3xx Redirect {{ "{:,}".format(dashboard.requests.requests_3xx) }}
4xx Client Error {{ "{:,}".format(dashboard.requests.requests_4xx) }}
5xx Server Error {{ "{:,}".format(dashboard.requests.requests_5xx) }}
Error Rate {{ "%.2f"|format(dashboard.requests.error_rate) }}%

💻 CPU

Usage {{ "%.1f"|format(dashboard.system.cpu_percent) }}%
Cores {{ dashboard.system.cpu_count }}
{% if dashboard.system.cpu_freq_mhz %}
Frequency {{ "{:,}".format(dashboard.system.cpu_freq_mhz|int) }} MHz
{% endif %} {% if dashboard.system.load_avg_1m is not none %}
Load Avg (1m) {{ "%.2f"|format(dashboard.system.load_avg_1m) }}
Load Avg (5m) {{ "%.2f"|format(dashboard.system.load_avg_5m) }}
Load Avg (15m) {{ "%.2f"|format(dashboard.system.load_avg_15m) }}
{% endif %}

🧠 Memory

Usage {{ "%.1f"|format(dashboard.system.memory_percent) }}%
Used {{ "{:,}".format(dashboard.system.memory_used_mb) }} MB
Available {{ "{:,}".format(dashboard.system.memory_available_mb) }} MB
Total {{ "{:,}".format(dashboard.system.memory_total_mb) }} MB
{% if dashboard.system.swap_total_mb > 0 %}
Swap Used {{ "{:,}".format(dashboard.system.swap_used_mb) }} / {{ "{:,}".format(dashboard.system.swap_total_mb) }} MB
{% endif %}

💾 Disk

Usage {{ "%.1f"|format(dashboard.system.disk_percent) }}%
Used {{ "%.1f"|format(dashboard.system.disk_used_gb) }} GB
Total {{ "%.1f"|format(dashboard.system.disk_total_gb) }} GB

🌐 Network

Bytes Sent {{ "{:,}".format(dashboard.system.network_bytes_sent // 1048576) }} MB
Bytes Received {{ "{:,}".format(dashboard.system.network_bytes_recv // 1048576) }} MB
Active Connections {{ "{:,}".format(dashboard.system.network_connections) }}

👷 Gunicorn Status

{{ dashboard.gunicorn.workers_total }}
Total Workers
{{ dashboard.gunicorn.workers_active }}
Active
{{ dashboard.gunicorn.workers_idle }}
Idle
{% if dashboard.gunicorn.master_pid %}
{{ dashboard.gunicorn.master_pid }}
Master PID
{% endif %}

Worker Processes

{% for worker in dashboard.workers %} {% else %} {% endfor %}
PID CPU % Memory Threads Connections Status Uptime
{{ worker.pid }} {{ "%.1f"|format(worker.cpu_percent) }}% {{ "%.1f"|format(worker.memory_rss_mb) }} MB {{ worker.threads }} {{ worker.connections }} {{ worker.status }} {% if worker.uptime_seconds %} {{ worker.uptime_seconds // 3600 }}h {{ (worker.uptime_seconds % 3600) // 60 }}m {% else %} - {% endif %}
No worker data available

📈 Request Statistics

Total Requests {{ "{:,}".format(dashboard.requests.requests_total) }}
Requests/Second {{ "%.2f"|format(dashboard.requests.requests_per_second) }}
Active Requests {{ dashboard.requests.active_requests }}
Error Rate {{ "%.2f"|format(dashboard.requests.error_rate) }}%

⏱️ Response Times

Average {{ "%.2f"|format(dashboard.requests.response_time_avg_ms) }} ms
P50 (Median) {{ "%.2f"|format(dashboard.requests.response_time_p50_ms) }} ms
P95 {{ "%.2f"|format(dashboard.requests.response_time_p95_ms) }} ms
P99 {{ "%.2f"|format(dashboard.requests.response_time_p99_ms) }} ms

🗄️ Database Connection Pool

{{ dashboard.database.pool_size }}
Pool Size
{{ dashboard.database.connections_available }}
Available
{{ dashboard.database.connections_in_use }}
In Use
{{ dashboard.database.overflow }}
Overflow
Pool Utilization
{% set pool_pct = (dashboard.database.connections_in_use / dashboard.database.pool_size * 100) if dashboard.database.pool_size > 0 else 0 %}
{{ "%.1f"|format(pool_pct) }}% utilized

🔴 Redis Cache

{% if dashboard.cache.connected %}
Connected
v{{ dashboard.cache.version or 'N/A' }}
{{ "%.1f"|format(dashboard.cache.used_memory_mb) }}
Memory (MB)
{{ "{:,}".format(dashboard.cache.ops_per_second) }}
Ops/sec
{{ dashboard.cache.connected_clients }}
Clients
Cache Hit Rate {{ "%.1f"|format(dashboard.cache.hit_rate) }}%
Keyspace Hits {{ "{:,}".format(dashboard.cache.keyspace_hits) }}
Keyspace Misses {{ "{:,}".format(dashboard.cache.keyspace_misses) }}
{% else %}
Not Connected

Redis cache is not configured or unavailable.

Configure REDIS_URL to enable caching.

{% endif %}