运维服务中台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
4.7 KiB

2 years ago
'use strict';
const fs = require('fs');
const moment = require('moment')
const { alarmConfirmLog } = require('./alarmConfirmLog');
async function serviceError (ctx) {
try {
const { utils: { sendAppearToWeb }, clickHouse } = ctx.app.fs
const models = ctx.fs.dc.models;
const { type, file, comment } = ctx.request.body
const now = moment().format()
if (!type) {
throw '请标明服务告警类型 type'
}
let serviceNumber = await models.AlarmServiceType.findOne({
where: { typeNumber: type }
});
if (!serviceNumber) {
throw '不存在该服务告警类型'
}
await models.AlarmService.create({
type, file, createTime: now, comment
});
ctx.status = 204;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
async function serviceErrorList (ctx) {
try {
const models = ctx.fs.dc.models;
const { clickHouse } = ctx.app.fs
const { utils: { anxinStrucIdRange, pomsProjectRange } } = ctx.app.fs
const { keyword, errType, confirmState, state, sustainTimeStart, sustainTimeEnd, limit, page, pepProjectId, toExport } = ctx.query
let pomsProject = await pomsProjectRange({
ctx, pepProjectId,
keywordTarget: 'pepProject',
keyword,
})
const pomsProjectIds = pomsProject.map(p => p.id)
let findOption = {
distinct: true,
where: {
$or: []
},
include: [{
model: models.App,
where: {
},
attributes: {
exclude: ['projectId']
},
include: [{
model: models.ProjectCorrelation,
where: {
},
attributes: {
exclude: ['createTime', 'createUser', 'anxinProjectId',]
},
}]
}]
}
if (keyword) {
findOption.where.$or.push(
{
'$app->projectCorrelations.id$': {
$in: pomsProjectIds
},
}
)
findOption.where.$or.push(
{
'$app.name$': { $like: `%${keyword}%` }
},
)
} else {
// findOption.where['$app->projectCorrelations.id$'] = {
// $in: pomsProjectIds
// }
findOption.include[0].include[0].where.id = { $in: pomsProjectIds }
}
if (errType) {
findOption.where.type = errType // element / apiError
}
if (confirmState || state) {
if (confirmState == 'confirmd' || state == 'histroy') {
findOption.where.confirmTime = { $ne: null }
} else if (confirmState == 'unconfirmed' || state == 'new') {
findOption.where.confirmTime = null
}
}
if (sustainTimeStart && sustainTimeEnd) {
findOption.where.$or = findOption.where.$or.concat([
{
createTime: { $between: [moment(sustainTimeStart).format(), moment(sustainTimeEnd).format()] },
},
{
updateTime: { $between: [moment(sustainTimeStart).format(), moment(sustainTimeEnd).format()] }
},
{
createTime: { $lte: moment(sustainTimeStart).format() },
updateTime: { $gte: moment(sustainTimeEnd).format() },
}
])
}
if (!toExport) {//非导出时考虑分页
if (limit) {
findOption.limit = limit
}
if (page && limit) {
findOption.offset = page * limit
}
}
if (!findOption.where.$or.length) {
delete findOption.where.$or
}
const listRes = await models.AppAlarm.findAndCountAll(findOption)
for (let lr of listRes.rows) {
if (lr.app && lr.app.projectCorrelations) {
for (let p of lr.app.projectCorrelations) {
let corProjectCorrelations = pomsProject.find(pr => pr.id == p.id)
if (corProjectCorrelations) {
p.dataValues = corProjectCorrelations
}
}
}
}
if (toExport) {//数据导出相关
await exportAppAlarms(ctx, listRes);
} else {
ctx.status = 200;
ctx.body = listRes
}
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
module.exports = {
serviceError,
serviceErrorList,
};