Skip to content

Commit 3f47f9a

Browse files
committed
iter
1 parent 97cb335 commit 3f47f9a

File tree

3 files changed

+138
-17
lines changed

3 files changed

+138
-17
lines changed

server/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -531,8 +531,9 @@ static ReducedQueryPhase reducedQueryPhase(
531531
// we simply take the first one: we should get the same value from all shards anyway
532532
rangeTimestampFrom = result.getRangeTimestampFrom();
533533
}
534-
assert rangeTimestampFrom == null || rangeTimestampFrom.equals(result.getRangeTimestampFrom())
535-
: rangeTimestampFrom + " != " + result.getRangeTimestampFrom();
534+
assert rangeTimestampFrom == null
535+
|| result.getRangeTimestampFrom() == null
536+
|| rangeTimestampFrom.equals(result.getRangeTimestampFrom()) : rangeTimestampFrom + " != " + result.getRangeTimestampFrom();
536537

537538
if (hasSuggest) {
538539
assert result.suggest() != null;

server/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,9 +534,14 @@ public Long getRangeTimestampFrom() {
534534
*/
535535
public void setRangeTimestampFrom(long rangeTimestampFrom) {
536536
if (trackRangeTimestampFrom) {
537+
// if we got a timestamp with nanoseconds precision, round it down to millis
538+
if (rangeTimestampFrom > 1_000_000_000_000_000L) {
539+
rangeTimestampFrom = rangeTimestampFrom / 1_000_000;
540+
}
537541
if (this.rangeTimestampFrom == null) {
538542
this.rangeTimestampFrom = rangeTimestampFrom;
539543
} else {
544+
// if there's more range filters on timestamp, we'll take the lowest of the lower bounds
540545
this.rangeTimestampFrom = Math.min(rangeTimestampFrom, this.rangeTimestampFrom);
541546
}
542547
}

server/src/test/java/org/elasticsearch/search/TelemetryMetrics/SearchTookTimeTelemetryTests.java

Lines changed: 130 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,11 @@
5757

5858
public class SearchTookTimeTelemetryTests extends ESSingleNodeTestCase {
5959
private static final String indexName = "test_search_metrics2";
60+
private static final String indexNameNanoPrecision = "nano_search_metrics2";
6061
private static final String singleShardIndexName = "single_shard_test_search_metric";
6162
private static final LocalDateTime NOW = LocalDateTime.now(ZoneOffset.UTC);
62-
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss", Locale.ROOT);
63-
64-
@Override
65-
protected boolean resetNodeAfterTest() {
66-
return true;
67-
}
63+
private static final DateTimeFormatter FORMATTER_MILLIS = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss", Locale.ROOT);
64+
private static final DateTimeFormatter FORMATTER_NANOS = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnnnnn", Locale.ROOT);
6865

6966
@Before
7067
public void setUpIndex() {
@@ -93,11 +90,77 @@ public void setUpIndex() {
9390
);
9491
ensureGreen(singleShardIndexName);
9592
prepareIndex(singleShardIndexName).setId("1")
96-
.setSource("body", "foo", "@timestamp", NOW.minusMinutes(5).format(FORMATTER))
93+
.setSource("body", "foo", "@timestamp", NOW.minusMinutes(5).withSecond(randomIntBetween(0, 59)).format(FORMATTER_MILLIS))
9794
.setRefreshPolicy(IMMEDIATE)
9895
.get();
9996
prepareIndex(singleShardIndexName).setId("2")
100-
.setSource("body", "foo", "@timestamp", NOW.minusMinutes(30).format(FORMATTER))
97+
.setSource("body", "foo", "@timestamp", NOW.minusMinutes(30).withSecond(randomIntBetween(0, 59)).format(FORMATTER_MILLIS))
98+
.setRefreshPolicy(IMMEDIATE)
99+
.get();
100+
101+
createIndex(
102+
indexNameNanoPrecision,
103+
Settings.builder()
104+
.put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, num_primaries)
105+
.put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 0)
106+
.build(),
107+
"_doc",
108+
"@timestamp",
109+
"type=date_nanos"
110+
);
111+
ensureGreen(indexNameNanoPrecision);
112+
prepareIndex(indexNameNanoPrecision).setId("10")
113+
.setSource(
114+
"body",
115+
"foo",
116+
"@timestamp",
117+
NOW.minusMinutes(2).withNano(randomIntBetween(0, 1_000_000_000)).format(FORMATTER_NANOS)
118+
)
119+
.setRefreshPolicy(IMMEDIATE)
120+
.get();
121+
prepareIndex(indexNameNanoPrecision).setId("11")
122+
.setSource(
123+
"body",
124+
"foo",
125+
"@timestamp",
126+
NOW.minusMinutes(3).withNano(randomIntBetween(0, 1_000_000_000)).format(FORMATTER_NANOS)
127+
)
128+
.setRefreshPolicy(IMMEDIATE)
129+
.get();
130+
prepareIndex(indexNameNanoPrecision).setId("12")
131+
.setSource(
132+
"body",
133+
"foo",
134+
"@timestamp",
135+
NOW.minusMinutes(4).withNano(randomIntBetween(0, 1_000_000_000)).format(FORMATTER_NANOS)
136+
)
137+
.setRefreshPolicy(IMMEDIATE)
138+
.get();
139+
prepareIndex(indexNameNanoPrecision).setId("13")
140+
.setSource(
141+
"body",
142+
"foo",
143+
"@timestamp",
144+
NOW.minusMinutes(5).withNano(randomIntBetween(0, 1_000_000_000)).format(FORMATTER_NANOS)
145+
)
146+
.setRefreshPolicy(IMMEDIATE)
147+
.get();
148+
prepareIndex(indexNameNanoPrecision).setId("14")
149+
.setSource(
150+
"body",
151+
"foo",
152+
"@timestamp",
153+
NOW.minusMinutes(6).withNano(randomIntBetween(0, 1_000_000_000)).format(FORMATTER_NANOS)
154+
)
155+
.setRefreshPolicy(IMMEDIATE)
156+
.get();
157+
prepareIndex(indexNameNanoPrecision).setId("15")
158+
.setSource(
159+
"body",
160+
"foo",
161+
"@timestamp",
162+
NOW.minusMinutes(75).withNano(randomIntBetween(0, 1_000_000_000)).format(FORMATTER_NANOS)
163+
)
101164
.setRefreshPolicy(IMMEDIATE)
102165
.get();
103166
}
@@ -207,7 +270,7 @@ public void testOthersDottedIndexName() {
207270
SearchResponse searchResponse = client().prepareSearch("_all").setQuery(simpleQueryStringQuery("foo")).get();
208271
try {
209272
assertNoFailures(searchResponse);
210-
assertSearchHits(searchResponse, "1", "2", "1", "2");
273+
assertSearchHits(searchResponse, "1", "2", "1", "2", "10", "11", "12", "13", "14", "15");
211274
} finally {
212275
searchResponse.decRef();
213276
}
@@ -320,7 +383,7 @@ public void testCompoundRetriever() {
320383
List<Measurement> measurements = getTestTelemetryPlugin().getLongHistogramMeasurement(TOOK_DURATION_TOTAL_HISTOGRAM_NAME);
321384
// compound retriever does its own search as an async action, whose took time is recorded separately
322385
assertEquals(2, measurements.size());
323-
assertThat(measurements.getFirst().getLong(), Matchers.lessThan(searchResponse.getTook().millis()));
386+
assertThat(measurements.getFirst().getLong(), Matchers.lessThanOrEqualTo(searchResponse.getTook().millis()));
324387
assertEquals(searchResponse.getTook().millis(), measurements.getLast().getLong());
325388
for (Measurement measurement : measurements) {
326389
Map<String, Object> attributes = measurement.attributes();
@@ -533,7 +596,7 @@ public void testTimeRangeFilterAllResultsFilterOnEventIngestedAndTimestamp() {
533596

534597
public void testTimeRangeFilterOneResultQueryAndFetchRecentTimestamps() {
535598
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
536-
boolQueryBuilder.filter(new RangeQueryBuilder("@timestamp").from(FORMATTER.format(NOW.minusMinutes(10))));
599+
boolQueryBuilder.filter(new RangeQueryBuilder("@timestamp").from(FORMATTER_MILLIS.format(NOW.minusMinutes(10))));
537600
boolQueryBuilder.must(simpleQueryStringQuery("foo"));
538601
SearchResponse searchResponse = client().prepareSearch(singleShardIndexName)
539602
.setQuery(boolQueryBuilder)
@@ -562,11 +625,11 @@ public void testTimeRangeFilterOneResultQueryAndFetchRecentTimestamps() {
562625
public void testMultipleTimeRangeFiltersQueryAndFetchRecentTimestamps() {
563626
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
564627
// we take the lowest of the two bounds
565-
boolQueryBuilder.must(new RangeQueryBuilder("@timestamp").from(FORMATTER.format(NOW.minusMinutes(20))));
566-
boolQueryBuilder.filter(new RangeQueryBuilder("@timestamp").from(FORMATTER.format(NOW.minusMinutes(10))));
628+
boolQueryBuilder.must(new RangeQueryBuilder("@timestamp").from(FORMATTER_MILLIS.format(NOW.minusMinutes(20))));
629+
boolQueryBuilder.filter(new RangeQueryBuilder("@timestamp").from(FORMATTER_MILLIS.format(NOW.minusMinutes(10))));
567630
// should and must_not get ignored
568-
boolQueryBuilder.should(new RangeQueryBuilder("@timestamp").from(FORMATTER.format(NOW.minusMinutes(2))));
569-
boolQueryBuilder.mustNot(new RangeQueryBuilder("@timestamp").from(FORMATTER.format(NOW.minusMinutes(1))));
631+
boolQueryBuilder.should(new RangeQueryBuilder("@timestamp").from(FORMATTER_MILLIS.format(NOW.minusMinutes(2))));
632+
boolQueryBuilder.mustNot(new RangeQueryBuilder("@timestamp").from(FORMATTER_MILLIS.format(NOW.minusMinutes(1))));
570633
boolQueryBuilder.must(simpleQueryStringQuery("foo"));
571634
SearchResponse searchResponse = client().prepareSearch(singleShardIndexName)
572635
.setQuery(boolQueryBuilder)
@@ -630,6 +693,58 @@ public void testTimeRangeFilterOneResultMustNotClause() {
630693
assertSimpleQueryAttributes(measurement.attributes());
631694
}
632695

696+
public void testTimeRangeFilterAllResultsNanoPrecision() {
697+
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
698+
boolQueryBuilder.filter(new RangeQueryBuilder("@timestamp").from(FORMATTER_NANOS.format(NOW.minusMinutes(20))));
699+
boolQueryBuilder.must(simpleQueryStringQuery("foo"));
700+
SearchResponse searchResponse = client().prepareSearch(indexNameNanoPrecision).setQuery(boolQueryBuilder).get();
701+
try {
702+
assertNoFailures(searchResponse);
703+
assertSearchHits(searchResponse, "10", "11", "12", "13", "14");
704+
} finally {
705+
searchResponse.decRef();
706+
}
707+
708+
List<Measurement> measurements = getTestTelemetryPlugin().getLongHistogramMeasurement(TOOK_DURATION_TOTAL_HISTOGRAM_NAME);
709+
assertEquals(1, measurements.size());
710+
Measurement measurement = measurements.getFirst();
711+
assertEquals(searchResponse.getTook().millis(), measurement.getLong());
712+
Map<String, Object> attributes = measurement.attributes();
713+
assertEquals(5, attributes.size());
714+
assertEquals("user", attributes.get("target"));
715+
assertEquals("hits_only", attributes.get("query_type"));
716+
assertEquals("_score", attributes.get("sort"));
717+
assertEquals(true, attributes.get("range_timestamp"));
718+
assertEquals("1_hour", attributes.get("timestamp_range_filter"));
719+
}
720+
721+
public void testTimeRangeFilterAllResultsMixedPrecision() {
722+
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
723+
boolQueryBuilder.filter(new RangeQueryBuilder("@timestamp").from(FORMATTER_NANOS.format(NOW.minusMinutes(20))));
724+
boolQueryBuilder.must(simpleQueryStringQuery("foo"));
725+
SearchResponse searchResponse = client().prepareSearch(singleShardIndexName, indexNameNanoPrecision)
726+
.setQuery(boolQueryBuilder)
727+
.get();
728+
try {
729+
assertNoFailures(searchResponse);
730+
assertSearchHits(searchResponse, "1", "10", "11", "12", "13", "14");
731+
} finally {
732+
searchResponse.decRef();
733+
}
734+
735+
List<Measurement> measurements = getTestTelemetryPlugin().getLongHistogramMeasurement(TOOK_DURATION_TOTAL_HISTOGRAM_NAME);
736+
assertEquals(1, measurements.size());
737+
Measurement measurement = measurements.getFirst();
738+
assertEquals(searchResponse.getTook().millis(), measurement.getLong());
739+
Map<String, Object> attributes = measurement.attributes();
740+
assertEquals(5, attributes.size());
741+
assertEquals("user", attributes.get("target"));
742+
assertEquals("hits_only", attributes.get("query_type"));
743+
assertEquals("_score", attributes.get("sort"));
744+
assertEquals(true, attributes.get("range_timestamp"));
745+
assertEquals("1_hour", attributes.get("timestamp_range_filter"));
746+
}
747+
633748
private void resetMeter() {
634749
getTestTelemetryPlugin().resetMeter();
635750
}

0 commit comments

Comments
 (0)