From f55deb0b670d2c6a12960d89980900ac8662016c Mon Sep 17 00:00:00 2001 From: makotocc0107 <1424018999@qq.com> Date: Thu, 10 Oct 2024 16:07:32 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=A2=9E=E6=B7=BB]=E5=A2=9E=E6=B7=BB=E4=BA=86?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=8D=95=E6=8D=89=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=8A=A5=E9=94=99=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/Filament/Pages/ManageRemoteWrite.php | 4 + .../app/Filament/Widgets/SystemStats.php | 90 ++++++++++++------- .../app/Livewire/MetricWidgetChart.php | 54 +++++------ .../app/Services/PrometheusService.php | 40 ++++++--- 4 files changed, 118 insertions(+), 70 deletions(-) diff --git a/management-panel/app/Filament/Pages/ManageRemoteWrite.php b/management-panel/app/Filament/Pages/ManageRemoteWrite.php index c6d5886..10a627b 100644 --- a/management-panel/app/Filament/Pages/ManageRemoteWrite.php +++ b/management-panel/app/Filament/Pages/ManageRemoteWrite.php @@ -13,6 +13,10 @@ class ManageRemoteWrite extends SettingsPage protected static string $settings = RemoteWriteSettings::class; + protected static ?string $navigationLabel = '远程写入配置管理'; + + protected static ?string $title = '远程写入配置管理'; + public function form(Form $form): Form { return $form diff --git a/management-panel/app/Filament/Widgets/SystemStats.php b/management-panel/app/Filament/Widgets/SystemStats.php index 6d614d3..b919adf 100644 --- a/management-panel/app/Filament/Widgets/SystemStats.php +++ b/management-panel/app/Filament/Widgets/SystemStats.php @@ -13,49 +13,78 @@ class SystemStats extends BaseWidget { $prometheus = new PrometheusService(); - // 获取内存总量 - $memoryTotalQuery = 'node_memory_MemTotal_bytes'; - $memoryTotalResult = $prometheus->query($memoryTotalQuery); - $memoryTotal = $memoryTotalResult['data']['result'][0]['value'][1] ?? 0; + try { + // 获取内存总量 + $memoryTotalQuery = 'node_memory_MemTotal_bytes'; + $memoryTotalResult = $prometheus->query($memoryTotalQuery); + $memoryTotal = $memoryTotalResult['data']['result'][0]['value'][1] ?? 0; + } catch (\Exception $e) { + error_log('Failed to retrieve memory total: ' . $e->getMessage()); + $memoryTotal = 0; + } - // 获取已用内存 - $memoryAvailableQuery = 'node_memory_MemAvailable_bytes'; - $memoryAvailableResult = $prometheus->query($memoryAvailableQuery); - $memoryAvailable = $memoryAvailableResult['data']['result'][0]['value'][1] ?? 0; + try { + // 获取已用内存 + $memoryAvailableQuery = 'node_memory_MemAvailable_bytes'; + $memoryAvailableResult = $prometheus->query($memoryAvailableQuery); + $memoryAvailable = $memoryAvailableResult['data']['result'][0]['value'][1] ?? 0; + } catch (\Exception $e) { + error_log('Failed to retrieve memory available: ' . $e->getMessage()); + $memoryAvailable = 0; + } $memoryUsed = $memoryTotal - $memoryAvailable; $memoryDisplay = round($memoryUsed / (1024 * 1024 * 1024), 2) . ' GB / ' . round($memoryTotal / (1024 * 1024 * 1024), 2) . ' GB'; - // 获取硬盘总量 - $diskTotalQuery = 'node_filesystem_size_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs",mountpoint=~"/|/home|/boot"}'; - $diskTotalResult = $prometheus->query($diskTotalQuery); - $diskTotal = array_sum(array_map(function ($item) { - return $item['value'][1] ?? 0; - }, $diskTotalResult['data']['result'])); + try { + // 获取硬盘总量 + $diskTotalQuery = 'node_filesystem_size_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs",mountpoint=~"/|/home|/boot"}'; + $diskTotalResult = $prometheus->query($diskTotalQuery); + $diskTotal = array_sum(array_map(function ($item) { + return $item['value'][1] ?? 0; + }, $diskTotalResult['data']['result'])); + } catch (\Exception $e) { + error_log('Failed to retrieve disk total: ' . $e->getMessage()); + $diskTotal = 0; + } - // 获取已用硬盘 - $diskFreeQuery = 'node_filesystem_free_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs",mountpoint=~"/|/home|/boot"}'; - $diskFreeResult = $prometheus->query($diskFreeQuery); - $diskFree = array_sum(array_map(function ($item) { - return $item['value'][1] ?? 0; - }, $diskFreeResult['data']['result'])); + try { + // 获取已用硬盘 + $diskFreeQuery = 'node_filesystem_free_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs",mountpoint=~"/|/home|/boot"}'; + $diskFreeResult = $prometheus->query($diskFreeQuery); + $diskFree = array_sum(array_map(function ($item) { + return $item['value'][1] ?? 0; + }, $diskFreeResult['data']['result'])); + } catch (\Exception $e) { + error_log('Failed to retrieve disk free: ' . $e->getMessage()); + $diskFree = 0; + } $diskUsed = $diskTotal - $diskFree; $diskDisplay = round($diskUsed / (1024 * 1024 * 1024), 2) . ' GB / ' . round($diskTotal / (1024 * 1024 * 1024), 2) . ' GB'; - // 获取系统启动时间 - $uptimeQuery = 'node_boot_time_seconds'; - $uptimeResult = $prometheus->query($uptimeQuery); - $bootTime = $uptimeResult['data']['result'][0]['value'][1] ?? 0; + try { + // 获取系统启动时间 + $uptimeQuery = 'node_boot_time_seconds'; + $uptimeResult = $prometheus->query($uptimeQuery); + $bootTime = $uptimeResult['data']['result'][0]['value'][1] ?? 0; + } catch (\Exception $e) { + error_log('Failed to retrieve boot time: ' . $e->getMessage()); + $bootTime = 0; + } + $uptime = now()->timestamp - $bootTime; $uptimeDisplay = gmdate('H:i:s', $uptime); - // 获取CPU核心数量 - $cpuCoresQuery = 'count(node_cpu_seconds_total{mode="system"})'; - $cpuCoresResult = $prometheus->query($cpuCoresQuery); - $cpuCores = $cpuCoresResult['data']['result'][0]['value'][1] ?? 0; - - + try { + // 获取CPU核心数量 + $cpuCoresQuery = 'count(node_cpu_seconds_total{mode="system"})'; + $cpuCoresResult = $prometheus->query($cpuCoresQuery); + $cpuCores = $cpuCoresResult['data']['result'][0]['value'][1] ?? 0; + } catch (\Exception $e) { + error_log('Failed to retrieve CPU cores: ' . $e->getMessage()); + $cpuCores = 0; + } return [ BaseWidget\Stat::make('内存占用', $memoryDisplay), @@ -65,6 +94,7 @@ class SystemStats extends BaseWidget ]; } + protected function getPollingInterval(): ?string { return "1s"; diff --git a/management-panel/app/Livewire/MetricWidgetChart.php b/management-panel/app/Livewire/MetricWidgetChart.php index 86b9d39..4ce17b2 100644 --- a/management-panel/app/Livewire/MetricWidgetChart.php +++ b/management-panel/app/Livewire/MetricWidgetChart.php @@ -19,44 +19,44 @@ class MetricWidgetChart extends InlineChartWidget protected function getData(): array { $prometheus = new PrometheusService(); + $labels = []; + $data = []; - $query1 = $this->record->name . '{data="real"}'; + try { + $query1 = $this->record->name . '{data="real"}'; + $start = now()->subMinutes(2)->timestamp; + $end = now()->timestamp; + $step = 5; - $start = now()->now()->subMinutes(2)->timestamp; - $end = now()->timestamp; - $step = 5; - $realdata = $prometheus->queryRange($query1, $start, $end, $step); + // 查询 Prometheus 数据 + $realdata = $prometheus->queryRange($query1, $start, $end, $step); + // 检查查询结果是否有数据 + if (!empty($realdata['data']['result']) && !empty($realdata['data']['result'][0]['values'][1])) { - // 检查查询结果是否有数据 - if (empty($realdata['data']['result'])) { - // 如果没有数据,返回一个空数据集或提示信息 + // 获取数据 + $realdataValue = array_column($realdata['data']['result'][0]['values'], 1, 0); + + // 只保留最新的 MAX_POINTS 个数据点 + $timestamps = array_keys($realdataValue); + $timestamps = array_slice($timestamps, -self::MAX_POINTS); + + foreach ($timestamps as $timestamp) { + $labels[] = date('H:i:s', $timestamp); // 格式化时间戳 + $data[] = round(floatval($realdataValue[$timestamp]), 2); // 保留两位小数 + } + } + } catch (\Exception $e) { + error_log('Failed to retrieve data from Prometheus: ' . $e->getMessage()); + // 处理错误,返回默认的空数据集或提示信息 return [ 'labels' => [], 'datasets' => [], ]; } - if (!empty($realdata['data']['result'][0]['values'][1])) { - - // 获取内存使用率数据 - $realdataValue = array_column($realdata['data']['result'][0]['values'], 1, 0); - - // 只保留最新的 MAX_POINTS 个数据点 - $timestamps = array_keys($realdataValue); - $timestamps = array_slice($timestamps, -self::MAX_POINTS); - - foreach ($timestamps as $timestamp) { - $labels[] = date('H:i:s', $timestamp); // 格式化时间戳为小时:分钟:秒 - $data[] = round(floatval($realdataValue[$timestamp]), 2); // 取出每个时间点的内存使用率,并保留两位小数 - } - } - - // 将数据格式化为 InlineChartWidget 所需的格式 -// $formattedRealData = $this->formatData($realdata, 'Real Data'); - - + // 返回格式化后的数据 return [ 'labels' => $labels, 'datasets' => [ diff --git a/management-panel/app/Services/PrometheusService.php b/management-panel/app/Services/PrometheusService.php index 9dd16ac..4141510 100644 --- a/management-panel/app/Services/PrometheusService.php +++ b/management-panel/app/Services/PrometheusService.php @@ -21,12 +21,19 @@ class PrometheusService */ public function query($query) { - $response = $this->client->get('query', [ - 'query' => ['query' => $query], - ]); - return json_decode($response->getBody()->getContents(), true); + try { + $response = $this->client->get('query', [ + 'query' => ['query' => $query], + ]); + return json_decode($response->getBody()->getContents(), true); + } catch (\Exception $e) { + // 处理异常,记录日志或返回错误信息 + error_log('Query failed: ' . $e->getMessage()); + return ['error' => 'Failed to execute query', 'message' => $e->getMessage()]; + } } + /** * 执行 Prometheus 区间查询 * @@ -38,17 +45,24 @@ class PrometheusService */ public function queryRange($query, $start, $end, $step) { - $response = $this->client->get('query_range', [ - 'query' => [ - 'query' => $query, - 'start' => $start, - 'end' => $end, - 'step' => $step, - ], - ]); - return json_decode($response->getBody()->getContents(), true); + try { + $response = $this->client->get('query_range', [ + 'query' => [ + 'query' => $query, + 'start' => $start, + 'end' => $end, + 'step' => $step, + ], + ]); + return json_decode($response->getBody()->getContents(), true); + } catch (\Exception $e) { + // 处理异常,记录日志或返回错误信息 + error_log('Query range failed: ' . $e->getMessage()); + return ['error' => 'Failed to execute query range', 'message' => $e->getMessage()]; + } } + /** * 获取 Prometheus 监控的所有目标 *