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

发布于:2025-05-01 ⋅ 阅读:(21) ⋅ 点赞:(0)

在这里插入图片描述

一、背景

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

  • 监控系统资源:实时监测 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、队列、数据库占用空间等等信息


网站公告

今日签到

点亮在社区的每一天
去签到