From 6d7926c020660d7e3150a1a180c8d8a04d7d6211 Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Fri, 3 Dec 2021 21:25:26 +0800 Subject: [PATCH] =?UTF-8?q?[web-app,manager]=20=E7=9B=91=E6=8E=A7=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=8F=96=E6=B6=88=E7=BA=B3=E7=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MonitorsController.java | 25 +++++ .../usthe/manager/service/MonitorService.java | 13 +++ .../service/impl/MonitorServiceImpl.java | 45 +++++++++ .../monitor-list/monitor-list.component.html | 12 +-- .../monitor-list/monitor-list.component.ts | 93 +++++++++++++++++++ web-app/src/app/service/monitor.service.ts | 26 +++++- 6 files changed, 206 insertions(+), 8 deletions(-) diff --git a/manager/src/main/java/com/usthe/manager/controller/MonitorsController.java b/manager/src/main/java/com/usthe/manager/controller/MonitorsController.java index fc50289..61ef8db 100644 --- a/manager/src/main/java/com/usthe/manager/controller/MonitorsController.java +++ b/manager/src/main/java/com/usthe/manager/controller/MonitorsController.java @@ -93,4 +93,29 @@ public class MonitorsController { Message message = new Message<>(); return ResponseEntity.ok(message); } + + @DeleteMapping("manage") + @ApiOperation(value = "批量取消纳管监控", notes = "根据监控ID列表批量取消纳管监控项") + public ResponseEntity> cancelManageMonitors( + @ApiParam(value = "监控IDs", example = "6565463543") @RequestParam(required = false) List ids + ) { + if (ids != null && !ids.isEmpty()) { + monitorService.cancelManageMonitors(new HashSet<>(ids)); + } + Message message = new Message<>(); + return ResponseEntity.ok(message); + } + + @GetMapping("manage") + @ApiOperation(value = "批量启动纳管监控", notes = "根据监控ID列表批量启动纳管监控项") + public ResponseEntity> enableManageMonitors( + @ApiParam(value = "监控IDs", example = "6565463543") @RequestParam(required = false) List ids + ) { + if (ids != null && !ids.isEmpty()) { + monitorService.enableManageMonitors(new HashSet<>(ids)); + } + Message message = new Message<>(); + return ResponseEntity.ok(message); + } + } diff --git a/manager/src/main/java/com/usthe/manager/service/MonitorService.java b/manager/src/main/java/com/usthe/manager/service/MonitorService.java index 9592690..813dd45 100644 --- a/manager/src/main/java/com/usthe/manager/service/MonitorService.java +++ b/manager/src/main/java/com/usthe/manager/service/MonitorService.java @@ -8,6 +8,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.domain.Specification; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -80,4 +81,16 @@ public interface MonitorService { * @return 查询结果 */ Page getMonitors(Specification specification, PageRequest pageRequest); + + /** + * 根据监控ID列表批量取消纳管监控项 + * @param ids 监控IDs + */ + void cancelManageMonitors(HashSet ids); + + /** + * 根据监控ID列表批量启动纳管监控项 + * @param ids 监控IDs + */ + void enableManageMonitors(HashSet ids); } diff --git a/manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java b/manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java index 7c179a5..77a85b3 100644 --- a/manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java +++ b/manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java @@ -27,6 +27,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -282,4 +283,48 @@ public class MonitorServiceImpl implements MonitorService { public Page getMonitors(Specification specification, PageRequest pageRequest) { return monitorDao.findAll(specification, pageRequest); } + + @Override + public void cancelManageMonitors(HashSet ids) { + // 更新监控状态 删除对应的监控周期性任务 + // jobId不删除 待启动纳管之后再次复用jobId + List managedMonitors = monitorDao.findMonitorsByIdIn(ids) + .stream().filter(monitor -> + monitor.getStatus() != CommonConstants.UN_MANAGE && monitor.getJobId() != null) + .peek(monitor -> monitor.setStatus(CommonConstants.UN_MANAGE)) + .collect(Collectors.toList()); + if (!managedMonitors.isEmpty()) { + monitorDao.saveAll(managedMonitors); + for (Monitor monitor : managedMonitors) { + jobScheduling.cancelAsyncCollectJob(monitor.getJobId()); + } + } + } + + @Override + public void enableManageMonitors(HashSet ids) { + // 更新监控状态 新增对应的监控周期性任务 + List unManagedMonitors = monitorDao.findMonitorsByIdIn(ids) + .stream().filter(monitor -> + monitor.getStatus() == CommonConstants.UN_MANAGE && monitor.getJobId() != null) + .peek(monitor -> monitor.setStatus(CommonConstants.AVAILABLE)) + .collect(Collectors.toList()); + if (!unManagedMonitors.isEmpty()) { + monitorDao.saveAll(unManagedMonitors); + for (Monitor monitor : unManagedMonitors) { + // 构造采集任务Job实体 + Job appDefine = appService.getAppDefine(monitor.getApp()); + appDefine.setMonitorId(monitor.getId()); + appDefine.setInterval(monitor.getIntervals()); + appDefine.setCyclic(true); + appDefine.setTimestamp(System.currentTimeMillis()); + List params = paramDao.findParamsByMonitorId(monitor.getId()); + List configmaps = params.stream().map(param -> + new Configmap(param.getField(), param.getValue(), param.getType())).collect(Collectors.toList()); + appDefine.setConfigmap(configmaps); + // 下发采集任务 + jobScheduling.addAsyncCollectJob(appDefine); + } + } + } } diff --git a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html index a2d8426..d5cf9d0 100644 --- a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html +++ b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html @@ -26,11 +26,11 @@ 删除 - - @@ -93,13 +93,13 @@ - - - diff --git a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.ts b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.ts index e532c39..7ddb1d2 100644 --- a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.ts +++ b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.ts @@ -38,6 +38,8 @@ export class MonitorListComponent implements OnInit { this.app = paramMap.get("app") || ''; this.pageIndex = 1; this.pageSize = 8; + this.checkedMonitorIds = new Set(); + this.tableLoading = true; this.loadMonitorTable(); }); } @@ -138,6 +140,97 @@ export class MonitorListComponent implements OnInit { ); } + onCancelManageMonitors() { + if (this.checkedMonitorIds == null || this.checkedMonitorIds.size === 0) { + this.notifySvc.warning("未选中任何待取消项!",""); + return; + } + this.modal.confirm({ + nzTitle: '请确认是否批量取消纳管!', + nzOkText: '确定', + nzCancelText: '取消', + nzOkDanger: true, + nzOkType: "primary", + nzOnOk: () => this.cancelManageMonitors(this.checkedMonitorIds) + }); + } + + onCancelManageOneMonitor(monitorId: number) { + let monitors = new Set(); + monitors.add(monitorId); + this.modal.confirm({ + nzTitle: '请确认是否取消纳管!', + nzOkText: '确定', + nzCancelText: '取消', + nzOkDanger: true, + nzOkType: "primary", + nzOnOk: () => this.cancelManageMonitors(monitors) + }); + } + + cancelManageMonitors(monitors: Set) { + const cancelManage$ = this.monitorSvc.cancelManageMonitors(monitors) + .subscribe(message => { + cancelManage$.unsubscribe(); + if (message.code === 0) { + this.notifySvc.success("取消纳管成功!", ""); + this.loadMonitorTable(); + } else { + this.notifySvc.error("取消纳管失败!", message.msg); + } + }, + error => { + cancelManage$.unsubscribe(); + this.notifySvc.error("取消纳管失败!", error.msg) + } + ); + } + + onEnableManageMonitors() { + if (this.checkedMonitorIds == null || this.checkedMonitorIds.size === 0) { + this.notifySvc.warning("未选中任何待启用纳管项!",""); + return; + } + this.modal.confirm({ + nzTitle: '请确认是否批量启用纳管!', + nzOkText: '确定', + nzCancelText: '取消', + nzOkDanger: true, + nzOkType: "primary", + nzOnOk: () => this.enableManageMonitors(this.checkedMonitorIds) + }); + } + + onEnableManageOneMonitor(monitorId: number) { + let monitors = new Set(); + monitors.add(monitorId); + this.modal.confirm({ + nzTitle: '请确认是否启用纳管!', + nzOkText: '确定', + nzCancelText: '取消', + nzOkDanger: true, + nzOkType: "primary", + nzOnOk: () => this.enableManageMonitors(monitors) + }); + } + + enableManageMonitors(monitors: Set) { + const enableManage$ = this.monitorSvc.enableManageMonitors(monitors) + .subscribe(message => { + enableManage$.unsubscribe(); + if (message.code === 0) { + this.notifySvc.success("启用纳管成功!", ""); + this.loadMonitorTable(); + } else { + this.notifySvc.error("启用纳管失败!", message.msg); + } + }, + error => { + enableManage$.unsubscribe(); + this.notifySvc.error("启用纳管失败!", error.msg) + } + ); + } // begin: 列表多选逻辑 checkedAll: boolean = false; diff --git a/web-app/src/app/service/monitor.service.ts b/web-app/src/app/service/monitor.service.ts index e1bc5f0..1361371 100644 --- a/web-app/src/app/service/monitor.service.ts +++ b/web-app/src/app/service/monitor.service.ts @@ -8,6 +8,7 @@ import {Monitor} from "../pojo/Monitor"; const monitor_uri = "/monitor"; const monitors_uri = "/monitors"; const detect_monitor_uri = "/monitor/detect" +const manage_monitors_uri = "/monitors/manage"; @Injectable({ providedIn: 'root' @@ -31,13 +32,34 @@ export class MonitorService { public deleteMonitors(monitorIds: Set) : Observable> { let httpParams = new HttpParams(); monitorIds.forEach(monitorId => { - // 注意HttpParams是不可变对象 需要保存set后返回的对象为最新对象 - httpParams = httpParams.set('ids', monitorId); + // 注意HttpParams是不可变对象 需要保存append后返回的对象为最新对象 + // append方法可以叠加同一key, set方法会把key之前的值覆盖只留一个key-value + httpParams = httpParams.append('ids', monitorId); }) const options = { params: httpParams }; return this.http.delete>(monitors_uri, options); } + public cancelManageMonitors(monitorIds: Set) : Observable> { + let httpParams = new HttpParams(); + monitorIds.forEach(monitorId => { + // 注意HttpParams是不可变对象 需要保存append后返回的对象为最新对象 + // append方法可以叠加同一key, set方法会把key之前的值覆盖只留一个key-value + httpParams = httpParams.append('ids', monitorId); + }) + const options = { params: httpParams }; + return this.http.delete>(manage_monitors_uri, options); + } + + public enableManageMonitors(monitorIds: Set) : Observable> { + let httpParams = new HttpParams(); + monitorIds.forEach(monitorId => { + httpParams = httpParams.append('ids', monitorId); + }) + const options = { params: httpParams }; + return this.http.get>(manage_monitors_uri, options); + } + public detectMonitor(body: any) : Observable> { return this.http.post>(detect_monitor_uri, body); }