This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 6ed190c6eb HDDS-9822. Format audit log message lazily (#5718)
6ed190c6eb is described below

commit 6ed190c6eb3e06013567b247f7a26adaacf14392
Author: XiChen <[email protected]>
AuthorDate: Mon Dec 4 15:31:22 2023 +0800

    HDDS-9822. Format audit log message lazily (#5718)
---
 .../org/apache/hadoop/ozone/audit/AuditLogger.java | 10 +++++--
 .../apache/hadoop/ozone/audit/AuditMessage.java    | 32 ++++++++++------------
 .../hadoop/ozone/s3/endpoint/BucketEndpoint.java   |  2 +-
 .../hadoop/ozone/s3/endpoint/EndpointBase.java     |  3 +-
 .../hadoop/ozone/s3/endpoint/ObjectEndpoint.java   |  8 +++---
 5 files changed, 30 insertions(+), 25 deletions(-)

diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/audit/AuditLogger.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/audit/AuditLogger.java
index f4f8ba7853..33ad708698 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/audit/AuditLogger.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/audit/AuditLogger.java
@@ -29,7 +29,9 @@ import org.slf4j.LoggerFactory;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
@@ -52,6 +54,7 @@ public class AuditLogger {
   public static final String AUDIT_LOG_DEBUG_CMD_LIST_PREFIX =
       "ozone.audit.log.debug.cmd.list.";
   private AuditLoggerType type;
+  private final Map<String, String> opNameCache = new ConcurrentHashMap<>();
 
   /**
    * Parametrized Constructor to initialize logger.
@@ -130,8 +133,11 @@ public class AuditLogger {
   }
 
   private boolean shouldLogAtDebug(AuditMessage auditMessage) {
-    return debugCmdSetRef.get()
-        .contains(auditMessage.getOp().toLowerCase(Locale.ROOT));
+    return debugCmdSetRef.get().contains(getLowerCaseOp(auditMessage.getOp()));
+  }
+
+  private String getLowerCaseOp(String op) {
+    return opNameCache.computeIfAbsent(op, k -> k.toLowerCase(Locale.ROOT));
   }
 
   /**
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/audit/AuditMessage.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/audit/AuditMessage.java
index bff05f024d..b8156d58d9 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/audit/AuditMessage.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/audit/AuditMessage.java
@@ -16,38 +16,36 @@
  */
 package org.apache.hadoop.ozone.audit;
 
+import org.apache.hadoop.ozone.audit.AuditLogger.PerformanceStringBuilder;
 import org.apache.logging.log4j.message.Message;
+import org.apache.ratis.util.MemoizedSupplier;
 
 import java.util.Map;
+import java.util.function.Supplier;
 
 /**
  * Defines audit message structure.
  */
 public final class AuditMessage implements Message {
 
-  private final String message;
-  private final String user;
-  private final String ip;
+  private static final long serialVersionUID = 1L;
+
+  private final transient Supplier<String> messageSupplier;
   private final String op;
-  private final Map<String, String> params;
-  private final String ret;
   private final Throwable throwable;
 
   private AuditMessage(String user, String ip, String op,
       Map<String, String> params, String ret, Throwable throwable,
-      String performance) {
-    this.user = user;
-    this.ip = ip;
+      PerformanceStringBuilder performance) {
     this.op = op;
-    this.params = params;
-    this.ret = ret;
-    this.message = formMessage(user, ip, op, params, ret, performance);
+    this.messageSupplier = MemoizedSupplier.valueOf(
+        () -> formMessage(user, ip, op, params, ret, performance));
     this.throwable = throwable;
   }
 
   @Override
   public String getFormattedMessage() {
-    return message;
+    return messageSupplier.get();
   }
 
   @Override
@@ -79,7 +77,7 @@ public final class AuditMessage implements Message {
     private String op;
     private Map<String, String> params;
     private String ret;
-    private String performance;
+    private PerformanceStringBuilder performance;
 
     public Builder setUser(String usr) {
       this.user = usr;
@@ -111,7 +109,7 @@ public final class AuditMessage implements Message {
       return this;
     }
 
-    public Builder setPerformance(String perf) {
+    public Builder setPerformance(PerformanceStringBuilder perf) {
       this.performance = perf;
       return this;
     }
@@ -124,9 +122,9 @@ public final class AuditMessage implements Message {
 
   private String formMessage(String userStr, String ipStr, String opStr,
       Map<String, String> paramsMap, String retStr,
-      String performanceMap) {
-    String perf = performanceMap != null && !performanceMap.isEmpty()
-        ? " | perf=" + performanceMap : "";
+      PerformanceStringBuilder performanceMap) {
+    String perf = performanceMap != null
+        ? " | perf=" + performanceMap.build() : "";
     return "user=" + userStr + " | ip=" + ipStr + " | " + "op=" + opStr
         + " " + paramsMap + " | ret=" + retStr + perf;
   }
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
index 910b0026e3..f7ec7130ea 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
@@ -275,7 +275,7 @@ public class BucketEndpoint extends EndpointBase {
     perf.appendCount(keyCount);
     perf.appendOpLatencyNanos(opLatencyNs);
     AUDIT.logReadSuccess(buildAuditMessageForSuccess(s3GAction,
-        getAuditParameters(), perf.build()));
+        getAuditParameters(), perf));
     response.setKeyCount(keyCount);
     return Response.ok(response).build();
   }
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/EndpointBase.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/EndpointBase.java
index abda4678dc..6f0f3c4847 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/EndpointBase.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/EndpointBase.java
@@ -40,6 +40,7 @@ import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.audit.AuditAction;
 import org.apache.hadoop.ozone.audit.AuditEventStatus;
 import org.apache.hadoop.ozone.audit.AuditLogger;
+import org.apache.hadoop.ozone.audit.AuditLogger.PerformanceStringBuilder;
 import org.apache.hadoop.ozone.audit.AuditLoggerType;
 import org.apache.hadoop.ozone.audit.AuditMessage;
 import org.apache.hadoop.ozone.audit.Auditor;
@@ -354,7 +355,7 @@ public abstract class EndpointBase implements Auditor {
   }
 
   public AuditMessage buildAuditMessageForSuccess(AuditAction op,
-      Map<String, String> auditMap, String performance) {
+      Map<String, String> auditMap, PerformanceStringBuilder performance) {
     AuditMessage.Builder builder = auditMessageBaseBuilder(op, auditMap)
         .withResult(AuditEventStatus.SUCCESS);
     builder.setPerformance(performance);
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
index b607b1c5cf..1e247c8eb8 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
@@ -370,7 +370,7 @@ public class ObjectEndpoint extends EndpointBase {
         long opLatencyNs = 
getMetrics().updateCreateKeySuccessStats(startNanos);
         perf.appendOpLatencyNanos(opLatencyNs);
         AUDIT.logWriteSuccess(buildAuditMessageForSuccess(s3GAction,
-            getAuditParameters(), perf.build()));
+            getAuditParameters(), perf));
       }
     }
   }
@@ -405,7 +405,7 @@ public class ObjectEndpoint extends EndpointBase {
         Response response = listParts(bucketName, keyPath, uploadId,
             partMarker, maxParts, perf);
         AUDIT.logReadSuccess(buildAuditMessageForSuccess(s3GAction,
-            getAuditParameters(), perf.build()));
+            getAuditParameters(), perf));
         return response;
       }
 
@@ -444,7 +444,7 @@ public class ObjectEndpoint extends EndpointBase {
           long opLatencyNs =  
getMetrics().updateGetKeySuccessStats(startNanos);
           perf.appendOpLatencyNanos(opLatencyNs);
           AUDIT.logReadSuccess(buildAuditMessageForSuccess(S3GAction.GET_KEY,
-              getAuditParameters(), perf.build()));
+              getAuditParameters(), perf));
         };
         responseBuilder = Response
             .ok(output)
@@ -468,7 +468,7 @@ public class ObjectEndpoint extends EndpointBase {
           long opLatencyNs = getMetrics().updateGetKeySuccessStats(startNanos);
           perf.appendOpLatencyNanos(opLatencyNs);
           AUDIT.logReadSuccess(buildAuditMessageForSuccess(S3GAction.GET_KEY,
-              getAuditParameters(), perf.build()));
+              getAuditParameters(), perf));
         };
         responseBuilder = Response
             .status(Status.PARTIAL_CONTENT)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to