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

leventov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-druid.git


The following commit(s) were added to refs/heads/master by this push:
     new e252abe  Enable toggling request logging on/off for different query 
types (#7562)
e252abe is described below

commit e252abedc5d7bd20c3c1dad7daf4cbdeb99ec761
Author: Lucas Capistrant <[email protected]>
AuthorDate: Tue Aug 6 07:47:30 2019 -0500

    Enable toggling request logging on/off for different query types (#7562)
    
    * Enable ability to toggle SegmentMetadata request logging on/off
    
    * Move SegmentMetadata query log filter to FilteredRequestLogger
    
    * Update documentation to reflect the segment metadata flag moving to the 
filtered request logger
    
    * Modify patch to allow blacklist of query types to not log to request 
logger
    
    * Address styling and naming requests following latest code review
    
    * Fix indentation on multiple locations per Druid style rules
---
 docs/content/configuration/index.md                |  1 +
 .../server/log/FileRequestLoggerProvider.java      |  7 ++-
 .../server/log/FilteredRequestLoggerProvider.java  | 30 ++++++++--
 .../server/log/FilteredRequestLoggerTest.java      | 65 +++++++++++++++++++++-
 4 files changed, 96 insertions(+), 7 deletions(-)

diff --git a/docs/content/configuration/index.md 
b/docs/content/configuration/index.md
index 0e9e663..fcccac7 100644
--- a/docs/content/configuration/index.md
+++ b/docs/content/configuration/index.md
@@ -378,6 +378,7 @@ For native query, only request logs where query/time is 
above the threshold are
 |--------|-----------|-------|
 |`druid.request.logging.queryTimeThresholdMs`|Threshold value for query/time 
in milliseconds.|0 i.e no filtering|
 |`druid.request.logging.sqlQueryTimeThresholdMs`|Threshold value for 
sqlQuery/time in milliseconds.|0 i.e no filtering|
+|`druid.request.logging.mutedQueryTypes` | Query requests of these types are 
not logged. Query types are defined as string objects corresponding to the 
"queryType" value for the specified query in the Druid's [native JSON query 
API](http://druid.apache.org/docs/latest/querying/querying.html). Misspelled 
query types will be ignored. Example to ignore scan and timeBoundary queries: 
["scan", "timeBoundary"]| []|
 |`druid.request.logging.delegate.type`|Type of delegate request logger to log 
requests.|none|
 
 #### Composite Request Logging
diff --git 
a/server/src/main/java/org/apache/druid/server/log/FileRequestLoggerProvider.java
 
b/server/src/main/java/org/apache/druid/server/log/FileRequestLoggerProvider.java
index be88caf..0d993d6 100644
--- 
a/server/src/main/java/org/apache/druid/server/log/FileRequestLoggerProvider.java
+++ 
b/server/src/main/java/org/apache/druid/server/log/FileRequestLoggerProvider.java
@@ -58,7 +58,12 @@ public class FileRequestLoggerProvider implements 
RequestLoggerProvider
   @Override
   public RequestLogger get()
   {
-    FileRequestLogger logger = new FileRequestLogger(jsonMapper, 
factory.create(1, "RequestLogger-%s"), dir, filePattern);
+    FileRequestLogger logger = new FileRequestLogger(
+        jsonMapper,
+        factory.create(1, "RequestLogger-%s"),
+        dir,
+        filePattern
+    );
     log.debug(new Exception("Stack trace"), "Creating %s at", logger);
     return logger;
   }
diff --git 
a/server/src/main/java/org/apache/druid/server/log/FilteredRequestLoggerProvider.java
 
b/server/src/main/java/org/apache/druid/server/log/FilteredRequestLoggerProvider.java
index 3bee5f4..beee88e 100644
--- 
a/server/src/main/java/org/apache/druid/server/log/FilteredRequestLoggerProvider.java
+++ 
b/server/src/main/java/org/apache/druid/server/log/FilteredRequestLoggerProvider.java
@@ -21,13 +21,16 @@ package org.apache.druid.server.log;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.collect.ImmutableList;
 import org.apache.druid.java.util.common.lifecycle.LifecycleStart;
 import org.apache.druid.java.util.common.lifecycle.LifecycleStop;
 import org.apache.druid.java.util.common.logger.Logger;
+import org.apache.druid.query.Query;
 import org.apache.druid.server.RequestLogLine;
 
 import javax.validation.constraints.NotNull;
 import java.io.IOException;
+import java.util.List;
 
 /**
  */
@@ -46,13 +49,17 @@ public class FilteredRequestLoggerProvider implements 
RequestLoggerProvider
   @JsonProperty
   private long sqlQueryTimeThresholdMs = 0;
 
+  @JsonProperty
+  private List<String> mutedQueryTypes = ImmutableList.of();
+
   @Override
   public RequestLogger get()
   {
     FilteredRequestLogger logger = new FilteredRequestLogger(
         delegate.get(),
         queryTimeThresholdMs,
-        sqlQueryTimeThresholdMs
+        sqlQueryTimeThresholdMs,
+        mutedQueryTypes
     );
     log.debug(new Exception("Stack trace"), "Creating %s at", logger);
     return logger;
@@ -63,12 +70,19 @@ public class FilteredRequestLoggerProvider implements 
RequestLoggerProvider
     private final RequestLogger logger;
     private final long queryTimeThresholdMs;
     private final long sqlQueryTimeThresholdMs;
-
-    public FilteredRequestLogger(RequestLogger logger, long 
queryTimeThresholdMs, long sqlQueryTimeThresholdMs)
+    private final List<String> mutedQueryTypes;
+
+    public FilteredRequestLogger(
+        RequestLogger logger,
+        long queryTimeThresholdMs,
+        long sqlQueryTimeThresholdMs,
+        List<String> mutedQueryTypes
+    )
     {
       this.logger = logger;
       this.queryTimeThresholdMs = queryTimeThresholdMs;
       this.sqlQueryTimeThresholdMs = sqlQueryTimeThresholdMs;
+      this.mutedQueryTypes = mutedQueryTypes;
     }
 
     public long getQueryTimeThresholdMs()
@@ -100,6 +114,10 @@ public class FilteredRequestLoggerProvider implements 
RequestLoggerProvider
     {
       Object queryTime = 
requestLogLine.getQueryStats().getStats().get("query/time");
       if (queryTime != null && ((Number) queryTime).longValue() >= 
queryTimeThresholdMs) {
+        Query query = requestLogLine.getQuery();
+        if (query != null && mutedQueryTypes.contains(query.getType())) {
+          return;
+        }
         logger.logNativeQuery(requestLogLine);
       }
     }
@@ -109,6 +127,10 @@ public class FilteredRequestLoggerProvider implements 
RequestLoggerProvider
     {
       Object sqlQueryTime = 
requestLogLine.getQueryStats().getStats().get("sqlQuery/time");
       if (sqlQueryTime != null && ((Number) sqlQueryTime).longValue() >= 
sqlQueryTimeThresholdMs) {
+        Query query = requestLogLine.getQuery();
+        if (query != null && mutedQueryTypes.contains(query.getType())) {
+          return;
+        }
         logger.logSqlQuery(requestLogLine);
       }
     }
@@ -120,8 +142,8 @@ public class FilteredRequestLoggerProvider implements 
RequestLoggerProvider
              "logger=" + logger +
              ", queryTimeThresholdMs=" + queryTimeThresholdMs +
              ", sqlQueryTimeThresholdMs=" + sqlQueryTimeThresholdMs +
+             ", mutedQueryTypes=" + mutedQueryTypes +
              '}';
     }
   }
-
 }
diff --git 
a/server/src/test/java/org/apache/druid/server/log/FilteredRequestLoggerTest.java
 
b/server/src/test/java/org/apache/druid/server/log/FilteredRequestLoggerTest.java
index 13450b1..75f4473 100644
--- 
a/server/src/test/java/org/apache/druid/server/log/FilteredRequestLoggerTest.java
+++ 
b/server/src/test/java/org/apache/druid/server/log/FilteredRequestLoggerTest.java
@@ -21,10 +21,14 @@ package org.apache.druid.server.log;
 
 import com.fasterxml.jackson.databind.InjectableValues;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.inject.ProvisionException;
 import org.apache.druid.guice.JsonConfigurator;
 import org.apache.druid.jackson.DefaultObjectMapper;
+import org.apache.druid.query.LegacyDataSource;
+import org.apache.druid.query.Query;
+import org.apache.druid.query.metadata.metadata.SegmentMetadataQuery;
 import org.apache.druid.server.QueryStats;
 import org.apache.druid.server.RequestLogLine;
 import org.easymock.EasyMock;
@@ -42,6 +46,16 @@ public class FilteredRequestLoggerTest
   @Rule
   public final ExpectedException expectedException = ExpectedException.none();
   private final DefaultObjectMapper mapper = new DefaultObjectMapper();
+  private final SegmentMetadataQuery testSegmentMetadataQuery = new 
SegmentMetadataQuery(
+      new LegacyDataSource("foo"),
+      null,
+      null,
+      null,
+      null,
+      null,
+      null,
+      null
+  );
 
   public FilteredRequestLoggerTest()
   {
@@ -69,12 +83,14 @@ public class FilteredRequestLoggerTest
     FilteredRequestLoggerProvider.FilteredRequestLogger logger = new 
FilteredRequestLoggerProvider.FilteredRequestLogger(
         delegate,
         1000,
-        2000
+        2000,
+        ImmutableList.of()
     );
     RequestLogLine nativeRequestLogLine = 
EasyMock.createMock(RequestLogLine.class);
     EasyMock.expect(nativeRequestLogLine.getQueryStats())
             .andReturn(new QueryStats(ImmutableMap.of("query/time", 100)))
             .once();
+
     RequestLogLine sqlRequestLogLine = 
EasyMock.createMock(RequestLogLine.class);
     EasyMock.expect(sqlRequestLogLine.getQueryStats())
             .andReturn(new QueryStats(ImmutableMap.of("sqlQuery/time", 1000)));
@@ -96,7 +112,8 @@ public class FilteredRequestLoggerTest
     FilteredRequestLoggerProvider.FilteredRequestLogger logger = new 
FilteredRequestLoggerProvider.FilteredRequestLogger(
         delegate,
         1000,
-        2000
+        2000,
+        ImmutableList.of()
     );
 
     RequestLogLine nativeRequestLogLine = 
EasyMock.createMock(RequestLogLine.class);
@@ -106,6 +123,9 @@ public class FilteredRequestLoggerTest
     EasyMock.expect(nativeRequestLogLine.getQueryStats())
             .andReturn(new QueryStats(ImmutableMap.of("query/time", 1000)))
             .once();
+    EasyMock.expect(nativeRequestLogLine.getQuery())
+            .andReturn(testSegmentMetadataQuery)
+            .times(2);
 
     RequestLogLine sqlRequestLogLine = 
EasyMock.createMock(RequestLogLine.class);
     EasyMock.expect(sqlRequestLogLine.getQueryStats())
@@ -114,6 +134,9 @@ public class FilteredRequestLoggerTest
     EasyMock.expect(sqlRequestLogLine.getQueryStats())
             .andReturn(new QueryStats(ImmutableMap.of("sqlQuery/time", 2000)))
             .once();
+    EasyMock.expect(sqlRequestLogLine.getQuery())
+            .andReturn(testSegmentMetadataQuery)
+            .times(2);
 
     EasyMock.replay(nativeRequestLogLine, sqlRequestLogLine, delegate);
 
@@ -126,6 +149,44 @@ public class FilteredRequestLoggerTest
   }
 
   @Test
+  public void testNotFilterAboveThresholdSkipSegmentMetadata() throws 
IOException
+  {
+    RequestLogger delegate = EasyMock.createStrictMock(RequestLogger.class);
+    delegate.logNativeQuery(EasyMock.anyObject());
+    EasyMock.expectLastCall().andThrow(new IOException());
+    delegate.logSqlQuery(EasyMock.anyObject());
+    EasyMock.expectLastCall().andThrow(new IOException());
+
+    FilteredRequestLoggerProvider.FilteredRequestLogger logger = new 
FilteredRequestLoggerProvider.FilteredRequestLogger(
+        delegate,
+        1000,
+        2000,
+        ImmutableList.of(Query.SEGMENT_METADATA)
+    );
+
+    RequestLogLine nativeRequestLogLine = 
EasyMock.createMock(RequestLogLine.class);
+    EasyMock.expect(nativeRequestLogLine.getQueryStats())
+            .andReturn(new QueryStats(ImmutableMap.of("query/time", 10000)))
+            .once();
+    EasyMock.expect(nativeRequestLogLine.getQuery())
+            .andReturn(testSegmentMetadataQuery)
+            .once();
+
+    RequestLogLine sqlRequestLogLine = 
EasyMock.createMock(RequestLogLine.class);
+    EasyMock.expect(sqlRequestLogLine.getQueryStats())
+            .andReturn(new QueryStats(ImmutableMap.of("sqlQuery/time", 10000)))
+            .once();
+    EasyMock.expect(sqlRequestLogLine.getQuery())
+            .andReturn(testSegmentMetadataQuery)
+            .once();
+
+    EasyMock.replay(nativeRequestLogLine, sqlRequestLogLine, delegate);
+
+    logger.logNativeQuery(nativeRequestLogLine);
+    logger.logSqlQuery(sqlRequestLogLine);
+  }
+
+  @Test
   public void testConfiguration()
   {
     final Properties properties = new Properties();


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

Reply via email to