From c5590b99f127e8ca83571e2c6da654d60336c235 Mon Sep 17 00:00:00 2001 From: zzyangh <799463087@qq.com> Date: Thu, 16 Jan 2025 18:17:31 +0800 Subject: [PATCH 1/4] [chore]: Update api --- .../lib/api/sqle/service/SqlManage/index.d.ts | 8 +++++ .../lib/api/sqle/service/SqlManage/index.ts | 17 ++++++++++ .../shared/lib/api/sqle/service/common.d.ts | 31 +++++++++++++++++++ .../lib/api/sqle/service/common.enum.ts | 18 +++++++++++ 4 files changed, 74 insertions(+) diff --git a/packages/shared/lib/api/sqle/service/SqlManage/index.d.ts b/packages/shared/lib/api/sqle/service/SqlManage/index.d.ts index 75858a868..4d539fe0c 100644 --- a/packages/shared/lib/api/sqle/service/SqlManage/index.d.ts +++ b/packages/shared/lib/api/sqle/service/SqlManage/index.d.ts @@ -24,6 +24,7 @@ import { IGetGlobalSqlManageListResp, IGetGlobalSqlManageStatisticsResp, IGetSqlManageListResp, + IGetAbnormalAuditPlanInstancesResp, IBatchUpdateSqlManageReq, IBaseRes, IGetSqlManageRuleTipsResp, @@ -97,6 +98,13 @@ export interface IGetSqlManageListParams { export interface IGetSqlManageListReturn extends IGetSqlManageListResp {} +export interface IGetAbnormalInstanceAuditPlansV1Params { + project_name: string; +} + +export interface IGetAbnormalInstanceAuditPlansV1Return + extends IGetAbnormalAuditPlanInstancesResp {} + export interface IBatchUpdateSqlManageParams extends IBatchUpdateSqlManageReq { project_name: string; } diff --git a/packages/shared/lib/api/sqle/service/SqlManage/index.ts b/packages/shared/lib/api/sqle/service/SqlManage/index.ts index d96a057cd..bc64fec6e 100644 --- a/packages/shared/lib/api/sqle/service/SqlManage/index.ts +++ b/packages/shared/lib/api/sqle/service/SqlManage/index.ts @@ -13,6 +13,8 @@ import { IGetGlobalSqlManageStatisticsReturn, IGetSqlManageListParams, IGetSqlManageListReturn, + IGetAbnormalInstanceAuditPlansV1Params, + IGetAbnormalInstanceAuditPlansV1Return, IBatchUpdateSqlManageParams, IBatchUpdateSqlManageReturn, IExportSqlManageV1Params, @@ -68,6 +70,21 @@ class SqlManageService extends ServiceBase { ); } + public getAbnormalInstanceAuditPlansV1( + params: IGetAbnormalInstanceAuditPlansV1Params, + options?: AxiosRequestConfig + ) { + const paramsData = this.cloneDeep(params); + const project_name = paramsData.project_name; + delete paramsData.project_name; + + return this.get( + `/v1/projects/${project_name}/sql_manages/abnormal_audit_plan_instance`, + paramsData, + options + ); + } + public BatchUpdateSqlManage( params: IBatchUpdateSqlManageParams, options?: AxiosRequestConfig diff --git a/packages/shared/lib/api/sqle/service/common.d.ts b/packages/shared/lib/api/sqle/service/common.d.ts index 4829df2c2..e924fece5 100644 --- a/packages/shared/lib/api/sqle/service/common.d.ts +++ b/packages/shared/lib/api/sqle/service/common.d.ts @@ -4,6 +4,8 @@ import { AuditPlanParamResV1TypeEnum, AuditPlanReportResV1AuditLevelEnum, AuditPlanSQLHeadV1TypeEnum, + AuditPlanTypeResBaseActiveStatusEnum, + AuditPlanTypeResBaseLastCollectionStatusEnum, AuditPlanTypesV1InstanceTypeEnum, AuditResDataV1AuditLevelEnum, AuditTaskResV1AuditLevelEnum, @@ -32,6 +34,7 @@ import { HighPriorityConditionReqOperatorEnum, HighPriorityConditionResV1TypeEnum, InstanceAuditPlanInfoActiveStatusEnum, + InstanceAuditPlanInfoLastCollectionStatusEnum, InstanceAuditPlanResV1ActiveStatusEnum, InstanceTipResV1SupportedBackupStrategyEnum, ModuleRedDotModuleNameEnum, @@ -122,6 +125,12 @@ export interface IRuleCategoryStatistic { tag?: string; } +export interface IAbnormalAuditPlanInstance { + instance_audit_plan_id?: number; + + instance_name?: string; +} + export interface IAffectRows { count?: number; @@ -301,10 +310,14 @@ export interface IAuditPlanSQLResV1 { } export interface IAuditPlanTypeResBase { + active_status?: AuditPlanTypeResBaseActiveStatusEnum; + audit_plan_id?: number; desc?: string; + last_collection_status?: AuditPlanTypeResBaseLastCollectionStatusEnum; + token?: string; type?: string; @@ -1072,6 +1085,14 @@ export interface IGenModifylSQLReqV1 { database_schema_objects?: IDatabaseSchemaObject[]; } +export interface IGetAbnormalAuditPlanInstancesResp { + code?: number; + + data?: IAbnormalAuditPlanInstance[]; + + message?: string; +} + export interface IGetAuditPlanAnalysisDataResV1 { code?: number; @@ -2119,6 +2140,8 @@ export interface IInstanceAuditPlanInfo { id?: number; + last_collection_status?: InstanceAuditPlanInfoLastCollectionStatusEnum; + last_collection_time?: string; total_sql_nums?: number; @@ -2852,6 +2875,10 @@ export interface ISqlAnalysis { export interface ISqlAnalysisChart { points?: IChartPoint[]; + + x_info?: string; + + y_info?: string; } export interface ISqlAnalysisResDataV1 { @@ -3990,6 +4017,8 @@ export interface IExecResultCount { export interface IFullSyncAuditPlanSQLsReqV2 { audit_plan_sql_list?: IAuditPlanSQLReqV2[]; + + error_message?: string; } export interface IGetAuditFileExecStatisticRes { @@ -4178,6 +4207,8 @@ export interface IUpdateWorkflowScheduleReqV2 { export interface IUploadInstanceAuditPlanSQLsReqV2 { audit_plan_sql_list?: IAuditPlanSQLReqV2[]; + + error_message?: string; } export interface IWorkflowRecordResV2 { diff --git a/packages/shared/lib/api/sqle/service/common.enum.ts b/packages/shared/lib/api/sqle/service/common.enum.ts index 0534ef9f6..7951af768 100644 --- a/packages/shared/lib/api/sqle/service/common.enum.ts +++ b/packages/shared/lib/api/sqle/service/common.enum.ts @@ -50,6 +50,18 @@ export enum AuditPlanSQLHeadV1TypeEnum { 'sql' = 'sql' } +export enum AuditPlanTypeResBaseActiveStatusEnum { + 'normal' = 'normal', + + 'disabled' = 'disabled' +} + +export enum AuditPlanTypeResBaseLastCollectionStatusEnum { + 'normal' = 'normal', + + 'abnormal' = 'abnormal' +} + export enum AuditPlanTypesV1InstanceTypeEnum { 'MySQL' = 'MySQL', @@ -332,6 +344,12 @@ export enum InstanceAuditPlanInfoActiveStatusEnum { 'disabled' = 'disabled' } +export enum InstanceAuditPlanInfoLastCollectionStatusEnum { + 'normal' = 'normal', + + 'abnormal' = 'abnormal' +} + export enum InstanceAuditPlanResV1ActiveStatusEnum { 'normal' = 'normal', From a579908daea2fc0f24e70fe2eabca72c061efa43 Mon Sep 17 00:00:00 2001 From: zzyangh <799463087@qq.com> Date: Thu, 16 Jan 2025 18:19:42 +0800 Subject: [PATCH 2/4] [feature](SqlManagement): Add intelligent scanning error prompt --- .../sqle/src/locale/zh-CN/managementConf.ts | 12 +++- .../sqle/src/locale/zh-CN/sqlManagement.ts | 2 + .../component/SQLEEIndex/index.tsx | 58 +++++++++++++++++-- .../component/SQLEEIndex/style.ts | 11 +++- .../ConfForm/DataSourceSelection/index.tsx | 34 +++++------ .../Detail/Overview/column.tsx | 33 +++++++++-- .../page/SqlManagementConf/List/column.tsx | 50 ++++++++++++---- 7 files changed, 156 insertions(+), 44 deletions(-) diff --git a/packages/sqle/src/locale/zh-CN/managementConf.ts b/packages/sqle/src/locale/zh-CN/managementConf.ts index bd6cdb184..23cbeef9f 100644 --- a/packages/sqle/src/locale/zh-CN/managementConf.ts +++ b/packages/sqle/src/locale/zh-CN/managementConf.ts @@ -34,7 +34,8 @@ export default { scanStatus: '采集状态', notificationMethod: '推送方式', createdAt: '创建时间', - creator: '创建人' + creator: '创建人', + abnormalTips: 'SQL采集存在异常' }, action: { disabled: { @@ -117,7 +118,14 @@ export default { connectionInfo: '连接信息', collectedSqlCount: '采集到的SQL数', problematicSqlCount: '审核有问题的SQL数', - lastCollectionTime: '最近一次采集时间' + lastCollectionTime: '最近一次采集时间', + taskStatus: { + disabled: '停用', + normal: '运行中', + abnormal: '运行异常' + }, + abnormalTips: + '请根据"execute extract sql failed"关键字到sqled.log日志中检索相关信息' }, actions: { enabled: '启用', diff --git a/packages/sqle/src/locale/zh-CN/sqlManagement.ts b/packages/sqle/src/locale/zh-CN/sqlManagement.ts index 91f3d927e..f313d559c 100644 --- a/packages/sqle/src/locale/zh-CN/sqlManagement.ts +++ b/packages/sqle/src/locale/zh-CN/sqlManagement.ts @@ -13,6 +13,8 @@ export default { problemSQlNum: '问题SQL数', optimizedSQLNum: '已优化SQL数' }, + abnormalAuditPlanTips: + '上的SQL采集存在问题,为保障SQL管控功能正常运行,请及时进行诊断排查', ceTips: 'SQL管控为用户提供SQL全生命周期监控,面板将整合所有的业务SQL,用户可以在该面板中查看项目中采集并审核的所有SQL,暴露其中的问题SQL,同时支持用户解决问题SQL。', table: { diff --git a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx index b7a14b389..fa538bd7c 100644 --- a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx +++ b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx @@ -1,7 +1,13 @@ import { useTranslation } from 'react-i18next'; import { useBoolean, useRequest } from 'ahooks'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { BasicButton, PageHeader, useTypedQuery } from '@actiontech/shared'; +import { + BasicButton, + PageHeader, + useTypedQuery, + TypedLink, + EmptyBox +} from '@actiontech/shared'; import SQLStatistics, { ISQLStatisticsProps } from '../SQLStatistics'; import { useTableFilterContainer, @@ -42,7 +48,7 @@ import { import { ModalName } from '../../../../data/ModalName'; import { SorterResult, TableRowSelection } from 'antd/es/table/interface'; import { ISqlManage } from '@actiontech/shared/lib/api/sqle/service/common'; -import { Spin, message } from 'antd'; +import { Spin, message, Alert, Space } from 'antd'; import SqlManagementModal from './Modal'; import EmitterKey from '../../../../data/EmitterKey'; import EventEmitter from '../../../../utils/EventEmitter'; @@ -53,7 +59,10 @@ import useGetTableFilterInfo from './hooks/useGetTableFilterInfo'; import { DownArrowLineOutlined } from '@actiontech/icons'; import useSqlManagementExceptionRedux from '../../../SqlManagementException/hooks/useSqlManagementExceptionRedux'; import useWhitelistRedux from '../../../Whitelist/hooks/useWhitelistRedux'; -import { SqlManagementTableStyleWrapper } from './style'; +import { + SqlManagementTableStyleWrapper, + AbnormalAuditPlanTipsStyleWrapper +} from './style'; import { SqlManageAuditStatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; import { GetSqlManageListV2FilterSourceEnum } from '@actiontech/shared/lib/api/sqle/service/SqlManage/index.enum'; import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths'; @@ -198,6 +207,17 @@ const SQLEEIndex = () => { } ); + const { data: abnormalInstances, loading: getAbnormalInstancesLoading } = + useRequest(() => + SqlManage.getAbnormalInstanceAuditPlansV1({ + project_name: projectName + }).then((res) => { + if (res.data.code === ResponseCode.SUCCESS) { + return res.data.data; + } + }) + ); + const openModal = useCallback((name: ModalName, row?: ISqlManage) => { if (row) { setSelectData(row); @@ -445,7 +465,7 @@ const SQLEEIndex = () => { }, []); return ( - + {messageContextHolder} { errorMessage={getListError} loading={loading} /> + + + + + {abnormalInstances?.map((instance, index) => { + return ( + + {instance.instance_name} + + ); + })} + + {t('sqlManagement.abnormalAuditPlanTips')} + + } + type="warning" + showIcon + /> + + {/* table */} { filterCustomProps={filterCustomProps} /> ` .ant-table-body { - max-height: calc(100vh - 338px) !important; + max-height: ${(hasAbnormalAuditPlan) => + `calc(100vh - ${hasAbnormalAuditPlan ? '378px' : '338px'}) !important`}; } .audit-status .ant-tag { width: fit-content; } `; + +export const AbnormalAuditPlanTipsStyleWrapper = styled('div')` + padding: 10px 40px 0; +`; diff --git a/packages/sqle/src/page/SqlManagementConf/Common/ConfForm/DataSourceSelection/index.tsx b/packages/sqle/src/page/SqlManagementConf/Common/ConfForm/DataSourceSelection/index.tsx index b95c184b7..db68116c2 100644 --- a/packages/sqle/src/page/SqlManagementConf/Common/ConfForm/DataSourceSelection/index.tsx +++ b/packages/sqle/src/page/SqlManagementConf/Common/ConfForm/DataSourceSelection/index.tsx @@ -11,7 +11,7 @@ import { } from '@actiontech/shared/lib/global'; import { Form } from 'antd'; import useInstance from '../../../../../hooks/useInstance'; -import { useContext, useEffect, useMemo, useCallback } from 'react'; +import { useContext, useEffect, useMemo } from 'react'; import useDatabaseType from '../../../../../hooks/useDatabaseType'; import { ConfFormContext } from '../context'; import { SqlManagementConfFormFields } from '../index.type'; @@ -103,8 +103,8 @@ const DataSourceSelection: React.FC = () => { updateDriverNameList(); }, [updateDriverNameList]); - const updateInstanceListByProjectName = useCallback( - (id: string) => { + useEffect(() => { + if (!!instanceIdByUrlSearchParams && !!businessByUrlSearchParams) { updateInstanceList( { project_name: projectName, @@ -113,34 +113,32 @@ const DataSourceSelection: React.FC = () => { }, { onSuccess: (list) => { - const instance = list.find((v) => v.instance_id === id); + const instance = list.find( + (v) => v.instance_id === instanceIdByUrlSearchParams + ); form.setFieldsValue({ + businessScope: businessByUrlSearchParams, + instanceId: instanceIdByUrlSearchParams, instanceName: instance?.instance_name ?? '', instanceType: instance?.instance_type ?? '' }); } } ); - }, - [form, projectName, updateInstanceList] - ); - - useEffect(() => { - if (!!instanceIdByUrlSearchParams && !!businessByUrlSearchParams) { - form.setFieldsValue({ - businessScope: businessByUrlSearchParams, - instanceId: instanceIdByUrlSearchParams - }); - updateInstanceListByProjectName(instanceIdByUrlSearchParams); } else if (!!defaultValue) { - updateInstanceListByProjectName(defaultValue.instanceId as string); + updateInstanceList({ + project_name: projectName, + functional_module: + getInstanceTipListV1FunctionalModuleEnum.create_audit_plan + }); } }, [ businessByUrlSearchParams, instanceIdByUrlSearchParams, defaultValue, - updateInstanceListByProjectName, - form + updateInstanceList, + form, + projectName ]); useEffect(() => { diff --git a/packages/sqle/src/page/SqlManagementConf/Detail/Overview/column.tsx b/packages/sqle/src/page/SqlManagementConf/Detail/Overview/column.tsx index b59e85e78..7e93325bb 100644 --- a/packages/sqle/src/page/SqlManagementConf/Detail/Overview/column.tsx +++ b/packages/sqle/src/page/SqlManagementConf/Detail/Overview/column.tsx @@ -2,13 +2,17 @@ import { ActiontechTableColumn } from '@actiontech/shared/lib/components/Actiont import { t } from '../../../../locale'; import { formatTime } from '@actiontech/shared/lib/utils/Common'; import { IInstanceAuditPlanInfo } from '@actiontech/shared/lib/api/sqle/service/common'; -import { SensitiveDisplay, TypedLink } from '@actiontech/shared'; -import { InstanceAuditPlanInfoActiveStatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; +import { SensitiveDisplay, TypedLink, BasicToolTip } from '@actiontech/shared'; +import { + InstanceAuditPlanInfoLastCollectionStatusEnum, + InstanceAuditPlanInfoActiveStatusEnum +} from '@actiontech/shared/lib/api/sqle/service/common.enum'; import { TableColumnWithIconStyleWrapper } from '@actiontech/shared/lib/styleWrapper/element'; import { CheckCircleOutlined, CloseHexagonOutlined, - InfoHexagonOutlined + InfoHexagonOutlined, + InfoCircleOutlined } from '@actiontech/icons'; import { Typography } from 'antd'; import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths'; @@ -62,13 +66,30 @@ export const ConfDetailOverviewColumns: ( { dataIndex: 'active_status', title: () => t('managementConf.detail.overview.column.status'), - render: (status) => { + render: (status, record) => { if (status === InstanceAuditPlanInfoActiveStatusEnum.disabled) { return ( - {t('managementConf.list.table.column.taskStatus.disabled')} + {t('managementConf.detail.overview.column.taskStatus.disabled')} + + + ); + } + if ( + status === InstanceAuditPlanInfoActiveStatusEnum.normal && + record.last_collection_status === + InstanceAuditPlanInfoLastCollectionStatusEnum.abnormal + ) { + return ( + + } + title={t('managementConf.detail.overview.column.abnormalTips')} + /> + + {t('managementConf.detail.overview.column.taskStatus.abnormal')} ); @@ -78,7 +99,7 @@ export const ConfDetailOverviewColumns: ( - {t('managementConf.list.table.column.taskStatus.normal')} + {t('managementConf.detail.overview.column.taskStatus.normal')} ); diff --git a/packages/sqle/src/page/SqlManagementConf/List/column.tsx b/packages/sqle/src/page/SqlManagementConf/List/column.tsx index a6111a820..5e22fca42 100644 --- a/packages/sqle/src/page/SqlManagementConf/List/column.tsx +++ b/packages/sqle/src/page/SqlManagementConf/List/column.tsx @@ -4,7 +4,12 @@ import { ActiontechTableFilterMetaValue } from '@actiontech/shared/lib/components/ActiontechTable'; import { t } from '../../../locale'; -import { DatabaseTypeLogo, TypedLink } from '@actiontech/shared'; +import { + DatabaseTypeLogo, + TypedLink, + BasicToolTip, + EmptyBox +} from '@actiontech/shared'; import { IInstanceAuditPlanResV1 } from '@actiontech/shared/lib/api/sqle/service/common'; import { InstanceAuditPlanTableFilterParamType } from './index.type'; import { formatTime } from '@actiontech/shared/lib/utils/Common'; @@ -13,10 +18,16 @@ import { CloseHexagonOutlined, InfoHexagonOutlined } from '@actiontech/icons'; -import { InstanceAuditPlanResV1ActiveStatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; +import { + InstanceAuditPlanResV1ActiveStatusEnum, + AuditPlanTypeResBaseLastCollectionStatusEnum, + AuditPlanTypeResBaseActiveStatusEnum +} from '@actiontech/shared/lib/api/sqle/service/common.enum'; import ScanTypeTagsCell from './ScanTypeTagsCell'; import { TableColumnWithIconStyleWrapper } from '@actiontech/shared/lib/styleWrapper/element'; import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths'; +import { InfoCircleOutlined } from '@actiontech/icons/'; +import { PlanListTaskTypeButtonStyleWrapper } from './style'; export const ExtraFilterMeta: () => ActiontechTableFilterMeta< IInstanceAuditPlanResV1, @@ -49,17 +60,32 @@ export const SqlManagementConfColumns: ( dataIndex: 'instance_name', title: () => t('managementConf.list.table.column.dbName'), render: (instanceName, record) => { + const hasAbnormalPlan = record.audit_plan_types?.some( + (plan) => + plan.active_status === + AuditPlanTypeResBaseActiveStatusEnum.normal && + plan.last_collection_status === + AuditPlanTypeResBaseLastCollectionStatusEnum.abnormal + ); return ( - - {instanceName || - t('managementConf.list.table.column.staticScanType')} - + + + {instanceName || + t('managementConf.list.table.column.staticScanType')} + + + } + title={t('managementConf.list.table.column.abnormalTips')} + /> + + ); }, filterCustomType: 'select', From 88b6672fabeaa63c837eea02b57bbee335051b5a Mon Sep 17 00:00:00 2001 From: zzyangh <799463087@qq.com> Date: Thu, 16 Jan 2025 18:20:23 +0800 Subject: [PATCH 3/4] [test]: Update unit testing --- .../__snapshots__/index.test.tsx.snap | 2 +- .../__snapshots__/index.test.tsx.snap | 1292 ++++++++++++++++- .../component/SQLEEIndex/index.test.tsx | 13 + .../__snapshots__/index.test.tsx.snap | 495 +++++++ .../Detail/Overview/__tests__/index.test.tsx | 29 +- .../__snapshots__/index.test.tsx.snap | 6 +- .../__snapshots__/index.test.tsx.snap | 1008 ++++++++++++- .../List/__tests__/index.test.tsx | 30 + .../src/testUtils/mockApi/sqlManage/data.ts | 13 + .../src/testUtils/mockApi/sqlManage/index.ts | 7 + 10 files changed, 2857 insertions(+), 38 deletions(-) diff --git a/packages/sqle/src/page/SqlManagement/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlManagement/__snapshots__/index.test.tsx.snap index 26245b634..e834356a9 100644 --- a/packages/sqle/src/page/SqlManagement/__snapshots__/index.test.tsx.snap +++ b/packages/sqle/src/page/SqlManagement/__snapshots__/index.test.tsx.snap @@ -467,7 +467,7 @@ exports[`page/SqlManagement render sql management page 1`] = `
`; +exports[`page/SqlManagement/SQLEEIndex render abnormal status audit plan tips when request return data 1`] = ` + +