| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- <?php
- namespace App\Module\ThirdParty\AdminControllers;
- use UCore\DcatAdmin\AdminController;
- use App\Module\ThirdParty\Models\ThirdPartyMonitor;
- use App\Module\ThirdParty\Models\ThirdPartyService;
- use App\Module\ThirdParty\Repositorys\ThirdPartyMonitorRepository;
- use Dcat\Admin\Grid;
- use Dcat\Admin\Show;
- /**
- * 第三方服务监控记录管理控制器
- *
- * 路由: /admin/thirdparty/monitors
- */
- class ThirdPartyMonitorController extends AdminController
- {
- /**
- * 页面标题
- *
- * @var string
- */
- protected $title = '监控记录管理';
- /**
- * 数据仓库
- *
- * @return string
- */
- protected function repository()
- {
- return ThirdPartyMonitorRepository::class;
- }
- /**
- * 列表页面
- *
- * @return Grid
- */
- protected function grid(): Grid
- {
- return Grid::make(new ThirdPartyMonitorRepository(), function (Grid $grid) {
- // 基础设置
- $grid->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 "<span class='badge badge-{$config['color']}'><i class='{$config['icon']}'></i> {$config['label']}</span>";
- });
- // 检查状态
- $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 "<span class='badge badge-{$color}'><i class='{$icon}'></i> " . ucfirst($status) . "</span>";
- });
- // 响应时间
- $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 "<span class='badge badge-{$color}'>{$time}ms</span>";
- })->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 "<span class='badge badge-{$color}'>{$code}</span>";
- });
- // 错误信息(截断显示)
- $grid->column('error_message', '错误信息')->display(function ($error) {
- if (!$error) {
- return '-';
- }
- $shortError = strlen($error) > 30 ? substr($error, 0, 30) . '...' : $error;
- return "<span class='text-danger' title='{$error}'>{$shortError}</span>";
- });
- // 检查时间
- $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) {
- $batch->add('批量删除', new \App\Module\ThirdParty\AdminActions\BatchDeleteMonitorAction());
- });
- // 工具栏
- $grid->tools(function (Grid\Tools $tools) {
- $tools->append('<a href="/admin/thirdparty/monitors/health-check" class="btn btn-sm btn-success"><i class="fa fa-heartbeat"></i> 执行健康检查</a>');
- $tools->append('<a href="/admin/thirdparty/monitors/stats" class="btn btn-sm btn-info"><i class="fa fa-chart-bar"></i> 监控统计</a>');
- $tools->append('<a href="/admin/thirdparty/monitors/cleanup" class="btn btn-sm btn-warning"><i class="fa fa-trash"></i> 清理记录</a>');
- });
- // 行操作
- $grid->actions(function (Grid\Displayers\Actions $actions) {
- // 移除编辑按钮,监控记录只读
- $actions->disableEdit();
-
- if ($actions->row->status === 'error') {
- $actions->append('<a href="/admin/thirdparty/monitors/' . $actions->getKey() . '/recheck" class="btn btn-xs btn-warning"><i class="fa fa-redo"></i> 重新检查</a>');
- }
- });
- // 默认排序(最新的在前)
- $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 "<span class='badge badge-{$color}'>" . ucfirst($status) . "</span>";
- });
-
- $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 "<span class='badge badge-{$color}'>" . ucfirst($status) . "</span>";
- });
-
- $grid->column('response_time', '响应时间(ms)');
- $grid->column('checked_at', '检查时间');
-
- $grid->disableCreateButton();
- $grid->disableActions();
- $grid->disableFilter();
- $grid->disableBatchActions();
-
- return $grid;
- });
- });
- }
- }
|