文章目录
- 一、背景
- 二、说明
- 三、页面
- 四、代码
-
- 前端
-
- addMonitorTask.vue
- showMonitorTask.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
四、代码
前端
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>
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 = editId
const 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>
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–pager
ref="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–pager
ref="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);
@Autowired
private IMonitorTaskService monitorTaskService;
@Autowired
private 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 task
log.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);
@Resource
private MonitorTaskMapper monitorTaskMapper;
@Override
public Page<MonitorTask> getMonitorTaskList(Page<MonitorTask> pager){
List<MonitorTask> monitorTaskList = monitorTaskMapper.findMonitorTaskPage(pager, pager.getParam());
return pager;
}
@Override
public List<MonitorTask> getMonitorTaskAll(){
List<MonitorTask> monitorTaskList = monitorTaskMapper.findMonitorTaskAll();
return monitorTaskList;
}
@Override
public MonitorTask getMonitorTask(String id) throws LteException {
return monitorTaskMapper.findById(id);
}
@Override
public int insertMonitorTask(MonitorTask monitorTask){
return monitorTaskMapper.insertMonitorTask(monitorTask);
}
@Override
public int updateMonitorTask(MonitorTask monitorTask){
return monitorTaskMapper.modMonitorTask(monitorTask);
}
@Override
public List<MonitorTask> queryDataByTaskName(String taskName) {
return monitorTaskMapper.queryDataByTaskName(taskName);
}
@Override
public int updateMonitorTask(Map<String, Object> map){
return monitorTaskMapper.updateMonitorTask(map);
}
@Override
public 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_task
where 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_task
where 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;
}
@Override
public 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;
}
@Override
public 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;
//网络接收数据包速率/s
private Double networkRxRate;
//网络发送数据包速率/s
private Double networkTxRate;
//IOPS读取数据量/s
private Double iopsKbRead;
//IOPS写入数据量/s
private Double iopsKbWrite;
//每秒存储队列输入/输出操作数
private Double queueOperands;
//南向告警数据量/s
private 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;
}
@Override
public 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;
}
@Override
public 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 {
@Autowired
SimpMessagingTemplate 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;
//网络接收数据包速率/s
private Double networkRxRate;
//网络发送数据包速率/s
private Double networkTxRate;
//IOPS读取数据量/s
private Double iopsKbRead;
//IOPS写入数据量/s
private Double iopsKbWrite;
//每秒存储队列输入/输出操作数
private Double queueOperands;
//南向告警数据量/s
private 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;
}
@Override
public 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
*/
@Override
Map<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
*/
@Override
List<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);
@Autowired
private MonitorTaskMapper monitorTaskMapper;
@Autowired
private MonitorTaskLogMapper monitorTaskLogMapper;
@Autowired
@Qualifier(value = "redissonClient")
RedissonClient redissonClient;
@Resource
WServerHelper 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);
}
}
/**
* 项目启动后将任务读入内存
*/
@PostConstruct
public 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();
// 返回最小的 key
return minEntry.getScore().toString();
}
}
本人其他相关文章链接
1.统计服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息 2.查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
评论前必须登录!
注册