Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
6999ec7
feature: enable a sparse doc values index for @timestamp in LogsDB
salvatore-campagna Feb 10, 2025
ffec507
fix: constructor with hasDocValuesSkipper set to false
salvatore-campagna Feb 10, 2025
035961b
fix: adapt test results to build type
salvatore-campagna Feb 10, 2025
31aa6bb
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 10, 2025
bbc84ab
fix: typo in method name
salvatore-campagna Feb 10, 2025
d93d7ce
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 10, 2025
a13c553
fix: rename variable to useDocValuesSkipper
salvatore-campagna Feb 10, 2025
d99614c
fix: gate timestamp doc values sparse idnex behind index version
salvatore-campagna Feb 10, 2025
146d40d
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 10, 2025
4ab00c7
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 11, 2025
dda2afb
fix: gate pointsMetadataAvailable
salvatore-campagna Feb 10, 2025
0c9e1a8
fix: improve readability
salvatore-campagna Feb 11, 2025
003f1bb
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 11, 2025
9a80a93
test: logsdb test without doc values skipper
salvatore-campagna Feb 11, 2025
53fdd68
test: add two more tests
salvatore-campagna Feb 11, 2025
27a2bcd
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 11, 2025
e62614f
fix: add missing feature flag
salvatore-campagna Feb 11, 2025
454f64f
fix: gate test execution
salvatore-campagna Feb 12, 2025
07b4c35
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 12, 2025
20a4f5b
not:rename method for consistency with host.name
salvatore-campagna Feb 12, 2025
0393874
fix: version 8.18.1
salvatore-campagna Feb 12, 2025
8027bdb
nit: improve shouldUseDocValuesSkipper method and add javadoc
salvatore-campagna Feb 12, 2025
cc24182
nit: just another improvement
salvatore-campagna Feb 12, 2025
1e08b57
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 12, 2025
ff02d40
fix: checkstyle line longer thatn 140
salvatore-campagna Feb 12, 2025
66a116e
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 12, 2025
c162427
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 12, 2025
077d48d
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 12, 2025
a976d54
fix: assume on feature flag and todo
salvatore-campagna Feb 13, 2025
833a8db
fix: additional yaml test and range query
salvatore-campagna Feb 13, 2025
0f4aa54
test: check disk usage for points and doc values
salvatore-campagna Feb 13, 2025
d1578c1
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 13, 2025
bc66ebd
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 13, 2025
ec662e0
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 13, 2025
db86770
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 14, 2025
c18febe
test: move yaml tests to logsdb xpack plugin
salvatore-campagna Feb 14, 2025
58222a0
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 14, 2025
99dba18
fix: missing doc values feature flag
salvatore-campagna Feb 14, 2025
1447c81
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 14, 2025
ce3b3f8
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 14, 2025
0d7c8ff
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 15, 2025
a346eaa
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 17, 2025
6e14fa1
Merge branch 'main' into feature/timestamp-doc-values-spars-index-set…
salvatore-campagna Feb 17, 2025
6634a98
fix: rename hasInvertedIndex to hasPoints
salvatore-campagna Feb 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.core.CheckedConsumer;
import org.elasticsearch.datastreams.DataStreamsPlugin;
import org.elasticsearch.index.IndexMode;
import org.elasticsearch.index.IndexSettings;
import org.elasticsearch.index.IndexSortConfig;
import org.elasticsearch.index.IndexVersion;
import org.elasticsearch.index.mapper.DataStreamTimestampFieldMapper;
import org.elasticsearch.index.mapper.DateFieldMapper;
Expand Down Expand Up @@ -231,4 +234,212 @@ public void testValidateDefaultIgnoreMalformed() throws Exception {
assertThat(summaryTimestamp.ignoreMalformed(), is(false));
}
}

public void testFieldTypeWithDocValuesSkipper_LogsDBModeDisabledDocValuesSkipper() throws IOException {
final Settings settings = Settings.builder()
.put(IndexSettings.MODE.getKey(), IndexMode.LOGSDB.name())
.put(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH)
.put(IndexSettings.USE_DOC_VALUES_SKIPPER.getKey(), false)
.build();
final MapperService mapperService = createMapperService(settings, timestampMapping(true, b -> {
b.startObject(DataStreamTimestampFieldMapper.DEFAULT_PATH);
b.field("type", "date");
b.endObject();
}));

final DateFieldMapper timestampMapper = (DateFieldMapper) mapperService.documentMapper()
.mappers()
.getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH);
assertTrue(timestampMapper.fieldType().hasDocValues());
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
assertTrue(timestampMapper.fieldType().isIndexed());
}

public void testFieldTypeWithDocValuesSkipper_LogsDBMode() throws IOException {
final Settings settings = Settings.builder()
.put(IndexSettings.MODE.getKey(), IndexMode.LOGSDB.name())
.put(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH)
.build();
final MapperService mapperService = createMapperService(settings, timestampMapping(true, b -> {
b.startObject(DataStreamTimestampFieldMapper.DEFAULT_PATH);
b.field("type", "date");
b.endObject();
}));

final DateFieldMapper timestampMapper = (DateFieldMapper) mapperService.documentMapper()
.mappers()
.getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH);
assertTrue(timestampMapper.fieldType().hasDocValues());
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
assertFalse(timestampMapper.fieldType().isIndexed());
}

public void testFieldTypeWithDocValuesSkipper_LogsDBModeExplicitTimestampIndexEnabledDocValuesSkipper() throws IOException {
final Settings settings = Settings.builder()
.put(IndexSettings.MODE.getKey(), IndexMode.LOGSDB.name())
.put(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH)
.build();
final MapperService mapperService = createMapperService(settings, timestampMapping(true, b -> {
b.startObject(DataStreamTimestampFieldMapper.DEFAULT_PATH);
b.field("type", "date");
b.field("index", true);
b.endObject();
}));

final DateFieldMapper timestampMapper = (DateFieldMapper) mapperService.documentMapper()
.mappers()
.getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH);
assertTrue(timestampMapper.fieldType().hasDocValues());
// NOTE: setting `index.mapping.use_doc_values_skipper` true overrides `index` for @timestamp in LogsDB
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
assertFalse(timestampMapper.fieldType().isIndexed());
}

public void testFieldTypeWithDocValuesSkipper_LogsDBModeExplicitTimestampIndexDisabledDocValuesSkipper() throws IOException {
final Settings settings = Settings.builder()
.put(IndexSettings.MODE.getKey(), IndexMode.LOGSDB.name())
.put(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH)
.put(IndexSettings.USE_DOC_VALUES_SKIPPER.getKey(), false)
.build();
final MapperService mapperService = createMapperService(settings, timestampMapping(true, b -> {
b.startObject(DataStreamTimestampFieldMapper.DEFAULT_PATH);
b.field("type", "date");
b.field("index", true); // NOTE: setting `index.mapping.use_doc_values_skipper` false does not override `index`
b.endObject();
}));

final DateFieldMapper timestampMapper = (DateFieldMapper) mapperService.documentMapper()
.mappers()
.getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH);
assertTrue(timestampMapper.fieldType().hasDocValues());
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
assertTrue(timestampMapper.fieldType().isIndexed());
}

public void testFieldTypeWithDocValuesSkipper_LogsDBModeWithoutDefaultMapping() throws IOException {
final Settings settings = Settings.builder()
.put(IndexSettings.MODE.getKey(), IndexMode.LOGSDB.name())
.put(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH)
.build();
final MapperService mapperService = withMapping(
new TestMapperServiceBuilder().settings(settings).applyDefaultMapping(false).build(),
timestampMapping(true, b -> {
b.startObject(DataStreamTimestampFieldMapper.DEFAULT_PATH);
b.field("type", "date");
b.endObject();
})
);

final DateFieldMapper timestampMapper = (DateFieldMapper) mapperService.documentMapper()
.mappers()
.getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH);
assertTrue(timestampMapper.fieldType().hasDocValues());
assertFalse(timestampMapper.fieldType().isIndexed());
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
}

public void testFieldTypeWithDocValuesSkipper_DocValuesFalseEnabledDocValuesSkipper() {
final Settings settings = Settings.builder()
.put(IndexSettings.MODE.getKey(), IndexMode.LOGSDB.name())
.put(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH)
.build();
final IllegalArgumentException ex = expectThrows(
IllegalArgumentException.class,
() -> withMapping(
new TestMapperServiceBuilder().settings(settings).applyDefaultMapping(false).build(),
timestampMapping(true, b -> {
b.startObject(DataStreamTimestampFieldMapper.DEFAULT_PATH);
b.field("type", "date");
b.field("doc_values", false);
b.endObject();
})
)
);
assertEquals(
ex.getMessage(),
"data stream timestamp field [" + DataStreamTimestampFieldMapper.DEFAULT_PATH + "] doesn't have doc values"
);
}

public void testFieldTypeWithDocValuesSkipper_DocValuesFalseDisabledDocValuesSkipper() {
final Settings settings = Settings.builder()
.put(IndexSettings.MODE.getKey(), IndexMode.LOGSDB.name())
.put(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH)
.put(IndexSettings.USE_DOC_VALUES_SKIPPER.getKey(), false)
.build();
final IllegalArgumentException ex = expectThrows(
IllegalArgumentException.class,
() -> withMapping(
new TestMapperServiceBuilder().settings(settings).applyDefaultMapping(false).build(),
timestampMapping(true, b -> {
b.startObject(DataStreamTimestampFieldMapper.DEFAULT_PATH);
b.field("type", "date");
b.field("doc_values", false);
b.endObject();
})
)
);
assertEquals(
ex.getMessage(),
"data stream timestamp field [" + DataStreamTimestampFieldMapper.DEFAULT_PATH + "] doesn't have doc values"
);
}

public void testFieldTypeWithDocValuesSkipper_WithoutTimestampSorting() throws IOException {
final Settings settings = Settings.builder().put(IndexSettings.MODE.getKey(), IndexMode.LOGSDB.name()).build();
final MapperService mapperService = createMapperService(settings, timestampMapping(true, b -> {
b.startObject(DataStreamTimestampFieldMapper.DEFAULT_PATH);
b.field("type", "date");
b.endObject();
}));

final DateFieldMapper timestampMapper = (DateFieldMapper) mapperService.documentMapper()
.mappers()
.getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH);
assertTrue(timestampMapper.fieldType().hasDocValues());
// NOTE: in LogsDB we always sort on @timestamp (and maybe also on host.name) by default
assertFalse(timestampMapper.fieldType().isIndexed());
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
}

public void testFieldTypeWithDocValuesSkipper_StandardMode() throws IOException {
final Settings settings = Settings.builder()
.put(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH)
.build();
final MapperService mapperService = createMapperService(settings, timestampMapping(true, b -> {
b.startObject(DataStreamTimestampFieldMapper.DEFAULT_PATH);
b.field("type", "date");
b.endObject();
}));

final DateFieldMapper timestampMapper = (DateFieldMapper) mapperService.documentMapper()
.mappers()
.getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH);
assertTrue(timestampMapper.fieldType().hasDocValues());
assertTrue(timestampMapper.fieldType().isIndexed());
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
}

public void testFieldTypeWithDocValuesSkipper_CustomTimestampField() throws IOException {
final Settings settings = Settings.builder()
.put(IndexSettings.MODE.getKey(), IndexMode.LOGSDB.name())
.put(IndexSortConfig.INDEX_SORT_FIELD_SETTING.getKey(), DataStreamTimestampFieldMapper.DEFAULT_PATH)
.build();
final MapperService mapperService = createMapperService(settings, timestampMapping(true, b -> {
b.startObject("timestamp");
b.field("type", "date");
b.endObject();
}));

final DateFieldMapper customTimestamp = (DateFieldMapper) mapperService.documentMapper().mappers().getMapper("timestamp");
assertTrue(customTimestamp.fieldType().hasDocValues());
assertTrue(customTimestamp.fieldType().isIndexed());
assertFalse(customTimestamp.fieldType().hasDocValuesSkipper());

// Default LogsDB mapping including @timestamp field is used
final DateFieldMapper defaultTimestamp = (DateFieldMapper) mapperService.documentMapper().mappers().getMapper("@timestamp");
assertTrue(defaultTimestamp.fieldType().hasDocValues());
assertFalse(defaultTimestamp.fieldType().isIndexed());
assertTrue(defaultTimestamp.fieldType().hasDocValuesSkipper());
}
}
Loading