Author: catholicon
Date: Sun Apr  7 01:17:28 2019
New Revision: 1857057

URL: http://svn.apache.org/viewvc?rev=1857057&view=rev
Log:
OAK-8148: [Indexing] Implement sling metric to calculate number of slow 
queries(relative to all queries)

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettings.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsData.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettings.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettings.java?rev=1857057&r1=1857056&r2=1857057&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettings.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettings.java
 Sun Apr  7 01:17:28 2019
@@ -76,7 +76,7 @@ public class QueryEngineSettings impleme
     public static final boolean DEFAULT_FAST_QUERY_SIZE = 
Boolean.getBoolean(OAK_FAST_QUERY_SIZE);
     private boolean fastQuerySize = DEFAULT_FAST_QUERY_SIZE;
 
-    private QueryStatsMBeanImpl queryStats = new QueryStatsMBeanImpl(this);
+    private final QueryStatsMBeanImpl queryStats = new 
QueryStatsMBeanImpl(this);
 
     /**
      * StatisticsProvider used to record query side metrics.

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java?rev=1857057&r1=1857056&r2=1857057&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
 Sun Apr  7 01:17:28 2019
@@ -503,7 +503,7 @@ public class SelectorImpl extends Source
     private boolean nextInternal() {
         while (cursor != null && cursor.hasNext()) {
             scanCount++;
-            query.getQueryExecutionStats().scan(1, scanCount);
+            query.getQueryExecutionStats().scan(1, scanCount, 
query.getSettings());
             currentRow = cursor.next();
             if (isParent) {
                 // we must not check whether the _parent_ is readable

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsData.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsData.java?rev=1857057&r1=1857056&r2=1857057&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsData.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/stats/QueryStatsData.java
 Sun Apr  7 01:17:28 2019
@@ -17,6 +17,10 @@
 package org.apache.jackrabbit.oak.query.stats;
 
 import org.apache.jackrabbit.oak.commons.json.JsopBuilder;
+import org.apache.jackrabbit.oak.query.QueryEngineSettings;
+import org.apache.jackrabbit.oak.stats.CounterStats;
+import org.apache.jackrabbit.oak.stats.HistogramStats;
+import org.apache.jackrabbit.oak.stats.StatsOptions;
 
 public class QueryStatsData {
     
@@ -43,6 +47,8 @@ public class QueryStatsData {
     private long readNanos;
     private long maxTimeNanos;
     private boolean captureStackTraces;
+    private boolean isSlowQuery = false;
+    private boolean updateTotalQueryHistogram = true;
 
     public QueryStatsData(String query, String language) {
         this.query = query;
@@ -138,6 +144,12 @@ public class QueryStatsData {
     public class QueryExecutionStats {
         
         long time;
+        private final long SLOW_QUERY_HISTOGRAM = 1;
+        private final long TOTAL_QUERY_HISTOGRAM = 0;
+        private final String SLOW_QUERY_PERCENTILE_METRICS_NAME = 
"SLOW_QUERY_PERCENTILE_METRICS";
+        private final String SLOW_QUERY_COUNT_NAME = "SLOW_QUERY_COUNT";
+        private final int SLOW_QUERY_LIMIT_SCANNED =
+                Integer.getInteger("oak.query.slowScanLimit", 100000);
         
         public void execute(long nanos) {
             QueryRecorder.record(query, internal);
@@ -171,10 +183,23 @@ public class QueryStatsData {
             maxTimeNanos = Math.max(maxTimeNanos, time);
         }
 
-        public void scan(long count, long max) {
+        public void scan(long count, long max, QueryEngineSettings 
queryEngineSettings) {
             totalRowsScanned += count;
             maxRowsScanned = Math.max(maxRowsScanned, max);
-        }        
+            long maxScannedLimit = Math.min(SLOW_QUERY_LIMIT_SCANNED, 
queryEngineSettings.getLimitReads());
+            if (updateTotalQueryHistogram) {
+                updateTotalQueryHistogram = false;
+                HistogramStats histogramStats = 
queryEngineSettings.getStatisticsProvider().getHistogram(SLOW_QUERY_PERCENTILE_METRICS_NAME,
 StatsOptions.METRICS_ONLY);
+                histogramStats.update(TOTAL_QUERY_HISTOGRAM);
+            }
+            if (totalRowsScanned >= maxScannedLimit && !isSlowQuery) {
+                isSlowQuery = true;
+                HistogramStats histogramStats = 
queryEngineSettings.getStatisticsProvider().getHistogram(SLOW_QUERY_PERCENTILE_METRICS_NAME,
 StatsOptions.METRICS_ONLY);
+                histogramStats.update(SLOW_QUERY_HISTOGRAM);
+                CounterStats slowQueryCounter = 
queryEngineSettings.getStatisticsProvider().getCounterStats(SLOW_QUERY_COUNT_NAME,
 StatsOptions.METRICS_ONLY);
+                slowQueryCounter.inc();
+            }
+        }
     }
 
 }
\ No newline at end of file


Reply via email to