diff --git a/sqle/locale/active.en.toml b/sqle/locale/active.en.toml index 11b55532c..ca87dc8e3 100644 --- a/sqle/locale/active.en.toml +++ b/sqle/locale/active.en.toml @@ -29,6 +29,7 @@ ApMetaMySQLProcesslist = "Processlist" ApMetaMySQLSchemaMeta = "Database schema metadata" ApMetaMySQLTopSQL = "MySQL TOP SQL" ApMetaObForOracleTopSQL = "OceanBase For Oracle TOP SQL" +ApMetaOceanBaseForMySQLFullCollect = "Full Collect" ApMetaOracleTopSQL = "Oracle TOP SQL" ApMetaPerformanceCollect = "Performance metrics" ApMetaPerformanceCollectTips = "Performance metric collection will incur significant performance overhead, so please enable it with caution. Once enabled, the system will continuously collect performance data (such as QPS, number of connections, etc.) for this data source and generate performance trend charts, which will be displayed on the Performance Insights page." @@ -48,6 +49,7 @@ ApMetricNameBufferReadAvg = "Average logical read count" ApMetricNameCPUTimeAvg = "Average CPU time (μs)" ApMetricNameCPUTimeTotal = "Total CPU time (s)" ApMetricNameChecksum = "checksum" +ApMetricUserClientIP = "Client IP" ApMetricNameCounter = "Execution count" ApMetricNameCounterMoreThan = "Occurrence count > " ApMetricNameDBUser = "User" @@ -87,9 +89,11 @@ ApMetricNameQueryTimeTotal = "Total execution time(s)" ApMetricNameQueryTimeTotalMS = "Total execution time(ms)" ApMetricNameRowExaminedAvg = "Average examined rows" ApMetricNameRowExaminedAvgMoreThan = "Average examined rows > " +ApMetricNameRequestTime = "Request Time" ApMetricNameRowsAffectedAvg = "Average affected rows" ApMetricNameRowsAffectedMax = "Max affected rows" ApMetricNameTable = "table name" +ApMetricNameTenantName = "Tenant Name" ApMetricNameTransactionStarted = "transaction started" ApMetricNameTrxWaitStarted = "transaction wait started" ApMetricNameUserIOWaitTimeTotal = "I/O wait time (s)" diff --git a/sqle/locale/active.zh.toml b/sqle/locale/active.zh.toml index e1c2dc546..c19c16f70 100644 --- a/sqle/locale/active.zh.toml +++ b/sqle/locale/active.zh.toml @@ -29,6 +29,7 @@ ApMetaMySQLProcesslist = "processlist 列表" ApMetaMySQLSchemaMeta = "库表元数据" ApMetaMySQLTopSQL = "MySQL TOP SQL" ApMetaObForOracleTopSQL = "OceanBase For Oracle TOP SQL" +ApMetaOceanBaseForMySQLFullCollect = "全量采集" ApMetaOracleTopSQL = "Oracle TOP SQL" ApMetaPerformanceCollect = "数据源性能指标" ApMetaPerformanceCollectTips = "性能指标采集将产生较大性能开销,请谨慎开启。开启后,系统将持续采集该数据源的性能数据(如QPS、连接数等),并生成性能趋势图表,体现在性能洞察页面。" @@ -48,6 +49,7 @@ ApMetricNameBufferReadAvg = "平均逻辑读次数" ApMetricNameCPUTimeAvg = "平均 CPU 时间(μs)" ApMetricNameCPUTimeTotal = "CPU时间占用(s)" ApMetricNameChecksum = "校验和" +ApMetricUserClientIP = "客户端IP" ApMetricNameCounter = "执行次数" ApMetricNameCounterMoreThan = "出现次数 > " ApMetricNameDBUser = "用户" @@ -87,9 +89,11 @@ ApMetricNameQueryTimeTotal = "总执行时间(s)" ApMetricNameQueryTimeTotalMS = "总执行时间(ms)" ApMetricNameRowExaminedAvg = "平均扫描行数" ApMetricNameRowExaminedAvgMoreThan = "平均扫描行数 > " +ApMetricNameRequestTime = "请求时间" ApMetricNameRowsAffectedAvg = "平均影响行数" ApMetricNameRowsAffectedMax = "最大影响行数" ApMetricNameTable = "表名" +ApMetricNameTenantName = "租户名称" ApMetricNameTransactionStarted = "持有锁事务开始时间" ApMetricNameTrxWaitStarted = "等待锁事务开始时间" ApMetricNameUserIOWaitTimeTotal = "I/O等待时间(s)" diff --git a/sqle/locale/message_zh.go b/sqle/locale/message_zh.go index dbda19282..9c2ca6f4b 100644 --- a/sqle/locale/message_zh.go +++ b/sqle/locale/message_zh.go @@ -322,6 +322,7 @@ var ( ApMetricNameGrantedLockSql = &i18n.Message{ID: "ApMetricNameGrantedLockSql", Other: "持有锁SQL"} ApMetricNameWaitingLockSql = &i18n.Message{ID: "ApMetricNameWaitingLockSql", Other: "等待锁SQL"} ApMetricNameDBUser = &i18n.Message{ID: "ApMetricNameDBUser", Other: "用户"} + ApMetricUserClientIP = &i18n.Message{ID: "ApMetricUserClientIP", Other: "客户端IP"} ApMetricNameHost = &i18n.Message{ID: "ApMetricNameHost", Other: "主机"} ApMetricNameMetaName = &i18n.Message{ID: "ApMetricNameMetaName", Other: "对象名称"} ApMetricNameMetaType = &i18n.Message{ID: "ApMetricNameMetaType", Other: "对象类型"} @@ -362,40 +363,43 @@ var ( ApMetricNameQueryTimeAvgMoreThan = &i18n.Message{ID: "ApMetricNameQueryTimeAvgMoreThan", Other: "平均执行时间(s) > "} ApMetricNameRowExaminedAvgMoreThan = &i18n.Message{ID: "ApMetricNameRowExaminedAvgMoreThan", Other: "平均扫描行数 > "} - ApMetricNameInstance = &i18n.Message{ID: "ApMetricNameInstance", Other: "节点地址"} - ApMetricNameMemMax = &i18n.Message{ID: "ApMetricNameMemMax", Other: "使用的最大内存空间"} - ApMetricNameDiskMax = &i18n.Message{ID: "ApMetricNameDiskMax", Other: "使用的最大硬盘空间"} - - ApMetaCustom = &i18n.Message{ID: "ApMetaCustom", Other: "自定义"} - ApMetaMySQLSchemaMeta = &i18n.Message{ID: "ApMetaMySQLSchemaMeta", Other: "库表元数据"} - ApMetaMySQLProcesslist = &i18n.Message{ID: "ApMetaMySQLProcesslist", Other: "processlist 列表"} - ApMetaAliRdsMySQLSlowLog = &i18n.Message{ID: "ApMetaAliRdsMySQLSlowLog", Other: "阿里RDS MySQL慢日志"} - ApMetaAliRdsMySQLAuditLog = &i18n.Message{ID: "ApMetaAliRdsMySQLAuditLog", Other: "阿里RDS MySQL审计日志"} - ApMetaBaiduRdsMySQLSlowLog = &i18n.Message{ID: "ApMetaBaiduRdsMySQLSlowLog", Other: "百度云RDS MySQL慢日志"} - ApMetaHuaweiRdsMySQLSlowLog = &i18n.Message{ID: "ApMetaHuaweiRdsMySQLSlowLog", Other: "华为云RDS MySQL慢日志"} - ApMetaOracleTopSQL = &i18n.Message{ID: "ApMetaOracleTopSQL", Other: "Oracle TOP SQL"} - ApMetaAllAppExtract = &i18n.Message{ID: "ApMetaAllAppExtract", Other: "应用程序SQL抓取"} - ApMetaTiDBAuditLog = &i18n.Message{ID: "ApMetaTiDBAuditLog", Other: "TiDB审计日志"} - ApMetaSlowLog = &i18n.Message{ID: "ApMetaSlowLog", Other: "慢日志"} - ApMetaMDBSlowLog = &i18n.Message{ID: "ApMetaMDBSlowLog", Other: "慢日志(监控库)"} - ApMetaTopSQL = &i18n.Message{ID: "ApMetaTopSQL", Other: "Top SQL"} - ApMetaDB2TopSQL = &i18n.Message{ID: "ApMetaDB2TopSQL", Other: "DB2 Top SQL"} - ApMetaSchemaMeta = &i18n.Message{ID: "ApMetaSchemaMeta", Other: "库表元数据"} - ApMetaDistributedLock = &i18n.Message{ID: "ApMetaDistributedLock", Other: "分布式锁"} - ApMetaDmTopSQL = &i18n.Message{ID: "ApMetaDmTopSQL", Other: "DM TOP SQL"} - ApMetaObForOracleTopSQL = &i18n.Message{ID: "ApMetaObForOracleTopSQL", Other: "OceanBase For Oracle TOP SQL"} - ApMetaPostgreSQLTopSQL = &i18n.Message{ID: "ApMetaPostgreSQLTopSQL", Other: "TOP SQL"} - ApMetaGoldenDBTopSQL = &i18n.Message{ID: "ApMetaGoldenDBTopSQL", Other: "GoldenDB TOP SQL"} - ApMetaTiDBTopSQL = &i18n.Message{ID: "ApMetaTiDBTopSQL", Other: "TiDB TOP SQL"} - ApMetaMySQLTopSQL = &i18n.Message{ID: "ApMetaMySQLTopSQL", Other: "MySQL TOP SQL"} - ApMetricQueryTimeAvg = &i18n.Message{ID: "ApMetricQueryTimeAvg", Other: "平均查询时间(s)"} - ApMetricRowExaminedAvg = &i18n.Message{ID: "ApMetricRowExaminedAvg", Other: "平均扫描行数"} - ApMetaPerformanceCollect = &i18n.Message{ID: "ApMetaPerformanceCollect", Other: "数据源性能指标"} - ApMetaPerformanceCollectTips = &i18n.Message{ID: "ApMetaPerformanceCollectTips", Other: "性能指标采集将产生较大性能开销,请谨慎开启。开启后,系统将持续采集该数据源的性能数据(如QPS、连接数等),并生成性能趋势图表,体现在性能洞察页面。"} - ApMetaCollectTime = &i18n.Message{ID: "ApMetaCollectTime", Other: "采集时间"} - ApMetaThreadsConnected = &i18n.Message{ID: "ApMetaThreadsConnected", Other: "线程数"} - ApMetaQPS = &i18n.Message{ID: "ApMetaQueries", Other: "QPS"} - ApMetricNameFullTableScanCount = &i18n.Message{ID: "ApMetricNameFullTableScanCount", Other: "全表扫描次数"} + ApMetricNameInstance = &i18n.Message{ID: "ApMetricNameInstance", Other: "节点地址"} + ApMetricNameMemMax = &i18n.Message{ID: "ApMetricNameMemMax", Other: "使用的最大内存空间"} + ApMetricNameDiskMax = &i18n.Message{ID: "ApMetricNameDiskMax", Other: "使用的最大硬盘空间"} + ApMetricNameTenantName = &i18n.Message{ID: "ApMetricNameTenantName", Other: "租户名称"} + ApMetricNameRequestTime = &i18n.Message{ID: "ApMetricNameRequestTime", Other: "请求时间"} + + ApMetaCustom = &i18n.Message{ID: "ApMetaCustom", Other: "自定义"} + ApMetaMySQLSchemaMeta = &i18n.Message{ID: "ApMetaMySQLSchemaMeta", Other: "库表元数据"} + ApMetaMySQLProcesslist = &i18n.Message{ID: "ApMetaMySQLProcesslist", Other: "processlist 列表"} + ApMetaAliRdsMySQLSlowLog = &i18n.Message{ID: "ApMetaAliRdsMySQLSlowLog", Other: "阿里RDS MySQL慢日志"} + ApMetaAliRdsMySQLAuditLog = &i18n.Message{ID: "ApMetaAliRdsMySQLAuditLog", Other: "阿里RDS MySQL审计日志"} + ApMetaBaiduRdsMySQLSlowLog = &i18n.Message{ID: "ApMetaBaiduRdsMySQLSlowLog", Other: "百度云RDS MySQL慢日志"} + ApMetaHuaweiRdsMySQLSlowLog = &i18n.Message{ID: "ApMetaHuaweiRdsMySQLSlowLog", Other: "华为云RDS MySQL慢日志"} + ApMetaOracleTopSQL = &i18n.Message{ID: "ApMetaOracleTopSQL", Other: "Oracle TOP SQL"} + ApMetaAllAppExtract = &i18n.Message{ID: "ApMetaAllAppExtract", Other: "应用程序SQL抓取"} + ApMetaTiDBAuditLog = &i18n.Message{ID: "ApMetaTiDBAuditLog", Other: "TiDB审计日志"} + ApMetaSlowLog = &i18n.Message{ID: "ApMetaSlowLog", Other: "慢日志"} + ApMetaMDBSlowLog = &i18n.Message{ID: "ApMetaMDBSlowLog", Other: "慢日志(监控库)"} + ApMetaTopSQL = &i18n.Message{ID: "ApMetaTopSQL", Other: "Top SQL"} + ApMetaDB2TopSQL = &i18n.Message{ID: "ApMetaDB2TopSQL", Other: "DB2 Top SQL"} + ApMetaSchemaMeta = &i18n.Message{ID: "ApMetaSchemaMeta", Other: "库表元数据"} + ApMetaDistributedLock = &i18n.Message{ID: "ApMetaDistributedLock", Other: "分布式锁"} + ApMetaDmTopSQL = &i18n.Message{ID: "ApMetaDmTopSQL", Other: "DM TOP SQL"} + ApMetaObForOracleTopSQL = &i18n.Message{ID: "ApMetaObForOracleTopSQL", Other: "OceanBase For Oracle TOP SQL"} + ApMetaOceanBaseForMySQLFullCollect = &i18n.Message{ID: "ApMetaOceanBaseForMySQLFullCollect", Other: "全量采集"} + ApMetaPostgreSQLTopSQL = &i18n.Message{ID: "ApMetaPostgreSQLTopSQL", Other: "TOP SQL"} + ApMetaGoldenDBTopSQL = &i18n.Message{ID: "ApMetaGoldenDBTopSQL", Other: "GoldenDB TOP SQL"} + ApMetaTiDBTopSQL = &i18n.Message{ID: "ApMetaTiDBTopSQL", Other: "TiDB TOP SQL"} + ApMetaMySQLTopSQL = &i18n.Message{ID: "ApMetaMySQLTopSQL", Other: "MySQL TOP SQL"} + ApMetricQueryTimeAvg = &i18n.Message{ID: "ApMetricQueryTimeAvg", Other: "平均查询时间(s)"} + ApMetricRowExaminedAvg = &i18n.Message{ID: "ApMetricRowExaminedAvg", Other: "平均扫描行数"} + ApMetaPerformanceCollect = &i18n.Message{ID: "ApMetaPerformanceCollect", Other: "数据源性能指标"} + ApMetaPerformanceCollectTips = &i18n.Message{ID: "ApMetaPerformanceCollectTips", Other: "性能指标采集将产生较大性能开销,请谨慎开启。开启后,系统将持续采集该数据源的性能数据(如QPS、连接数等),并生成性能趋势图表,体现在性能洞察页面。"} + ApMetaCollectTime = &i18n.Message{ID: "ApMetaCollectTime", Other: "采集时间"} + ApMetaThreadsConnected = &i18n.Message{ID: "ApMetaThreadsConnected", Other: "线程数"} + ApMetaQPS = &i18n.Message{ID: "ApMetaQueries", Other: "QPS"} + ApMetricNameFullTableScanCount = &i18n.Message{ID: "ApMetricNameFullTableScanCount", Other: "全表扫描次数"} ApPriorityHigh = &i18n.Message{ID: "ApPriorityHigh", Other: "高优先级"} diff --git a/sqle/model/instance_audit_plan.go b/sqle/model/instance_audit_plan.go index 72f6efd27..de0c92665 100644 --- a/sqle/model/instance_audit_plan.go +++ b/sqle/model/instance_audit_plan.go @@ -181,6 +181,18 @@ func (s *Storage) GetLatestStartTimeAuditPlanSQLV2(sourceId uint, typ string) (s return info.StartTime, err } +// HasSQLManageRecords 检查是否存在指定 source_id 和 source 的 SQL 记录 +func (s *Storage) HasSQLManageRecords(sourceId string, source string) (bool, error) { + info := struct { + Count int64 `gorm:"column:cnt"` + }{} + err := s.db.Raw(`SELECT COUNT(*) AS cnt FROM sql_manage_records WHERE source_id = ? AND source = ? AND deleted_at IS NULL`, sourceId, source).Scan(&info).Error + if err != nil { + return false, err + } + return info.Count > 0, nil +} + // 此表对于来源是扫描任务的相关sql, 目前仅在采集和审核时会更新, 如有其他场景更新此表, 需要考虑更新后会触发审核影响 // 如有其他sql业务相关字段补充, 可新增至SQLManageRecordProcess中 type SQLManageRecord struct { diff --git a/sqle/server/auditplan/metrics.go b/sqle/server/auditplan/metrics.go index cd0b70c36..6c7aceb66 100644 --- a/sqle/server/auditplan/metrics.go +++ b/sqle/server/auditplan/metrics.go @@ -79,6 +79,10 @@ const MetricNameMemMax = "mem_max" const MetricNameDiskMax = "disk_max" const MetricNameFullTableScanCount = "full_table_scan_count" +const MetricNameUserClientIP = "user_client_ip" +const MetricNameTenantName = "tenant_name" +const MetricNameRequestTime = "request_time" + var ALLMetric = map[string]MetricType{ MetricNameCounter: MetricTypeInt, // MySQL slow log MetricNameLastReceiveTimestamp: MetricTypeString, // MySQL slow log @@ -92,6 +96,7 @@ var ALLMetric = map[string]MetricType{ MetricNameMetaName: MetricTypeString, // MySQL schema meta MetricNameMetaType: MetricTypeString, // MySQL schema meta MetricNameRecordDeleted: MetricTypeBool, // MySQL schema meta + MetricNameHost: MetricTypeString, // OB MySQL Full Collect MetricNameQueryTimeTotal: MetricTypeFloat, // DB2 TOP SQL | OB Oracle TOP SQL MetricNameCPUTimeAvg: MetricTypeFloat, // DB2 TOP SQL | OB MySQL TOP SQL @@ -131,6 +136,10 @@ var ALLMetric = map[string]MetricType{ MetricNameDiskMax: MetricTypeInt, MetricNameInstance: MetricTypeString, MetricNameFullTableScanCount: MetricTypeInt, + + MetricNameUserClientIP: MetricTypeString, + MetricNameTenantName: MetricTypeString, + MetricNameRequestTime: MetricTypeString, } func LoadMetrics(info map[string]interface{}, metrics []string) Metrics {