Browse Source

Instrumenting Weight#count in ProfileWeight (#85656)

Start instrumenting Weight#count function in ProfileWeight because we start to use it to compute total hit counts and aggregation counts.

Resolve #85203
Olivier Cavadenti 2 years ago
parent
commit
7e9ce33e84

+ 6 - 0
docs/changelog/85656.yaml

@@ -0,0 +1,6 @@
+pr: 85656
+summary: Instrument Weight#count in ProfileWeight
+area: Search
+type: enhancement
+issues:
+  - 85203

+ 19 - 5
docs/reference/search/profile.asciidoc

@@ -97,7 +97,9 @@ The API returns the following result:
                   "create_weight": 4694895,
                   "shallow_advance": 0,
                   "create_weight_count": 1,
-                  "build_scorer": 7112295
+                  "build_scorer": 7112295,
+                  "count_weight": 0,
+                  "count_weight_count": 0
                 },
                 "children": [
                   {
@@ -122,7 +124,9 @@ The API returns the following result:
                       "create_weight": 2382719,
                       "shallow_advance": 9754,
                       "create_weight_count": 1,
-                      "build_scorer": 1355007
+                      "build_scorer": 1355007,
+                      "count_weight": 0,
+                      "count_weight_count": 0
                     }
                   },
                   {
@@ -147,7 +151,9 @@ The API returns the following result:
                       "create_weight": 130951,
                       "shallow_advance": 2512,
                       "create_weight_count": 1,
-                      "build_scorer": 46153
+                      "build_scorer": 46153,
+                      "count_weight": 0,
+                      "count_weight_count": 0
                     }
                   }
                 ]
@@ -386,7 +392,9 @@ Lucene execution:
   "create_weight": 4694895,
   "shallow_advance": 0,
   "create_weight_count": 1,
-  "build_scorer": 7112295
+  "build_scorer": 7112295,
+  "count_weight": 0,
+  "count_weight_count": 0
 }
 --------------------------------------------------
 // TESTRESPONSE[s/^/{\n"took": $body.took,\n"timed_out": $body.timed_out,\n"_shards": $body._shards,\n"hits": $body.hits,\n"profile": {\n"shards": [ {\n"id": "$body.$_path",\n"searches": [{\n"query": [{\n"type": "BooleanQuery",\n"description": "message:get message:search",\n"time_in_nanos": $body.$_path,/]
@@ -653,10 +661,12 @@ The API returns the following result:
                   "compute_max_score": 0,
                   "advance": 3942,
                   "advance_count": 4,
+                  "count_weight_count": 0,
                   "score": 0,
                   "build_scorer_count": 2,
                   "create_weight": 38380,
                   "shallow_advance": 0,
+                  "count_weight": 0,
                   "create_weight_count": 1,
                   "build_scorer": 99296
                 }
@@ -679,9 +689,11 @@ The API returns the following result:
                   "advance": 3552,
                   "advance_count": 1,
                   "score": 5027,
+                  "count_weight_count": 0,
                   "build_scorer_count": 2,
                   "create_weight": 107840,
                   "shallow_advance": 0,
+                  "count_weight": 0,
                   "create_weight_count": 1,
                   "build_scorer": 44215
                 }
@@ -1260,7 +1272,9 @@ One of the `dfs.knn` sections for a shard looks like the following:
                   "create_weight" : 128879,
                   "shallow_advance" : 0,
                   "create_weight_count" : 1,
-                  "build_scorer" : 307595
+                  "build_scorer" : 307595,
+                  "count_weight": 0,
+                  "count_weight_count": 0
                 }
             }
         ],

+ 7 - 1
server/src/main/java/org/elasticsearch/search/profile/query/ProfileWeight.java

@@ -102,7 +102,13 @@ public final class ProfileWeight extends Weight {
 
     @Override
     public int count(LeafReaderContext context) throws IOException {
-        return subQueryWeight.count(context);
+        Timer timer = profile.getTimer(QueryTimingType.COUNT_WEIGHT);
+        timer.start();
+        try {
+            return subQueryWeight.count(context);
+        } finally {
+            timer.stop();
+        }
     }
 
     @Override

+ 1 - 0
server/src/main/java/org/elasticsearch/search/profile/query/QueryTimingType.java

@@ -12,6 +12,7 @@ import java.util.Locale;
 
 public enum QueryTimingType {
     CREATE_WEIGHT,
+    COUNT_WEIGHT,
     BUILD_SCORER,
     NEXT_DOC,
     ADVANCE,

+ 6 - 0
server/src/test/java/org/elasticsearch/search/profile/query/QueryProfilerTests.java

@@ -106,6 +106,7 @@ public class QueryProfilerTests extends ESTestCase {
         assertEquals(1, results.size());
         Map<String, Long> breakdown = results.get(0).getTimeBreakdown();
         assertThat(breakdown.get(QueryTimingType.CREATE_WEIGHT.toString()), greaterThan(0L));
+        assertThat(breakdown.get(QueryTimingType.COUNT_WEIGHT.toString()), equalTo(0L));
         assertThat(breakdown.get(QueryTimingType.BUILD_SCORER.toString()), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.NEXT_DOC.toString()), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.ADVANCE.toString()), equalTo(0L));
@@ -113,6 +114,7 @@ public class QueryProfilerTests extends ESTestCase {
         assertThat(breakdown.get(QueryTimingType.MATCH.toString()), equalTo(0L));
 
         assertThat(breakdown.get(QueryTimingType.CREATE_WEIGHT.toString() + "_count"), greaterThan(0L));
+        assertThat(breakdown.get(QueryTimingType.COUNT_WEIGHT.toString() + "_count"), equalTo(0L));
         assertThat(breakdown.get(QueryTimingType.BUILD_SCORER.toString() + "_count"), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.NEXT_DOC.toString() + "_count"), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.ADVANCE.toString() + "_count"), equalTo(0L));
@@ -149,6 +151,7 @@ public class QueryProfilerTests extends ESTestCase {
         assertEquals(1, results.size());
         Map<String, Long> breakdown = results.get(0).getTimeBreakdown();
         assertThat(breakdown.get(QueryTimingType.CREATE_WEIGHT.toString()), greaterThan(0L));
+        assertThat(breakdown.get(QueryTimingType.COUNT_WEIGHT.toString()), equalTo(0L));
         assertThat(breakdown.get(QueryTimingType.BUILD_SCORER.toString()), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.NEXT_DOC.toString()), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.ADVANCE.toString()), equalTo(0L));
@@ -156,6 +159,7 @@ public class QueryProfilerTests extends ESTestCase {
         assertThat(breakdown.get(QueryTimingType.MATCH.toString()), equalTo(0L));
 
         assertThat(breakdown.get(QueryTimingType.CREATE_WEIGHT.toString() + "_count"), greaterThan(0L));
+        assertThat(breakdown.get(QueryTimingType.COUNT_WEIGHT.toString() + "_count"), equalTo(0L));
         assertThat(breakdown.get(QueryTimingType.BUILD_SCORER.toString() + "_count"), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.NEXT_DOC.toString() + "_count"), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.ADVANCE.toString() + "_count"), equalTo(0L));
@@ -189,6 +193,7 @@ public class QueryProfilerTests extends ESTestCase {
         assertEquals(1, results.size());
         Map<String, Long> breakdown = results.get(0).getTimeBreakdown();
         assertThat(breakdown.get(QueryTimingType.CREATE_WEIGHT.toString()), greaterThan(0L));
+        assertThat(breakdown.get(QueryTimingType.COUNT_WEIGHT.toString()), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.BUILD_SCORER.toString()), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.NEXT_DOC.toString()), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.ADVANCE.toString()), equalTo(0L));
@@ -196,6 +201,7 @@ public class QueryProfilerTests extends ESTestCase {
         assertThat(breakdown.get(QueryTimingType.MATCH.toString()), greaterThan(0L));
 
         assertThat(breakdown.get(QueryTimingType.CREATE_WEIGHT.toString() + "_count"), greaterThan(0L));
+        assertThat(breakdown.get(QueryTimingType.COUNT_WEIGHT.toString() + "_count"), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.BUILD_SCORER.toString() + "_count"), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.NEXT_DOC.toString() + "_count"), greaterThan(0L));
         assertThat(breakdown.get(QueryTimingType.ADVANCE.toString() + "_count"), equalTo(0L));