diff --git a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/controller/MigrationTaskAlertController.java b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/controller/MigrationTaskAlertController.java index 86e7f4f5f7f6486fd8c2cc9c60236d8314e81745..83b76c925e23baf93134fe7d82b1ba2e251b42a2 100644 --- a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/controller/MigrationTaskAlertController.java +++ b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/controller/MigrationTaskAlertController.java @@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.opengauss.admin.common.core.domain.AjaxResult; import org.opengauss.admin.common.core.page.TableDataInfo; import org.opengauss.admin.plugin.base.BaseController; -import org.opengauss.admin.plugin.domain.MigrationTaskAlert; +import org.opengauss.admin.plugin.dto.MigrationTaskAlertDto; import org.opengauss.admin.plugin.service.MigrationTaskAlertDetailService; import org.opengauss.admin.plugin.service.MigrationTaskAlertService; import org.springframework.beans.factory.annotation.Autowired; @@ -41,7 +41,7 @@ public class MigrationTaskAlertController extends BaseController { */ @GetMapping("/list/{taskId}/{migrationPhase}") public TableDataInfo getList(@PathVariable int taskId, @PathVariable int migrationPhase) { - IPage iPage = alertService.selectPage(startPage(), taskId, migrationPhase); + IPage iPage = alertService.selectGroupPage(startPage(), taskId, migrationPhase); return getDataTable(iPage); } @@ -53,7 +53,7 @@ public class MigrationTaskAlertController extends BaseController { */ @GetMapping("/count/{taskId}") public AjaxResult countAlertNumber(@PathVariable int taskId) { - return alertService.countAlertNumber(taskId); + return alertService.countGroupAlertNumber(taskId); } /** @@ -64,6 +64,6 @@ public class MigrationTaskAlertController extends BaseController { */ @GetMapping("/detail/{id}") public AjaxResult getDetail(@PathVariable int id) { - return AjaxResult.success(alertDetailService.getById(id)); + return AjaxResult.success(alertDetailService.getGroupDetailByAlertId(id)); } } diff --git a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/domain/MigrationTaskAlert.java b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/domain/MigrationTaskAlert.java index 8e4336ab2a985f79fd2bbf7247761200cdcaed6c..5751224dc33f01ee4e2a16f153b2ae8a0be02a9c 100644 --- a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/domain/MigrationTaskAlert.java +++ b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/domain/MigrationTaskAlert.java @@ -62,12 +62,4 @@ public class MigrationTaskAlert { return String.format(Locale.ROOT, "[%s] %s %s (%s:%d)", dateTime, logLevel, logCode, message, className, lineNumber); } - - /** - * format date time - */ - public void formatDateTime() { - String dataTimeModel = "yyyy-MM-dd HH:mm:ss"; - this.dateTime = this.dateTime.substring(0, dataTimeModel.length()); - } } diff --git a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/dto/MigrationTaskAlertDto.java b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/dto/MigrationTaskAlertDto.java new file mode 100644 index 0000000000000000000000000000000000000000..eb0307eac711e6772378fedd213add13b74e790e --- /dev/null +++ b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/dto/MigrationTaskAlertDto.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + */ + +package org.opengauss.admin.plugin.dto; + +import lombok.Data; + +/** + * migration task alert dto + * + * @since 2025/3/11 + */ +@Data +public class MigrationTaskAlertDto { + private Integer id; + private int taskId; + private int migrationPhase; + private String causeCn; + private String causeEn; + private String logCode; + private int logSource; + + private Integer minId; + private Integer maxId; + private Long groupNum; + private String firstDateTime; + private String latestDateTime; + + /** + * format date time + */ + public void formatDateTime() { + String dataTimeModel = "yyyy-MM-dd HH:mm:ss"; + this.firstDateTime = this.firstDateTime.substring(0, dataTimeModel.length()); + this.latestDateTime = this.latestDateTime.substring(0, dataTimeModel.length()); + } +} diff --git a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/mapper/MigrationTaskAlertMapper.java b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/mapper/MigrationTaskAlertMapper.java index 4e06580076bd04a93de67f7ebb2bd8ef0ce0978d..d523fd2b50578f96f314a4b3d3851d8af9cf4064 100644 --- a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/mapper/MigrationTaskAlertMapper.java +++ b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/mapper/MigrationTaskAlertMapper.java @@ -6,7 +6,11 @@ package org.opengauss.admin.plugin.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.opengauss.admin.plugin.domain.MigrationTaskAlert; +import org.opengauss.admin.plugin.dto.MigrationTaskAlertDto; + +import java.util.List; /** * migration task alert mapper @@ -15,4 +19,37 @@ import org.opengauss.admin.plugin.domain.MigrationTaskAlert; */ @Mapper public interface MigrationTaskAlertMapper extends BaseMapper { + /** + * count group alert + * + * @param taskId task id + * @return group alert count + */ + long countGroupAlertByTaskId(@Param("taskId") int taskId); + + /** + * count group alert in phase + * + * @param taskId task id + * @param phaseId phase id + * @return group alert in phase + */ + long countGroupAlertInPhase(@Param("taskId") int taskId, @Param("phaseId") int phaseId); + + /** + * get group alert dto in phase of task + * + * @param taskId task id + * @param phaseId phase id + * @return migration task alert dto list + */ + List getGroupAlertDto(@Param("taskId") int taskId, @Param("phaseId") int phaseId); + + /** + * get group alert id list by the same group alert + * + * @param alert alert entity + * @return group alert id list + */ + List getGroupAlertIds(MigrationTaskAlert alert); } diff --git a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/MigrationTaskAlertDetailService.java b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/MigrationTaskAlertDetailService.java index 7a89dcd583387f0dbc60765e9cf2e5766dc1a247..a19060244b50da1d8177c5285603d2ae846f583e 100644 --- a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/MigrationTaskAlertDetailService.java +++ b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/MigrationTaskAlertDetailService.java @@ -13,4 +13,11 @@ import org.opengauss.admin.plugin.domain.MigrationTaskAlertDetail; * @since 2024/12/17 */ public interface MigrationTaskAlertDetailService extends IService { + /** + * get group alert detail + * + * @param alertId alert id + * @return migration alert details + */ + MigrationTaskAlertDetail getGroupDetailByAlertId(int alertId); } diff --git a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/MigrationTaskAlertService.java b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/MigrationTaskAlertService.java index 3f9c2b42c3568fd1967d880819c59272da7bd44d..66baad29161030c97c8871ff6f6c93a8dd2e05f5 100644 --- a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/MigrationTaskAlertService.java +++ b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/MigrationTaskAlertService.java @@ -9,6 +9,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.opengauss.admin.common.core.domain.AjaxResult; import org.opengauss.admin.plugin.domain.MigrationTask; import org.opengauss.admin.plugin.domain.MigrationTaskAlert; +import org.opengauss.admin.plugin.dto.MigrationTaskAlertDto; + +import java.util.List; /** * tb migration alert service @@ -24,14 +27,14 @@ public interface MigrationTaskAlertService extends IService void refreshAlertByPortal(MigrationTask task); /** - * select alert page info + * select group alert page info * * @param page page info * @param taskId task id * @param migrationPhase migration phase id * @return page info */ - IPage selectPage(IPage page, int taskId, int migrationPhase); + IPage selectGroupPage(IPage page, int taskId, int migrationPhase); /** * count alert numbers @@ -42,12 +45,12 @@ public interface MigrationTaskAlertService extends IService int countAlertByTaskId(int taskId); /** - * count alert numbers of each migration phase + * count group alert numbers of each migration phase * * @param taskId task id * @return alert numbers of each migration phase */ - AjaxResult countAlertNumber(int taskId); + AjaxResult countGroupAlertNumber(int taskId); /** * delete alert by task id @@ -62,4 +65,12 @@ public interface MigrationTaskAlertService extends IService * @param mainTaskId main task id */ void deleteByMainTaskId(int mainTaskId); + + /** + * get group alert id list by alert entity + * + * @param alert alert entity + * @return alert id list + */ + List getGroupAlertIds(MigrationTaskAlert alert); } diff --git a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/impl/MigrationTaskAlertDetailServiceImpl.java b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/impl/MigrationTaskAlertDetailServiceImpl.java index addb4b94866c4922532d8b9d0f5860817d72faac..98ef00f9a6c98398e14cc1c41fb2c09217011035 100644 --- a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/impl/MigrationTaskAlertDetailServiceImpl.java +++ b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/impl/MigrationTaskAlertDetailServiceImpl.java @@ -4,19 +4,66 @@ package org.opengauss.admin.plugin.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.opengauss.admin.plugin.domain.MigrationTaskAlert; import org.opengauss.admin.plugin.domain.MigrationTaskAlertDetail; +import org.opengauss.admin.plugin.exception.MigrationTaskException; import org.opengauss.admin.plugin.mapper.MigrationTaskAlertDetailMapper; import org.opengauss.admin.plugin.service.MigrationTaskAlertDetailService; +import org.opengauss.admin.plugin.service.MigrationTaskAlertService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** * tb migration alert detail service impl * * @since 2024/12/17 */ +@Slf4j @Service public class MigrationTaskAlertDetailServiceImpl extends ServiceImpl implements MigrationTaskAlertDetailService { + @Autowired + private MigrationTaskAlertService alertService; + + @Autowired + private MigrationTaskAlertDetailMapper alertDetailMapper; + + @Override + public MigrationTaskAlertDetail getGroupDetailByAlertId(int alertId) { + MigrationTaskAlert taskAlert = alertService.getById(alertId); + if (taskAlert == null) { + log.error("Alert cannot found by alert id: {}", alertId); + throw new MigrationTaskException("Alert not found."); + } + + List alertIds = alertService.getGroupAlertIds(taskAlert); + + LambdaQueryWrapper detailQueryWrapper = new LambdaQueryWrapper<>(); + detailQueryWrapper.in(MigrationTaskAlertDetail::getAlertId, alertIds); + detailQueryWrapper.orderByDesc(MigrationTaskAlertDetail::getAlertId); + detailQueryWrapper.last("LIMIT 100"); + + List migrationTaskAlertDetails = list(detailQueryWrapper); + if (migrationTaskAlertDetails == null || migrationTaskAlertDetails.isEmpty()) { + log.error("The table data is abnormal. Alert detail cannot found by alert id: {}", alertId); + throw new MigrationTaskException("Alert detail not found."); + } + MigrationTaskAlertDetail taskAlertDetail = migrationTaskAlertDetails.get(0); + StringBuilder alertDetails = new StringBuilder(); + for (MigrationTaskAlertDetail alertDetail : migrationTaskAlertDetails) { + alertDetails.append(alertDetail.getDetail()).append("\n\n"); + } + if (alertIds.size() > 100) { + alertDetails.append("...\n\n"); + alertDetails.append("Only the latest 100 alerts are displayed. For more details, please see the log file."); + } + taskAlertDetail.setDetail(alertDetails.toString()); + return taskAlertDetail; + } } diff --git a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/impl/MigrationTaskAlertServiceImpl.java b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/impl/MigrationTaskAlertServiceImpl.java index f7e276f9260512172498cde2ec10de6ffe6cc61a..286c67a799cbac77bc6245bcdff3af99cf3279e9 100644 --- a/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/impl/MigrationTaskAlertServiceImpl.java +++ b/plugins/data-migration/src/main/java/org/opengauss/admin/plugin/service/impl/MigrationTaskAlertServiceImpl.java @@ -8,6 +8,7 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gitee.starblues.bootstrap.annotation.AutowiredType; import com.github.benmanes.caffeine.cache.Cache; @@ -18,6 +19,7 @@ import org.opengauss.admin.plugin.domain.MigrationHostPortalInstall; import org.opengauss.admin.plugin.domain.MigrationTask; import org.opengauss.admin.plugin.domain.MigrationTaskAlert; import org.opengauss.admin.plugin.domain.MigrationTaskAlertDetail; +import org.opengauss.admin.plugin.dto.MigrationTaskAlertDto; import org.opengauss.admin.plugin.enums.AlertMigrationPhaseEnum; import org.opengauss.admin.plugin.handler.PortalHandle; import org.opengauss.admin.plugin.mapper.MigrationTaskAlertMapper; @@ -33,6 +35,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -128,22 +131,38 @@ public class MigrationTaskAlertServiceImpl extends ServiceImpl selectPage(IPage page, int taskId, int migrationPhase) { + public IPage selectGroupPage( + IPage page, int taskId, int migrationPhase) { syncRefreshAlertByPortal(migrationTaskService.getById(taskId)); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(MigrationTaskAlert::getTaskId, taskId); - queryWrapper.eq(MigrationTaskAlert::getMigrationPhase, migrationPhase); - queryWrapper.orderByAsc(MigrationTaskAlert::getId); + List alertDtoList = getGroupAlertDto(taskId, migrationPhase); + if (alertDtoList == null || alertDtoList.isEmpty()) { + return page; + } + for (MigrationTaskAlertDto taskAlertDto : alertDtoList) { + taskAlertDto.setMigrationPhase(migrationPhase); + taskAlertDto.setTaskId(taskId); + taskAlertDto.setId(taskAlertDto.getMinId()); + MigrationTaskAlert firstTaskAlert = getById(taskAlertDto.getMinId()); + MigrationTaskAlert latestTaskAlert = getById(taskAlertDto.getMaxId()); + taskAlertDto.setFirstDateTime(firstTaskAlert.getDateTime()); + taskAlertDto.setLatestDateTime(latestTaskAlert.getDateTime()); + taskAlertDto.formatDateTime(); + taskAlertDto.setCauseCn(firstTaskAlert.getCauseCn()); + taskAlertDto.setCauseEn(firstTaskAlert.getCauseEn()); + } - IPage alertIPage = alertMapper.selectPage(page, queryWrapper); - List taskAlerts = alertIPage.getRecords(); - if (taskAlerts != null) { - taskAlerts.forEach(MigrationTaskAlert::formatDateTime); + long startIndex = (page.getCurrent() - 1) * page.getSize(); + long endIndex = Math.min(page.getCurrent() * page.getSize(), alertDtoList.size()); + if (startIndex >= alertDtoList.size()) { + return page; } + alertDtoList.sort(Comparator.comparing(MigrationTaskAlertDto::getId)); + alertDtoList = alertDtoList.subList((int) startIndex, (int) endIndex); - alertIPage.setRecords(taskAlerts); - return alertIPage; + Page alertDtoPage = new Page<>(page.getCurrent(), page.getSize(), alertDtoList.size()); + alertDtoPage.setRecords(alertDtoList); + return alertDtoPage; } @Override @@ -154,17 +173,17 @@ public class MigrationTaskAlertServiceImpl extends ServiceImpl countMap = new HashMap<>(); - countMap.put("total", countAlertByTaskId(taskId)); + public AjaxResult countGroupAlertNumber(int taskId) { + HashMap countMap = new HashMap<>(); + countMap.put("total", countGroupAlertByTaskId(taskId)); countMap.put(AlertMigrationPhaseEnum.FULL_MIGRATION.getPhaseId().toString(), - countAlertInPhase(taskId, AlertMigrationPhaseEnum.FULL_MIGRATION.getPhaseId())); + countGroupAlertInPhase(taskId, AlertMigrationPhaseEnum.FULL_MIGRATION.getPhaseId())); countMap.put(AlertMigrationPhaseEnum.FULL_MIGRATION_CHECK.getPhaseId().toString(), - countAlertInPhase(taskId, AlertMigrationPhaseEnum.FULL_MIGRATION_CHECK.getPhaseId())); + countGroupAlertInPhase(taskId, AlertMigrationPhaseEnum.FULL_MIGRATION_CHECK.getPhaseId())); countMap.put(AlertMigrationPhaseEnum.INCREMENTAL_MIGRATION.getPhaseId().toString(), - countAlertInPhase(taskId, AlertMigrationPhaseEnum.INCREMENTAL_MIGRATION.getPhaseId())); + countGroupAlertInPhase(taskId, AlertMigrationPhaseEnum.INCREMENTAL_MIGRATION.getPhaseId())); countMap.put(AlertMigrationPhaseEnum.REVERSE_MIGRATION.getPhaseId().toString(), - countAlertInPhase(taskId, AlertMigrationPhaseEnum.REVERSE_MIGRATION.getPhaseId())); + countGroupAlertInPhase(taskId, AlertMigrationPhaseEnum.REVERSE_MIGRATION.getPhaseId())); return AjaxResult.success(countMap); } @@ -204,6 +223,11 @@ public class MigrationTaskAlertServiceImpl extends ServiceImpl getGroupAlertIds(MigrationTaskAlert alert) { + return alertMapper.getGroupAlertIds(alert); + } + private void syncRefreshAlertByPortal(MigrationTask task) { Integer taskId = task.getId(); Long time = ALERT_REFRESH_RECORD.get(taskId); @@ -221,10 +245,15 @@ public class MigrationTaskAlertServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(MigrationTaskAlert::getTaskId, taskId); - queryWrapper.eq(MigrationTaskAlert::getMigrationPhase, phaseId); - return (int) count(queryWrapper); + private Long countGroupAlertInPhase(int taskId, int phaseId) { + return alertMapper.countGroupAlertInPhase(taskId, phaseId); + } + + private Long countGroupAlertByTaskId(int taskId) { + return alertMapper.countGroupAlertByTaskId(taskId); + } + + private List getGroupAlertDto(int taskId, int phaseId) { + return alertMapper.getGroupAlertDto(taskId, phaseId); } } diff --git a/plugins/data-migration/src/main/resources/mapper/MigrationTaskAlertMapper.xml b/plugins/data-migration/src/main/resources/mapper/MigrationTaskAlertMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..404925f1b9888882be2339160d25e9743f0701f1 --- /dev/null +++ b/plugins/data-migration/src/main/resources/mapper/MigrationTaskAlertMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/data-migration/web-ui/src/locale/locale/en.json b/plugins/data-migration/web-ui/src/locale/locale/en.json index 5b5f50cd5fd599c1fc7d02260dbe1bf534198738..d8958459bde1dcf790cf07a6a32ab7211eb28725 100644 --- a/plugins/data-migration/web-ui/src/locale/locale/en.json +++ b/plugins/data-migration/web-ui/src/locale/locale/en.json @@ -167,7 +167,8 @@ "reverseMigration": "Reverse Migration", "alarmLocation": "Alarm location", "alarmReason": "Alarm Reason", - "alarmTime": "Alarm time", + "firstAlarmTime": "First alarm time", + "latestAlarmTime": "Latest alarm time", "operate": "Operate", "showDetail": "Show detail", "confirm": "Confirm", diff --git a/plugins/data-migration/web-ui/src/locale/locale/zh-cn.json b/plugins/data-migration/web-ui/src/locale/locale/zh-cn.json index 5835955db0cb9d6bb6820ff0df8cff4dba7567b7..07bc21a1c1b768972c3f730b4349a40cb028549e 100644 --- a/plugins/data-migration/web-ui/src/locale/locale/zh-cn.json +++ b/plugins/data-migration/web-ui/src/locale/locale/zh-cn.json @@ -167,7 +167,8 @@ "reverseMigration": "反向迁移", "alarmLocation": "异常告警位置", "alarmReason": "异常告警原因", - "alarmTime": "异常告警时间", + "firstAlarmTime": "首次告警时间", + "latestAlarmTime": "最新告警时间", "operate": "操作", "showDetail": "查看详情", "confirm": "确定", diff --git a/plugins/data-migration/web-ui/src/views/detail/components/ErrorDetail.vue b/plugins/data-migration/web-ui/src/views/detail/components/ErrorDetail.vue index f883bba36fb18699fda62bfe4a080ad359147fa9..8ea80db460b2bd1af9d3993768c508b6bba2e337 100644 --- a/plugins/data-migration/web-ui/src/views/detail/components/ErrorDetail.vue +++ b/plugins/data-migration/web-ui/src/views/detail/components/ErrorDetail.vue @@ -13,9 +13,17 @@
-
{{ $t('components.SubTaskDetail.alarmTime') }}
+
{{ $t('components.SubTaskDetail.firstAlarmTime') }}
-
{{ detailInfo.dateTime }}
+
{{ detailInfo.firstDateTime }}
+
+
+
+ +
+
{{ $t('components.SubTaskDetail.latestAlarmTime') }}
+
+
{{ detailInfo.latestDateTime }}
@@ -118,4 +126,4 @@ const closeModal = () => { } } -} \ No newline at end of file +} diff --git a/plugins/data-migration/web-ui/src/views/detail/components/SubTaskDetail.vue b/plugins/data-migration/web-ui/src/views/detail/components/SubTaskDetail.vue index 4b182ba52a6e5fbbc38658a6a2ae999504bdc5ef..df398161c49599f79b98841f08aff2d737308105 100644 --- a/plugins/data-migration/web-ui/src/views/detail/components/SubTaskDetail.vue +++ b/plugins/data-migration/web-ui/src/views/detail/components/SubTaskDetail.vue @@ -308,7 +308,8 @@ - + +