column('id', 'ID')->sortable(); // 关联服务 $grid->column('service.name', '服务名称')->sortable(); $grid->column('service.code', '服务代码'); // 检查类型 $grid->column('check_type', '检查类型')->display(function ($type) { $types = [ 'health' => ['label' => '健康检查', 'color' => 'primary', 'icon' => 'fa-heartbeat'], 'performance' => ['label' => '性能检查', 'color' => 'info', 'icon' => 'fa-tachometer-alt'], 'availability' => ['label' => '可用性检查', 'color' => 'success', 'icon' => 'fa-check-circle'], 'status_change' => ['label' => '状态变更', 'color' => 'warning', 'icon' => 'fa-exchange-alt'], ]; $config = $types[$type] ?? ['label' => $type, 'color' => 'secondary', 'icon' => 'fa-question']; return " {$config['label']}"; }); // 检查状态 $grid->column('status', '检查状态')->display(function ($status) { $colors = [ 'success' => 'success', 'warning' => 'warning', 'error' => 'danger', 'timeout' => 'secondary', ]; $icons = [ 'success' => 'fa-check', 'warning' => 'fa-exclamation-triangle', 'error' => 'fa-times', 'timeout' => 'fa-clock', ]; $color = $colors[$status] ?? 'secondary'; $icon = $icons[$status] ?? 'fa-question'; return " " . ucfirst($status) . ""; }); // 响应时间 $grid->column('response_time', '响应时间')->display(function ($time) { if (!$time) { return '-'; } $color = 'success'; if ($time > 5000) { $color = 'danger'; } elseif ($time > 2000) { $color = 'warning'; } elseif ($time > 1000) { $color = 'info'; } return "{$time}ms"; })->sortable(); // HTTP状态码 $grid->column('status_code', 'HTTP状态码')->display(function ($code) { if (!$code) { return '-'; } $color = 'secondary'; if ($code >= 200 && $code < 300) { $color = 'success'; } elseif ($code >= 300 && $code < 400) { $color = 'info'; } elseif ($code >= 400 && $code < 500) { $color = 'warning'; } elseif ($code >= 500) { $color = 'danger'; } return "{$code}"; }); // 错误信息(截断显示) $grid->column('error_message', '错误信息')->display(function ($error) { if (!$error) { return '-'; } $shortError = strlen($error) > 30 ? substr($error, 0, 30) . '...' : $error; return "{$shortError}"; }); // 检查时间 $grid->column('checked_at', '检查时间')->sortable(); // 过滤器 $grid->filter(function (Grid\Filter $filter) { $filter->equal('service_id', '服务')->select( ThirdPartyService::pluck('name', 'id')->toArray() ); $filter->equal('check_type', '检查类型')->select([ 'health' => '健康检查', 'performance' => '性能检查', 'availability' => '可用性检查', 'status_change' => '状态变更', ]); $filter->equal('status', '检查状态')->select([ 'success' => '成功', 'warning' => '警告', 'error' => '错误', 'timeout' => '超时', ]); $filter->between('response_time', '响应时间(ms)'); $filter->between('status_code', 'HTTP状态码'); $filter->like('error_message', '错误信息'); $filter->between('checked_at', '检查时间')->datetime(); }); // 批量操作 $grid->batchActions(function (Grid\Tools\BatchActions $batch) { // TODO: 创建批量操作类 // $batch->add('批量删除', new \App\Module\ThirdParty\AdminActions\BatchDeleteMonitorAction()); }); // 工具栏 $grid->tools(function (Grid\Tools $tools) { $tools->append(' 执行健康检查'); $tools->append(' 监控统计'); $tools->append(' 清理记录'); }); // 行操作 $grid->actions(function (Grid\Displayers\Actions $actions) { // 移除编辑按钮,监控记录只读 $actions->disableEdit(); if ($actions->row->status === 'error') { $actions->append(' 重新检查'); } }); // 默认排序(最新的在前) $grid->model()->orderBy('checked_at', 'desc'); // 禁用创建按钮 $grid->disableCreateButton(); }); } /** * 详情页面 * * @return Show */ protected function detail($id): Show { return Show::make($id, new ThirdPartyMonitorRepository(), function (Show $show) { $show->field('id', 'ID'); $show->field('service.name', '服务名称'); $show->field('service.code', '服务代码'); $show->field('check_type', '检查类型')->as(function ($type) { $types = [ 'health' => '健康检查', 'performance' => '性能检查', 'availability' => '可用性检查', 'status_change' => '状态变更', ]; return $types[$type] ?? $type; }); $show->field('status', '检查状态')->as(function ($status) { return ucfirst($status); }); $show->field('response_time', '响应时间')->as(function ($time) { return $time ? $time . ' ms' : '-'; }); $show->field('status_code', 'HTTP状态码'); $show->field('error_message', '错误信息'); $show->field('details', '详细信息')->json(); $show->field('checked_at', '检查时间'); // 相关监控记录 $show->relation('recentChecks', '最近检查记录', function ($model) { $grid = new Grid(new ThirdPartyMonitor()); $grid->model()->where('service_id', $model->service_id) ->where('check_type', $model->check_type) ->where('id', '!=', $model->id) ->orderBy('checked_at', 'desc') ->limit(10); $grid->column('status', '状态')->display(function ($status) { $colors = [ 'success' => 'success', 'warning' => 'warning', 'error' => 'danger', 'timeout' => 'secondary', ]; $color = $colors[$status] ?? 'secondary'; return "" . ucfirst($status) . ""; }); $grid->column('response_time', '响应时间(ms)'); $grid->column('status_code', 'HTTP状态码'); $grid->column('checked_at', '检查时间'); $grid->disableCreateButton(); $grid->disableActions(); $grid->disableFilter(); $grid->disableBatchActions(); return $grid; }); // 服务健康趋势 $show->relation('healthTrend', '健康趋势', function ($model) { $grid = new Grid(new ThirdPartyMonitor()); $grid->model()->where('service_id', $model->service_id) ->where('check_type', 'health') ->orderBy('checked_at', 'desc') ->limit(20); $grid->column('status', '状态')->display(function ($status) { $colors = [ 'success' => 'success', 'warning' => 'warning', 'error' => 'danger', 'timeout' => 'secondary', ]; $color = $colors[$status] ?? 'secondary'; return "" . ucfirst($status) . ""; }); $grid->column('response_time', '响应时间(ms)'); $grid->column('checked_at', '检查时间'); $grid->disableCreateButton(); $grid->disableActions(); $grid->disableFilter(); $grid->disableBatchActions(); return $grid; }); }); } }