From 543d6419a89008f1e78f2fe736c4ff3f64d4370f Mon Sep 17 00:00:00 2001 From: He xueyu <112704062+HexyinUESTC@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:45:53 +0800 Subject: [PATCH] [Improve](auditlog) audit log print real sql in prepared statement (#43038) 1. Use the "execute *** using *** /*original sql = */" in the audit log instead of "execute *** using ***". 2. Add a CommandType parameter to the audit log. 3. When the prepared statement is ready, it should log OK instead of NOOP --- .../src/main/java/org/apache/doris/plugin/AuditEvent.java | 7 +++++++ .../src/main/java/org/apache/doris/qe/AuditLogHelper.java | 7 ++++++- .../java/org/apache/doris/qe/MysqlConnectProcessor.java | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/plugin/AuditEvent.java b/fe/fe-core/src/main/java/org/apache/doris/plugin/AuditEvent.java index 55a8b00d2e8d13..d3ffae1f48478b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/plugin/AuditEvent.java +++ b/fe/fe-core/src/main/java/org/apache/doris/plugin/AuditEvent.java @@ -60,6 +60,8 @@ public enum EventType { public String ctl = ""; @AuditField(value = "Db") public String db = ""; + @AuditField(value = "CommandType") + public String commandType = ""; @AuditField(value = "State") public String state = ""; @AuditField(value = "ErrorCode") @@ -272,6 +274,11 @@ public AuditEventBuilder setScanBytesFromRemoteStorage(long scanBytesFromRemoteS return this; } + public AuditEventBuilder setCommandType(String commandType) { + auditEvent.commandType = commandType; + return this; + } + public AuditEvent build() { return this.auditEvent; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/AuditLogHelper.java b/fe/fe-core/src/main/java/org/apache/doris/qe/AuditLogHelper.java index 0bbc37cd47b132..02ad2754ad260c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/AuditLogHelper.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/AuditLogHelper.java @@ -32,6 +32,7 @@ import org.apache.doris.datasource.CatalogIf; import org.apache.doris.datasource.InternalCatalog; import org.apache.doris.metric.MetricRepo; +import org.apache.doris.mysql.MysqlCommand; import org.apache.doris.nereids.analyzer.UnboundOneRowRelation; import org.apache.doris.nereids.analyzer.UnboundTableSink; import org.apache.doris.nereids.glue.LogicalPlanAdapter; @@ -208,7 +209,8 @@ private static void logAuditLogImpl(ConnectContext ctx, String origStmt, Stateme .setQueryId(ctx.queryId() == null ? "NaN" : DebugUtil.printId(ctx.queryId())) .setCloudCluster(Strings.isNullOrEmpty(cluster) ? "UNKNOWN" : cluster) .setWorkloadGroup(ctx.getWorkloadGroupName()) - .setFuzzyVariables(!printFuzzyVariables ? "" : ctx.getSessionVariable().printFuzzyVariables()); + .setFuzzyVariables(!printFuzzyVariables ? "" : ctx.getSessionVariable().printFuzzyVariables()) + .setCommandType(ctx.getCommand().toString()); if (ctx.getState().isQuery()) { if (!ctx.getSessionVariable().internalSession) { @@ -277,6 +279,9 @@ private static void logAuditLogImpl(ConnectContext ctx, String origStmt, Stateme } } } + if (ctx.getCommand() == MysqlCommand.COM_STMT_PREPARE && ctx.getState().getErrorCode() == null) { + auditEventBuilder.setState(String.valueOf(MysqlStateType.OK)); + } Env.getCurrentEnv().getWorkloadRuntimeStatusMgr().submitFinishQueryToAudit(auditEventBuilder.build()); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/MysqlConnectProcessor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/MysqlConnectProcessor.java index d5f4ab7dfcccea..376d4740e632a1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/MysqlConnectProcessor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/MysqlConnectProcessor.java @@ -151,6 +151,7 @@ private void handleExecute(PrepareCommand prepareCommand, long stmtId, PreparedS executor.execute(); if (ctx.getSessionVariable().isEnablePreparedStmtAuditLog()) { stmtStr = executeStmt.toSql(); + stmtStr = stmtStr + " /*originalSql = " + prepareCommand.getOriginalStmt().originStmt + "*/"; } } catch (Throwable e) { // Catch all throwable.