diff --git a/extensions/Servers/Proxmox/views/partials/statistics/comparison-inner.blade.php b/extensions/Servers/Proxmox/views/partials/statistics/comparison-inner.blade.php new file mode 100644 index 000000000..545ffa039 --- /dev/null +++ b/extensions/Servers/Proxmox/views/partials/statistics/comparison-inner.blade.php @@ -0,0 +1,322 @@ + + @php + $historicalComparison = $this->historicalComparison; + @endphp +
| Metric | +
+
+
+ |
+
+
+
+ |
+ Change | +
|---|---|---|---|
|
+
+
+ |
+ + {{ number_format($diff['cpu']['historical_percent'], 1) }}% + | ++ {{ number_format($diff['cpu']['current_percent'], 1) }}% + | ++ + {{ $diff['cpu']['percent_change'] > 0 ? '+' : '' }}{{ number_format($diff['cpu']['percent_change'], 1) }}% + + | +
|
+
+
+ |
+ + {{ number_format($diff['memory']['historical_percent'], 1) }}% + | ++ {{ number_format($diff['memory']['current_percent'], 1) }}% + | ++ + {{ $diff['memory']['percent_change'] > 0 ? '+' : '' }}{{ number_format($diff['memory']['percent_change'], 1) }}% + + | +
|
+
+
+ |
+ + {{ $this->formatBytes($diff['disk_read']['historical_rate']) }}/s + | ++ {{ $this->formatBytes($diff['disk_read']['current_rate']) }}/s + | ++ + {{ $diff['disk_read']['percent_change'] > 0 ? '+' : '' }}{{ number_format($diff['disk_read']['percent_change'], 1) }}% + + | +
|
+
+
+ |
+ + {{ $this->formatBytes($diff['disk_write']['historical_rate']) }}/s + | ++ {{ $this->formatBytes($diff['disk_write']['current_rate']) }}/s + | ++ + {{ $diff['disk_write']['percent_change'] > 0 ? '+' : '' }}{{ number_format($diff['disk_write']['percent_change'], 1) }}% + + | +
|
+
+
+ |
+ + {{ $this->formatBytes($diff['network_in']['historical_rate']) }}/s + | ++ {{ $this->formatBytes($diff['network_in']['current_rate']) }}/s + | ++ + {{ $diff['network_in']['percent_change'] > 0 ? '+' : '' }}{{ number_format($diff['network_in']['percent_change'], 1) }}% + + | +
|
+
+
+ |
+ + {{ $this->formatBytes($diff['network_out']['historical_rate']) }}/s + | ++ {{ $this->formatBytes($diff['network_out']['current_rate']) }}/s + | ++ + {{ $diff['network_out']['percent_change'] > 0 ? '+' : '' }}{{ number_format($diff['network_out']['percent_change'], 1) }}% + + | +
{{ $historicalComparison['message'] }}
+ @if(isset($historicalComparison['total_stats'])) ++ Total statistics in database: {{ $historicalComparison['total_stats'] }} + @if($historicalComparison['total_stats'] == 0) + - Statistics are collected automatically every hour. You can also create manual statistics using the "Create Statistics" button above. + @elseif($historicalComparison['total_stats'] < 2) + - At least 2 statistics are needed for comparison. Wait for more data to be collected or create a manual statistic. + @endif +
+ @endif +No comparison data available
+Please select periods with available statistics data.
+|
+
+ Captured
+
+ |
+
+
+ Power
+
+ |
+
+
+ CPU
+
+ |
+
+
+ RAM
+
+ |
+
+
+ Disk
+
+ |
+
+
+ Net in
+
+ |
+
+
+ Net out
+
+ |
+
+
+ Block I/O
+
+ |
+
+
+ Uptime
+
+ |
+ Actions | +
|---|---|---|---|---|---|---|---|---|---|
|
+ {{ $stat->DateTime?->format('M d, Y') ?? '-' }}
+ {{ $stat->DateTime?->format('H:i:s') ?? '' }}
+ |
+ + @if($stat->vmstatus) + + {{ ucfirst($stat->vmstatus) }} + + @else + - + @endif + | +
+
+
+
+
+
+ {{ number_format($cpuPercent, 1) }}%
+ |
+
+
+
+
+
+
+ {{ number_format($memPercent, 1) }}%
+ |
+
+ @if(($stat->diskmax ?? 0) > 0 && ($stat->diskused ?? 0) > 0)
+
+
+ @else
+ N/A
+ @endif
+
+
+
+ {{ number_format($diskPercent, 1) }}%
+ |
+
+
+
+ @if($networkStats['netin_rate'] > 0)
+ {{ Illuminate\Support\Number::fileSize(bytes: (int)$networkStats['netin_rate']) }}/s
+ @endif
+ |
+
+
+
+ @if($networkStats['netout_rate'] > 0)
+ {{ Illuminate\Support\Number::fileSize(bytes: (int)$networkStats['netout_rate']) }}/s
+ @endif
+ |
+
+
+
+
+
+
+
+ |
+ + @if($stat->uptime > 0) + {{ $this->formatUptime($stat->uptime) }} + @else + - + @endif + | ++ + | +
|
+
+
+
+
+
+
+ No samples yet +Hourly automation will populate this grid; you can also pin a manual capture. + |
+ |||||||||
| + |
+
+ Type
+
+ |
+
+
+ Status
+
+ |
+
+
+ Start Time
+
+ |
+
+
+ End Time
+
+ |
+
+
+ Duration
+
+ |
+
|---|---|---|---|---|---|
| + + | ++ {{ $event['label'] ?? 'N/A' }} + | ++ @if(isset($event['status'])) + @if(strtolower($event['status']) === 'ok') + + Success + + @elseif(strtolower($event['status']) === 'running') + + Running + + @else + + Failure + + @endif + @else + - + @endif + | +
+ @if($startTime)
+ {{ $startTime->format('M d, Y') }}
+ {{ $startTime->format('H:i:s') }}
+ @else
+ -
+ @endif
+ |
+
+ @if($endTime)
+ {{ $endTime->format('M d, Y') }}
+ {{ $endTime->format('H:i:s') }}
+ @else
+ -
+ @endif
+ |
+ + @if($duration !== null) + {{ $this->formatUptime($duration) }} + @else + - + @endif + | +
|
+
+
+
+
+
+ |
+ |||||
|
+
+
+
+
+
+
+ No lifecycle events available +Lifecycle events will appear here as operations are performed on the server. + |
+ |||||
+ Deep visibility into firewall sessions, security threats, and top consumers of bandwidth powered by the Core Router API. +
++ Fetching data from Core Router... + reload page +
+{{ $networkAnalysis['error'] }}
+Ensure the Core Router API credentials are configured in your environment.
+|
+
+ Direction
+
+ |
+
+
+ Protocol
+
+ |
+
+
+ Source
+
+ |
+
+
+ Destination
+
+ |
+
+
+ State
+
+ |
+
+
+ Traffic
+
+ |
+
|---|---|---|---|---|---|
|
+ @php
+ $direction = $connection['direction'] ?? '—';
+ @endphp
+ @if($direction !== '—')
+
+ {{ $direction }}
+
+ @else
+ —
+ @endif
+
+
+
+
+
+
+
+ |
+
+ @php
+ $protocol = $connection['protocol'] ?? '—';
+ @endphp
+ @if($protocol !== '—')
+
+ {{ $protocol }}
+
+ @else
+ —
+ @endif
+
+
+
+
+
+
+
+ |
+
+ @php
+ $sourceIP = $connection['source'] ?? '—';
+ $isSourcePublic = $sourceIP !== '—' && $this->checkIsPublicIP($sourceIP);
+ @endphp
+
+ {{ $sourceIP }}
+ @if($isSourcePublic)
+
+ @if(isset($connection['source_port']))
+ {{ $connection['source_port'] }}
+ @endif
+
+
+
+
+
+ @endif
+ |
+
+ @php
+ $destIP = $connection['destination'] ?? '—';
+ $isDestPublic = $destIP !== '—' && $this->checkIsPublicIP($destIP);
+ @endphp
+
+ {{ $destIP }}
+ @if($isDestPublic)
+
+ @if(isset($connection['destination_port']))
+ {{ $connection['destination_port'] }}
+ @endif
+
+
+
+
+
+ @endif
+ |
+
+ @php
+ $state = $connection['state'] ?? '—';
+ @endphp
+ @if($state !== '—')
+
+
+ {{ $state }}
+
+
+ @else
+ —
+ @endif
+
+
+
+
+
+
+
+ |
+
+
+ {{ $connection['bytes_human'] ?? '—' }}
+ @if(isset($connection['packets']))
+ {{ number_format($connection['packets']) }} packets
+ @endif
+
+ |
+
|
+
+ Endpoint
+
+ |
+
+
+ Port
+
+ |
+
+
+ Connections
+
+ |
+
+
+ Traffic
+
+ |
+
|---|---|---|---|
|
+ @php
+ $isEndpointPublic = $endpointIP !== '—' && $this->checkIsPublicIP($endpointIP);
+ @endphp
+
+ {{ $endpointIP }}
+ @if($isEndpointPublic)
+
+
+
+
+
+
+ @endif
+ |
+
+ @if(isset($row['port']) && $row['port'] !== '—')
+
+ {{ $row['port'] }}
+
+ @else
+ —
+ @endif
+
+
+
+
+
+
+
+ |
+ {{ number_format($row['count']) }} | +
+
+ {{ $row['bytes_human'] }}
+ {{ number_format($row['packets']) }} packets
+
+ |
+
|
+
+ Port
+
+ |
+
+
+ Connections
+
+ |
+
+
+ Traffic
+
+ |
+
|---|---|---|
|
+
+ {{ $row['port'] }}
+
+
+
+
+
+
+
+
+ |
+ {{ number_format($row['connections']) }} | +
+
+ {{ $row['bytes_human'] }}
+ {{ number_format($row['packets']) }} packets
+
+ |
+
+ {{ $warning['threat'] }} + @if(isset($warning['quantity']) && $warning['quantity'] > 1) + ({{ $warning['quantity'] }} similar connection{{ $warning['quantity'] > 1 ? 's' : '' }} detected) + @endif +
+ @php + $threatIP = $warning['ip'] ?? '—'; + $isThreatPublic = $threatIP !== '—' && $this->checkIsPublicIP($threatIP); + @endphp +| + |
+
+ Type
+
+ |
+
+
+ Status
+
+ |
+
+
+ Start Time
+
+ |
+
+
+ End Time
+
+ |
+
+
+ Duration
+
+ |
+
|---|---|---|---|---|---|
| + + | ++ {{ $task['type'] ?? 'N/A' }} + | ++ @if(isset($task['status'])) + @if($task['status'] === 'OK') + + Success + + @else + + Failure + + @endif + @else + - + @endif + | +
+ @if($startTime)
+ {{ $startTime->format('M d, Y') }}
+ {{ $startTime->format('H:i:s') }}
+ @else
+ -
+ @endif
+ |
+
+ @if($endTime)
+ {{ $endTime->format('M d, Y') }}
+ {{ $endTime->format('H:i:s') }}
+ @else
+ -
+ @endif
+ |
+ + @if($duration !== null) + {{ $this->formatUptime($duration) }} + @else + - + @endif + | +
|
+
+
+
+
+
+
+ |
+ |||||
|
+
+
+
+
+
+
+ No task history available +Task history will appear here as tasks are executed on the server. + |
+ |||||
Four synchronized canvases fed straight from the node RRD cache.
+Auto-refresh every two minutes while this screen stays mounted.
+Percent of allocated vCPU
+In / out / P95
+Bytes from RRD
+Read vs write
+- Monitor your server's performance metrics and resource utilization over time. -
-CPU, memory, network (with 95th percentile), and disk I/O from Proxmox rrddata.
Polls with graph refresh every 2 minutes.
-Utilization (%)
-Throughput + 95th percentile
-Guest RAM (bytes)
-Read / write rates
-|
-
- Date & Time
-
- |
-
-
- Status
-
- |
-
-
- CPU
-
- |
-
-
- Memory
-
- |
-
-
- Disk
-
- |
-
-
- Network In
-
- |
-
-
- Network Out
-
- |
-
-
- Disk I/O
-
- |
-
-
- Uptime
-
- |
- Actions | -
|---|---|---|---|---|---|---|---|---|---|
|
- {{ $stat->DateTime?->format('M d, Y') ?? '-' }}
- {{ $stat->DateTime?->format('H:i:s') ?? '' }}
- |
- - @if($stat->vmstatus) - - {{ ucfirst($stat->vmstatus) }} - - @else - - - @endif - | -
-
-
-
-
-
- {{ number_format($cpuPercent, 1) }}%
- |
-
-
-
-
-
-
- {{ number_format($memPercent, 1) }}%
- |
-
- @if(($stat->diskmax ?? 0) > 0 && ($stat->diskused ?? 0) > 0)
-
-
- @else
- N/A
- @endif
-
-
-
- {{ number_format($diskPercent, 1) }}%
- |
-
-
-
- @if($networkStats['netin_rate'] > 0)
- {{ Illuminate\Support\Number::fileSize(bytes: (int)$networkStats['netin_rate']) }}/s
- @endif
- |
-
-
-
- @if($networkStats['netout_rate'] > 0)
- {{ Illuminate\Support\Number::fileSize(bytes: (int)$networkStats['netout_rate']) }}/s
- @endif
- |
-
-
-
-
-
-
-
- |
- - @if($stat->uptime > 0) - {{ $this->formatUptime($stat->uptime) }} - @else - - - @endif - | -- - | -
|
-
-
-
-
-
-
- No statistics available -Statistics are collected every 5 minutes automatically. - |
- |||||||||
| - |
-
- Type
-
- |
-
-
- Status
-
- |
-
-
- Start Time
-
- |
-
-
- End Time
-
- |
-
-
- Duration
-
- |
-
|---|---|---|---|---|---|
| - - | -- {{ $task['type'] ?? 'N/A' }} - | -- @if(isset($task['status'])) - @if($task['status'] === 'OK') - - Success - - @else - - Failure - - @endif - @else - - - @endif - | -
- @if($startTime)
- {{ $startTime->format('M d, Y') }}
- {{ $startTime->format('H:i:s') }}
- @else
- -
- @endif
- |
-
- @if($endTime)
- {{ $endTime->format('M d, Y') }}
- {{ $endTime->format('H:i:s') }}
- @else
- -
- @endif
- |
- - @if($duration !== null) - {{ $this->formatUptime($duration) }} - @else - - - @endif - | -
|
-
-
-
-
-
-
- |
- |||||
|
-
-
-
-
-
-
- No task history available -Task history will appear here as tasks are executed on the server. - |
- |||||