feat: add tencent cloud integration
This commit is contained in:
parent
9a7afed08c
commit
8585ea4196
86
src/server/model/_schema/feed.ts
Normal file
86
src/server/model/_schema/feed.ts
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
const tencentCloudAlarmEventSchema = z.object({
|
||||||
|
sessionId: z.string(),
|
||||||
|
alarmStatus: z.union([z.literal('0'), z.literal('1')]),
|
||||||
|
alarmType: z.literal('event'),
|
||||||
|
alarmObjInfo: z.object({
|
||||||
|
region: z.string().optional(),
|
||||||
|
appId: z.string(),
|
||||||
|
uin: z.string(),
|
||||||
|
dimensions: z.object({
|
||||||
|
unInstanceId: z.string(),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
alarmPolicyInfo: z.object({
|
||||||
|
policyName: z.string(),
|
||||||
|
conditions: z.object({
|
||||||
|
productName: z.string(),
|
||||||
|
productShowName: z.string(),
|
||||||
|
eventName: z.string(),
|
||||||
|
eventShowName: z.string(),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
firstOccurTime: z.string(),
|
||||||
|
durationTime: z.number(),
|
||||||
|
recoverTime: z.string(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// 定义 metric 类型
|
||||||
|
const tencentCloudAlarmMetricSchema = z.object({
|
||||||
|
sessionId: z.string(),
|
||||||
|
alarmStatus: z.union([z.literal('0'), z.literal('1')]),
|
||||||
|
alarmType: z.literal('metric'),
|
||||||
|
alarmLevel: z.string(),
|
||||||
|
alarmObjInfo: z.object({
|
||||||
|
region: z.string().optional(),
|
||||||
|
namespace: z.string(),
|
||||||
|
appId: z.string(),
|
||||||
|
uin: z.string(),
|
||||||
|
dimensions: z.object({
|
||||||
|
deviceName: z.string(),
|
||||||
|
objId: z.string(),
|
||||||
|
objName: z.string(),
|
||||||
|
unInstanceId: z.string(),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
alarmPolicyInfo: z.object({
|
||||||
|
policyId: z.string(),
|
||||||
|
policyType: z.string(),
|
||||||
|
policyName: z.string(),
|
||||||
|
policyTypeCName: z.string(),
|
||||||
|
policyTypeEname: z.string().optional(),
|
||||||
|
conditions: z.object({
|
||||||
|
metricName: z.string(),
|
||||||
|
metricShowName: z.string(),
|
||||||
|
calcType: z.string().optional(),
|
||||||
|
calcValue: z.string().optional(),
|
||||||
|
currentValue: z.string().optional(),
|
||||||
|
historyValue: z.string().optional(),
|
||||||
|
unit: z.string().optional(),
|
||||||
|
calcUnit: z.string().optional(),
|
||||||
|
period: z.string().optional(),
|
||||||
|
periodNum: z.string().optional(),
|
||||||
|
alarmNotifyType: z.string().optional(),
|
||||||
|
alarmNotifyPeriod: z.number().optional(),
|
||||||
|
}),
|
||||||
|
tag: z.array(z.unknown()).optional(),
|
||||||
|
policyTags: z
|
||||||
|
.array(
|
||||||
|
z.object({
|
||||||
|
key: z.string(),
|
||||||
|
value: z.string(),
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.optional(),
|
||||||
|
}),
|
||||||
|
firstOccurTime: z.string(),
|
||||||
|
durationTime: z.number(),
|
||||||
|
recoverTime: z.string(),
|
||||||
|
policyDetailURL: z.string().optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const tencentCloudAlarmSchema = z.union([
|
||||||
|
tencentCloudAlarmEventSchema,
|
||||||
|
tencentCloudAlarmMetricSchema,
|
||||||
|
]);
|
@ -5,7 +5,7 @@ export type MonitorInfoWithNotificationIds = MonitorInfo & {
|
|||||||
notifications: { id: string }[];
|
notifications: { id: string }[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export const MonitorPublicInfoSchema = MonitorModelSchema.pick({
|
export const monitorPublicInfoSchema = MonitorModelSchema.pick({
|
||||||
id: true,
|
id: true,
|
||||||
name: true,
|
name: true,
|
||||||
type: true,
|
type: true,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { prisma } from '../_client';
|
import { prisma } from '../_client';
|
||||||
import { MonitorPublicInfoSchema } from '../_schema/monitor';
|
import { monitorPublicInfoSchema } from '../_schema/monitor';
|
||||||
import { MonitorManager } from './manager';
|
import { MonitorManager } from './manager';
|
||||||
|
|
||||||
export const monitorManager = new MonitorManager();
|
export const monitorManager = new MonitorManager();
|
||||||
@ -13,7 +13,7 @@ export async function getMonitorPublicInfos(monitorIds: string[]) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return res.map((item) => MonitorPublicInfoSchema.parse(item));
|
return res.map((item) => monitorPublicInfoSchema.parse(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getMonitorData(
|
export function getMonitorData(
|
||||||
|
@ -5,6 +5,7 @@ import _ from 'lodash';
|
|||||||
import { OpenApiMeta } from 'trpc-openapi';
|
import { OpenApiMeta } from 'trpc-openapi';
|
||||||
import { OPENAPI_TAG } from '../../../utils/const';
|
import { OPENAPI_TAG } from '../../../utils/const';
|
||||||
import { createFeedEvent } from '../../../model/feed/event';
|
import { createFeedEvent } from '../../../model/feed/event';
|
||||||
|
import { tencentCloudAlarmSchema } from '../../../model/_schema/feed';
|
||||||
|
|
||||||
export const feedIntegrationRouter = router({
|
export const feedIntegrationRouter = router({
|
||||||
github: publicProcedure
|
github: publicProcedure
|
||||||
@ -39,7 +40,7 @@ export const feedIntegrationRouter = router({
|
|||||||
.then((res) => res?.workspaceId);
|
.then((res) => res?.workspaceId);
|
||||||
|
|
||||||
if (!workspaceId) {
|
if (!workspaceId) {
|
||||||
return 'Not found';
|
throw new Error('Not found Workspace');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eventType === 'push') {
|
if (eventType === 'push') {
|
||||||
@ -127,7 +128,91 @@ export const feedIntegrationRouter = router({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 'not supported';
|
return 'Not supported yet';
|
||||||
|
}),
|
||||||
|
tencentCloudAlarm: publicProcedure
|
||||||
|
.meta(
|
||||||
|
buildFeedPublicOpenapi({
|
||||||
|
method: 'POST',
|
||||||
|
path: '/{channelId}/tencent-cloud/alarm',
|
||||||
|
summary: 'integrate with tencent-cloud webhook',
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.input(
|
||||||
|
z
|
||||||
|
.object({
|
||||||
|
channelId: z.string(),
|
||||||
|
})
|
||||||
|
.passthrough()
|
||||||
|
)
|
||||||
|
.output(z.string())
|
||||||
|
.mutation(async ({ input, ctx }) => {
|
||||||
|
const { channelId, ...data } = input;
|
||||||
|
|
||||||
|
const workspaceId = await prisma.feedChannel
|
||||||
|
.findFirst({
|
||||||
|
where: {
|
||||||
|
id: channelId,
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
workspaceId: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => res?.workspaceId);
|
||||||
|
|
||||||
|
if (!workspaceId) {
|
||||||
|
throw new Error('Not found Workspace');
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = tencentCloudAlarmSchema.safeParse(data);
|
||||||
|
if (!res.success) {
|
||||||
|
throw new Error('Input not valid');
|
||||||
|
}
|
||||||
|
|
||||||
|
const alarm = res.data;
|
||||||
|
|
||||||
|
if (alarm.alarmType === 'event') {
|
||||||
|
const conditions = alarm.alarmPolicyInfo.conditions;
|
||||||
|
|
||||||
|
await createFeedEvent(workspaceId, {
|
||||||
|
channelId: channelId,
|
||||||
|
eventName: alarm.alarmType,
|
||||||
|
eventContent: `[${alarm.alarmStatus === '1' ? 'Trigger' : 'Recover'}] **${alarm.alarmObjInfo.dimensions.unInstanceId}** ${alarm.alarmPolicyInfo.policyName} ${conditions.productShowName} ${conditions.eventShowName}.`,
|
||||||
|
tags: [
|
||||||
|
alarm.alarmObjInfo.appId,
|
||||||
|
alarm.alarmObjInfo.dimensions.unInstanceId,
|
||||||
|
],
|
||||||
|
source: 'tencent-cloud',
|
||||||
|
senderId: alarm.alarmObjInfo.appId,
|
||||||
|
senderName: alarm.alarmPolicyInfo.policyName,
|
||||||
|
important: alarm.alarmStatus === '1',
|
||||||
|
});
|
||||||
|
|
||||||
|
return 'ok';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alarm.alarmType === 'metric') {
|
||||||
|
const conditions = alarm.alarmPolicyInfo.conditions;
|
||||||
|
|
||||||
|
await createFeedEvent(workspaceId, {
|
||||||
|
channelId: channelId,
|
||||||
|
eventName: alarm.alarmType,
|
||||||
|
eventContent: `[${alarm.alarmStatus === '1' ? 'Trigger' : 'Recover'}] **${alarm.alarmObjInfo.dimensions.unInstanceId}** ${alarm.alarmPolicyInfo.policyName} ${conditions.metricShowName} ${conditions.calcType} ${conditions.calcValue}${conditions.calcUnit} (current: ${conditions.currentValue}${conditions.unit}) [${alarm.firstOccurTime} - ${alarm.durationTime}](keep: ${alarm.durationTime}s).`,
|
||||||
|
tags: [
|
||||||
|
alarm.alarmObjInfo.appId,
|
||||||
|
alarm.alarmObjInfo.dimensions.unInstanceId,
|
||||||
|
...(alarm.alarmPolicyInfo.tag ?? []).map(String),
|
||||||
|
],
|
||||||
|
source: 'tencent-cloud',
|
||||||
|
senderId: alarm.alarmObjInfo.appId,
|
||||||
|
senderName: alarm.alarmPolicyInfo.policyName,
|
||||||
|
important: alarm.alarmStatus === '1',
|
||||||
|
});
|
||||||
|
|
||||||
|
return 'ok';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'Not supported yet';
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ import { runCodeInVM } from '../../model/monitor/provider/custom';
|
|||||||
import { createAuditLog } from '../../model/auditLog';
|
import { createAuditLog } from '../../model/auditLog';
|
||||||
import {
|
import {
|
||||||
MonitorInfoWithNotificationIds,
|
MonitorInfoWithNotificationIds,
|
||||||
MonitorPublicInfoSchema,
|
monitorPublicInfoSchema,
|
||||||
} from '../../model/_schema/monitor';
|
} from '../../model/_schema/monitor';
|
||||||
import { monitorPageManager } from '../../model/monitor/page/manager';
|
import { monitorPageManager } from '../../model/monitor/page/manager';
|
||||||
|
|
||||||
@ -107,7 +107,7 @@ export const monitorRouter = router({
|
|||||||
monitorIds: z.array(z.string()),
|
monitorIds: z.array(z.string()),
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.output(z.array(MonitorPublicInfoSchema))
|
.output(z.array(monitorPublicInfoSchema))
|
||||||
.query(async ({ input }) => {
|
.query(async ({ input }) => {
|
||||||
const { monitorIds } = input;
|
const { monitorIds } = input;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user