|
57 | 57 |
|
58 | 58 | public class SearchTookTimeTelemetryTests extends ESSingleNodeTestCase {
|
59 | 59 | private static final String indexName = "test_search_metrics2";
|
| 60 | + private static final String indexNameNanoPrecision = "nano_search_metrics2"; |
60 | 61 | private static final String singleShardIndexName = "single_shard_test_search_metric";
|
61 | 62 | 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); |
68 | 65 |
|
69 | 66 | @Before
|
70 | 67 | public void setUpIndex() {
|
@@ -93,11 +90,77 @@ public void setUpIndex() {
|
93 | 90 | );
|
94 | 91 | ensureGreen(singleShardIndexName);
|
95 | 92 | 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)) |
97 | 94 | .setRefreshPolicy(IMMEDIATE)
|
98 | 95 | .get();
|
99 | 96 | 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 | + ) |
101 | 164 | .setRefreshPolicy(IMMEDIATE)
|
102 | 165 | .get();
|
103 | 166 | }
|
@@ -207,7 +270,7 @@ public void testOthersDottedIndexName() {
|
207 | 270 | SearchResponse searchResponse = client().prepareSearch("_all").setQuery(simpleQueryStringQuery("foo")).get();
|
208 | 271 | try {
|
209 | 272 | assertNoFailures(searchResponse);
|
210 |
| - assertSearchHits(searchResponse, "1", "2", "1", "2"); |
| 273 | + assertSearchHits(searchResponse, "1", "2", "1", "2", "10", "11", "12", "13", "14", "15"); |
211 | 274 | } finally {
|
212 | 275 | searchResponse.decRef();
|
213 | 276 | }
|
@@ -320,7 +383,7 @@ public void testCompoundRetriever() {
|
320 | 383 | List<Measurement> measurements = getTestTelemetryPlugin().getLongHistogramMeasurement(TOOK_DURATION_TOTAL_HISTOGRAM_NAME);
|
321 | 384 | // compound retriever does its own search as an async action, whose took time is recorded separately
|
322 | 385 | assertEquals(2, measurements.size());
|
323 |
| - assertThat(measurements.getFirst().getLong(), Matchers.lessThan(searchResponse.getTook().millis())); |
| 386 | + assertThat(measurements.getFirst().getLong(), Matchers.lessThanOrEqualTo(searchResponse.getTook().millis())); |
324 | 387 | assertEquals(searchResponse.getTook().millis(), measurements.getLast().getLong());
|
325 | 388 | for (Measurement measurement : measurements) {
|
326 | 389 | Map<String, Object> attributes = measurement.attributes();
|
@@ -533,7 +596,7 @@ public void testTimeRangeFilterAllResultsFilterOnEventIngestedAndTimestamp() {
|
533 | 596 |
|
534 | 597 | public void testTimeRangeFilterOneResultQueryAndFetchRecentTimestamps() {
|
535 | 598 | 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)))); |
537 | 600 | boolQueryBuilder.must(simpleQueryStringQuery("foo"));
|
538 | 601 | SearchResponse searchResponse = client().prepareSearch(singleShardIndexName)
|
539 | 602 | .setQuery(boolQueryBuilder)
|
@@ -562,11 +625,11 @@ public void testTimeRangeFilterOneResultQueryAndFetchRecentTimestamps() {
|
562 | 625 | public void testMultipleTimeRangeFiltersQueryAndFetchRecentTimestamps() {
|
563 | 626 | BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
|
564 | 627 | // 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)))); |
567 | 630 | // 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)))); |
570 | 633 | boolQueryBuilder.must(simpleQueryStringQuery("foo"));
|
571 | 634 | SearchResponse searchResponse = client().prepareSearch(singleShardIndexName)
|
572 | 635 | .setQuery(boolQueryBuilder)
|
@@ -630,6 +693,58 @@ public void testTimeRangeFilterOneResultMustNotClause() {
|
630 | 693 | assertSimpleQueryAttributes(measurement.attributes());
|
631 | 694 | }
|
632 | 695 |
|
| 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 | + |
633 | 748 | private void resetMeter() {
|
634 | 749 | getTestTelemetryPlugin().resetMeter();
|
635 | 750 | }
|
|
0 commit comments