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) <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]