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;
});
});
}
}