This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push: new 2b62fb1a593 [fix](audit) fix potential audit log missing issue (#50357) (#50501) 2b62fb1a593 is described below commit 2b62fb1a593e5c41debb9258b902d8c6d122b911 Author: Mingyu Chen (Rayner) <morning...@163.com> AuthorDate: Mon Apr 28 17:27:13 2025 -0700 [fix](audit) fix potential audit log missing issue (#50357) (#50501) bp #50357 --- .../apache/doris/plugin/audit/AuditLogBuilder.java | 4 +--- .../org/apache/doris/qe/AuditEventProcessor.java | 28 ++++++++++------------ .../java/org/apache/doris/qe/AuditLogHelper.java | 7 +++++- .../org/apache/doris/qe/MysqlConnectProcessor.java | 2 +- .../WorkloadRuntimeStatusMgr.java | 13 ++++++---- 5 files changed, 29 insertions(+), 25 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/plugin/audit/AuditLogBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/plugin/audit/AuditLogBuilder.java index 56465f9c17b..4208d5def2e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/plugin/audit/AuditLogBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/plugin/audit/AuditLogBuilder.java @@ -93,9 +93,7 @@ public class AuditLogBuilder extends Plugin implements AuditPlugin { break; } } catch (Exception e) { - if (LOG.isDebugEnabled()) { - LOG.debug("failed to process audit event", e); - } + LOG.warn("failed to process audit event: {}", event.queryId, e); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/AuditEventProcessor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/AuditEventProcessor.java index 42625301df1..b8855600eca 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/AuditEventProcessor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/AuditEventProcessor.java @@ -17,6 +17,7 @@ package org.apache.doris.qe; +import org.apache.doris.common.Config; import org.apache.doris.plugin.AuditEvent; import org.apache.doris.plugin.AuditPlugin; import org.apache.doris.plugin.Plugin; @@ -44,7 +45,7 @@ public class AuditEventProcessor { private List<Plugin> auditPlugins; private long lastUpdateTime = 0; - private BlockingQueue<AuditEvent> eventQueue = Queues.newLinkedBlockingDeque(10000); + private BlockingQueue<AuditEvent> eventQueue = Queues.newLinkedBlockingDeque(); private Thread workerThread; private volatile boolean isStopped = false; @@ -71,18 +72,19 @@ public class AuditEventProcessor { } public boolean handleAuditEvent(AuditEvent auditEvent) { - return handleAuditEvent(auditEvent, false); - } - - public boolean handleAuditEvent(AuditEvent auditEvent, boolean ignoreQueueFullLog) { boolean isAddSucc = true; try { - eventQueue.add(auditEvent); + if (eventQueue.size() >= Config.audit_event_log_queue_size) { + isAddSucc = false; + LOG.warn("the audit event queue is full with size {}, discard the audit event: {}", + eventQueue.size(), auditEvent.queryId); + } else { + eventQueue.add(auditEvent); + } } catch (Exception e) { isAddSucc = false; - if (!ignoreQueueFullLog) { - LOG.warn("encounter exception when handle audit event {}, ignore", auditEvent.type, e); - } + LOG.warn("encounter exception when handle audit event {}, discard the event", + auditEvent.queryId, e); } return isAddSucc; } @@ -108,9 +110,7 @@ public class AuditEventProcessor { continue; } } catch (InterruptedException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("encounter exception when getting audit event from queue, ignore", e); - } + LOG.warn("encounter exception when getting audit event from queue, ignore", e); continue; } @@ -121,9 +121,7 @@ public class AuditEventProcessor { } } } catch (Exception e) { - if (LOG.isDebugEnabled()) { - LOG.debug("encounter exception when processing audit event.", e); - } + LOG.warn("encounter exception when processing audit events. ignore", e); } } } 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 e060e198733..d7621a1476e 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 @@ -39,6 +39,7 @@ import org.apache.doris.nereids.trees.plans.commands.insert.InsertIntoTableComma import org.apache.doris.nereids.trees.plans.logical.LogicalInlineTable; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalUnion; +import org.apache.doris.plugin.AuditEvent; import org.apache.doris.plugin.AuditEvent.AuditEventBuilder; import org.apache.doris.plugin.AuditEvent.EventType; import org.apache.doris.qe.QueryState.MysqlStateType; @@ -257,6 +258,10 @@ public class AuditLogHelper { if (ctx.getCommand() == MysqlCommand.COM_STMT_PREPARE && ctx.getState().getErrorCode() == null) { auditEventBuilder.setState(String.valueOf(MysqlStateType.OK)); } - Env.getCurrentEnv().getWorkloadRuntimeStatusMgr().submitFinishQueryToAudit(auditEventBuilder.build()); + AuditEvent event = auditEventBuilder.build(); + Env.getCurrentEnv().getWorkloadRuntimeStatusMgr().submitFinishQueryToAudit(event); + if (LOG.isDebugEnabled()) { + LOG.debug("submit audit event: {}", event.queryId); + } } } 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 f40bae578a4..0c89b4a8403 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 @@ -258,7 +258,7 @@ public class MysqlConnectProcessor extends ConnectProcessor { // get from lagacy planner context, to be removed handleExecute((PrepareStmt) prepareCtx.stmt, stmtId); } else { - // nererids + // nereids PreparedStatementContext preparedStatementContext = ctx.getPreparedStementContext(String.valueOf(stmtId)); if (preparedStatementContext == null) { LOG.warn("No such statement in context, stmtId:{}", stmtId); diff --git a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadschedpolicy/WorkloadRuntimeStatusMgr.java b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadschedpolicy/WorkloadRuntimeStatusMgr.java index ce0703f23a8..e888f79b808 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadschedpolicy/WorkloadRuntimeStatusMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadschedpolicy/WorkloadRuntimeStatusMgr.java @@ -87,7 +87,7 @@ public class WorkloadRuntimeStatusMgr extends MasterDaemon { auditEvent.scanBytesFromLocalStorage = queryStats.scan_bytes_from_local_storage; auditEvent.scanBytesFromRemoteStorage = queryStats.scan_bytes_from_remote_storage; } - boolean ret = Env.getCurrentAuditEventProcessor().handleAuditEvent(auditEvent, true); + boolean ret = Env.getCurrentAuditEventProcessor().handleAuditEvent(auditEvent); if (!ret) { missedLogCount++; } else { @@ -110,9 +110,12 @@ public class WorkloadRuntimeStatusMgr extends MasterDaemon { queryAuditEventLogWriteLock(); try { if (queryAuditEventList.size() >= Config.audit_event_log_queue_size) { - LOG.warn("audit log event queue size {} is full, this may cause audit log missed." - + "you can check whether qps is too high or reset audit_event_log_queue_size", - queryAuditEventList.size()); + // if queryAuditEventList is full, we don't put the event to queryAuditEventList. + // so that the statistic info of this audit event will be ignored, and event will be logged directly. + LOG.warn("audit log event queue size {} is full, this may cause audit log missing statistics." + + "you can check whether qps is too high or " + + "set audit_event_log_queue_size to a larger value in fe.conf. query id: {}", + queryAuditEventList.size(), event.queryId); return; } event.pushToAuditLogQueueTime = System.currentTimeMillis(); @@ -122,7 +125,7 @@ public class WorkloadRuntimeStatusMgr extends MasterDaemon { } } - public List<AuditEvent> getQueryNeedAudit() { + private List<AuditEvent> getQueryNeedAudit() { List<AuditEvent> ret = new ArrayList<>(); long currentTime = System.currentTimeMillis(); queryAuditEventLogWriteLock(); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org