[增添]增添了错误捕捉,避免页面报错显示
This commit is contained in:
@@ -13,6 +13,10 @@ class ManageRemoteWrite extends SettingsPage
|
|||||||
|
|
||||||
protected static string $settings = RemoteWriteSettings::class;
|
protected static string $settings = RemoteWriteSettings::class;
|
||||||
|
|
||||||
|
protected static ?string $navigationLabel = '远程写入配置管理';
|
||||||
|
|
||||||
|
protected static ?string $title = '远程写入配置管理';
|
||||||
|
|
||||||
public function form(Form $form): Form
|
public function form(Form $form): Form
|
||||||
{
|
{
|
||||||
return $form
|
return $form
|
||||||
|
|||||||
@@ -13,49 +13,78 @@ class SystemStats extends BaseWidget
|
|||||||
{
|
{
|
||||||
$prometheus = new PrometheusService();
|
$prometheus = new PrometheusService();
|
||||||
|
|
||||||
// 获取内存总量
|
try {
|
||||||
$memoryTotalQuery = 'node_memory_MemTotal_bytes';
|
// 获取内存总量
|
||||||
$memoryTotalResult = $prometheus->query($memoryTotalQuery);
|
$memoryTotalQuery = 'node_memory_MemTotal_bytes';
|
||||||
$memoryTotal = $memoryTotalResult['data']['result'][0]['value'][1] ?? 0;
|
$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;
|
||||||
|
}
|
||||||
|
|
||||||
// 获取已用内存
|
try {
|
||||||
$memoryAvailableQuery = 'node_memory_MemAvailable_bytes';
|
// 获取已用内存
|
||||||
$memoryAvailableResult = $prometheus->query($memoryAvailableQuery);
|
$memoryAvailableQuery = 'node_memory_MemAvailable_bytes';
|
||||||
$memoryAvailable = $memoryAvailableResult['data']['result'][0]['value'][1] ?? 0;
|
$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;
|
$memoryUsed = $memoryTotal - $memoryAvailable;
|
||||||
$memoryDisplay = round($memoryUsed / (1024 * 1024 * 1024), 2) . ' GB / ' . round($memoryTotal / (1024 * 1024 * 1024), 2) . ' GB';
|
$memoryDisplay = round($memoryUsed / (1024 * 1024 * 1024), 2) . ' GB / ' . round($memoryTotal / (1024 * 1024 * 1024), 2) . ' GB';
|
||||||
|
|
||||||
// 获取硬盘总量
|
try {
|
||||||
$diskTotalQuery = 'node_filesystem_size_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs",mountpoint=~"/|/home|/boot"}';
|
// 获取硬盘总量
|
||||||
$diskTotalResult = $prometheus->query($diskTotalQuery);
|
$diskTotalQuery = 'node_filesystem_size_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs",mountpoint=~"/|/home|/boot"}';
|
||||||
$diskTotal = array_sum(array_map(function ($item) {
|
$diskTotalResult = $prometheus->query($diskTotalQuery);
|
||||||
return $item['value'][1] ?? 0;
|
$diskTotal = array_sum(array_map(function ($item) {
|
||||||
}, $diskTotalResult['data']['result']));
|
return $item['value'][1] ?? 0;
|
||||||
|
}, $diskTotalResult['data']['result']));
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
error_log('Failed to retrieve disk total: ' . $e->getMessage());
|
||||||
|
$diskTotal = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// 获取已用硬盘
|
try {
|
||||||
$diskFreeQuery = 'node_filesystem_free_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs",mountpoint=~"/|/home|/boot"}';
|
// 获取已用硬盘
|
||||||
$diskFreeResult = $prometheus->query($diskFreeQuery);
|
$diskFreeQuery = 'node_filesystem_free_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs",mountpoint=~"/|/home|/boot"}';
|
||||||
$diskFree = array_sum(array_map(function ($item) {
|
$diskFreeResult = $prometheus->query($diskFreeQuery);
|
||||||
return $item['value'][1] ?? 0;
|
$diskFree = array_sum(array_map(function ($item) {
|
||||||
}, $diskFreeResult['data']['result']));
|
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;
|
$diskUsed = $diskTotal - $diskFree;
|
||||||
$diskDisplay = round($diskUsed / (1024 * 1024 * 1024), 2) . ' GB / ' . round($diskTotal / (1024 * 1024 * 1024), 2) . ' GB';
|
$diskDisplay = round($diskUsed / (1024 * 1024 * 1024), 2) . ' GB / ' . round($diskTotal / (1024 * 1024 * 1024), 2) . ' GB';
|
||||||
|
|
||||||
// 获取系统启动时间
|
try {
|
||||||
$uptimeQuery = 'node_boot_time_seconds';
|
// 获取系统启动时间
|
||||||
$uptimeResult = $prometheus->query($uptimeQuery);
|
$uptimeQuery = 'node_boot_time_seconds';
|
||||||
$bootTime = $uptimeResult['data']['result'][0]['value'][1] ?? 0;
|
$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;
|
$uptime = now()->timestamp - $bootTime;
|
||||||
$uptimeDisplay = gmdate('H:i:s', $uptime);
|
$uptimeDisplay = gmdate('H:i:s', $uptime);
|
||||||
|
|
||||||
// 获取CPU核心数量
|
try {
|
||||||
$cpuCoresQuery = 'count(node_cpu_seconds_total{mode="system"})';
|
// 获取CPU核心数量
|
||||||
$cpuCoresResult = $prometheus->query($cpuCoresQuery);
|
$cpuCoresQuery = 'count(node_cpu_seconds_total{mode="system"})';
|
||||||
$cpuCores = $cpuCoresResult['data']['result'][0]['value'][1] ?? 0;
|
$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 [
|
return [
|
||||||
BaseWidget\Stat::make('内存占用', $memoryDisplay),
|
BaseWidget\Stat::make('内存占用', $memoryDisplay),
|
||||||
@@ -65,6 +94,7 @@ class SystemStats extends BaseWidget
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected function getPollingInterval(): ?string
|
protected function getPollingInterval(): ?string
|
||||||
{
|
{
|
||||||
return "1s";
|
return "1s";
|
||||||
|
|||||||
@@ -19,44 +19,44 @@ class MetricWidgetChart extends InlineChartWidget
|
|||||||
protected function getData(): array
|
protected function getData(): array
|
||||||
{
|
{
|
||||||
$prometheus = new PrometheusService();
|
$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;
|
// 查询 Prometheus 数据
|
||||||
$end = now()->timestamp;
|
$realdata = $prometheus->queryRange($query1, $start, $end, $step);
|
||||||
$step = 5;
|
|
||||||
$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 [
|
return [
|
||||||
'labels' => [],
|
'labels' => [],
|
||||||
'datasets' => [],
|
'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 [
|
return [
|
||||||
'labels' => $labels,
|
'labels' => $labels,
|
||||||
'datasets' => [
|
'datasets' => [
|
||||||
|
|||||||
@@ -21,12 +21,19 @@ class PrometheusService
|
|||||||
*/
|
*/
|
||||||
public function query($query)
|
public function query($query)
|
||||||
{
|
{
|
||||||
$response = $this->client->get('query', [
|
try {
|
||||||
'query' => ['query' => $query],
|
$response = $this->client->get('query', [
|
||||||
]);
|
'query' => ['query' => $query],
|
||||||
return json_decode($response->getBody()->getContents(), true);
|
]);
|
||||||
|
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 区间查询
|
* 执行 Prometheus 区间查询
|
||||||
*
|
*
|
||||||
@@ -38,17 +45,24 @@ class PrometheusService
|
|||||||
*/
|
*/
|
||||||
public function queryRange($query, $start, $end, $step)
|
public function queryRange($query, $start, $end, $step)
|
||||||
{
|
{
|
||||||
$response = $this->client->get('query_range', [
|
try {
|
||||||
'query' => [
|
$response = $this->client->get('query_range', [
|
||||||
'query' => $query,
|
'query' => [
|
||||||
'start' => $start,
|
'query' => $query,
|
||||||
'end' => $end,
|
'start' => $start,
|
||||||
'step' => $step,
|
'end' => $end,
|
||||||
],
|
'step' => $step,
|
||||||
]);
|
],
|
||||||
return json_decode($response->getBody()->getContents(), true);
|
]);
|
||||||
|
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 监控的所有目标
|
* 获取 Prometheus 监控的所有目标
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user