Browse Source

(*)告警处置效率数据计算入库定时任务修改-数据类告警查询优化

dev
wuqun 2 years ago
parent
commit
4fd1b0ccc0
  1. 233
      api/app/lib/schedule/alarms_handle_statistics.js

233
api/app/lib/schedule/alarms_handle_statistics.js

@ -7,7 +7,7 @@ module.exports = function (app, opts) {
const { database: anxinyun } = clickHouse.anxinyun.opts.config const { database: anxinyun } = clickHouse.anxinyun.opts.config
const alarmHandleStatistics = app.fs.scheduleInit( const alarmHandleStatistics = app.fs.scheduleInit(
{ {
interval: '0 58 9 * * *', interval: '0 48 1 ? * MON',//0 48 1 ? * MON 每周一凌晨1点48开始执行
// immediate: true, // immediate: true,
//proRun: true, //proRun: true,
}, },
@ -16,18 +16,18 @@ module.exports = function (app, opts) {
let anxinStruc = await getAxyStructs() let anxinStruc = await getAxyStructs()
let pomsProject = await pomsProjectRange() let pomsProject = await pomsProjectRange()
if (anxinStruc.length) { if (anxinStruc.length) {
let dataAlarms = await getDataAlarms(anxinStruc);//数据告警 let { dataSum, dataMaps } = await getDataAlarms(anxinStruc);//数据告警
let appAlarms = await getAppAlarms(pomsProject);//应用告警 let appAlarms = await getAppAlarms(pomsProject);//应用告警
let videoAlarms = await getVideoAlarms(anxinStruc);//视频告警 let videoAlarms = await getVideoAlarms(anxinStruc);//视频告警
let time = moment().format() let time = moment().format()
//算全局 //算全局
let dataArrToSave = [] //let dataArrToSave = []
let dataMap = calculate(dataAlarms, appAlarms, videoAlarms) let dataMap = calculate(dataMaps, appAlarms, videoAlarms)
let sum = dataAlarms.length + appAlarms.length + videoAlarms.length; let sum = dataSum + appAlarms.length + videoAlarms.length;
if (sum) { if (sum) {
dataArrToSave.push({ let data = {
time: time, time: time,
projectCorrelationId: null,//全局 projectCorrelationId: null,//全局
day1: parseFloat((100 * dataMap.day1 / sum).toFixed(2)), day1: parseFloat((100 * dataMap.day1 / sum).toFixed(2)),
@ -36,32 +36,60 @@ module.exports = function (app, opts) {
day15: parseFloat((100 * dataMap.day15 / sum).toFixed(2)), day15: parseFloat((100 * dataMap.day15 / sum).toFixed(2)),
day30: parseFloat((100 * dataMap.day30 / sum).toFixed(2)), day30: parseFloat((100 * dataMap.day30 / sum).toFixed(2)),
day30m: parseFloat((100 * dataMap.day30m / sum).toFixed(2)), day30m: parseFloat((100 * dataMap.day30m / sum).toFixed(2)),
}) }
await models.AlarmHandleStatistics.create(data)
} }
//算单个项目 //算单个项目
pomsProject.map(p => { pomsProject.map(async p => {
let pid = p.id; let pid = p.id;
let pDataAlarms = dataAlarms.filter(da => da.pomsProject.indexOf(pid) != -1) //let pid = 11
let pAppAlarms = appAlarms.filter(aa => aa.app.projectCorrelations.map(ap => ap.id).indexOf(pid) != -1) let pAnxinStruc = await getAxyStructs(pid)
let pVideoAlarms = videoAlarms.filter(va => va.pomsProject.indexOf(pid) != -1) let pPomsProject = await pomsProjectRange(pid)
if (pAnxinStruc.length) {
let pDataMap = calculate(pDataAlarms, pAppAlarms, pVideoAlarms) let { dataSum, dataMaps } = await getDataAlarms(pAnxinStruc);//数据告警
let sm = pDataAlarms.length + pAppAlarms.length + pVideoAlarms.length; let pAppAlarms = await getAppAlarms(pPomsProject);//应用告警
if (sm) { let pVideoAlarms = await getVideoAlarms(pAnxinStruc);//视频告警
dataArrToSave.push({ let pDataMap = calculate(dataMaps, pAppAlarms, pVideoAlarms)
time: time, let sm = dataSum + pAppAlarms.length + pVideoAlarms.length;
projectCorrelationId: pid,//单个项目 if (sm) {
day1: parseFloat((100 * pDataMap.day1 / sum).toFixed(2)), let data = {
day3: parseFloat((100 * pDataMap.day3 / sum).toFixed(2)), time: time,
day7: parseFloat((100 * pDataMap.day7 / sum).toFixed(2)), projectCorrelationId: pid,//单个项目
day15: parseFloat((100 * pDataMap.day15 / sum).toFixed(2)), day1: parseFloat((100 * pDataMap.day1 / sm).toFixed(2)),
day30: parseFloat((100 * pDataMap.day30 / sum).toFixed(2)), day3: parseFloat((100 * pDataMap.day3 / sm).toFixed(2)),
day30m: parseFloat((100 * pDataMap.day30m / sum).toFixed(2)), day7: parseFloat((100 * pDataMap.day7 / sm).toFixed(2)),
}) day15: parseFloat((100 * pDataMap.day15 / sm).toFixed(2)),
day30: parseFloat((100 * pDataMap.day30 / sm).toFixed(2)),
day30m: parseFloat((100 * pDataMap.day30m / sm).toFixed(2)),
}
await models.AlarmHandleStatistics.create(data)
}
} }
}) })
await models.AlarmHandleStatistics.bulkCreate(dataArrToSave) //算单个项目
// pomsProject.map(p => {
// let pid = p.id;
// let pDataAlarms = dataAlarms.filter(da => da.pomsProject.indexOf(pid) != -1)
// let pAppAlarms = appAlarms.filter(aa => aa.app.projectCorrelations.map(ap => ap.id).indexOf(pid) != -1)
// let pVideoAlarms = videoAlarms.filter(va => va.pomsProject.indexOf(pid) != -1)
// let pDataMap = calculate(pDataAlarms, pAppAlarms, pVideoAlarms)
// let sm = pDataAlarms.length + pAppAlarms.length + pVideoAlarms.length;
// if (sm) {
// dataArrToSave.push({
// time: time,
// projectCorrelationId: pid,//单个项目
// day1: parseFloat((100 * pDataMap.day1 / sum).toFixed(2)),
// day3: parseFloat((100 * pDataMap.day3 / sum).toFixed(2)),
// day7: parseFloat((100 * pDataMap.day7 / sum).toFixed(2)),
// day15: parseFloat((100 * pDataMap.day15 / sum).toFixed(2)),
// day30: parseFloat((100 * pDataMap.day30 / sum).toFixed(2)),
// day30m: parseFloat((100 * pDataMap.day30m / sum).toFixed(2)),
// })
// }
// })
//await models.AlarmHandleStatistics.bulkCreate(dataArrToSave)
} }
} catch (error) { } catch (error) {
console.error(error); console.error(error);
@ -69,33 +97,34 @@ module.exports = function (app, opts) {
} }
) )
function calculate(dataAlarms, appAlarms, videoAlarms) { function calculate(dataMaps, appAlarms, videoAlarms) {
try { try {
let { day1, day3, day7, day15, day30, day30m } = dataMaps;
//算全局 //算全局
let dataMap = { let dataMap = {
day1: 0,//当日处理 day1: day1[0].count,//当日处理
day3: 0,//3日内 day3: day3[0].count,//3日内
day7: 0,//7日内 day7: day7[0].count,//7日内
day15: 0,//15日内 day15: day15[0].count,//15日内
day30: 0,//30日内 day30: day30[0].count,//30日内
day30m: 0//超过30日 day30m: day30m[0].count//超过30日
} }
dataAlarms.filter(d => d.State > 3).map(da => { // dataAlarms.filter(d => d.State > 3).map(da => {
let range = moment(da.confirmTime).diff(moment(da.StartTime), 'day') // let range = moment(da.confirmTime).diff(moment(da.StartTime), 'day')
if (range <= 1) { // if (range <= 1) {
dataMap.day1++ // dataMap.day1++
} else if (range > 1 && range <= 3) { // } else if (range > 1 && range <= 3) {
dataMap.day3++ // dataMap.day3++
} else if (range > 3 && range <= 7) { // } else if (range > 3 && range <= 7) {
dataMap.day7++ // dataMap.day7++
} else if (range > 7 && range <= 15) { // } else if (range > 7 && range <= 15) {
dataMap.day15++ // dataMap.day15++
} else if (range > 15 && range <= 30) { // } else if (range > 15 && range <= 30) {
dataMap.day30++ // dataMap.day30++
} else if (range > 30) { // } else if (range > 30) {
dataMap.day30m++ // dataMap.day30m++
} // }
}) // })
appAlarms.filter(d => d.confirmTime).map(da => { appAlarms.filter(d => d.confirmTime).map(da => {
let range = moment(da.confirmTime).diff(moment(da.createTime), 'day') let range = moment(da.confirmTime).diff(moment(da.createTime), 'day')
if (range < 1) { if (range < 1) {
@ -134,6 +163,17 @@ module.exports = function (app, opts) {
} }
} }
function getStr(alarmQueryOptionStr, paramStr) {
return `
select count(AlarmId) count from
(SELECT
alarms.AlarmId AS AlarmId,
alarms.State AS State,
alarms.StructureId AS StructureId,
StartTime, EndTime
${alarmQueryOptionStr}) where State>3 and ${paramStr}`
}
async function getDataAlarms(anxinStruc) { async function getDataAlarms(anxinStruc) {
try { try {
const anxinStrucIds = anxinStruc.map(a => a.strucId) const anxinStrucIds = anxinStruc.map(a => a.strucId)
@ -158,35 +198,53 @@ module.exports = function (app, opts) {
StartTime, EndTime StartTime, EndTime
${alarmQueryOptionStr}`).toPromise(); ${alarmQueryOptionStr}`).toPromise();
console.log('数据-数据-数据告警查询结束---' + moment().format('YYYY-MM-DD HH:mm:ss') + `---一共${alarmRes.length}`) let day1Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)<=1');
let day1 = await clickHouse.dataAlarm.query(day1Str).toPromise();
const confirmedAlarm = alarmRes.filter(ar => ar.State && ar.State > 2).map(ar => "'" + ar.AlarmId + "'");
const confirmedAlarmDetailMax = confirmedAlarm.length ?
await clickHouse.dataAlarm.query(`
SELECT
max(Time) AS Time, AlarmId
FROM
alarm_details
WHERE
AlarmId IN (${confirmedAlarm.join(',')})
GROUP BY AlarmId
`).toPromise() : [];
alarmRes.forEach(ar => {
ar.pomsProject = (
anxinStruc.find(as => as.strucId == ar.StructureId) ||
{
pomsProject: [
// TODO: 开发临时添加
]
}
).pomsProject.map(p => p.id)
// 最新告警详情 - 确认信息 let day3Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>1 and Date(EndTime) - Date(StartTime)<=3');
let corConfirmedData = (confirmedAlarmDetailMax.find(cdm => cdm.AlarmId == ar.AlarmId) || {}); let day3 = await clickHouse.dataAlarm.query(day3Str).toPromise();
ar.confirmTime = corConfirmedData.Time || ar.EndTime
}) let day7Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>3 and Date(EndTime) - Date(StartTime)<=7');
return alarmRes; let day7 = await clickHouse.dataAlarm.query(day7Str).toPromise();
let day15Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>7 and Date(EndTime) - Date(StartTime)<=15');
let day15 = await clickHouse.dataAlarm.query(day15Str).toPromise();
let day30Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>15 and Date(EndTime) - Date(StartTime)<=30');
let day30 = await clickHouse.dataAlarm.query(day30Str).toPromise();
let day30mStr = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>30');
let day30m = await clickHouse.dataAlarm.query(day30mStr).toPromise();
// console.log('数据-数据-数据告警查询结束---' + moment().format('YYYY-MM-DD HH:mm:ss') + `---一共${alarmRes.length}条`)
// const confirmedAlarm = alarmRes.filter(ar => ar.State && ar.State > 2).map(ar => "'" + ar.AlarmId + "'");
// const confirmedAlarmDetailMax = confirmedAlarm.length ?
// await clickHouse.dataAlarm.query(`
// SELECT
// max(Time) AS Time, AlarmId
// FROM
// alarm_details
// WHERE
// AlarmId IN (${confirmedAlarm.join(',')})
// GROUP BY AlarmId
// `).toPromise() : [];
// alarmRes.forEach(ar => {
// ar.pomsProject = (
// anxinStruc.find(as => as.strucId == ar.StructureId) ||
// {
// pomsProject: [
// // TODO: 开发临时添加
// ]
// }
// ).pomsProject.map(p => p.id)
// // 最新告警详情 - 确认信息
// let corConfirmedData = (confirmedAlarmDetailMax.find(cdm => cdm.AlarmId == ar.AlarmId) || {});
// ar.confirmTime = corConfirmedData.Time || ar.EndTime
// })
return { dataSum: alarmRes.length, dataMaps: { day1, day3, day7, day15, day30, day30m } };
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
@ -318,9 +376,9 @@ module.exports = function (app, opts) {
console.error(error); console.error(error);
} }
} }
async function pomsProjectRange() { async function pomsProjectRange(pepProjectId) {
try { try {
const { pepProjectRes, bindRes } = await pomsWithPepRangeParams() const { pepProjectRes, bindRes } = await pomsWithPepRangeParams(pepProjectId)
let pomsProject = [] let pomsProject = []
for (let b of bindRes) { for (let b of bindRes) {
if (b.pepProjectId) { if (b.pepProjectId) {
@ -341,9 +399,18 @@ module.exports = function (app, opts) {
} }
} }
async function pomsWithPepRangeParams() { async function pomsWithPepRangeParams(pepProjectId) {
try { try {
const bindRes = await models.ProjectCorrelation.findAll({ where: { del: false } }); let findOption = {
where: {
del: false
}
}
if (pepProjectId) {
// 有 特定的项目id 就按此查询
findOption.where.id = pepProjectId
}
const bindRes = await models.ProjectCorrelation.findAll(findOption);
// 获取不重复的 项企项目id // 获取不重复的 项企项目id
let pepProjectIds = [] let pepProjectIds = []
for (let b of bindRes) { for (let b of bindRes) {
@ -379,9 +446,9 @@ module.exports = function (app, opts) {
} }
} }
async function getAxyStructs() { async function getAxyStructs(pepProjectId) {
try { try {
const { pepProjectRes, bindRes } = await pomsWithPepRangeParams() const { pepProjectRes, bindRes } = await pomsWithPepRangeParams(pepProjectId)
// 获取不重复的 安心云项目 id // 获取不重复的 安心云项目 id
const anxinProjectIds = [ const anxinProjectIds = [
...(bindRes).reduce( ...(bindRes).reduce(

Loading…
Cancel
Save