当前位置: 首页 > news >正文

统计服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息

在这里插入图片描述

文章目录

  • 一、背景
  • 二、说明
  • 三、页面
  • 四、代码
    • 前端
      • MonitorServiceProcessPage.vue
      • MonitorServiceProcessTable.vue
      • MonitorServiceProcessTableButton.vue
      • addMonitorTask.vue
      • productOperation.vue
      • showMonitorTask.vue
      • MonitorSystemLog.vue
      • MonitorTask.vue
      • MonitorTaskLog.vue
      • RealtimeCpuMonitor.vue
      • RealtimeDiskMonitor.vue
      • RealtimeMemoryMonitor.vue
      • RealtimeMonitor.vue
    • 后端
      • pom.xml
      • en_US.js
      • zh_CN.js
      • MonitorTaskController
      • IMonitorTaskService
      • MonitorTaskServiceImpl
      • MonitorTaskMapper
      • MonitorTaskMapper.xml
      • MonitorThresholdPo
      • MonitorTaskPo
      • MonitorTaskLog
      • MonitorTask
      • WServerHelper
      • SystemMonitor
      • MonitorPo
      • MonitorConfig
      • AlarmThresholdConstants
      • IFmCurrentService
      • MonitorTaskExe
  • 本人其他相关文章链接

一、背景

我们项目的目标是开发一个类似于电脑任务资源管理器的监控工具。该工具将具备以下功能:

  • 监控系统资源:实时监测 CPU、内存和磁盘空间的使用情况。
  • 创建监控任务:用户可以设置监控任务,并定义相应的监控阈值。
  • 定时记录:系统将每分钟记录当前的监控数据,无论这些数据是否超过设定的阈值。
  • 报警机制:当当前监控值超过设定的阈值时,系统将自动触发报警。

通过这些功能,我们希望能够提供一个全面的资源监控解决方案,帮助用户及时了解系统性能并采取必要的措施。
在这里插入图片描述

二、说明

说明点1
功能介绍:
允许创建监控任务,支持“激活/停止”任务
允许查看监控记录,程序每分钟上报检测值
允许查看CPU、内存、磁盘空间使用情况,后端采用websocket推送前端页面,页面采用echart动态滚动上报

说明点2
当前代码有些混乱,全部记录了,所以这里简单介绍下重要的文件:
MonitorTaskExe:定时任务,监控CPU等信息websocket推送前端;监控记录信息入库;超过阈值上报告警
WServerHelper:websocket实现类
MonitorTaskController:任务管理增删改实现逻辑

说明点3
定时任务有以下几种:
scheduleRealTimeTask方法:每5秒执行一次,实时性能查询任务(及CPU、内存、磁盘空间)
scheduleMonitorTask方法:每1分钟执行一次,查询记录入库
scheduleCleanTaskLog方法:每天凌晨清理性能任务日志 仅保留三天内的数据
taskClearTiming方法:任务清理,判断任务是否到达采样时间,超过时间则直接停止任务

三、页面

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

字段介绍

  • System Info:系统信息
  • Record Time:记录时间
  • Cpu Usage Threshold(%):Cpu使用率阈值(%)
  • Memory Usage Threshold(%):内存使用率阈值(%)
  • Disk Space Usage Threshold(%):磁盘空间使用率阈值(%)
  • Network Rx Rate/s:网络接收数据包速率/s
  • Network Tx Rate/s:网络发送数据包速率/s
  • IOPS kB_read/s:IOPS读取数据量/s
  • IOPS kB_wrtn/s:IOPS写入数据量/s
  • Total number of stored queue operations/s:存储队列操作总数/s
  • Database disk space used in the file system:文件系统中数据库磁盘空间占用大小
  • SBI alarm number/s:南向告警数量/s

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、代码

前端

在这里插入图片描述

MonitorServiceProcessPage.vue

<template><BasicLayout :left='left' :middle='middle' :right='right'><template v-slot:right_view><div class='h100vh-100'><MonitorServiceProcessTableButton @notice='notice'></MonitorServiceProcessTableButton><MonitorServiceProcessTable ref="monitorServiceProcess"></MonitorServiceProcessTable></div></template></BasicLayout>
</template><script>
import BasicLayout from '@/layouts/BasicLayout';
import MonitorServiceProcessTableButton from "@/views/monitor/monitorServiceProcess/MonitorServiceProcessTableButton";
import MonitorServiceProcessTable from "@/views/monitor/monitorServiceProcess/MonitorServiceProcessTable";export default {name: "monitorServiceProcessPage",components:{BasicLayout,MonitorServiceProcessTableButton,MonitorServiceProcessTable},data() {return {left: {show: false,name: ''},middle: {show: false,name: ''},right: {show: true,crumb: `${this.$t('Security.securityManage')}`+'/' + `${this.$t('Monitor.monitor')}` + '/' + `${this.$t('Monitor.task.monitoringServiceProcess')}`}};},methods: {notice(type) {switch (type) {case 'refresh':this.$refs.monitorServiceProcess.getMonitorServiceProcessListData();break;case 'doActiveTask':this.$refs.monitorServiceProcess.doActiveTask();break;case 'doUnactiveTask':this.$refs.monitorServiceProcess.doUnactiveTask();break;default:}}}
}
</script><style scoped></style>

MonitorServiceProcessTable.vue

<template><div class='h100-40 width-100vw h-scroll'><ejs-grid ref='grid' height='calc(100% - 0px)' :dataSource='monitorServiceProcessData' :contextMenuItems="contextMenuItems" :contextMenuOpen='menuBeforeOpenFunc' :contextMenuClick='menuClickFunc':selectionSettings='selectionOptions' :allowReordering='true' :allowResizing='true' ><e-columns><e-column type='checkbox' textAlign='Center' width='66'></e-column><e-column field='componentName' :headerText='$t("Topo.service") + $t("DeployManagement.type")' textAlign='Center' minWidth='10' clipMode='EllipsisWithTooltip'></e-column><e-column field='state' :headerText='$t("DeployManagement.runStatus")' :disableHtmlEncode='false' :formatter='formatActiveState' textAlign='Center' minWidth='10' clipMode='EllipsisWithTooltip'></e-column><e-column field='description' :headerText='$t("MCS.description")' textAlign='Center' minWidth='10' clipMode='EllipsisWithTooltip'></e-column><e-column field='activeTime' :headerText='$t("Monitor.systemLog.productStart")' textAlign='Center' minWidth='10' type='date' :format='dateFormatOptions' clipMode='EllipsisWithTooltip'></e-column><e-column field='unactiveTime' :headerText='$t("Pm.hangupTime")' textAlign='Center' minWidth='10' type='date' :format='dateFormatOptions' clipMode='EllipsisWithTooltip'></e-column></e-columns></ejs-grid><ejs-pager ref='pager' @click='getMonitorServiceProcessListData' :currentPage='page.pageNo' :pageSize='page.pageSize' :totalRecordsCount='page.totalCount' :pageCount='page.pageCount'></ejs-pager></div>
</template><script>
import { EventBus } from '../../../plugins/eventBus';export default {name: "monitorServiceProcessTable",data() {return {selectionOptions: { type: 'Multiple' },dateFormatOptions: { type: 'date', format: 'yyyy-MM-dd HH:mm:ss' },contextMenuItems: [{text: `${this.$t('Alarm.refresh')}`}, {text: `${this.$t('Monitor.systemLog.startup')}`}, {text: `${this.$t('Monitor.systemLog.shutdown')}`}],page: {pageNo: 1,pageSize: 15,totalCount: 3,pageCount: 1},monitorServiceProcessData: [],}},methods: {formatActiveState(grids, data) {let color = '';switch (data.state) {case 'down':color = 'red';break;case 'up':color = 'green';break;case 'exception':color = 'orange';break;default:break;}return `<span style='background-color:${color};font-size: 12px;display: inline-block;width: 55px;height: 22px;color: #fff;line-height: 22px;' >${data.state}</span>`;},getCheckedData(selectOnly) {// false: 不支持多选   true: 支持多选const selectedRecords = this.$refs.grid.getSelectedRecords();if (selectedRecords.length < 1) {EventBus.$emit('toast', {type: 'warning', content: this.$t('Alarm.no_checked')});return false;}if (selectedRecords.length > 1 && !selectOnly) {EventBus.$emit('toast', {type: 'warning', content: this.$t('Common.tips.onlyOneSelect')});return false;}return selectedRecords;},getCheckedVals() {const ids = [];const checkedData = this.getCheckedData(true);for (let i = 0; i < checkedData.length; i++) {ids.push(checkedData[i].id);}return ids;},//批量查询getMonitorServiceProcessListData() {console.log("******getMonitorServiceProcessListData()")//获取表格数据const This = this;This.$axios.get('/lte/ems/oss/component/state', {}).then((response) => {if (response && response.data.errorCode === 'SUCCESS') {const result = response.data.resultVal;let getResult = resultgetResult.forEach(item => {if (item.description != "" || item.description != null || item.description != undefined) {item.description = this.$t(item.description);}})This.monitorServiceProcessData = getResult;}});},//启动服务doActiveTask() {console.log("******doActiveTask()")const This = this;const checkedData = This.getCheckedData(true);const list = [];for (let i = 0; i < checkedData.length; i++) {list.push({state: 1, id: checkedData[i].id, activeTime: new Date()});}let str = This.$t('Track.activation');if (checkedData) {This.$layer.confirm({title: this.$t('System.tip'),msg: `${str}?`,btn1: {msg: this.$t('Alarm.cancel')},btn2: {msg: this.$t('Alarm.confirm'),func: () => {This.$axios.post('/lte/ems/oss/component/updateMonitorServiceProcess', {list: list}).then((response) => {if (response && response.data.errorCode === 'SUCCESS') {EventBus.$emit('toast', {type: 'success', content: this.$t('Alarm.success')});} else if (response && response.data.errorCode === '1001') {EventBus.$emit('toast', {type: 'error', content: this.$t(response.data.errorString)});} else if (response && response.data.errorCode === '16002') {EventBus.$emit('toast', {type: 'error', content: this.$t('ErrorCode.16002')});} else {EventBus.$emit('toast', {type: 'error', content: this.$t('Alarm.error')});}This.getMonitorServiceProcessListData();});}}});}},//挂起服务doUnactiveTask() {console.log("******doUnactiveTask()")const This = this;const checkedData = This.getCheckedData(true);const list = [];for (let i = 0; i < checkedData.length; i++) {list.push({state: 0, id: checkedData[i].id, unactiveTime: new Date()});}let str = This.$t('Track.hangup');if (checkedData) {This.$layer.confirm({title: this.$t('System.tip'),msg: `${str}?`,btn1: {msg: this.$t('Alarm.cancel')},btn2: {msg: this.$t('Alarm.confirm'),func: () => {This.$axios.post('/lte/ems/oss/component/updateMonitorServiceProcess', {list: list}).then((response) => {if (response && response.data.errorCode === 'SUCCESS') {EventBus.$emit('toast', {type: 'success', content: this.$t('Alarm.success')});} else if (response && response.data.errorCode === '1002') {EventBus.$emit('toast', {type: 'error', content: this.$t(response.data.errorString)});} else if (response && response.data.errorCode === '16001') {EventBus.$emit('toast', {type: 'error', content: this.$t('ErrorCode.16001')});} else {EventBus.$emit('toast', {type: 'error', content: this.$t('Alarm.error')});}This.getMonitorServiceProcessListData();});}}});}},menuBeforeOpenFunc(menuArgs) { // 屏蔽表头的右键事件if (!menuArgs.rowInfo.rowIndex && menuArgs.rowInfo.rowIndex !== 0) {menuArgs.cancel = true;}const childList = menuArgs.element.querySelectorAll('li.e-menu-item');if (this.getCheckedData(true).length > 1) {childList[2].style.display = 'none';} else {childList[2].style.display = 'block';}},menuClickFunc(menuArgs) { // 为右键分配事件console.log("******menuArgs:", menuArgs)switch (menuArgs.element.innerText) {case `${this.$t('Alarm.refresh')}`:this.getMonitorServiceProcessListData();break;case `${this.$t('Monitor.systemLog.startup')}`:this.doActiveTask();break;case `${this.$t('Monitor.systemLog.shutdown')}`:this.doUnactiveTask();break;default:}}},mounted() {this.getMonitorServiceProcessListData();}
}
</script><style scoped></style>

MonitorServiceProcessTableButton.vue

<template><div class='h-toolbarBg'><ejs-toolbar><e-items><e-item prefixIcon='icon hero-icon hero-icon-refresh' :tooltipText='$t("Alarm.refresh")' :click='notices' eventType='refresh'></e-item><e-item prefixIcon='icon hero-icon hero-icon-start-up' :tooltipText='$t("Monitor.systemLog.startup")' :click='notices' eventType='doActiveTask'></e-item><e-item prefixIcon='icon hero-icon hero-icon-disable' :tooltipText='$t("Monitor.systemLog.shutdown")' :click='notices' eventType='doUnactiveTask'></e-item></e-items></ejs-toolbar></div>
</template><script>
export default {name: "monitorServiceProcessTableButton",methods: {notices(args) {this.$emit('notice', args.item.eventType);}}
}
</script><style scoped></style>

addMonitorTask.vue

<template><div id="addReportTaskContainer"><form id="monitorTaskForm"><div class="row h-row-inputBox"><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.task.taskName')}}:</div><input name="taskName" :placeholder="$t('Monitor.task.taskName')" v-model="monitorTask.taskName"class="e-input e-input-group" maxlength="20" /><div class="error"></div></div></div></div><div class="col-sm-6 h-col-inputBox" style="display: none"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.task.product')}}:</div><ejs-dropdownlist :dataSource="productList" v-model="monitorTask.product" name="product":fields="fieldsFormat" @change="productChange" ></ejs-dropdownlist><div class="error"></div></div></div></div><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.record.diskSpaceThreshold')}}:</div><input name="spaceThreshold" :placeholder="$t('Monitor.record.diskSpaceThreshold')" v-model="monitorThresholdPo.spaceThreshold"class="e-input e-input-group" maxlength="20" /><div class="error"></div></div></div></div></div><div class="row h-row-inputBox"><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.record.cpuThreshold')}}:</div><input name="cpuThreshold" :placeholder="$t('Monitor.record.cpuThreshold')" v-model="monitorThresholdPo.cpuThreshold"class="e-input e-input-group" maxlength="20" /><div class="error"></div></div></div></div><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.record.memoryThreshold')}}:</div><input name="memoryThreshold" :placeholder="$t('Monitor.record.memoryThreshold')" v-model="monitorThresholdPo.memoryThreshold"class="e-input e-input-group" maxlength="20" /><div class="error"></div></div></div></div></div><div class="row h-row-inputBox"><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.task.sampleStart')}}:</div><ejs-datetimepicker :format="dateFormat" v-model="monitorTask.sampleStart" ref="startTime" name="sampleStart"class="e-input" :allowEdit="false" @keydown.native="stopEvent" :locale="locale"></ejs-datetimepicker><div class="error"></div></div></div></div><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.task.sampleEnd')}}:</div><ejs-datetimepicker :format="dateFormat" v-model="monitorTask.sampleEnd" ref="endTime" name="sampleEnd"class="e-input" :allowEdit="false" :min="monitorTask.sampleStart" @keydown.native="stopEvent" :locale="locale"></ejs-datetimepicker><div class="error"></div></div></div></div></div></form></div>
</template><script>import { CheckBoxSelection } from '@syncfusion/ej2-vue-dropdowns';import { FormValidator } from "@syncfusion/ej2-vue-inputs";import mixin from '../../../mixin/mixin';export default {name: 'AddReportTask',mixins: [mixin],displayFlag : 'none',props: {baseType: Number,},components: {},data() {return {formValidator: '',dateFormat: "yyyy-MM-dd HH:mm:ss",locale: localStorage.getItem('locale'),currentDay: new Date(),productList: [],monitorTask: {taskName: '',product: 'PLATFORM',sampleStart: '',sampleEnd: '',},monitorThresholdPo: {cpuThreshold: '',memoryThreshold: '',spaceThreshold: '',},fieldsFormat: {text: "text",value: "value"},formatList: [{ text: "csv", value: "csv" },{ text: "excel", value: "excel" },],validateOptions: {customPlacement: function(inputElement, errorElement) {console.log("******validateOptions-inputElement:", inputElement)console.log("******validateOptions-errorElement:", errorElement)inputElement = inputElement.closest('.form-group').querySelector('.error');inputElement.parentElement.appendChild(errorElement);},rules: {'taskName': {required: [true, `${this.$t('Monitor.placeholder.taskName')}`],},// 'product': {//     required: [true, `${this.$t('Monitor.placeholder.product')}`],// },'cpuThreshold': {number: [true, this.$t('MCS.insertNum')],max: [100, this.$t('System.input1t100')],},'spaceThreshold': {number: [true, this.$t('MCS.insertNum')],max: [100, this.$t('System.input1t100')],},'memoryThreshold': {number: [true, this.$t('MCS.insertNum')],max: [100, this.$t('System.input1t100')],},'sampleStart': {required: [true, `${this.$t('Monitor.placeholder.sampleStart')}`],},'sampleEnd': {required: [true, `${this.$t('Monitor.placeholder.sampleEnd')}`],},}}}},methods: {init(){this.getProductList();this.formValidator = new FormValidator('#monitorTaskForm', this.validateOptions);},getProductList() {this.$axios.get("/lte/ems/sys/monitor/log/findProducts").then(response => {let resultVal = response.data.resultVal;resultVal = resultVal.filter(item => !item.includes('ems_5gc') && !item.includes('ems_gnb') && !item.includes('ems_tr069'));for (let i = 0; i < resultVal.length; i++) {this.productList.push({text: resultVal[i],value: resultVal[i],});}});},productChange() {this.monitorTask.product = msg.value;},getMonitorTask() {return {monitorTask: {taskName: this.monitorTask.taskName,product: this.monitorTask.product,sampleStart: (new Date(this.monitorTask.sampleStart)).getTime(),sampleEnd: (new Date(this.monitorTask.sampleEnd)).getTime(),},monitorThresholdPo: {cpuThreshold: this.monitorThresholdPo.cpuThreshold,memoryThreshold: this.monitorThresholdPo.memoryThreshold,spaceThreshold: this.monitorThresholdPo.spaceThreshold,},}},validation() {let status = this.formValidator.validate();return status;},stopEvent(event) {if (event.keyCode == 13) {event.cancelBubble = true;event.returnValue = false;return false;}}}};
</script>

productOperation.vue

<template><div><div class="h-toolbarBg"><ejs-toolbar :items="toolbarItems"></ejs-toolbar></div><div class="h100-80 h-scroll"><ejs-grid :dataSource="monitorTaskLogData" :allowPaging="true" ref="grid" :allowExcelExport='true' ><e-columns><!-- <e-column type="checkbox" width="50" textAlign="center"></e-column> --><e-column field="code" :visible="false"></e-column><e-column field="name" :headerText="$t('Monitor.record.product')" width="120" textAlign="Center"></e-column></e-columns></ejs-grid></div></div>
</template>
<script>
import BasicLayout from '../../../layouts/BasicLayout';
import { EventBus } from '../../../plugins/eventBus';export default {name: 'monitorSystemLog',components: {BasicLayout,},data() {return {toolbarItems: [{ prefixIcon: 'icon hero-icon hero-icon-confirm', tooltipText: this.$t('Monitor.systemLog.startup'), click: this.startup },{ prefixIcon: 'icon hero-icon hero-icon-disable', tooltipText: this.$t('Monitor.systemLog.shutdown'), click: this.shutdown },],monitorTaskLogData: [],product: '',productList: [],};},mounted() {let That = this;},methods: {getproductList() {const url = '/lte/ems/sys/monitor/log/getProducts';const That = this;this.axios.get(url).then(response => {let productList = response.data.filter(item => !item.name.includes('ems_5gc') && !item.name.includes('ems_gnb') && !item.name.includes('ems_tr069'));That.monitorTaskLogData = productList;});},startup() {const record = this.getRecord();debuggerif (record.length === 0) {EventBus.$emit('toast', {type: 'warning', content: this.$t('Common.tips.selectOne')});return null;}if (record.length !== 1) {EventBus.$emit('toast', {type: 'warning', content: this.$t('Common.tips.onlyOneSelect')});return null;}const url = '/lte/ems/sys/monitor/log/startShell?code=' + record[0].code;this.axios.get(url).then(response => {const result = response.data;if(result) {EventBus.$emit('toast', {type: 'success', content: this.$t('Monitor.systemLog.startupSuccess')});} else {EventBus.$emit('toast', {type: 'error', content: this.$t('Monitor.systemLog.startupFail')});}});},shutdown() {const record = this.getRecord();debuggerif (record.length === 0) {EventBus.$emit('toast', {type: 'warning', content: this.$t('Common.tips.selectOne')});return null;}if (record.length !== 1) {EventBus.$emit('toast', {type: 'warning', content: this.$t('Common.tips.onlyOneSelect')});return null;}const url = '/lte/ems/sys/monitor/log/shutdownShell?code=' + record[0].code;this.axios.get(url).then(response => {const result = response.data;if(result) {EventBus.$emit('toast', {type: 'success', content: this.$t('Monitor.systemLog.shutdownSuccess')});} else {EventBus.$emit('toast', {type: 'error', content: this.$t('Monitor.systemLog.shutdownFail')});}});},getRecord() {const result = this.$refs.grid.getSelectedRecords();if (result === null || result === '') {this.$parent.showToast('warning',`${this.$t('Common.tips.noSelect')}`);return null;}return result;},},watch: {screenHeight(val) {this.screenHeight = val;}}
};
</script>

showMonitorTask.vue

<template><div id="addReportTaskContainer"><form id="reportTaskForm"><div class="row h-row-inputBox"><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.task.taskName')}}:</div><input name="taskName" v-model="monitorTask.taskName" class="e-input e-input-group" maxlength="20" /><div class="error"></div></div></div></div><div class="col-sm-6 h-col-inputBox" style="display: none"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.task.product')}}:</div><input name="product" v-model="monitorTask.product"  readonly="readonly"class="e-input e-input-group" maxlength="20" /><div class="error"></div></div></div></div><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.record.diskSpaceThreshold')}}:</div><input name="spaceThreshold" :placeholder="$t('Monitor.record.diskSpaceThreshold')" v-model="monitorThresholdPo.spaceThreshold" class="e-input e-input-group" maxlength="20" /><div class="error"></div></div></div></div></div><div class="row h-row-inputBox"><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.record.cpuThreshold')}}:</div><input name="cpuThreshold" v-model="monitorThresholdPo.cpuThreshold" class="e-input e-input-group" maxlength="20" /><div class="error"></div></div></div></div><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.record.memoryThreshold')}}:</div><input name="memoryThreshold" v-model="monitorThresholdPo.memoryThreshold"class="e-input e-input-group" maxlength="20" /><div class="error"></div></div></div></div></div><div class="row h-row-inputBox"><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.task.sampleStart')}}:</div><ejs-datepicker :format="dateFormat" v-model="monitorTask.sampleStart" ref="startTime" name="sampleStart" readonly="readonly"class="e-input" :allowEdit="false" @keydown.native="stopEvent" :locale="locale"></ejs-datepicker></div></div></div><div class="col-sm-6 h-col-inputBox"><div class="form-group"><div class="e-float-input"><div class="h-inputLit"><span class="h-red-code">* </span>{{$t('Monitor.task.sampleEnd')}}:</div><ejs-datepicker :format="dateFormat" v-model="monitorTask.sampleEnd" ref="endTime" name="sampleEnd" readonly="readonly"class="e-input" :allowEdit="false" @keydown.native="stopEvent" :locale="locale"></ejs-datepicker></div></div></div></div></form></div>
</template>
<script>import { CheckBoxSelection } from '@syncfusion/ej2-vue-dropdowns';import { FormValidator } from "@syncfusion/ej2-vue-inputs";import mixin from '../../../mixin/mixin';export default {name: 'AddReportTask',mixins: [mixin],displayFlag : 'none',props: {baseType: Number,},components: {},data() {return {formValidator: '',dateFormat: "yyyy-MM-dd HH:mm:ss",locale: localStorage.getItem('locale'),currentDay: new Date(),monitorTask: {taskId:'',taskName: '',product: '',sampleStart: '',sampleEnd: '',},monitorThresholdPo: {cpuThreshold: '',memoryThreshold: '',spaceThreshold: '',},productList: [],fieldsFormat: {text: "text",value: "value"},formatList: [{ text: "csv", value: "csv" },{ text: "excel", value: "excel" },],validateOptions: {customPlacement: function(inputElement, errorElement) {console.log("******validateOptions-inputElement:", inputElement)console.log("******validateOptions-errorElement:", errorElement)inputElement = inputElement.closest('.form-group').querySelector('.error');inputElement.parentElement.appendChild(errorElement);},rules: {'taskName': {required: [true, `${this.$t('Monitor.placeholder.taskName')}`],},// 'product': {//     required: [true, `${this.$t('Monitor.placeholder.product')}`],// },'cpuThreshold': {number: [true, this.$t('MCS.insertNum')],max: [100, this.$t('System.input1t100')],},'spaceThreshold': {number: [true, this.$t('MCS.insertNum')],max: [100, this.$t('System.input1t100')],},'memoryThreshold': {number: [true, this.$t('MCS.insertNum')],max: [100, this.$t('System.input1t100')],},'sampleStart': {required: [true, `${this.$t('Monitor.placeholder.sampleStart')}`],},'sampleEnd': {required: [true, `${this.$t('Monitor.placeholder.sampleEnd')}`],},}}}},methods: {init(editId){this.monitorTask.taskId = editIdconst baseUrl = '/lte/ems/sys/monitor/task/queryId';const params = { params: {id: editId} };const That = this;this.axios.get(baseUrl, params).then(response => {const result = response.data;var monitorTask = result.monitorTask;this.monitorTask.taskName = monitorTask.taskName;this.monitorTask.product = monitorTask.product;if(monitorTask.sampleStart != null && monitorTask.sampleStart != ''){this.monitorTask.sampleStart = new Date(monitorTask.sampleStart).Format("yyyy-MM-dd HH:mm:ss");}if(monitorTask.sampleEnd != null && monitorTask.sampleEnd != ''){this.monitorTask.sampleEnd = new Date(monitorTask.sampleEnd).Format("yyyy-MM-dd HH:mm:ss");}var monitorThresholdPo = result.monitorThresholdPo;this.monitorThresholdPo.cpuThreshold = monitorThresholdPo.cpuThreshold;this.monitorThresholdPo.memoryThreshold = monitorThresholdPo.memoryThreshold;this.monitorThresholdPo.spaceThreshold = monitorThresholdPo.spaceThreshold;});this.formValidator = new FormValidator('#reportTaskForm', this.validateOptions);},getMonitorTask() {return {monitorTask: {id:this.monitorTask.taskId,taskName: this.monitorTask.taskName,product: this.monitorTask.product,sampleStart: (new Date(this.monitorTask.sampleStart)).getTime(),sampleEnd: (new Date(this.monitorTask.sampleEnd)).getTime(),},monitorThresholdPo: {cpuThreshold: this.monitorThresholdPo.cpuThreshold,memoryThreshold: this.monitorThresholdPo.memoryThreshold,spaceThreshold: this.monitorThresholdPo.spaceThreshold,},}},validation() {let status = this.formValidator.validate();return status;},stopEvent(event) {if (event.keyCode == 13) {event.cancelBubble = true;event.returnValue = false;return false;}}}};
</script>

MonitorSystemLog.vue

<template><BasicLayout :left="left" :middle="middle" :right="right"><template v-slot:right_view><div class="h-toolbarBg"><!-- <ejs-toolbar :items="toolbarItems"> --><ejs-toolbar><e-items><e-item v-if = 'isShow_Operation' prefixIcon='icon hero-icon hero-icon-business-operation' :tooltipText="$t('Monitor.systemLog.operation')" :click="operationShow"></e-item><e-item v-if = 'isShow_Refresh' prefixIcon='icon hero-icon hero-icon-refresh' :tooltipText="$t('Alarm.refresh')" :click="refreshGrid"></e-item></e-items> </ejs-toolbar><div class='h-inputBox'>{{$t('Monitor.task.product')}}:<ejs-dropdownlist :dataSource="productList" v-model="product":fields="fieldsType" name="productCheck"  @change="productChange" ></ejs-dropdownlist></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class='h-inputBox'>{{$t('Monitor.systemLog.logType')}}:<ejs-dropdownlist :dataSource="logTypeList" v-model="logType":fields="fieldsType" name="logTypeCheck"  @change="logTypeChange" ></ejs-dropdownlist></div></div><div class="h100-80 h-scroll"><ejs-grid :dataSource="monitorSystemLogData" :allowPaging="true" ref="grid" :pageSettings="pageSettings" :height="screenHeight" :allowExcelExport='true' ><e-columns><!-- <e-column type="checkbox" width="50" textAlign="center"></e-column> --><e-column field="id" :visible="false"></e-column><e-column field="product" :headerText="$t('Monitor.systemLog.product')" width="120" textAlign="Center"></e-column><e-column field="systemInfo" :headerText="$t('Monitor.systemLog.systemInfo')" width="120" textAlign="Center"></e-column><!-- <e-column field="processInfo" :headerText="$t('Monitor.systemLog.processInfo')" width="120" textAlign="Center"></e-column> --><e-column field="logType" :headerText="$t('Monitor.systemLog.logType')" :formatter='logTypeFormat' width="120" textAlign="Center"></e-column><e-column field="recordTime" :headerText="$t('Monitor.systemLog.recordTime')" :format="dateFormat" width="120" textAlign="Center" clipMode="EllipsisWithTooltip"></e-column><e-column field="productStart" :headerText="$t('Monitor.systemLog.productStart')" :format="dateFormat" width="120" textAlign="Center" clipMode="EllipsisWithTooltip"></e-column><e-column field="productEnd" :headerText="$t('Monitor.systemLog.productEnd')" :format="dateFormat" width="120" textAlign="Center" clipMode="EllipsisWithTooltip"></e-column><e-column field="message" :headerText="$t('Monitor.systemLog.message')" width="120" textAlign="Center"></e-column></e-columns></ejs-grid><ejs-pagerref="pager":pageSize="pageSettings.pageSize":pageCount="page.pageCount":currentPage="page.pageNo":totalRecordsCount="page.totalRecordsCount"@click="getMonitorTaskList"></ejs-pager></div><CustomDialog ref="productOperationDialog" v-bind:element="operatDialog.element" v-bind:styles="operatDialog.styles" ><template v-slot:dialog-content><ProductOperation ref="productOperationPage"></ProductOperation></template></CustomDialog></template></BasicLayout>
</template>
<script>
import CustomDialog from "../../components/common/CustomDialog";
import BasicLayout from '../../layouts/BasicLayout';
import {ExcelExport} from '@syncfusion/ej2-vue-grids';
import ProductOperation from './monitorTask/productOperation';export default {name: 'monitorSystemLog',provide: {grid: [ExcelExport]},components: {CustomDialog,BasicLayout,ProductOperation,},data() {return {isShow_Operation: JSON.parse(sessionStorage.getItem('authMap')).monitor_system_log.Operation,isShow_Refresh: JSON.parse(sessionStorage.getItem('authMap')).monitor_system_log.Refresh,monitorSystemLogData: [],left: { show: false, name: '' },middle: { show: false, name: '' },right: { show: true, crumb: `${this.$t('Security.securityManage')}`+'/' + `${this.$t('Monitor.monitor')}` + '/' + `${this.$t('Monitor.systemLog.titleName')}` },toolbarItems: [{ prefixIcon: 'icon hero-icon hero-icon-business-operation', tooltipText: this.$t('Monitor.systemLog.operation'), click: this.operationShow },{ prefixIcon: 'icon hero-icon hero-icon-refresh', tooltipText: this.$t('Alarm.refresh'), click: this.refreshGrid },],product: '',logType: '',productList: [],logTypeList: [{ text: `${this.$t('MCS.all')}`, value: "" },{ text: `${this.$t('Monitor.systemLog.run')}`, value: "run" },{ text: `${this.$t('Monitor.systemLog.start')}`, value: "start" },],pageSettings: { pageSize: 15 },page: {pageCount: 4,totalRecordsCount: 0,pageNo: 1,},dateFormat: {type: 'date', format: 'yyyy-MM-dd HH:mm:ss'},fieldsType: {text: "text",value: "value"},addStatus: true,operatDialog: {element: {target: '#app',isClose: true,refName: 'productOperationDialog',buttonGroup: [{click: this.dialogHide,buttonModel: { content: `${this.$t('Common.close')}` }},],title: `${this.$t('Monitor.systemLog.operation')}`},styles: {width: '500px',height: '500px',model: true,visible: false}},screenHeight: document.body.clientHeight - 240};},mounted() {this.getMonitorTaskList();this.getProductList();let That = this;},methods: {logTypeFormat(grids, data) {if(data.logType == 'run'){return `${this.$t('Monitor.systemLog.run')}`;}else if(data.logType == 'start'){return `${this.$t('Monitor.systemLog.start')}`;}},getMonitorTaskList() {const url = '/lte/ems/sys/monitor/log/queryMonitorSysLog';this.page.pageNo = this.$refs.pager.ej2Instances.currentPage;const params = { params: {product: this.product,logType: this.logType,pageNo: this.page.pageNo,pageSize: this.pageSettings.pageSize} };const That = this;this.axios.get(url, params).then(response => {const result = response.data.result;result.forEach((v) => {if (!!v.recordTime) {let date = new Date();date.setTime(v.recordTime);v.recordTime = date;}if (!!v.productStart) {let date = new Date();date.setTime(v.productStart);v.productStart = date;}if (!!v.productEnd) {let date = new Date();date.setTime(v.productEnd);v.productEnd = date;}// if (v.logType =='start' && v.status == '0') {//   v.productEnd = null;// }});That.monitorSystemLogData = result;That.page.totalRecordsCount = response.data.totalCount;});},productChange(msg){this.product = msg.value;this.getMonitorTaskList();},operationShow() {this.$refs.productOperationPage.getproductList();this.$refs.productOperationDialog.show();},logTypeChange(msg){this.logType = msg.value;this.getMonitorTaskList();},getProductList() {this.$axios.get("/lte/ems/sys/monitor/log/findProducts").then(response => {let resultVal = response.data.resultVal;resultVal = resultVal.filter(item => !item.includes('ems_5gc') && !item.includes('ems_gnb') && !item.includes('ems_tr069'));this.productList.push({ text: `${this.$t('MCS.all')}`, value: "" });for (let i = 0; i < resultVal.length; i++) {this.productList.push({text: resultVal[i],value: resultVal[i],});}});},dialogHide() {this.$refs.productOperationDialog.clear();this.$refs.productOperationDialog.close();},filterMonitorTask() {this.getMonitorTaskList();},refreshGrid() {this.product='';this.logType='';this.getMonitorTaskList();},},watch: {screenHeight(val) {this.screenHeight = val;}}
};
</script>

MonitorTask.vue

<template><BasicLayout :left="left" :middle="middle" :right="right"><template v-slot:right_view><div class="h-toolbarBg"><!-- <ejs-toolbar :items="toolbarItems"> --><ejs-toolbar><e-items><e-item  v-if='isShow_Add' prefixIcon='icon hero-icon hero-icon-add' :tooltipText="$t('Security.add')" :click="showAddDialog"></e-item><e-item  v-if='isShow_Start' prefixIcon='icon hero-icon hero-icon-start-up' :tooltipText="$t('Pm.startUp')" :click="activeMonitorTask"></e-item><e-item  v-if='isShow_Pause' prefixIcon='icon hero-icon hero-icon-disable' :tooltipText="$t('System.deactiveTask')" :click="deactiveMonitorTask"></e-item><e-item  v-if='isShow_Modify' prefixIcon='icon hero-icon hero-icon-edit' :tooltipText="$t('Track.detail')" :click="showEditDialog"></e-item><e-item  v-if='isShow_Delete' prefixIcon='icon hero-icon hero-icon-remove' :tooltipText="$t('Security.delete')" :click="deleteMonitorTask"></e-item><e-item  v-if='isShow_Refresh' prefixIcon='icon hero-icon hero-icon-refresh' :tooltipText="$t('Alarm.refresh')" :click="refreshGrid"></e-item></e-items> </ejs-toolbar><div class='h-inputBox'><ejs-textbox v-model='keyword' :placeholder='$t("Monitor.task.taskName")' @keyup.enter.native="filterMonitorTask" maxLength='20'></ejs-textbox></div></div><div class="h100-80 h-scroll"><ejs-grid :dataSource="monitorTaskData" :allowPaging="true" ref="grid" :pageSettings="pageSettings" :height="screenHeight" :allowExcelExport='true' ><e-columns><e-column type="checkbox" width="50" textAlign="center"></e-column><e-column field="id" :visible="false"></e-column><e-column field="taskName" :headerText="$t('Monitor.task.taskName')" width="120" textAlign="Center"></e-column><!--<e-column field="product" :headerText="$t('Monitor.task.product')" width="120" textAlign="Center"></e-column>--><e-column field="sampleStart" :headerText="$t('Monitor.task.sampleStart')" :format="dateFormat" width="120" textAlign="Center" clipMode="EllipsisWithTooltip"></e-column><e-column field="sampleEnd" :headerText="$t('Monitor.task.sampleEnd')" :format="dateFormat" width="120" textAlign="Center" clipMode="EllipsisWithTooltip"></e-column><e-column field="exeState" :headerText="$t('Monitor.task.exeState')" :formatter='exeStateFormat' width="120" textAlign="Center"></e-column></e-columns></ejs-grid><ejs-pagerref="pager":pageSize="pageSettings.pageSize":pageCount="page.pageCount":currentPage="page.pageNo":totalRecordsCount="page.totalRecordsCount"@click="getMonitorTaskList"></ejs-pager></div><CustomDialog ref="addMonitorTaskDialog" v-bind:element="addDialog.element" v-bind:styles="addDialog.styles" ><template v-slot:dialog-content><AddMonitorTask ref="addMonitorTaskPage"></AddMonitorTask></template></CustomDialog><CustomDialog ref="showMonitorTaskDialog" v-bind:element="editDialog.element" v-bind:styles="editDialog.styles" ><template v-slot:dialog-content><ShowMonitorTask ref="showMonitorTaskPage"></ShowMonitorTask></template></CustomDialog></template></BasicLayout>
</template>
<script>
import CustomDialog from "../../components/common/CustomDialog";
import BasicLayout from '../../layouts/BasicLayout';
import AddMonitorTask from './monitorTask/addMonitorTask';
import ShowMonitorTask from './monitorTask/showMonitorTask';
import {ExcelExport} from '@syncfusion/ej2-vue-grids';
import {EventBus} from "../../plugins/eventBus";export default {name: 'monitorTask',provide: {grid: [ExcelExport]},components: {CustomDialog,BasicLayout,AddMonitorTask,ShowMonitorTask,},data() {return {isShow_Add: JSON.parse(sessionStorage.getItem('authMap')).monitor_task.Add,isShow_Start: JSON.parse(sessionStorage.getItem('authMap')).monitor_task.Start,isShow_Pause: JSON.parse(sessionStorage.getItem('authMap')).monitor_task.Pause,isShow_Modify: JSON.parse(sessionStorage.getItem('authMap')).monitor_task.Modify,isShow_Delete: JSON.parse(sessionStorage.getItem('authMap')).monitor_task.Delete,isShow_Refresh: JSON.parse(sessionStorage.getItem('authMap')).monitor_task.Refresh,monitorTaskData: [],left: { show: false, name: '' },middle: { show: false, name: '' },right: { show: true, crumb: `${this.$t('Security.securityManage')}`+'/' + `${this.$t('Monitor.monitor')}` + '/' + `${this.$t('Monitor.task.titleName')}` },toolbarItems: [{ prefixIcon: 'icon hero-icon hero-icon-add', tooltipText: this.$t('Security.add'), click: this.showAddDialog },{ prefixIcon: 'icon hero-icon hero-icon-start-up', tooltipText: this.$t('Pm.startUp'), click: this.activeMonitorTask },{ prefixIcon: 'icon hero-icon hero-icon-disable', tooltipText: this.$t('System.deactiveTask'), click: this.deactiveMonitorTask },{ prefixIcon: 'icon hero-icon hero-icon-edit', tooltipText: this.$t('Track.detail'), click: this.showEditDialog },{ prefixIcon: 'icon hero-icon hero-icon-remove', tooltipText: this.$t('Security.delete'), click: this.deleteMonitorTask },{ prefixIcon: 'icon hero-icon hero-icon-refresh', tooltipText: this.$t('Alarm.refresh'), click: this.refreshGrid },],keyword: '',pageSettings: { pageSize: 15 },page: {pageCount: 4,totalRecordsCount: 0,pageNo: 1,},dateFormat: {type: 'date', format: 'yyyy-MM-dd HH:mm:ss'},addStatus: true,addDialog: {element: {target: '#app',isClose: true,refName: 'addMonitorTaskDialog',buttonGroup: [{click: this.dialogHide,buttonModel: { content: `${this.$t('Common.cancel')}` }},{click: this.addMonitorTask,buttonModel: { content: `${this.$t('Common.ok')}`, cssClass: 'primary-btn' }}],title: `${this.$t('Pm.addMonitorTask')}`},styles: {width: '860px',height: '700px',model: true,visible: false}},editDialog: {element: {target: '#app',isClose: true,refName: 'showMonitorTaskDialog',buttonGroup: [{click: this.modiyMonitorTask,buttonModel: {content: `${this.$t('Common.ok')}`, cssClass: 'primary-btn' }},{click: this.dialogHide,buttonModel: { content: `${this.$t('Common.close')}` }},],title: `${this.$t('Pm.updateMonitorTask')}`},styles: {width: '860px',height: '700px',model: true,visible: false}},screenHeight: document.body.clientHeight - 240};},mounted() {this.getMonitorTaskList();let That = this;},methods: {exeStateFormat(grids, data) {if(data.exeState == 0){return `${this.$t('Monitor.task.notStarted')}`;}else if(data.exeState == 1){return `${this.$t('Monitor.task.inUse')}`;}else if(data.exeState == 2){return `${this.$t('Monitor.task.exeFinish')}`;}else if(data.exeState == 3){return `${this.$t('System.deactiveTask')}`;}},getMonitorTaskList() {const url = '/lte/ems/sys/monitor/task/query';this.page.pageNo = this.$refs.pager.ej2Instances.currentPage;const params = { params: {taskName: this.keyword,pageNo: this.page.pageNo,pageSize: this.pageSettings.pageSize} };const That = this;this.axios.get(url, params).then(response => {const result = response.data.result;result.forEach((v) => {if (!!v.sampleStart) {let date = new Date();date.setTime(v.sampleStart);v.sampleStart = date;}if (!!v.sampleEnd) {let date = new Date();date.setTime(v.sampleEnd);v.sampleEnd = date;}});That.monitorTaskData = result;That.page.totalRecordsCount = response.data.totalCount;});},filterMonitorTask() {this.getMonitorTaskList();},getRecord() {const result = this.$refs.grid.getSelectedRecords();if (result === null || result === '') {this.$parent.showToast('warning',`${this.$t('Common.tips.noSelect')}`);return null;}return result;},showAddDialog() {this.$refs.addMonitorTaskPage.init();this.$refs.addMonitorTaskDialog.show();},showEditDialog() {const record = this.getRecord();if (record.length === 0) {this.$parent.showToast('warning',`${this.$t('Common.tips.selectOne')}`);return null;}if (record.length !== 1) {this.$parent.showToast('warning',`${this.$t('Common.tips.onlyOneSelect')}`);return null;}for(let i=0; i<record.length; i++){if(1== record[i].exeState){this.$parent.showToast('warning',`${this.$t('Monitor.task.activeMonitor')}`);return null;}}this.editId = record[0].id;this.$refs.showMonitorTaskPage.init(this.editId);this.$refs.showMonitorTaskDialog.show();},activeMonitorTask() {const url = "/lte/ems/sys/monitor/task/active";let record = this.getRecord();if (record == null) {return null;}if (record.length === 0) {this.$parent.showToast('warning',`${this.$t('Common.tips.selectOne')}`);return null;} else if (record.length > 1) {EventBus.$emit('toast', { type: 'warning', content: this.$t('DeployManagement.pleaseSelectOneData') });return false;}for(let i=0; i<record.length; i++){if(3 !== record[i].exeState){this.$parent.showToast('warning',`${this.$t('Monitor.task.activeMonitor')}`);return null;}}for(let i=0; i<this.monitorTaskData.length; i++){if(1 == this.monitorTaskData[i].exeState){this.$parent.showToast('warning',`${this.$t('Monitor.task.oneActiveMonitor')}`);return null;}}let That = this;const params = [];record.forEach((r, i) => {params.push(r.id);});var currentDate = new Date();if (currentDate > record[0].sampleEnd) {That.$parent.showToast('error',  `${this.$t('Common.tips.taskExpired')}`);return null;}this.axios.post(url, params).then(response => {const result = response.data;if(result){That.$parent.showToast('success', `${this.$t('Common.tips.success')}`);That.getMonitorTaskList();}else{That.$parent.showToast('error',  `${this.$t('Common.tips.failure')}`);}});},deactiveMonitorTask() {const url = "/lte/ems/sys/monitor/task/deactive";let record = this.getRecord();if (record == null) {return null;}if (record.length === 0) {this.$parent.showToast('warning',`${this.$t('Common.tips.selectOne')}`);return null;}for(let i=0; i<record.length; i++){if(1 !== record[i].exeState){this.$parent.showToast('warning',`${this.$t('Monitor.task.deactiveMonitor')}`);return null;}}let That = this;const params = [];record.forEach((r, i) => {params.push(r.id);});this.axios.post(url, params).then(response => {const result = response.data;if(result){That.$parent.showToast('success', `${this.$t('Common.tips.success')}`);That.getMonitorTaskList();}else{That.$parent.showToast('error',  `${this.$t('Common.tips.failure')}`);}});},deleteMonitorTask() {const record = this.getRecord();if (record.length === 0) {this.$parent.showToast('warning',`${this.$t('Common.tips.selectOne')}`);return null;}for(let i=0; i<record.length; i++){if(1 === record[i].exeState){this.$parent.showToast('warning',`${this.$t('Monitor.task.deleteMonitor')}`);return null;}}const url = '/lte/ems/sys/monitor/task/delete';const params = [];record.forEach((r, i) => {params.push(r.id);});let That = this;this.$layer.confirm({msg: `${this.$t('Common.tips.confirmTip')}`,btn1: {msg: `${this.$t('Common.cancel')}`},btn2: {msg: `${this.$t('Common.ok')}`,func: () => {That.axios.post(url, params).then(response => {if (response.data) {That.$parent.showToast('success', `${this.$t('Common.tips.success')}`);That.getMonitorTaskList();} else {That.$parent.showToast('error', `${this.$t('Common.tips.failure')}`);}});}}});},addMonitorTask() {let status = this.$refs.addMonitorTaskPage.validation();if(!status){return;}const url = '/lte/ems/sys/monitor/task/add';const monitorTaskPo = this.$refs.addMonitorTaskPage.getMonitorTask();console.log("******addMonitorTask-monitorTaskPo:", monitorTaskPo)if(monitorTaskPo == null) {return;}let That = this;this.axios.post(url, monitorTaskPo).then(response => {const result = response.data;if(result==true) {That.$parent.showToast('success', `${this.$t('Common.tips.success')}`);That.getMonitorTaskList();That.$refs.addMonitorTaskDialog.clear();That.$refs.addMonitorTaskDialog.close();} else if (result==false){That.$parent.showToast('error', `${this.$t('Common.tips.failure')}`);}else {That.$parent.showToast('error', `${this.$t('Security.failureMessage')}`);}});},modiyMonitorTask() {let status = this.$refs.showMonitorTaskPage.validation();if(!status){return;}const url = '/lte/ems/sys/monitor/task/modify';const monitorTaskPo = this.$refs.showMonitorTaskPage.getMonitorTask();console.log("******modiyMonitorTask-monitorTaskPo:", monitorTaskPo)if(monitorTaskPo == null) {return;}let That = this;this.axios.post(url, monitorTaskPo).then(response => {const result = response.data;if(result) {That.$parent.showToast('success', `${this.$t('Common.tips.success')}`);That.getMonitorTaskList();That.$refs.showMonitorTaskDialog.clear();That.$refs.showMonitorTaskDialog.close();} else {That.$parent.showToast('error', `${this.$t('Common.tips.failure')}`);}});},dialogHide() {this.$refs.addMonitorTaskDialog.clear();this.$refs.addMonitorTaskDialog.close();this.$refs.showMonitorTaskDialog.clear();this.$refs.showMonitorTaskDialog.clear();},refreshGrid() {this.keyword='';this.getMonitorTaskList();},getCheckedData(selectOnly) {// false: 不支持多选   true: 支持多选const selectedRecords = this.$refs.grid.getSelectedRecords();if (selectedRecords.length < 1) {// EventBus.$emit('toast', {type: 'warning', content: this.$t('Alarm.no_checked')});this.$parent.showToast('warning',`${this.$t('Alarm.no_checked')}`);return false;}if (selectedRecords.length > 1 && !selectOnly) {// EventBus.$emit('toast', {type: 'warning', content: this.$t('Common.tips.onlyOneSelect')});this.$parent.showToast('warning',`${this.$t('Common.tips.onlyOneSelect')}`);return false;}return selectedRecords;},},watch: {screenHeight(val) {this.screenHeight = val;}}
};
</script>

MonitorTaskLog.vue

<template><div class="h100vh-140"><div class="h-toolbarBg"><ejs-toolbar :items="toolbarItems"><!-- <ejs-toolbar><e-items><e-item prefixIcon='icon hero-icon hero-icon-refresh' tooltipText="$t('Alarm.refresh')" :click="refreshGrid"></e-item></e-items>  --></ejs-toolbar><!--<div class='h-inputBox'>--><!--  <ejs-dropdownlist :dataSource="productList" v-model="product"--><!--      :fields="fieldsType" name="productCheck"  @change="productChange" ></ejs-dropdownlist>--><!--</div>--><div class="h-inputBox">{{$t('Monitor.task.sampleStart')}}:<ejs-datetimepicker ref="dataStart" class="e-input e-disabled e-input-group" name="StartDate":format="dateFormat.format" v-model="monitorTask.sampleStart" :locale="locale"  @change="getMonitorTaskList" ></ejs-datetimepicker>{{$t('Monitor.task.sampleEnd')}}:<ejs-datetimepicker ref="dataEnd" class="e-input e-disabled e-input-group" name="EndDate":format="dateFormat.format" v-model="monitorTask.sampleEnd" :locale="locale"   @change="getMonitorTaskList"></ejs-datetimepicker></div></div><div class="h100-80 h-scroll"><ejs-grid :dataSource="monitorTaskLogData" :allowPaging="true" ref="grid" :pageSettings="pageSettings" :height="screenHeight" :allowExcelExport='true' ><e-columns><!-- <e-column type="checkbox" width="50" textAlign="center"></e-column> --><e-column field="id" :visible="false"></e-column><!--<e-column field="product" :headerText="$t('Monitor.record.product')" width="120" textAlign="Center"></e-column>--><e-column field="systemInfo" :headerText="$t('Monitor.record.systemInfo')" width="240" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><!-- <e-column field="taskId" :headerText="$t('Monitor.record.taskId')" width="120" textAlign="Center"></e-column> --><e-column field="recoreTime" :headerText="$t('Monitor.record.recoreTime')" :format="dateFormat" width="120" textAlign="Center" clipMode="EllipsisWithTooltip"></e-column><e-column field="cpu" :headerText="$t('Monitor.record.cpu')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="cpuThreshold" :visible="false" :headerText="$t('Monitor.record.cpuThreshold')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="memory" :headerText="$t('Monitor.record.memory')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="memoryThreshold" :visible="false" :headerText="$t('Monitor.record.memoryThreshold')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="space" :headerText="$t('Monitor.record.diskSpace')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="spaceThreshold" :visible="false" :headerText="$t('Monitor.record.diskSpaceThreshold')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="networkRxRate" :headerText="$t('Monitor.record.networkRxRate')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="networkTxRate" :headerText="$t('Monitor.record.networkTxRate')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="iopsKbRead" :headerText="$t('Monitor.record.IOPSKbRead')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="iopsKbWrite" :headerText="$t('Monitor.record.IOPSKbWrite')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="queueOperands" :headerText="$t('Monitor.record.queueOperands')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="databaseDiskSpaceIsUsed" :headerText="$t('Monitor.record.databaseDiskSpaceIsUsed')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column><e-column field="snmpAlarmDataSize" :headerText="$t('Monitor.record.snmpAlarmDataSize')" width="120" textAlign="Center" clipMode='EllipsisWithTooltip'></e-column></e-columns></ejs-grid><ejs-pagerref="pager":pageSize="pageSettings.pageSize":pageCount="page.pageCount":currentPage="page.pageNo":totalRecordsCount="page.totalRecordsCount"@click="getMonitorTaskList"></ejs-pager></div></div>
</template>
<script>
import {ExcelExport} from '@syncfusion/ej2-vue-grids';export default {name: 'monitorSystemLog',provide: {grid: [ExcelExport]},components: {},data() {return {isShow_Refresh: JSON.parse(sessionStorage.getItem('authMap')).monitor_system_log.Refresh,monitorTaskLogData: [],left: { show: false, name: '' },middle: { show: false, name: '' },right: { show: true, crumb: `${this.$t('Security.securityManage')}`+'/' + `${this.$t('Monitor.monitor')}` + '/' + `${this.$t('Monitor.record.titleName')}` },toolbarItems: [{ prefixIcon: 'icon hero-icon hero-icon-refresh', tooltipText: this.$t('Alarm.refresh'), click: this.refreshGrid },],locale: localStorage.getItem('locale'),product: '',productList: [],pageSettings: { pageSize: 15 },page: {pageCount: 4,totalRecordsCount: 0,pageNo: 1,},monitorTask: {taskName: '',product: 'PLATFORM',sampleStart: '',sampleEnd: '',},dateFormat: {type: 'date', format: 'yyyy-MM-dd HH:mm:ss'},fieldsType: {text: "text",value: "value"},addStatus: true,screenHeight: document.body.clientHeight - 240};},mounted() {this.getMonitorTaskList();this.getProductList();let That = this;},methods: {typeFormat(grids, data) {if(data.exeCycle == 'run'){return `${this.$t('Monitor.record.run')}`;}else if(data.exeCycle == 'start'){return `${this.$t('Monitor.record.start')}`;}},getMonitorTaskList() {const url = '/lte/ems/sys/monitor/log/queryMonitorTaskLog';this.page.pageNo = this.$refs.pager.ej2Instances.currentPage;const params = { params: {product: this.product,pageNo: this.page.pageNo,pageSize: this.pageSettings.pageSize,startTime:this.monitorTask.sampleStart=='' ? '' : Date.parse(this.monitorTask.sampleStart),endTime:this.monitorTask.sampleEnd=='' ? '' : Date.parse(this.monitorTask.sampleEnd)} };const That = this;this.axios.get(url, params).then(response => {const result = response.data.result;result.forEach((v) => {if (!!v.recoreTime) {let date = new Date();date.setTime(v.recoreTime);v.recoreTime = date;}});That.monitorTaskLogData = result;That.page.totalRecordsCount = response.data.totalCount;});},productChange(msg){this.product = msg.value;this.getMonitorTaskList();},getProductList() {this.$axios.get("/lte/ems/sys/monitor/log/findProducts").then(response => {let resultVal = response.data.resultVal;resultVal = resultVal.filter(item => !item.includes('ems_5gc') && !item.includes('ems_gnb') && !item.includes('ems_tr069'));this.productList.push({ text: "All", value: "" });for (let i = 0; i < resultVal.length; i++) {this.productList.push({text: resultVal[i],value: resultVal[i],});}});},filterMonitorTask() {this.getMonitorTaskList();},refreshGrid() {this.product='';this.getMonitorTaskList();},},watch: {screenHeight(val) {this.screenHeight = val;}}
};
</script>

RealtimeCpuMonitor.vue

<template><div class='h100vh-150 h-normalBg'><div class='h-ainfoBg'><div class='h-ainfo'><span class='icon hero-icon hero-icon-detailcode'></span><span>{{$t('Monitor.realTimeMonitoring.CPUUtilization')}}{{ CPUUtilization }}%</span></div></div><div class='h-normalContainter'><div class='row h-nomargin h-full-container width-100vw h100-80'><div id='cpuMonitor' class='width-100vw h100' style="height:599px"></div></div></div></div>
</template>
<script>
import echarts from 'echarts';export default{name: "realtimeCpuMonitor",data() {return {data: [],charts: "",app: {},myChart: null,xData: [],CPUUtilization: 0};},methods: {initData() {this.myChart = echarts.init(document.getElementById('cpuMonitor'));for (var i=0;i<12;i++){if(i==11){this.xData.push('0');}else if (i==0){this.xData.push('60s')}else{this.xData.push('');}this.data.push('-');}let option = this.getChartOption();if (option && typeof option === 'object') {this.myChart.setOption(option);}},random(min,max){return Math.floor(Math.random()*(max-min))+min;},randomData() {return this.random(20,60);},getMonitorData(CPUUtilization) {this.CPUUtilization=CPUUtilization;if(this.data.length>=12){this.data.shift();}this.data.push(CPUUtilization);this.myChart.clear();this.myChart.setOption(this.getChartOption(),true);this.myChart.resize();},getChartOption() {const option = {title: {text: ''},tooltip: {trigger: 'axis',formatter: function (params) {return params[0].value;},axisPointer: {animation: false}},xAxis: {type: 'category',data: this.xData,boundaryGap: false},yAxis: {name: "%",type: 'value',min: 0,max: 100,axisLabel: {formatter: '{value}'}},series: [{type: 'line',areaStyle: {color: {type: 'linear',x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: 'rgb(232,248,252)'},{offset: 1,color: 'rgb(203,227,243)'}],global: false}},data: this.data,lineStyle: {color: '#4097c9'}}]};return option;}},mounted() {this.initData();}
}
</script>

RealtimeDiskMonitor.vue

<template><div class='h100vh-150 h-normalBg'><div class='h-ainfoBg'><div class='h-ainfo'><span class='icon hero-icon hero-icon-detailcode'></span><span>{{$t('Monitor.realTimeMonitoring.diskSize')}}{{ diskSize }}GB</span><span>{{$t('Monitor.realTimeMonitoring.diskUsage')}}{{ diskUsage }}GB</span><span>{{$t('Monitor.realTimeMonitoring.diskUtilization')}}{{ diskUtilization }}%</span></div></div><div class='h-normalContainter'><div class='row h-nomargin h-full-container width-100vw h100-80'><div id='diskMonitor' class='width-100vw h100' style="height:599px"></div></div></div></div>
</template>
<script>
import echarts from 'echarts';export default{name: "realtimeMemoryMonitor",data() {return {data: [],charts: "",app: {},myChart: null,xData: [],diskSize: 0,diskUsage: 0,diskUtilization: 0,};},methods: {initData() {this.myChart = echarts.init(document.getElementById('diskMonitor'));for (var i=0;i<12;i++){if(i==11){this.xData.push('0');}else if (i==0){this.xData.push('60s')}else{this.xData.push('');}this.data.push('-');}let option = this.getChartOption();if (option && typeof option === 'object') {this.myChart.setOption(option);}this.getMonitorData();},random(min,max){return Math.floor(Math.random()*(max-min))+min;},randomData() {return this.random(5600,7000);},getMonitorData(diskSize, diskUsage, diskUtilization) {this.diskSize = diskSize;this.diskUsage = diskUsage;this.diskUtilization = diskUtilization;if(this.data.length >= 12){this.data.shift();}this.data.push(diskUsage);this.myChart.clear();this.myChart.setOption(this.getChartOption(),true);this.myChart.resize();},getChartOption() {const option = {title: {text: ''},tooltip: {trigger: 'axis',formatter: function (params) {return params[0].value;},axisPointer: {animation: false}},xAxis: {type: 'category',data: this.xData,boundaryGap: false},yAxis: {name: "GB",type: 'value',axisLabel: {formatter: '{value}'}},series: [{type: 'line',areaStyle: {color: {type: 'linear',x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: 'rgb(220,236,203)'},{offset: 1,color: 'rgb(196,228,172)'}],global: false}},data: this.data,lineStyle: {color: '#4da40d'}}]};return option;}},mounted() {this.initData();},beforeDestroy() {try {clearInterval(this.clock);} catch (e) {console.log(e);}}
}
</script>

RealtimeMemoryMonitor.vue

<template><div class='h100vh-150 h-normalBg'><div class='h-ainfoBg'><div class='h-ainfo'><span class='icon hero-icon hero-icon-detailcode'></span><span>{{$t('Monitor.realTimeMonitoring.memoryTotal')}}{{ memoryTotal }}GB</span><span>{{$t('Monitor.realTimeMonitoring.memoryUsage')}}{{ memoryUsage }}GB</span><span>{{$t('Monitor.realTimeMonitoring.memoryUtilization')}}{{ memoryUsageRatio }}%</span></div></div><div class='h-normalContainter'><div class='row h-nomargin h-full-container width-100vw h100-80'><div id='memoryMonitor' class='width-100vw h100' style="height:599px"></div></div></div></div>
</template>
<script>
import echarts from 'echarts';export default{name: "realtimeMemoryMonitor",data() {return {data: [],charts: "",app: {},myChart: null,xData: [],memoryUsage: 0,memoryTotal: 0,memoryUsageRatio: 0,};},methods: {initData() {this.myChart = echarts.init(document.getElementById('memoryMonitor'));for (var i=0;i<12;i++){if(i==11){this.xData.push('0');}else if (i==0){this.xData.push('60s')}else{this.xData.push('');}this.data.push('-');}let option = this.getChartOption();if (option && typeof option === 'object') {this.myChart.setOption(option);}},random(min,max){return Math.floor(Math.random()*(max-min))+min;},randomData() {return this.random(5600,7000);},getMonitorData(memoryTotal, memoryUsage, memoryUsageRatio) {this.memoryTotal = memoryTotal;this.memoryUsage = memoryUsage;this.memoryUsageRatio = memoryUsageRatio;if(this.data.length>=12){this.data.shift();}this.data.push(memoryUsage);this.myChart.clear();this.myChart.setOption(this.getChartOption(),true);this.myChart.resize();},getChartOption() {const option = {title: {text: ''},tooltip: {trigger: 'axis',formatter: function (params) {return params[0].value;},axisPointer: {animation: false}},xAxis: {type: 'category',data: this.xData,boundaryGap: false},yAxis: {name: "GB",type: 'value',axisLabel: {formatter: '{value}'}},series: [{type: 'line',areaStyle: {color: {type: 'linear',x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: 'rgb(244,234,246)'},{offset: 1,color: 'rgb(209,169,220)'}],global: false}},data: this.data,lineStyle: {color: '#8d29a8'}}]};return option;}},mounted() {this.initData();}
}
</script>

RealtimeMonitor.vue

<template><BasicLayout :left="left" :middle="middle" :right="right"><template v-slot:right_view><div class="h-outTabs"><ejs-tab ref="tabObj" id="tab_orientation" heightAdjustMode="Auto" :selected='selected' :selectedItem="0"><e-tabitems><e-tabitem :header="headerText1" content="#idv1"></e-tabitem><e-tabitem :header="headerText2" content="#idv2"></e-tabitem><e-tabitem :header="headerText3" content="#idv3"></e-tabitem><e-tabitem :header="headerText4" content="#idv4"></e-tabitem></e-tabitems></ejs-tab></div><div id="idv1" style="display: none"><MonitorTaskLog></MonitorTaskLog></div><div id="idv2" style="display: none"><RealtimeCpuMonitor ref='realtimeCpuMonitor'></RealtimeCpuMonitor></div><div id="idv3" style="display: none"><RealtimeMemoryMonitor ref='realtimeMemoryMonitor'></RealtimeMemoryMonitor></div><div id="idv4" style="display: none"><RealtimeDiskMonitor ref='realtimeDiskMonitor'></RealtimeDiskMonitor></div></template></BasicLayout>
</template>
<script>
import BasicLayout from '../../layouts/BasicLayout';
import RealtimeCpuMonitor from './RealtimeCpuMonitor';
import RealtimeMemoryMonitor from './RealtimeMemoryMonitor';
import RealtimeDiskMonitor from './RealtimeDiskMonitor';
import socketInstance from '../../plugins/stompSock';
import MonitorTaskLog from '../../views/monitor/MonitorTaskLog';export default{name: "realtimeMonitor",components: {MonitorTaskLog,BasicLayout,RealtimeCpuMonitor,RealtimeMemoryMonitor,RealtimeDiskMonitor},data() {return {left: { show: false, name: '' },middle: { show: false, name: '' },right: { show: true, crumb: `${this.$t('Security.securityManage')}`+'/' + `${this.$t('Monitor.monitor')}` + '/' + `${this.$t('Monitor.realTimeMonitoring.crumb')}` },headerText1: { text: `${this.$t('Monitor.record.titleName')}` },headerText2: { text: `${this.$t('Monitor.realTimeMonitoring.CPUUtilization')}` },headerText3: { text: `${this.$t('Monitor.realTimeMonitoring.memoryUsage')}` },headerText4: { text: `${this.$t('Monitor.realTimeMonitoring.diskUsage')}`},websocketSetting: [{ topic: '/user/#/realTimeMonitoring', clientId: 'monitoring', callback: this.websocketCallback }],};},methods: {selected(args){const index = args.selectedIndex;if (index === 0) {} else {}},websocketInit() {socketInstance.init(this.websocketSetting);},websocketCallback(msg) {const data = JSON.parse(msg.body);const CPUUtilization = data.CPUUsage;this.$refs.realtimeCpuMonitor.getMonitorData(CPUUtilization);const memoryTotal = data.memoryTotal;const memoryUsage = data.memoryUsage;const memoryUsageRatio = data.memoryUsageRatio;this.$refs.realtimeMemoryMonitor.getMonitorData(memoryTotal, memoryUsage, memoryUsageRatio);const diskTotal = data.diskTotal;const diskUsage = data.diskUsage;const diskUtilization = data.diskUsageRatio;this.$refs.realtimeDiskMonitor.getMonitorData(diskTotal, diskUsage, diskUtilization);}},mounted() {this.websocketInit();},beforeDestroy() {for (let i = 0; i < this.websocketSetting.length; i++) {socketInstance.stopReceiveTopicMsg(this.websocketSetting[i].clientId, this.websocketSetting[i].topic);}}
}
</script>

后端

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>ems-common</artifactId><groupId>com.hero.lte.ems</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ems-common-websocket</artifactId>
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId></dependency><!-- http://mvnrepository.com/artifact/org.eclipse.jetty.websocket/websocket-server --><dependency><groupId>org.eclipse.jetty.websocket</groupId><artifactId>websocket-server</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId></dependency><dependency><groupId>com.hero.lte.ems</groupId><artifactId>other</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

en_US.js

"record": {"systemInfo": "System Info","product": "Product","memory": "Memory Usage Threshold(%)","titleName": "System Monitor Record","recoreTime": "Record Time","memoryThreshold": "Memory Usage Threshold(%)","cpuThreshold": "Cpu Usage Threshold(%)","diskSpaceThreshold": "Disk Space Usage Threshold(%)","diskSpace": "Disk Space Usage Threshold(%)","cpu": "Cpu Usage Threshold(%)","taskId": "Task ID","networkRxRate": "Network Rx Rate/s","networkTxRate": "Network Tx Rate/s","IOPSKbRead": "IOPS kB_read/s","IOPSKbWrite": "IOPS kB_wrtn/s","queueOperands": "Total number of stored queue operations/s","databaseDiskSpaceIsUsed": "Database disk space used in the file system","snmpAlarmDataSize": "SBI alarm number/s",},

zh_CN.js

"record": {"systemInfo": "系统信息","product": "产品","memory": "内存使用率阈值(%)","titleName": "系统监控记录","recoreTime": "记录时间","memoryThreshold": "内存使用率阈值(%)","cpuThreshold": "Cpu使用率阈值(%)","diskSpaceThreshold": "磁盘空间使用率阈值(%)","diskSpace": "磁盘空间使用率阈值(%)","cpu": "Cpu使用率阈值(%)","taskId": "任务id","networkRxRate": "网络接收数据包速率/s","networkTxRate": "网络发送数据包速率/s","IOPSKbRead": "IOPS读取数据量/s","IOPSKbWrite": "IOPS写入数据量/s","queueOperands": "存储队列操作总数/s","databaseDiskSpaceIsUsed": "文件系统中数据库磁盘空间占用大小","snmpAlarmDataSize": "南向告警数量/s",},

MonitorTaskController

package com.hero.lte.ems.monitor.controller;import com.alibaba.fastjson.JSONObject;
import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.monitor.entity.MonitorTask;
import com.hero.lte.ems.monitor.entity.po.MonitorTaskPo;
import com.hero.lte.ems.monitor.entity.po.MonitorThresholdPo;
import com.hero.lte.ems.monitor.eunm.MonitorTaskStateEnum;
import com.hero.lte.ems.monitor.service.IMonitorTaskService;
import com.hero.lte.ems.monitor.take.MonitorTaskExe;
import com.hero.lte.ems.monitor.util.UUIDGennerator;
import com.hero.lte.ems.security.entity.Account;
import com.hero.lte.ems.security.entity.Log;
import com.hero.lte.ems.security.service.ILogService;
import io.swagger.annotations.Api;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author l22898*/
@Api(value = "MonitorTaskController",tags={"系统监控任务"})
@RestController
@RequestMapping("/lte/ems/sys/monitor/task/")
public class MonitorTaskController {private static final Logger logger = LoggerFactory.getLogger(MonitorTaskController.class);@Autowiredprivate IMonitorTaskService monitorTaskService;@Autowiredprivate ILogService logService;private String monitorFilePath = "/home/ems/ems_eam/conf/monitorFiles.properties";private String checkoutFilePath = "/home/ems/ems_eam/conf/checkout.properties";@ResponseBody@RequestMapping(value = "query", method = RequestMethod.GET)public Page<MonitorTask> getPmGnbReportTaskList(MonitorTask monitorTask, Page<MonitorTask> page){Long currentTimeMillis = System.currentTimeMillis();boolean expired = false;Page<MonitorTask> pageReturn = new Page<>();try{page.setParam(monitorTask);pageReturn = monitorTaskService.getMonitorTaskList(page);for (MonitorTask task : pageReturn.getResult()) {if (task.getExeState() != 3 && currentTimeMillis > task.getSampleEnd()) {expired = true;task.setExeState(3);monitorTaskService.updateMonitorTask(task);}}if (expired) {pageReturn = monitorTaskService.getMonitorTaskList(page);}}catch (Exception e){logger.error("系统监控任务查询失败" ,e);}return pageReturn;}@ResponseBody@RequestMapping(value = "queryId", method = RequestMethod.GET)public MonitorTaskPo getPmGnbReportTask(String id){MonitorTaskPo monitorTaskPo = new MonitorTaskPo();try{//查询任务MonitorTask monitorTask = monitorTaskService.getMonitorTask(id);JSONObject jsonObject = JSONObject.parseObject(monitorTask.getThreshold());MonitorThresholdPo monitorThresholdPo = JSONObject.toJavaObject(jsonObject, MonitorThresholdPo.class);monitorTaskPo.setMonitorTask(monitorTask);monitorTaskPo.setMonitorThresholdPo(monitorThresholdPo);}catch (Exception e){logger.error("系统监控任务查询失败" ,e);}return monitorTaskPo;}/*** 新增* @param monitorTaskPo* @returnwq*/@ResponseBody@RequestMapping(value = "add", method = RequestMethod.POST)public String insertMonitorTask(@RequestBody MonitorTaskPo monitorTaskPo) {String result = "true";try {if(monitorTaskPo == null){return "false";}MonitorTask monitorTask = monitorTaskPo.getMonitorTask();String taskName = monitorTask.getTaskName();//根据任务名称查询是否存在List<MonitorTask> monitorTasks = monitorTaskService.queryDataByTaskName(taskName);if(monitorTasks.size() > 0){logger.error("任务名称重复");return "Duplicate task name.";}monitorTask.setId(UUIDGennerator.generator());monitorTask.setExeState(MonitorTaskStateEnum.IN_SUSPEND.getCode());monitorTask.setThreshold(JSONObject.toJSONString(monitorTaskPo.getMonitorThresholdPo()));monitorTaskService.insertMonitorTask(monitorTask);MonitorTaskExe.setMonitorTaskMap(monitorTask);} catch (Exception e) {logger.error("系统监控任务新增失败" ,e);result = "false";}finally {Subject subject = SecurityUtils.getSubject();Account account;if (subject != null) {account = (Account) subject.getPrincipal();String username = account.getUsername();String userId = account.getUserId();String ip = account.getIp();int status;if(result.equals("true")){status = 1;}else {status = 2;}this.addOperateLog(userId,username,status,"res.create_monitor_task",ip,"Create a system monitoring task.");}}return result;}@ResponseBody@RequestMapping(value = "modify", method = RequestMethod.POST)public boolean updateMonitorTask(@RequestBody MonitorTaskPo monitorTaskPo) {boolean result = true;try {if(monitorTaskPo == null){return false;}MonitorTask monitorTask = monitorTaskPo.getMonitorTask();MonitorTask modifyResult = monitorTaskService.getMonitorTask(monitorTask.getId());monitorTask.setExeState(modifyResult.getExeState());monitorTask.setThreshold(JSONObject.toJSONString(monitorTaskPo.getMonitorThresholdPo()));monitorTaskService.updateMonitorTask(monitorTask);MonitorTaskExe.setMonitorTaskMap(monitorTask);} catch (Exception e) {logger.error("系统监控任务修改失败" ,e);result = false;}finally {Subject subject = SecurityUtils.getSubject();Account account;if (subject != null) {account = (Account) subject.getPrincipal();String username = account.getUsername();String userId = account.getUserId();String ip = account.getIp();int status;if(result){status = 1;}else {status = 2;}this.addOperateLog(userId,username,status,"res.modify_monitor_task",ip,"Modify a system monitoring task.");}}return result;}/*** 暂停* @param idList* @return*/@ResponseBody@RequestMapping(value = "deactive", method = RequestMethod.POST)public boolean deactiveMonitorTask(@RequestBody List<String> idList) {boolean result = true;try {if(idList != null && idList.size() > 0){monitorTaskService.deactiveMonitorTask(idList);}MonitorTaskExe.deactiveMonitorTaskMap(idList);} catch (Exception e) {logger.error("系统监控任务暂停失败" ,e);result = false;}return result;}/*** 启动* @param idList* @return*/@ResponseBody@RequestMapping(value = "active", method = RequestMethod.POST)public boolean activeMonitorTask(@RequestBody List<String> idList) {boolean result = true;try {if(idList != null && idList.size() > 0){monitorTaskService.activeMonitorTask(idList);}MonitorTaskExe.activeMonitorTaskMap(idList);} catch (Exception e) {logger.error("系统监控任务启动失败" ,e);result = false;}return result;}/*** 删除* @param idList* @id*/@ResponseBody@RequestMapping(value = "delete", method = RequestMethod.POST)public boolean delete(@RequestBody List<String> idList) {boolean result = true;try {if(idList != null && idList.size() > 0){monitorTaskService.deleteMonitorTask(idList);}MonitorTaskExe.deleteMonitorTaskMap(idList);} catch (Exception e) {logger.error("系统监控任务删除失败" ,e);result = false;}finally {Subject subject = SecurityUtils.getSubject();Account account;if (subject != null) {account = (Account) subject.getPrincipal();String username = account.getUsername();String userId = account.getUserId();String ip = account.getIp();int status;if(result){status = 1;}else {status = 2;}this.addOperateLog(userId,username,status,"res.delete_monitor_task",ip,"Delete a system monitoring task.");}}return result;}@Scheduled(cron = "0 1 0 * * ?")public void modifyExpiredTaskStatus() {logger.info("-modifyExpiredTaskStatus-begin");Long currentTimeMillis = System.currentTimeMillis();List<MonitorTask> list = monitorTaskService.getMonitorTaskAll();for (MonitorTask task : list) {if (task.getExeState() != 3 && currentTimeMillis > task.getSampleEnd()) {task.setExeState(3);monitorTaskService.updateMonitorTask(task);}}}public void addOperateLog(String userId,String userName,int updateStatus,String featureId,String ip,String ExecData){Log log = new Log();log.setAccountId(userId);log.setAccountName(userName);log.setModuleId("res.security#res.system_monitor#res.monitor_task");log.setFeatureId(featureId);log.setExecTime(System.currentTimeMillis());log.setExecType(2);log.setResult(updateStatus);//  Create a system monitoring task//  Modify a system monitoring task//  Delete a system monitoring tasklog.setExecData(ExecData);log.setIp(ip);logService.addOperateLog(log);}@Scheduled(cron = "0 0 0/1 * * ?")public void monitorWhetherFilesAreTamperedWith() {logger.info("Monitor whether files are tampered begin!");// 读取 checkout.properties 文件Map<String, String> expectedMD5Map = readExpectedMD5(checkoutFilePath);if (expectedMD5Map == null) return;// 读取 monitorFiles.properties 文件并进行 MD5 校验try (BufferedReader reader = new BufferedReader(new FileReader(monitorFilePath))) {String filePath;while ((filePath = reader.readLine()) != null) {filePath = filePath.trim(); // 去掉前后空格if (expectedMD5Map.containsKey(filePath)) {String expectedMD5 = expectedMD5Map.get(filePath);String calculatedMD5 = calculateMD5(new File(filePath));if (calculatedMD5 == null) {logger.error("Monitor whether files are tampered, Error calculating MD5 for file:{}", filePath);continue;}// 比较 MD5 值if (!calculatedMD5.equalsIgnoreCase(expectedMD5)) {logger.error("Monitor whether files are tampered, Error: MD5 mismatch for:{}, Expected:{}, but got:{}, The conclusion document has been tampered with!", filePath, expectedMD5, calculatedMD5);}} else {logger.warn("Monitor whether files are tampered, Warning: No expected MD5 found for:{}", filePath);}}} catch (IOException e) {logger.error("Monitor whether files are tampered, Exception:{}", e.getMessage());}}private static Map<String, String> readExpectedMD5(String checkoutFilePath) {Map<String, String> md5Map = new HashMap<>();try (BufferedReader reader = new BufferedReader(new FileReader(checkoutFilePath))) {String line;while ((line = reader.readLine()) != null) {String[] parts = line.split("=");if (parts.length == 2) {String filePath = parts[0].trim();String md5Value = parts[1].trim();md5Map.put(filePath, md5Value);} else {logger.error("Skipping invalid line in checkout.properties:{}", line);}}} catch (IOException e) {logger.error("readExpectedMD5-Exception:{}", e.getMessage());}return md5Map;}private static String calculateMD5(File file) {try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] bytes = Files.readAllBytes(file.toPath());byte[] digest = md.digest(bytes);StringBuilder sb = new StringBuilder();for (byte b : digest) {sb.append(String.format("%02x", b));}return sb.toString();} catch (IOException | NoSuchAlgorithmException e) {logger.error("calculateMD5-Exception:{}", e.getMessage());return null;}}
}

IMonitorTaskService

package com.hero.lte.ems.monitor.service;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.framework.exception.LteException;
import com.hero.lte.ems.monitor.entity.MonitorTask;import java.util.List;
import java.util.Map;public interface IMonitorTaskService {Page<MonitorTask> getMonitorTaskList(Page<MonitorTask> pager);List<MonitorTask> getMonitorTaskAll();MonitorTask getMonitorTask(String id) throws LteException ;int insertMonitorTask(MonitorTask monitorTask);int updateMonitorTask(Map<String, Object> map);int deleteMonitorTask(List<String> idList);int deactiveMonitorTask(List<String> idList);int activeMonitorTask(List<String> idList);int updateMonitorTask(MonitorTask monitorTask);List<MonitorTask> queryDataByTaskName(String taskName);
}

MonitorTaskServiceImpl

package com.hero.lte.ems.monitor.service.impl;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.framework.exception.LteException;
import com.hero.lte.ems.monitor.dao.MonitorTaskMapper;
import com.hero.lte.ems.monitor.entity.MonitorTask;
import com.hero.lte.ems.monitor.service.IMonitorTaskService;
import com.hero.lte.ems.security.config.aop.LogAnnotation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;
import java.util.Map;/*** @author l22898*/
@Service
public class MonitorTaskServiceImpl implements IMonitorTaskService {private static final Logger LOGGER = LoggerFactory.getLogger(MonitorTaskServiceImpl.class);@Resourceprivate MonitorTaskMapper monitorTaskMapper;@Overridepublic Page<MonitorTask> getMonitorTaskList(Page<MonitorTask> pager){List<MonitorTask> monitorTaskList = monitorTaskMapper.findMonitorTaskPage(pager, pager.getParam());return pager;}@Overridepublic List<MonitorTask> getMonitorTaskAll(){List<MonitorTask> monitorTaskList = monitorTaskMapper.findMonitorTaskAll();return monitorTaskList;}@Overridepublic MonitorTask getMonitorTask(String id) throws LteException {return monitorTaskMapper.findById(id);}@Overridepublic int insertMonitorTask(MonitorTask monitorTask){return monitorTaskMapper.insertMonitorTask(monitorTask);}@Overridepublic int updateMonitorTask(MonitorTask monitorTask){return monitorTaskMapper.modMonitorTask(monitorTask);}@Overridepublic List<MonitorTask> queryDataByTaskName(String taskName) {return monitorTaskMapper.queryDataByTaskName(taskName);}@Overridepublic int updateMonitorTask(Map<String, Object> map){return monitorTaskMapper.updateMonitorTask(map);}@Overridepublic int deleteMonitorTask(List<String> idList){return monitorTaskMapper.deleteMonitorTask(idList);}@Override@LogAnnotation(module = "res.security#res.system_monitor", feature = "res.alarm_mod", type = 2)public int deactiveMonitorTask(List<String> idList) {return monitorTaskMapper.deactiveMonitorTask(idList);}@Override@LogAnnotation(module = "res.security#res.system_monitor", feature = "res.alarm_mod", type = 2)public int activeMonitorTask(List<String> idList) {return monitorTaskMapper.activeMonitorTask(idList);}
}

MonitorTaskMapper

package com.hero.lte.ems.monitor.dao;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.monitor.entity.MonitorTask;
import com.hero.lte.ems.monitor.entity.MonitorTaskLog;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;public interface MonitorTaskMapper {MonitorTask findById(String id);List<MonitorTask> findMonitorTaskPage(@Param("page") Page pager, @Param("monitorTask") MonitorTask monitorTask);List<MonitorTask> findMonitorTaskAll();int insertMonitorTask(MonitorTask monitorTask);int updateMonitorTask(Map<String, Object> map);int deleteMonitorTask(@Param("idList")List<String> idList);int deactiveMonitorTask(@Param("idList")List<String> idList);int activeMonitorTask(@Param("idList")List<String> idList);int modMonitorTask(MonitorTask monitorTask);List<MonitorTask> queryDataByTaskName(@Param("taskName") String taskName);
}

MonitorTaskMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hero.lte.ems.monitor.dao.MonitorTaskMapper"><resultMap id="BaseResultMap" type="com.hero.lte.ems.monitor.entity.MonitorTask"><id column="ID" property="id" jdbcType="VARCHAR"/><result column="TASK_NAME" property="taskName" jdbcType="VARCHAR"/><result column="PRODUCT" property="product" jdbcType="VARCHAR"/><result column="THRESHOLD" property="threshold" jdbcType="VARCHAR"/><result column="SAMPLE_START" property="sampleStart" jdbcType="BIGINT"/><result column="SAMPLE_END" property="sampleEnd" jdbcType="BIGINT"/><result column="EXE_STATE" property="exeState" jdbcType="INTEGER"/></resultMap><sql id="Base_Column_List">ID, TASK_NAME, PRODUCT, THRESHOLD, SAMPLE_START, SAMPLE_END, EXE_STATE</sql><select id="findById" parameterType="java.lang.String" resultMap="BaseResultMap">select<include refid="Base_Column_List"/>from monitor_taskwhere id = #{id,jdbcType=VARCHAR}</select><select id="findMonitorTaskPage" resultMap="BaseResultMap">select<include refid="Base_Column_List"/>from monitor_task<where><if test="monitorTask.taskName != null and monitorTask.taskName !=''" >and BINARY TASK_NAME like CONCAT('%',#{monitorTask.taskName},'%')</if><if test="monitorTask.product != null and monitorTask.product !=''" >and BINARY PRODUCT like CONCAT('%',#{monitorTask.product},'%')</if></where></select><select id="findMonitorTaskAll" resultMap="BaseResultMap">select<include refid="Base_Column_List"/>from monitor_task</select><insert id="insertMonitorTask" parameterType="com.hero.lte.ems.monitor.entity.MonitorTask">insert into monitor_task (ID, TASK_NAME, PRODUCT, THRESHOLD, SAMPLE_START, SAMPLE_END, EXE_STATE)values(#{id,jdbcType=VARCHAR},#{taskName,jdbcType=VARCHAR},#{product,jdbcType=VARCHAR},#{threshold,jdbcType=VARCHAR},#{sampleStart,jdbcType=BIGINT},#{sampleEnd,jdbcType=BIGINT},#{exeState,jdbcType=INTEGER})</insert><update id="modMonitorTask" parameterType="com.hero.lte.ems.monitor.entity.MonitorTask">update monitor_task<set><if test="taskName != null">task_name = #{taskName,jdbcType=INTEGER},</if><if test="threshold != null">threshold = #{threshold,jdbcType=INTEGER},</if><if test="exeState != -1">EXE_STATE = #{exeState},</if></set>where id = #{id,jdbcType=VARCHAR}</update><update id="updateMonitorTask" parameterType="java.util.Map">update monitor_task<set><if test="exeState != null">EXE_STATE = #{exeState,jdbcType=INTEGER},</if></set>where id in<foreach collection="idList" item="item" index="index" open="("separator="," close=")">#{item}</foreach></update><delete id="deleteMonitorTask" parameterType="java.lang.String" >delete from monitor_taskwhere id in<foreach collection="idList" item="item" index="index" open="("separator="," close=")">#{item}</foreach>and EXE_STATE in ('0','2','3')</delete><update id="deactiveMonitorTask" parameterType="java.lang.String" >update monitor_task<set>EXE_STATE = 3,</set>where id in<foreach collection="idList" item="item" index="index" open="("separator="," close=")">#{item}</foreach></update><update id="activeMonitorTask" parameterType="java.lang.String" >update monitor_task<set>EXE_STATE = 1,</set>where id in<foreach collection="idList" item="item" index="index" open="("separator="," close=")">#{item}</foreach></update><select id="queryDataByTaskName" resultMap="BaseResultMap" parameterType="java.lang.String">select<include refid="Base_Column_List"/>from monitor_task where TASK_NAME = #{taskName}</select>
</mapper>

MonitorThresholdPo

package com.hero.lte.ems.monitor.entity.po;public class MonitorThresholdPo {private Double cpuThreshold;private Double memoryThreshold;private Double spaceThreshold;private Double upTrafficThreshold;private Double downTrafficThreshold;public Double getCpuThreshold() {return cpuThreshold;}public void setCpuThreshold(Double cpuThreshold) {this.cpuThreshold = cpuThreshold;}public Double getMemoryThreshold() {return memoryThreshold;}public void setMemoryThreshold(Double memoryThreshold) {this.memoryThreshold = memoryThreshold;}public Double getSpaceThreshold() {return spaceThreshold;}public void setSpaceThreshold(Double spaceThreshold) {this.spaceThreshold = spaceThreshold;}public Double getUpTrafficThreshold() {return upTrafficThreshold;}public void setUpTrafficThreshold(Double upTrafficThreshold) {this.upTrafficThreshold = upTrafficThreshold;}public Double getDownTrafficThreshold() {return downTrafficThreshold;}public void setDownTrafficThreshold(Double downTrafficThreshold) {this.downTrafficThreshold = downTrafficThreshold;}@Overridepublic String toString() {return "MonitorThresholdPo{" +"cpuThreshold=" + cpuThreshold +", memoryThreshold=" + memoryThreshold +", spaceThreshold=" + spaceThreshold +", upTrafficThreshold=" + upTrafficThreshold +", downTrafficThreshold=" + downTrafficThreshold +'}';}
}

MonitorTaskPo

package com.hero.lte.ems.monitor.entity.po;import com.hero.lte.ems.monitor.entity.MonitorTask;public class MonitorTaskPo {private MonitorTask monitorTask;private MonitorThresholdPo monitorThresholdPo;public MonitorTask getMonitorTask() {return monitorTask;}public void setMonitorTask(MonitorTask monitorTask) {this.monitorTask = monitorTask;}public MonitorThresholdPo getMonitorThresholdPo() {return monitorThresholdPo;}public void setMonitorThresholdPo(MonitorThresholdPo monitorThresholdPo) {this.monitorThresholdPo = monitorThresholdPo;}@Overridepublic String toString() {return "MonitorTaskPo{" +"monitorTask=" + monitorTask +", monitorThresholdPo=" + monitorThresholdPo +'}';}
}

MonitorTaskLog

package com.hero.lte.ems.monitor.entity;public class MonitorTaskLog {private String id;private String systemInfo;private String taskId;private String product;private Long recoreTime;private Double cpu;private Double cpuThreshold;private Double memory;private Double memoryThreshold;private Double space;private Double spaceThreshold;private Double upTraffic;private Double upTrafficThreshold;private Double downTraffic;private Double downTrafficThreshold;//网络接收数据包速率/sprivate Double networkRxRate;//网络发送数据包速率/sprivate Double networkTxRate;//IOPS读取数据量/sprivate Double iopsKbRead;//IOPS写入数据量/sprivate Double iopsKbWrite;//每秒存储队列输入/输出操作数private Double queueOperands;//南向告警数据量/sprivate Double snmpAlarmDataSize;//文件系统中数据库磁盘空间已用private String databaseDiskSpaceIsUsed;private Long startTime;private Long endTime;public Long getStartTime() {return startTime;}public void setStartTime(Long startTime) {this.startTime = startTime;}public Long getEndTime() {return endTime;}public void setEndTime(Long endTime) {this.endTime = endTime;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getSystemInfo() {return systemInfo;}public void setSystemInfo(String systemInfo) {this.systemInfo = systemInfo;}public String getTaskId() {return taskId;}public void setTaskId(String taskId) {this.taskId = taskId;}public String getProduct() {return product;}public void setProduct(String product) {this.product = product;}public Long getRecoreTime() {return recoreTime;}public void setRecoreTime(Long recoreTime) {this.recoreTime = recoreTime;}public Double getCpu() {return cpu;}public void setCpu(Double cpu) {this.cpu = cpu;}public Double getCpuThreshold() {return cpuThreshold;}public void setCpuThreshold(Double cpuThreshold) {this.cpuThreshold = cpuThreshold;}public Double getMemory() {return memory;}public void setMemory(Double memory) {this.memory = memory;}public Double getMemoryThreshold() {return memoryThreshold;}public void setMemoryThreshold(Double memoryThreshold) {this.memoryThreshold = memoryThreshold;}public Double getSpace() {return space;}public void setSpace(Double space) {this.space = space;}public Double getSpaceThreshold() {return spaceThreshold;}public void setSpaceThreshold(Double spaceThreshold) {this.spaceThreshold = spaceThreshold;}public Double getUpTraffic() {return upTraffic;}public void setUpTraffic(Double upTraffic) {this.upTraffic = upTraffic;}public Double getUpTrafficThreshold() {return upTrafficThreshold;}public void setUpTrafficThreshold(Double upTrafficThreshold) {this.upTrafficThreshold = upTrafficThreshold;}public Double getDownTraffic() {return downTraffic;}public void setDownTraffic(Double downTraffic) {this.downTraffic = downTraffic;}public Double getDownTrafficThreshold() {return downTrafficThreshold;}public void setDownTrafficThreshold(Double downTrafficThreshold) {this.downTrafficThreshold = downTrafficThreshold;}public Double getNetworkRxRate() {return networkRxRate;}public void setNetworkRxRate(Double networkRxRate) {this.networkRxRate = networkRxRate;}public Double getNetworkTxRate() {return networkTxRate;}public void setNetworkTxRate(Double networkTxRate) {this.networkTxRate = networkTxRate;}public Double getIopsKbRead() {return iopsKbRead;}public void setIopsKbRead(Double iopsKbRead) {this.iopsKbRead = iopsKbRead;}public Double getIopsKbWrite() {return iopsKbWrite;}public void setIopsKbWrite(Double iopsKbWrite) {this.iopsKbWrite = iopsKbWrite;}public Double getQueueOperands() {return queueOperands;}public void setQueueOperands(Double queueOperands) {this.queueOperands = queueOperands;}public Double getSnmpAlarmDataSize() {return snmpAlarmDataSize;}public void setSnmpAlarmDataSize(Double snmpAlarmDataSize) {this.snmpAlarmDataSize = snmpAlarmDataSize;}public String getDatabaseDiskSpaceIsUsed() {return databaseDiskSpaceIsUsed;}public void setDatabaseDiskSpaceIsUsed(String databaseDiskSpaceIsUsed) {this.databaseDiskSpaceIsUsed = databaseDiskSpaceIsUsed;}@Overridepublic String toString() {return "MonitorTaskLog{" +"id='" + id + '\'' +", systemInfo='" + systemInfo + '\'' +", taskId='" + taskId + '\'' +", product='" + product + '\'' +", recoreTime=" + recoreTime +", cpu=" + cpu +", cpuThreshold=" + cpuThreshold +", memory=" + memory +", memoryThreshold=" + memoryThreshold +", space=" + space +", spaceThreshold=" + spaceThreshold +", upTraffic=" + upTraffic +", upTrafficThreshold=" + upTrafficThreshold +", downTraffic=" + downTraffic +", downTrafficThreshold=" + downTrafficThreshold +", networkRxRate=" + networkRxRate +", networkTxRate=" + networkTxRate +", iopsKbRead=" + iopsKbRead +", iopsKbWrite=" + iopsKbWrite +", queueOperands=" + queueOperands +", snmpAlarmDataSize=" + snmpAlarmDataSize +", databaseDiskSpaceIsUsed='" + databaseDiskSpaceIsUsed + '\'' +'}';}
}

MonitorTask

package com.hero.lte.ems.monitor.entity;public class MonitorTask {private String id;private String taskName;private String product;private String threshold;private Long sampleStart;private Long sampleEnd;//【0:未开始、1:执行中、2:执行状态、3:暂停状态】private Integer exeState;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getTaskName() {return taskName;}public void setTaskName(String taskName) {this.taskName = taskName;}public String getProduct() {return product;}public void setProduct(String product) {this.product = product;}public String getThreshold() {return threshold;}public void setThreshold(String threshold) {this.threshold = threshold;}public Long getSampleStart() {return sampleStart;}public void setSampleStart(Long sampleStart) {this.sampleStart = sampleStart;}public Long getSampleEnd() {return sampleEnd;}public void setSampleEnd(Long sampleEnd) {this.sampleEnd = sampleEnd;}public Integer getExeState() {return exeState;}public void setExeState(Integer exeState) {this.exeState = exeState;}@Overridepublic String toString() {return "MonitorTask{" +"id='" + id + '\'' +", taskName='" + taskName + '\'' +", product='" + product + '\'' +", threshold='" + threshold + '\'' +", sampleStart=" + sampleStart +", sampleEnd=" + sampleEnd +", exeState=" + exeState +'}';}
}

WServerHelper

package com.hero.lte.ems.websocket.server;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;@Component
public class WServerHelper {@AutowiredSimpMessagingTemplate messagingTemplate;public void push2OneClient(String topic,String channlId ,Object msg) {this.messagingTemplate.convertAndSend("/user/"+channlId+"/"+topic, msg);}public void push2AllClient(String topic,Object msg) {this.messagingTemplate.convertAndSend("/topic/"+topic, msg);}}

SystemMonitor

package com.hero.lte.ems.monitor.util;import com.hero.lte.ems.monitor.entity.po.MonitorPo;public abstract class SystemMonitor {public abstract MonitorPo getCPUInfo();public abstract MonitorPo getMemoryInfo();public abstract MonitorPo getDiskInfo();//获取【网络接收数据包速率/s、网络发送数据包速率/s】资源信息public abstract MonitorPo getNetworkResourceInformation();//获取文件系统中mysql磁盘空间使用情况public abstract MonitorPo getUsageOfTheMysqlDiskSpaceInTheFileSystem();//用来监控磁盘 I/O 性能,获取【IOPS读取数据量/s、IOPS写入数据量/s】资源信息public abstract MonitorPo getIopsResourceInformation();//获取每秒存储队列输入/输出操作数public abstract MonitorPo getStoresQueueInputOrOutputOperandsPerSecond();
}

MonitorPo

package com.hero.lte.ems.monitor.entity.po;public class MonitorPo {private String product;private Double cpu;private Double memory;private Double memoryTotal;private Double memoryUseRatio;private Double diskTotal;private Double diskFree;private Double diskUse;private Double diskUseRatio;//网络接收数据包速率/sprivate Double networkRxRate;//网络发送数据包速率/sprivate Double networkTxRate;//IOPS读取数据量/sprivate Double iopsKbRead;//IOPS写入数据量/sprivate Double iopsKbWrite;//每秒存储队列输入/输出操作数private Double queueOperands;//南向告警数据量/sprivate Double snmpAlarmDataSize;//文件系统中数据库磁盘空间已用private String databaseDiskSpaceIsUsed;public Double getNetworkRxRate() {return networkRxRate;}public void setNetworkRxRate(Double networkRxRate) {this.networkRxRate = networkRxRate;}public Double getNetworkTxRate() {return networkTxRate;}public void setNetworkTxRate(Double networkTxRate) {this.networkTxRate = networkTxRate;}public Double getIopsKbRead() {return iopsKbRead;}public void setIopsKbRead(Double iopsKbRead) {this.iopsKbRead = iopsKbRead;}public Double getIopsKbWrite() {return iopsKbWrite;}public void setIopsKbWrite(Double iopsKbWrite) {this.iopsKbWrite = iopsKbWrite;}public Double getQueueOperands() {return queueOperands;}public void setQueueOperands(Double queueOperands) {this.queueOperands = queueOperands;}public Double getSnmpAlarmDataSize() {return snmpAlarmDataSize;}public void setSnmpAlarmDataSize(Double snmpAlarmDataSize) {this.snmpAlarmDataSize = snmpAlarmDataSize;}public String getDatabaseDiskSpaceIsUsed() {return databaseDiskSpaceIsUsed;}public void setDatabaseDiskSpaceIsUsed(String databaseDiskSpaceIsUsed) {this.databaseDiskSpaceIsUsed = databaseDiskSpaceIsUsed;}public String getProduct() {return product;}public void setProduct(String product) {this.product = product;}public Double getCpu() {return cpu;}public void setCpu(Double cpu) {this.cpu = cpu;}public Double getMemory() {return memory;}public void setMemory(Double memory) {this.memory = memory;}public Double getDiskTotal() {return diskTotal;}public void setDiskTotal(Double diskTotal) {this.diskTotal = diskTotal;}public Double getDiskFree() {return diskFree;}public void setDiskFree(Double diskFree) {this.diskFree = diskFree;}public Double getMemoryTotal() {return memoryTotal;}public void setMemoryTotal(Double memoryTotal) {this.memoryTotal = memoryTotal;}public Double getDiskUse() {return diskUse;}public void setDiskUse(Double diskUse) {this.diskUse = diskUse;}public Double getDiskUseRatio() {return diskUseRatio;}public void setDiskUseRatio(Double diskUseRatio) {this.diskUseRatio = diskUseRatio;}public Double getMemoryUseRatio() {return memoryUseRatio;}public void setMemoryUseRatio(Double memoryUseRatio) {this.memoryUseRatio = memoryUseRatio;}@Overridepublic String toString() {return "MonitorPo{" +"product='" + product + '\'' +", cpu=" + cpu +", memory=" + memory +", memoryTotal=" + memoryTotal +", memoryUseRatio=" + memoryUseRatio +", diskTotal=" + diskTotal +", diskFree=" + diskFree +", diskUse=" + diskUse +", diskUseRatio=" + diskUseRatio +", networkRxRate=" + networkRxRate +", networkTxRate=" + networkTxRate +", iopsKbRead=" + iopsKbRead +", iopsKbWrite=" + iopsKbWrite +", queueOperands=" + queueOperands +", snmpAlarmDataSize=" + snmpAlarmDataSize +", databaseDiskSpaceIsUsed='" + databaseDiskSpaceIsUsed + '\'' +'}';}
}

MonitorConfig

package com.hero.lte.ems.monitor.entity.po;import com.hero.lte.ems.monitor.entity.MonitorTask;import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;public class MonitorConfig {/** 系统监控任务集合 **/public static final Map<String, MonitorTaskPo> MONITOR_TASK_MAP = new HashMap<>();/** 系统运行状态 **/public static final Integer MONITOR_RUN_SUCCESS = 1;/** 系统日志使用状态 **/public static final Integer MONITOR_SYS_USE = 0;/** 系统日志使用状态 **/public static final Integer MONITOR_SYS_FINISH = 1;public static final String SYSTEM_INFO ;static {String osName = "" ;String osVersion = "" ;Properties sysProperty = System.getProperties(); //系统属性Set<Object> keySet = sysProperty.keySet();for (Object object : keySet) {if("os.name".equals(object.toString())){osName = sysProperty.getProperty(object.toString());}if("os.version".equals(object.toString())){osVersion = sysProperty.getProperty(object.toString());}}SYSTEM_INFO = osName + " " + osVersion;}}

AlarmThresholdConstants

package com.hero.lte.ems.common.constant;/*** 告警相关常量* @author 211145187* @date 2023/6/21 14:24**/
public final class AlarmThresholdConstants {private AlarmThresholdConstants(){};// 系统监控任务中CPU阈值或者内存阈值超出设定值public static final int SYSTEM_MONITOR_TASK_EXCEEDS_THE_SPECIFIED_THRESHOLD = 40000;// enodeb进程异常public static final int ENODEB_PROCESS_EXCEPTION = 40001;}

IFmCurrentService

package com.hero.lte.ems.fm.service;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.fm.entity.ExportParam;
import com.hero.lte.ems.fm.model.*;
import com.hero.lte.ems.fm.model.db.FmAlarmLevelLangDb;
import com.hero.lte.ems.fm.model.event.AlarmTypeVo;
import com.hero.lte.ems.fm.model.parse.AlarmAutoConfirm;
import com.hero.lte.ems.fm.model.statistics.NeAlarmStatistics;
import com.hero.lte.ems.framework.resp.ResultSet;
import com.hero.lte.ems.mid.model.BusinessNe;
import org.redisson.api.RMap;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** @author w17231* @date 2017年3月16日*/public interface IFmCurrentService extends IFmConfirmService{/*** 按告警id和清除状态查询网元id** @param alarmIds* @param clearState* @return*/List<Integer> queryNeByAlarmId(List<Integer> alarmIds, Integer clearState);/*** 按网元id和清除状态查询当前告警** @param neIds* @param clearState* @return*/List<Alarm> queryByNeId(List<Integer> neIds, Integer clearState);/*** 通过nodeId集合以及清除状态查询告警** @param nodeIds    nodeId集合* @param clearState 清除状态* @return*/List<Alarm> queryByNodeIds(List<Integer> nodeIds, Integer clearState);/*** 按清除状态查询当前告警** @param clearState* @return*/List<Alarm> quryByClearState(Integer clearState);/*** 按告警等级查询当前告警** @param alarmLevel* @return*/int queryByAlarmLevel(Integer alarmLevel, String systemId);/*** 根据流水号查询告警** @param messageNos(多个流水号)* @return*/List<Alarm> queryBySN(List<Long> messageNos);/*** 根据流水号查询过滤后告警** @param messageNos(多个流水号)* @return*/List<Alarm> queryFilterBySN(List<Long> messageNos);/*** 根据流水号查询告警** @param alarmSeqs* @return*/List<AlarmFlow> queryFlowBySeq(List<Long> alarmSeqs);List<Alarm> queryBySNForEffectiveDevice(List<Long> messageNos);/*** 根据流水号查询告警** @param messageNo* @return*/Alarm queryBySN(Long messageNo, RMap<Integer, String>... rMap);/*** 根据流水号更新数据上报状态** @param receiveMessageNos* @return*/boolean updateSync(List<Long> receiveMessageNos);/*** 根据网元id及告警id、清除状态查询告警** @param neid* @param alarmId* @param clearstate* @return*/List<Alarm> queryByNeidAlarmId(Integer neid, Integer alarmId, Integer clearstate);List<Alarm> queryByNodeFlagAndNodeId(Integer nodeFlag, Integer nodeId, Integer alarmId, Integer clearState);List<Alarm> queryByEquipmentIdAlarmId(Integer equipmentId, Integer alarmId, Integer clearstate);/*** 根据网元id删除当前告警** @param neids* @return*/
//    boolean deleteByNeid(List<Integer> neids);/*** 根据节点id删除当前告警** @param nodeIds* @return*/boolean deleteByNodeId(List<Integer> nodeIds);/*** 根据网元id修改当前告警对应网元名称** @param neid* @param nename* @return*/boolean updateBtsName(Integer neid, String nename);/*** 查询所有未上报告警流水号** @return*/List<Long> queryBySync(Integer maxNum);/*** 告警入库** @param alarm*/boolean add(Alarm alarm);/*** 查询最大告警流水号** @return*/Long queryMaxMessageNo();/*** 按条件查询告警** @param alarmVo* @return*/List<Alarm> queryCurrentAlarm(AlarmVo alarmVo);Page<Alarm> qryCurrentAlarmPage(AlarmVo alarmVo, boolean flag, Page<Alarm> page);/*** 分页查询当前告警** @param alarm* @param page*/Page<Alarm> queryCurrentAlarm(AlarmVo alarm, Page<Alarm> page);/*** 分页查询当前告警(不做国际化)** @param alarm* @param page*/Page<Alarm> queryCurrentAlarmNoStatic(AlarmVo alarm, Page<Alarm> page);/*** 保存告警** @param alarm* @return*/Boolean saveAlarm(Alarm alarm);/*** 查询当前网元列表** @param systemId* @return*/List<BusinessNe> lteNes(String systemId);/*** 告警详细信息** @param messageNo* @return*/Alarm detail(Long messageNo);/*** 修改告警修复建议信息** @param messageNo 告警流水号* @param solution  修复建议* @return*/boolean modifyAdvise(Long messageNo, String solution);/*** 告警确认** @param messageNos* @param user* @param date* @return*/@OverrideMap<Long, Integer> lteConfirm(List<Long> messageNos, String user, String date, Boolean reportPdt);/*** 告警反确认** @param messageNos* @return*/void lteUnConfirm(List<Long> messageNos);/*** 告警清除** @param messageNos* @param user* @param date* @return*/Map<Long, Integer> lteClear(List<Long> messageNos, String user, String date, Boolean reportPdt);/*** 屏蔽告警** @param messageNos* @return*/boolean shield(List<Long> messageNos, String userName);/*** 按alarmKey查询当前告警** @param alarmKey* @return*/Alarm queryByAlarmKey(String alarmKey, String appendInfo);/*** 告警自动清除** @param alarm*/Long alarmAutoClear(Alarm alarm);/*** 根据网元id清除状态统计告警** @param* @param clearState* @return*/List<NeAlarmStatistics> getStatisticsData(List<Integer> neIds, Integer clearState);/*** 获取AlarmType集合** @return*/List<AlarmTypeVo> getAlarmTypes();/*** 获取告警级别集合** @return*/List<FmAlarmLevelLangDb> getAlarmLevels();/*** 告警定位到网元** @param systemId* @param messageNo* @return*/Map<String, String> locateNe(String systemId, String messageNo);/*** 获取同步待清除告警** @param ClearPath* @param clearState* @return*/List<Alarm> qrySynClearAlarm(Integer ClearPath, Integer clearState);/*** 查询告警流水号** @param systemId* @param clearState* @return*/List<Long> qryMessageNos(String systemId, Integer clearState);/*** 按告警流水号查询告警,查询范围包含当前表和历史表** @param messageNos* @return*/List<Alarm> qryByMessageNos(List<Long> messageNos);/*** 获取Lte网元类型** @return*/Map<Integer, String> lteNodeTypeToMap();/*** 获取Lte单板类型** @return*/Map<Integer, String> lteBrdTypeToMap();/*** 获取Lte告警类型** @return*/Map<Integer, String> lteAlarmTypeToMap();/*** 批量增加告警** @param list* @return*/Boolean add(List<Alarm> list);/*** 根据alarmKey判断告警是否存在** @param alarmKey* @return*/Boolean hasAlarm(String alarmKey, String appendInfo);/*** 获取最大流水号** @return*/Long getMaxMessageNo();/*** 获取流水表最大流水号** @return*/Long getMaxAlarmSeq();/*** 告警推送成功后处理** @param result*/void dealCurrentAlarmReceive(String result);/*** 获取需要自动确认的告警流水号** @param minConfirmTime 告警确认最小时间* @return*/List<Long> getAutoConfirmMessageNos(String systemId, Date minConfirmTime, Integer alarmLevel);/*** 获取当前告警中需要自动确认的告警流水号* @param alarmType* @param alarmLevel* @return*/@OverrideList<Long> getAutoConfirmNos(Integer alarmType, Integer alarmLevel);/*** AlarmLevelCount@return*/public void startAutoConfirm(AlarmAutoConfirm control);/*** 自动确认参数** @return*/AlarmAutoConfirm getAutoConfirmInfo();/*** 获取系统id下某个等级的告警数量**/
//    public int getAlarmCount(String systemId, Integer level);/*** 获取某网元的最大告警等级**/
//    public Integer getMaxLevel(String systemId);/*** 查询告警数量*/AlarmCountInfo queryAlarmCountInfo(AlarmVo alarmVo);/*** 初始化是否推送缓存*/public Integer isOn(String systemId);public void modifyAutoPara(String systemId);/*** 根据网元ID,清除状态查询告警流水号** @param syncNeIds* @param value* @return*/List<Long> qryMessageNos(List<Integer> syncNeIds, int value);/*** 根据通知状态和告警等级查询告警流水号** @param notifyState* @return*/List<Long> qryNotifyMessageNos(int notifyState, List<Integer> levels, String systemId, Integer ruleId);/*** 根据通知状态和alarmId查询告警流水号** @param notifyState* @return*/List<Long> qryNotifyMessageNosByAlarmId(int notifyState, List<Integer> alarmIds, String systemId, Integer ruleId);public boolean updateNotifyStatus(List<Long> messageNos);public boolean updateNotifyRules(List<Long> messageNos, String postFix);public SynAlarmResult synAlarmToPdt(String systemId);/*** 查询权限网元** @param concurrentHashMap* @return*/public void setRoleNe(ConcurrentHashMap concurrentHashMap);/*** 当前告警是否权限内** @param alarm* @return*/public boolean isRole(Alarm alarm);/*** 查询单板告警级别** @param neId* @return*/public List<NeAlarmStatistics> queryBoardAlarmLevelByNeId(int neId, int clearState);/*** 查询网元告警级别** @param neId* @return*/public List<NeAlarmStatistics> queryNetElementAlarmLevel(int clearState);/*** 修改告警详情** @param alarm* @return*/Integer changeDetails(AlarmVo alarm);/*** 插入流水表** @param flow* @return*/Boolean addAlarmFlow(AlarmFlow flow);List<Alarm> queryByCreatTime(Date startTime, Date endTime);Map<String, Object> getStatisticsData(AlarmVo alarmVo);/*** 获取未升级的告警* @return*/List<Alarm> queryUnUpdateAlarm();int updateAlarm(Alarm alarm);List<AlarmCurrentExport> qryAllCurrentAlarm(AlarmVo alarmVo, boolean flag, String[] formatI18n);Page<Alarm> queryCurrentAlarmPageForDataPush(AlarmDataPushVo alarmDataPushVo, Page<Alarm> page);int fmCurrentAlarmDataPush(AlarmDataPushVo alarmDataPushVo);ResultSet synchronizeAllAlarmData(String userId);/*** 根据条件查询当前告警数量,与qryAllCurrentAlarmPage的明细条件一致* @param alarmVo* @param flag* @return*/Integer queryAllCurrentAlarmCount(AlarmVo alarmVo, boolean flag);List<Alarm> getCurrentAlarmByNeId(Long neId);void exportAllData(HttpServletResponse response, ExportParam<Alarm> exportParam) throws IOException;
}

MonitorTaskExe

package com.hero.lte.ems.monitor.take;import com.alibaba.fastjson.JSONObject;
import com.hero.lte.ems.common.constant.AlarmThresholdConstants;
import com.hero.lte.ems.common.spring.SpringContextHolder;
import com.hero.lte.ems.common.tools.CustomStringUtils;
import com.hero.lte.ems.fm.cache.AlarmAutoClearQueeCache;
import com.hero.lte.ems.fm.enums.ClearStateEnum;
import com.hero.lte.ems.fm.enums.FaultTypeEnum;
import com.hero.lte.ems.fm.model.Alarm;
import com.hero.lte.ems.fm.service.IFmCurrentService;
import com.hero.lte.ems.fm.util.AlarmParamUtil;
import com.hero.lte.ems.monitor.dao.MonitorTaskLogMapper;
import com.hero.lte.ems.monitor.dao.MonitorTaskMapper;
import com.hero.lte.ems.monitor.entity.MonitorTask;
import com.hero.lte.ems.monitor.entity.MonitorTaskLog;
import com.hero.lte.ems.monitor.entity.po.MonitorConfig;
import com.hero.lte.ems.monitor.entity.po.MonitorPo;
import com.hero.lte.ems.monitor.entity.po.MonitorTaskPo;
import com.hero.lte.ems.monitor.entity.po.MonitorThresholdPo;
import com.hero.lte.ems.monitor.eunm.MonitorTaskStateEnum;
import com.hero.lte.ems.monitor.eunm.ProductEnum;
import com.hero.lte.ems.monitor.util.SystemMonitor;
import com.hero.lte.ems.monitor.util.SystemMonitorFactory;
import com.hero.lte.ems.monitor.util.UUIDGennerator;
import com.hero.lte.ems.topo.enums.NetElementTypeEnum;
import com.hero.lte.ems.websocket.enums.WSTopicEnum;
import com.hero.lte.ems.websocket.server.WServerHelper;
import org.redisson.api.RMap;
import org.redisson.api.RScoredSortedSet;
import org.redisson.api.RedissonClient;
import org.redisson.client.protocol.ScoredEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.time.Clock;
import java.util.*;/*** 定时查询服务器性能*/
@Component
public class MonitorTaskExe {private  static Logger log = LoggerFactory.getLogger(MonitorTaskExe.class);@Autowiredprivate MonitorTaskMapper monitorTaskMapper;@Autowiredprivate MonitorTaskLogMapper monitorTaskLogMapper;@Autowired@Qualifier(value = "redissonClient")RedissonClient redissonClient;@ResourceWServerHelper serverHelper;@Scheduled(cron = "*/5 * * * * *")public void scheduleRealTimeTask() {log.info("实时性能查询任务");realTimeMonitoring();}private void realTimeMonitoring() {SystemMonitor monitor = SystemMonitorFactory.createSystemMonitor();JSONObject jsonObj = new JSONObject();if (monitor != null) {MonitorPo monitorPoCPU = monitor.getCPUInfo();if (monitorPoCPU != null) {jsonObj.put("CPUUsage", monitorPoCPU.getCpu());}MonitorPo monitorPoMemory = monitor.getMemoryInfo();if (monitorPoMemory != null) {jsonObj.put("memoryUsage", monitorPoMemory.getMemory());jsonObj.put("memoryTotal", monitorPoMemory.getMemoryTotal());jsonObj.put("memoryUsageRatio", monitorPoMemory.getMemoryUseRatio());}MonitorPo monitorPoDisk = monitor.getDiskInfo();if (monitorPoDisk != null) {jsonObj.put("diskUsage", monitorPoDisk.getDiskUse());jsonObj.put("diskTotal", monitorPoDisk.getDiskTotal());jsonObj.put("diskUsageRatio", monitorPoDisk.getDiskUseRatio());}}log.info("json:{}", jsonObj);serverHelper.push2OneClient(WSTopicEnum.realTimeMonitoring.name(),"monitoring",JSONObject.toJSONString(jsonObj));}/*** 定时查询服务器性能,每1分钟执行一次 20231101 改1分钟一条*/@Scheduled(cron = "0 0/1 * * * *")public void scheduleMonitorTask() {try{Date date = new Date();this.scheduleMonitor(date);}catch (Exception e){log.error("定时查询服务器性能出错!", e);}}/*** 每天凌晨清理性能任务日志 仅保留三天内的数据* 0 59 23  * * **/@Scheduled(cron = "0 59 23 * * *")public void scheduleCleanTaskLog() {this.cleanTaskLog();}public void cleanTaskLog() {long threeDay =Clock.systemUTC().millis() - (3*24 * 60 * 60 * 1000);log.info("每日清理三天前数据  time---:{}",threeDay);monitorTaskLogMapper.cleanTaskLog(threeDay);}/*** 任务清理*/@Scheduled(cron = "30 10 1 * * *")public void taskClearTiming() {try{this.taskClear();}catch (Exception e){log.error("任务清理出错!", e);}}/*** 项目启动后将任务读入内存*/@PostConstructpublic void startSysLog(){log.info("项目启动后将系统监控任务读入内存");try{List<MonitorTask> monitorTaskList = monitorTaskMapper.findMonitorTaskAll();log.info("系统监控任共:monitorTaskList.size(){}, monitorTaskList", monitorTaskList.size(), monitorTaskList);for(MonitorTask monitorTask : monitorTaskList){setMonitorTaskMap(monitorTask);}}catch (Exception e){log.error("记录项目运行状态出错!", e);}}/*** 任务清理*/public void taskClear() {Date date = new Date();//获取任务Map<String, MonitorTaskPo> monitorTaskMap = MonitorConfig.MONITOR_TASK_MAP;log.info("monitorTaskMap:" +monitorTaskMap.size());if(monitorTaskMap.isEmpty()){return;}List<String> inUseList = new ArrayList<>();List<String> exeFinishList = new ArrayList<>();for(String mapKey : monitorTaskMap.keySet()){MonitorTaskPo monitorTaskPo = monitorTaskMap.get(mapKey);MonitorTask monitorTask = monitorTaskPo.getMonitorTask();Long sampleStart = monitorTask.getSampleStart();Long sampleEnd = monitorTask.getSampleEnd();Long currentTime = date.getTime();//判断任务是否到达采样时间,当前是“大于等于采样开始时间”且“小于等于采样结束时间”if(currentTime >= sampleStart && currentTime <= sampleEnd){inUseList.add(monitorTask.getId());}else if(currentTime > sampleEnd){exeFinishList.add(monitorTask.getId());}}log.info("inUseList:" + inUseList.size());log.info("exeFinishList:" + exeFinishList.size());Map<String, Object> inUseMap = new HashMap<>();inUseMap.put("idList", inUseList);inUseMap.put("exeState", MonitorTaskStateEnum.IN_USE.getCode());Map<String, Object> exeFinishMap = new HashMap<>();exeFinishMap.put("idList", exeFinishList);exeFinishMap.put("exeState", MonitorTaskStateEnum.EXE_FINISH.getCode());if(inUseList.size() > 0){monitorTaskMapper.updateMonitorTask(inUseMap);}if(exeFinishList.size() > 0){monitorTaskMapper.updateMonitorTask(exeFinishMap);}}/*** 新增或更新任务Map* @param monitorTask*/public static void setMonitorTaskMap(MonitorTask monitorTask){MonitorTaskPo monitorTaskPo = new MonitorTaskPo();//监控任务MonitorThresholdPo monitorThresholdPo = JSONObject.parseObject(monitorTask.getThreshold(), MonitorThresholdPo.class);if (monitorTask.getExeState() == null) {monitorTask.setExeState(MonitorTaskStateEnum.IN_SUSPEND.getCode());} else {monitorTask.setExeState(monitorTask.getExeState());}monitorTaskPo.setMonitorTask(monitorTask);monitorTaskPo.setMonitorThresholdPo(monitorThresholdPo);MonitorConfig.MONITOR_TASK_MAP.put(monitorTask.getId(), monitorTaskPo);}/*** 删除任务Map* @param idList*/public static void deactiveMonitorTaskMap(List<String> idList) {//获取任务Map<String, MonitorTaskPo> monitorTaskMap = MonitorConfig.MONITOR_TASK_MAP;for(String id : idList){MonitorTaskPo monitorTaskPo = monitorTaskMap.get(id);MonitorTask monitorTask = monitorTaskPo.getMonitorTask();monitorTask.setExeState(MonitorTaskStateEnum.IN_SUSPEND.getCode());monitorTaskPo.setMonitorTask(monitorTask);MonitorConfig.MONITOR_TASK_MAP.put(id, monitorTaskPo);}}/*** 删除任务Map* @param idList*/public static void activeMonitorTaskMap(List<String> idList) {//获取任务Map<String, MonitorTaskPo> monitorTaskMap = MonitorConfig.MONITOR_TASK_MAP;for(String id : idList){MonitorTaskPo monitorTaskPo = monitorTaskMap.get(id);MonitorTask monitorTask = monitorTaskPo.getMonitorTask();monitorTask.setExeState(MonitorTaskStateEnum.IN_USE.getCode());monitorTaskPo.setMonitorTask(monitorTask);MonitorConfig.MONITOR_TASK_MAP.put(id, monitorTaskPo);}}/*** 删除任务Map* @param idList*/public static void deleteMonitorTaskMap(List<String> idList){for(String id : idList){MonitorConfig.MONITOR_TASK_MAP.remove(id);}}/*** 定时查询服务器性能,超过目阈值入库 改所有的内容都入库*/public void scheduleMonitor(Date date) {String detail = "out of Threshold! cpu=%s, cpuThreshold=%s, memory=%s, memoryThreshold=%s, diskSpace=%s, diskSpaceThreshold=%s";Date currentDate = new Date();boolean whetherDeleteAlarm = false;boolean whetherAddAlarm = false;List<Alarm> alarmList = new ArrayList<>();JSONObject redisJson = new JSONObject();//获取任务Map<String, MonitorTaskPo> monitorTaskMap = MonitorConfig.MONITOR_TASK_MAP;if(monitorTaskMap.isEmpty()){return;}//按产品名称将任务分组Map<String, List<MonitorTaskPo>> monitorTaskProductMap = new HashMap<>();for(String mapKey : monitorTaskMap.keySet()){MonitorTaskPo monitorTaskPo = monitorTaskMap.get(mapKey);MonitorTask monitorTask = monitorTaskPo.getMonitorTask();Long sampleStart = monitorTask.getSampleStart();Long sampleEnd = monitorTask.getSampleEnd();Long currentTime = date.getTime();//判断任务是否到达采样时间,当前是“大于等于采样开始时间”且“小于等于采样结束时间”// 2023/01/10 新增了暂停按钮,所以这里需要判断状态是否为暂停状态if(currentTime >= sampleStart && currentTime <= sampleEnd||monitorTask.getExeState()==MonitorTaskStateEnum.IN_SUSPEND.getCode()){String product = monitorTask.getProduct();List<MonitorTaskPo> productList = monitorTaskProductMap.get(product);if(productList == null){productList = new ArrayList<>();}productList.add(monitorTaskPo);monitorTaskProductMap.put(product, productList);}}log.info( "monitorTaskProductMap:{}", JSONObject.toJSONString(monitorTaskProductMap));//获取产品List<String> list = ProductEnum.getCodeList();//按产品名称执行任务,将超过阈值的数据入库for(String productCode : list){log.info( "productCode:{}", productCode);List<MonitorTaskPo> monitorTaskPoList = monitorTaskProductMap.get(productCode);log.info( "monitorTaskPoList:{}", monitorTaskPoList);if(monitorTaskPoList == null || monitorTaskPoList.isEmpty()){continue;}String productSearch = ProductEnum.getSearch(productCode);log.info( "查询进程:{}", productSearch);SystemMonitor monitor = SystemMonitorFactory.createSystemMonitor();log.info( "-monitor:{}", monitor);if(monitor == null){continue;}RedissonClient redisson = SpringContextHolder.getBean("redissonClient");RMap<Long, Long> rMap = redisson.getMap("numberOfAlarmsReceivedPerMinute");long average = CustomStringUtils.calculateAverage(rMap);log.info( "-average:{}", average);List<MonitorTaskLog> monitorTaskLogList = new ArrayList<>();/** 遍历“监控任务” **/for(MonitorTaskPo monitorTaskPo :monitorTaskPoList ){//监控任务MonitorThresholdPo monitorThresholdPo = monitorTaskPo.getMonitorThresholdPo();Integer exeState = monitorTaskPo.getMonitorTask().getExeState();log.info( "monitorTaskPo:{},    monitor:{},    monitorThresholdPo{}", monitorTaskPo, monitor,monitorThresholdPo);/** 对比“进程当前信息”与“监控任务” **/if(exeState == 1 && monitorThresholdPo.getCpuThreshold() != null && monitorThresholdPo.getMemoryThreshold() != null && monitorThresholdPo.getSpaceThreshold() != null){MonitorTaskLog monitorTaskLog = new MonitorTaskLog();monitorTaskLog.setSystemInfo(MonitorConfig.SYSTEM_INFO);monitorTaskLog.setTaskId(monitorTaskPo.getMonitorTask().getId());monitorTaskLog.setId(UUIDGennerator.generator());monitorTaskLog.setProduct(productCode);monitorTaskLog.setRecoreTime(Clock.systemUTC().millis());MonitorPo monitorPoCPU = monitor.getCPUInfo();if (monitorPoCPU != null) {monitorTaskLog.setCpu(monitorPoCPU.getCpu());monitorTaskLog.setCpuThreshold(monitorThresholdPo.getCpuThreshold());}MonitorPo monitorPoMemory = monitor.getMemoryInfo();if (monitorPoMemory != null) {monitorTaskLog.setMemory(monitorPoMemory.getMemory());monitorTaskLog.setMemoryThreshold(monitorThresholdPo.getMemoryThreshold());}MonitorPo monitorPoDisk = monitor.getDiskInfo();if (monitorPoDisk != null) {monitorTaskLog.setSpace(monitorPoDisk.getDiskUseRatio());monitorTaskLog.setSpaceThreshold(monitorThresholdPo.getSpaceThreshold());}MonitorPo monitorPoNetwork = monitor.getNetworkResourceInformation();if (monitorPoNetwork != null) {monitorTaskLog.setNetworkRxRate(monitorPoNetwork.getNetworkRxRate());monitorTaskLog.setNetworkTxRate(monitorPoNetwork.getNetworkTxRate());}MonitorPo monitorPoIops = monitor.getIopsResourceInformation();if (monitorPoIops != null) {monitorTaskLog.setIopsKbRead(monitorPoIops.getIopsKbRead());monitorTaskLog.setIopsKbWrite(monitorPoIops.getIopsKbWrite());}MonitorPo monitorPoStoresQueue = monitor.getStoresQueueInputOrOutputOperandsPerSecond();if (monitorPoStoresQueue != null) {monitorTaskLog.setQueueOperands(monitorPoStoresQueue.getQueueOperands());}MonitorPo monitorPoMysqlDisk = monitor.getUsageOfTheMysqlDiskSpaceInTheFileSystem();if (monitorPoMysqlDisk != null) {monitorTaskLog.setDatabaseDiskSpaceIsUsed(monitorPoMysqlDisk.getDatabaseDiskSpaceIsUsed());}monitorTaskLog.setSnmpAlarmDataSize((double) average);if (monitorPoCPU != null && monitorPoMemory != null && monitorPoDisk != null) {if (monitorPoCPU.getCpu() >= monitorThresholdPo.getCpuThreshold() || monitorPoMemory.getMemory() >= monitorThresholdPo.getMemoryThreshold() || monitorPoDisk.getDiskUseRatio() >= monitorThresholdPo.getSpaceThreshold()) {detail = String.format(detail, monitorPoCPU.getCpu(), monitorThresholdPo.getCpuThreshold(), monitorPoMemory.getMemory(), monitorThresholdPo.getMemoryThreshold(), monitorPoDisk.getDiskUseRatio(), monitorThresholdPo.getSpaceThreshold());whetherAddAlarm = true;} else if(monitorPoCPU.getCpu() < monitorThresholdPo.getCpuThreshold() && monitorPoMemory.getMemory() < monitorThresholdPo.getMemoryThreshold() && monitorPoDisk.getDiskUseRatio() < monitorThresholdPo.getSpaceThreshold()) {whetherDeleteAlarm = true;}}monitorTaskLogList.add(monitorTaskLog);}}log.info("-whetherDeleteAlarm:{},whetherAddAlarm:{}", whetherDeleteAlarm, whetherAddAlarm);log.info("-monitorTaskLogList:{}", monitorTaskLogList);log.info("-monitorTaskLogList.size():{}", (monitorTaskLogList.size() > 0));if(monitorTaskLogList.size() > 0) {monitorTaskLogMapper.insertMonitorTaskLog(monitorTaskLogList);if (whetherAddAlarm) {log.info("add alarm whetherAddAlarm:{}", whetherAddAlarm);//添加告警IFmCurrentService currentAlarmService = SpringContextHolder.getBean(IFmCurrentService.class);Alarm alarm = addAlarmParam(currentDate, productCode, detail);//同类告警只产生一条,当需要添加告警时得先确认之前是否有同类告警,如果没有就新增,如果有就不应该再添加告警了,此处就是逻辑判断RMap<String, Object> internalAlarmsMap = redissonClient.getMap("InternalAlarmsOfTheSameType");//补充打印key功能,为了验证当版本升级时候,为啥40000的key在缓存中会消失或者清除问题,目前补救办法是入库前先查询是否有告警,有则不添加,没有则可以添加for (String key : internalAlarmsMap.keySet()) {log.info("-begin-key:{},value:{}", key, internalAlarmsMap.get(key));}if (productCode.equals("PLATFORM") && !internalAlarmsMap.containsKey(alarm.getAlarmID().toString())) {log.info("!containsKey-key:{}", alarm.getAlarmID().toString());alarmList = currentAlarmService.queryByNodeFlagAndNodeId(0, 0, alarm.getAlarmID(), ClearStateEnum.UNCLEAR.getValue());if (alarmList.size() == 0) {boolean result = currentAlarmService.add(alarm);log.info("-scheduleMonitor-addAlarm: add data result = {}", result);if (result) {redisJson = fillJsonParameter(alarm);internalAlarmsMap.put(alarm.getAlarmID().toString(), redisJson);}for (String key : internalAlarmsMap.keySet()) {log.info("-end-key:{},value:{}", key, internalAlarmsMap.get(key));}}log.info("alarmList has content:{}", alarmList);}}}if (whetherDeleteAlarm) {log.info("clear alarm whetherDeleteAlarm:{}", whetherDeleteAlarm);//清除告警Integer alarmId = AlarmThresholdConstants.SYSTEM_MONITOR_TASK_EXCEEDS_THE_SPECIFIED_THRESHOLD;RMap<String, Object> internalAlarmsMap = redissonClient.getMap("InternalAlarmsOfTheSameType");if (productCode.equals("PLATFORM") && internalAlarmsMap.containsKey(alarmId.toString())) {for (String key : internalAlarmsMap.keySet()) {log.info("-begin-key:{},value:{}", key, internalAlarmsMap.get(key));}JSONObject json = JSONObject.parseObject(internalAlarmsMap.get(alarmId.toString()).toString());String alarmKey = json.getString("alarmKey");Alarm alarm = addClearAlarmParam(alarmKey);boolean result = AlarmAutoClearQueeCache.getInstance().addDataWithoutBlock(alarm);log.info("-scheduleMonitor-clearAlarm: add auto clear data result = {}", result);if (result) {internalAlarmsMap.remove(alarmId.toString());}for (String key : internalAlarmsMap.keySet()) {log.info("-end-key:{},value:{}", key, internalAlarmsMap.get(key));}}}}}/*** 拼接存入redis的JSONObject参数* @Author 211145187* @Date 2024/3/5 14:48* @param alarm alarm* @Return JSONObject**/public JSONObject fillJsonParameter(Alarm alarm) {log.info("-fillJsonParameter-alarm:{}", alarm);JSONObject json = new JSONObject();json.put("alarmID", alarm.getAlarmID());json.put("alarmKey", alarm.getAlarmKey());json.put("alarmType", alarm.getAlarmType());json.put("appendInfo", alarm.getAppendInfo());json.put("clearState", alarm.getClearState());json.put("confirmState", alarm.getConfirmState());json.put("createTime", alarm.getCreateTime());json.put("filterUsers", alarm.getFilterUsers());json.put("intoDbTime", alarm.getIntoDbTime());json.put("isLinkedAlarm", alarm.getIsLinkedAlarm());json.put("isNmsAlarm", alarm.isNmsAlarm());json.put("level", alarm.getLevel());json.put("messageNo", alarm.getMessageNo());json.put("neID", alarm.getNeID());json.put("nodeFlag", alarm.getNodeFlag());json.put("nodeId", alarm.getNodeId());json.put("nodeType", alarm.getNodeType());json.put("nodeTypeId", alarm.getNodeTypeId());json.put("notification", alarm.getNotification());json.put("notifyRules", alarm.getNotifyRules());json.put("probableCause", alarm.getProbableCause());json.put("systemType", alarm.getSystemType());json.put("ulReportType", alarm.getUlReportType());log.info("-fillJsonParameter-json:{}", json);return json;}/*** 拼接添加告警参数* 说明:由于之前只有基站相关告警,而没有内部告警,比如cpu超阈值或者运行服务挂了等等,因此补充了nodeId为0的自定义内部告警,同时跳过参数加工处理、过滤等操作,直接操作数据表,因此目前只能这样了,多少有点不优雅,一切先以按时完成开发为主,后续有时间再优化吧* @param currentDate currentDate* @param processName 进程名称* @param detail 原因详情* @return Alarm*/public Alarm addAlarmParam(Date currentDate, String processName, String detail) {log.info("-MonitorTaskExe-addAlarmParam-currentDate:{},processName:{},detail:{}", currentDate, processName, detail);Alarm alarm = new Alarm();Long messageNo = AlarmParamUtil.nextAlarmSN();alarm.setAppendInfo(detail);alarm.setMessageNo(messageNo);alarm.setNotification(0);alarm.setNotifyRules("");alarm.setSystemType("Lte");alarm.setCreateTime(currentDate);alarm.setIntoDbTime(new Date());alarm.setLevel(1);alarm.setAlarmID(AlarmThresholdConstants.SYSTEM_MONITOR_TASK_EXCEEDS_THE_SPECIFIED_THRESHOLD);alarm.setAlarmType(2);alarm.setNodeType(NetElementTypeEnum.UNMS.getTypeName().toUpperCase());alarm.setNodeName(NetElementTypeEnum.UNMS.getTypeName().toUpperCase());alarm.setNeName(NetElementTypeEnum.UNMS.getTypeName().toUpperCase());alarm.setNodeTypeId(NetElementTypeEnum.UNMS.getTypeCode().toString());alarm.setProbableCause("Alarm.systemMonitorTaskExceedsTheSpecifiedThreshold");alarm.setNodeFlag(0);alarm.setNodeId(0);alarm.setNeID(0);alarm.setUlReportType(FaultTypeEnum.FAULT_REPORT.getType());alarm.setAlarmKey(AlarmParamUtil.getAlarmKey(alarm.getNeID(), alarm.getCabinet(), alarm.getFrame(),alarm.getSlot(), alarm.getSubSlot(), alarm.getAlarmID(), alarm.getCreateTime(),alarm.getXxdwinfo1(), alarm.getXxdwinfo2()) + processName);return alarm;}/*** 拼接清除告警参数* @param alarmKey alarmKey* @return Alarm*/public Alarm addClearAlarmParam(String alarmKey) {log.info("-MonitorTaskExe-addClearAlarmParam-alarmKey:{}", alarmKey);Alarm alarm = new Alarm();alarm.setAlarmID(AlarmThresholdConstants.SYSTEM_MONITOR_TASK_EXCEEDS_THE_SPECIFIED_THRESHOLD);alarm.setNeID(0);alarm.setUlReportType(FaultTypeEnum.FAULT_RECOVER.getType());alarm.setConfirmTime(new Date());alarm.setAlarmKey(alarmKey);return alarm;}/*** 获取key值最小的键* @param map map* @return key*/private static String getMinKey(RMap<String, Object> map) {// 使用 RScoredSortedSet 创建有序集合RScoredSortedSet<String> set = (RScoredSortedSet<String>) map.keySet();// 获取有序集合中的第一个元素的键ScoredEntry<String> minEntry = set.entryRange(0, 0).iterator().next();// 返回最小的 keyreturn minEntry.getScore().toString();}
}

本人其他相关文章链接

1.统计服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
2.查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息


http://www.mrgr.cn/news/100588.html

相关文章:

  • Linux 定时备份到windows 方案比较
  • [实战] IRIG-B协议详解及Verilog实现(完整代码)
  • 麻衣相法【麻衣相士】开篇
  • node.js 实战——mongoDB
  • HTML标记语言_@拉钩教育【笔记】
  • GCN+PyG 的安装与使用
  • JAVA设计模式——(八)单例模式
  • 深度对比:Objective-C与Swift的RunTime机制与底层原理
  • mac 基于Docker安装minio服务器
  • OpenAvatarChat要解决UnicodeDecodeError
  • 在C# WebApi 中使用 Nacos01:基础安装教程和启动运行
  • ArcGIS arcpy代码工具——根据属性结构表创建shape图层
  • 机器学习:【抛掷硬币的贝叶斯后验概率】
  • 基于ffmpeg的音视频编码
  • 数据库- JDBC
  • Miniconda Windows10版本下载和安装
  • Vue 3 vuedraggable 例子
  • linux 使用nginx部署vue、react项目
  • 【angular19】入门基础教程(三):关于angular里面的响应式数据入门使用
  • 【Linux实践系列】:进程间通信:万字详解命名管道实现通信