diff --git a/app/Filament/Resources/NodeResource/Pages/EditNode.php b/app/Filament/Resources/NodeResource/Pages/EditNode.php index 45fd9dcf6..4b1eba8b6 100644 --- a/app/Filament/Resources/NodeResource/Pages/EditNode.php +++ b/app/Filament/Resources/NodeResource/Pages/EditNode.php @@ -3,6 +3,8 @@ namespace App\Filament\Resources\NodeResource\Pages; use App\Filament\Resources\NodeResource; +use App\Filament\Resources\NodeResource\Widgets\NodeMemoryChart; +use App\Filament\Resources\NodeResource\Widgets\NodeStorageChart; use App\Models\Node; use Filament\Actions; use Filament\Forms; @@ -78,4 +80,12 @@ class EditNode extends EditRecord ->label(fn (Node $node) => $node->servers()->count() > 0 ? 'Node Has Servers' : 'Delete'), ]; } + + protected function getFooterWidgets(): array + { + return [ + NodeStorageChart::class, + NodeMemoryChart::class, + ]; + } } diff --git a/app/Filament/Resources/NodeResource/Widgets/NodeMemoryChart.php b/app/Filament/Resources/NodeResource/Widgets/NodeMemoryChart.php new file mode 100644 index 000000000..8c90adc68 --- /dev/null +++ b/app/Filament/Resources/NodeResource/Widgets/NodeMemoryChart.php @@ -0,0 +1,68 @@ + [ + 'x' => [ + 'grid' => [ + 'display' => false, + ], + 'ticks' => [ + 'display' => false, + ], + ], + 'y' => [ + 'grid' => [ + 'display' => false, + ], + 'ticks' => [ + 'display' => false, + ], + ], + ], + ]; + + protected function getData(): array + { + /** @var Node $node */ + $node = $this->record; + + $total = $node->statistics()['memory_total'] ?? 0; + $used = $node->statistics()['memory_used'] ?? 0; + $unused = $total - $used; + + return [ + 'datasets' => [ + [ + 'label' => 'Data Cool', + 'data' => [$used, $unused], + 'backgroundColor' => [ + 'rgb(255, 99, 132)', + 'rgb(54, 162, 235)', + 'rgb(255, 205, 86)', + ], + ], + // 'backgroundColor' => [], + ], + 'labels' => ['Used', 'Unused'], + ]; + } + + protected function getType(): string + { + return 'pie'; + } +} diff --git a/app/Filament/Resources/NodeResource/Widgets/NodeStorageChart.php b/app/Filament/Resources/NodeResource/Widgets/NodeStorageChart.php new file mode 100644 index 000000000..bd1ac0f6e --- /dev/null +++ b/app/Filament/Resources/NodeResource/Widgets/NodeStorageChart.php @@ -0,0 +1,68 @@ + [ + 'x' => [ + 'grid' => [ + 'display' => false, + ], + 'ticks' => [ + 'display' => false, + ], + ], + 'y' => [ + 'grid' => [ + 'display' => false, + ], + 'ticks' => [ + 'display' => false, + ], + ], + ], + ]; + + protected function getData(): array + { + /** @var Node $node */ + $node = $this->record; + + $total = $node->statistics()['disk_total'] ?? 0; + $used = $node->statistics()['disk_used'] ?? 0; + $unused = $total - $used; + + return [ + 'datasets' => [ + [ + 'label' => 'Data Cool', + 'data' => [$used, $unused], + 'backgroundColor' => [ + 'rgb(255, 99, 132)', + 'rgb(54, 162, 235)', + 'rgb(255, 205, 86)', + ], + ], + // 'backgroundColor' => [], + ], + 'labels' => ['Used', 'Unused'], + ]; + } + + protected function getType(): string + { + return 'pie'; + } +} diff --git a/app/Models/Node.php b/app/Models/Node.php index a1ed2cb29..c1716950b 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -309,6 +309,25 @@ class Node extends Model return $statuses; } + public function statistics() + { + return Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/system/utilization')->json() ?? []; + + /** Example + $stats = [ + 'memory_total' => 8221675520, + 'memory_used' => 1670275072, + 'swap_total' => 1073737728, + 'swap_used' => 0, + 'load_average1' => 0.67, + 'load_average5' => 0.64, + 'load_average15' => 0.7, + 'cpu_percent' => 0.84361590728896, + 'disk_total' => 62671097856, + 'disk_used' => 33444728832, + ]; // */ + } + public function ipAddresses(): array { return cache()->remember("nodes.$this->id.ips", now()->addHour(), function () {