Skip to content

Commit e0be278

Browse files
committed
Store dimensions in custom metadata rather than an index setting
1 parent 96e751d commit e0be278

File tree

27 files changed

+558
-232
lines changed

27 files changed

+558
-232
lines changed

modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/TSDBIndexingIT.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import org.elasticsearch.index.reindex.BulkByScrollResponse;
4949
import org.elasticsearch.index.reindex.ReindexAction;
5050
import org.elasticsearch.index.reindex.ReindexRequest;
51-
import org.elasticsearch.indices.InvalidIndexTemplateException;
5251
import org.elasticsearch.plugins.Plugin;
5352
import org.elasticsearch.reindex.ReindexPlugin;
5453
import org.elasticsearch.rest.RestStatus;
@@ -69,7 +68,6 @@
6968
import static org.elasticsearch.test.MapMatcher.matchesMap;
7069
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
7170
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertResponse;
72-
import static org.hamcrest.Matchers.containsInAnyOrder;
7371
import static org.hamcrest.Matchers.containsString;
7472
import static org.hamcrest.Matchers.equalTo;
7573
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
@@ -302,10 +300,10 @@ public void testInvalidTsdbTemplatesNoTimeSeriesDimensionAttribute() throws Exce
302300
.build()
303301
);
304302
var e = expectThrows(
305-
InvalidIndexTemplateException.class,
303+
IllegalArgumentException.class,
306304
() -> client().execute(TransportPutComposableIndexTemplateAction.TYPE, request).actionGet()
307305
);
308-
assertThat(e.getMessage(), containsString("[index.mode=time_series] requires a non-empty [index.routing_path]"));
306+
assertThat(e.getCause().getMessage(), containsString("[index.mode=time_series] requires a non-empty [index.routing_path]"));
309307
}
310308
}
311309

@@ -649,7 +647,7 @@ public void testAddDimensionToMapping() throws Exception {
649647
);
650648
assertAcked(client().execute(CreateDataStreamAction.INSTANCE, createDsRequest));
651649

652-
assertThat(getSetting(dataStreamName, IndexMetadata.INDEX_DIMENSIONS), equalTo(List.of("metricset")));
650+
assertThat(getSetting(dataStreamName, IndexMetadata.INDEX_ROUTING_PATH), equalTo(List.of()));
653651

654652
// put mapping with k8s.pod.uid as another time series dimension
655653
var putMappingRequest = new PutMappingRequest(dataStreamName).source("""
@@ -664,7 +662,7 @@ public void testAddDimensionToMapping() throws Exception {
664662
""", XContentType.JSON);
665663
assertAcked(client().execute(TransportPutMappingAction.TYPE, putMappingRequest).actionGet());
666664

667-
assertThat(getSetting(dataStreamName, IndexMetadata.INDEX_DIMENSIONS), containsInAnyOrder("metricset", "k8s.pod.name"));
665+
assertThat(getSetting(dataStreamName, IndexMetadata.INDEX_ROUTING_PATH), equalTo(List.of()));
668666

669667
indexWithPodNames(dataStreamName, Instant.now(), Map.of(), "dog", "cat");
670668
}

modules/data-streams/src/main/java/org/elasticsearch/datastreams/DataStreamIndexSettingsProvider.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import org.elasticsearch.cluster.metadata.DataStream;
1212
import org.elasticsearch.cluster.metadata.IndexMetadata;
1313
import org.elasticsearch.cluster.metadata.ProjectMetadata;
14+
import org.elasticsearch.cluster.routing.TimeSeriesDimensionsMetadataAccess;
1415
import org.elasticsearch.common.UUIDs;
16+
import org.elasticsearch.common.collect.ImmutableOpenMap;
1517
import org.elasticsearch.common.compress.CompressedXContent;
1618
import org.elasticsearch.common.regex.Regex;
1719
import org.elasticsearch.common.settings.Settings;
@@ -36,8 +38,8 @@
3638
import java.util.ArrayList;
3739
import java.util.List;
3840
import java.util.Locale;
41+
import java.util.Map;
3942

40-
import static org.elasticsearch.cluster.metadata.IndexMetadata.INDEX_DIMENSIONS;
4143
import static org.elasticsearch.cluster.metadata.IndexMetadata.INDEX_ROUTING_PATH;
4244

4345
/**
@@ -63,7 +65,8 @@ public Settings getAdditionalIndexSettings(
6365
ProjectMetadata projectMetadata,
6466
Instant resolvedAt,
6567
Settings indexTemplateAndCreateRequestSettings,
66-
List<CompressedXContent> combinedTemplateMappings
68+
List<CompressedXContent> combinedTemplateMappings,
69+
ImmutableOpenMap.Builder<String, Map<String, String>> extraCustomMetadata
6770
) {
6871
if (dataStreamName != null) {
6972
DataStream dataStream = projectMetadata.dataStreams().get(dataStreamName);
@@ -127,7 +130,11 @@ public Settings getAdditionalIndexSettings(
127130
dimensions
128131
);
129132
if (dimensions.isEmpty() == false) {
130-
builder.putList(matchesAllDimensions ? INDEX_DIMENSIONS.getKey() : INDEX_ROUTING_PATH.getKey(), dimensions);
133+
if (matchesAllDimensions) {
134+
TimeSeriesDimensionsMetadataAccess.addToCustomMetadata(extraCustomMetadata, dimensions);
135+
} else {
136+
builder.putList(INDEX_ROUTING_PATH.getKey(), dimensions);
137+
}
131138
}
132139
}
133140
return builder.build();
@@ -139,15 +146,19 @@ public Settings getAdditionalIndexSettings(
139146
}
140147

141148
/**
142-
* This is called when mappings are updated, so that the {@link IndexMetadata#INDEX_DIMENSIONS}
149+
* This is called when mappings are updated, so that the {@link IndexMetadata#getTimeSeriesDimensions()}
143150
* and {@link IndexMetadata#INDEX_ROUTING_PATH} settings are updated to match the new mappings.
144-
* Updates {@link IndexMetadata#INDEX_DIMENSIONS} if a new dimension field is added to the mappings,
151+
* Updates {@link IndexMetadata#getTimeSeriesDimensions} if a new dimension field is added to the mappings,
145152
* or sets {@link IndexMetadata#INDEX_ROUTING_PATH} if a new dimension field is added that doesn't allow for matching all
146153
* dimension fields via a wildcard pattern.
147154
*/
148155
@Override
149-
public Settings onUpdateMappings(IndexMetadata indexMetadata, DocumentMapper documentMapper) {
150-
List<String> indexDimensions = INDEX_DIMENSIONS.get(indexMetadata.getSettings());
156+
public Settings onUpdateMappings(
157+
IndexMetadata indexMetadata,
158+
ImmutableOpenMap.Builder<String, Map<String, String>> extraCustomMetadata,
159+
DocumentMapper documentMapper
160+
) {
161+
List<String> indexDimensions = indexMetadata.getTimeSeriesDimensions();
151162
if (indexDimensions.isEmpty()) {
152163
return Settings.EMPTY;
153164
}
@@ -158,8 +169,10 @@ public Settings onUpdateMappings(IndexMetadata indexMetadata, DocumentMapper doc
158169
return Settings.EMPTY;
159170
}
160171
if (matchesAllDimensions) {
161-
return Settings.builder().putList(INDEX_DIMENSIONS.getKey(), newIndexDimensions).build();
172+
TimeSeriesDimensionsMetadataAccess.addToCustomMetadata(extraCustomMetadata, newIndexDimensions);
173+
return Settings.EMPTY;
162174
} else {
175+
// If the new dimensions don't match all potential dimension fields, we need to set index.routing_path
163176
return Settings.builder().putList(INDEX_ROUTING_PATH.getKey(), newIndexDimensions).build();
164177
}
165178
}

modules/data-streams/src/main/java/org/elasticsearch/datastreams/action/TransportGetDataStreamsAction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.elasticsearch.cluster.metadata.ProjectMetadata;
3737
import org.elasticsearch.cluster.project.ProjectResolver;
3838
import org.elasticsearch.cluster.service.ClusterService;
39+
import org.elasticsearch.common.collect.ImmutableOpenMap;
3940
import org.elasticsearch.common.settings.ClusterSettings;
4041
import org.elasticsearch.common.settings.Settings;
4142
import org.elasticsearch.core.Nullable;
@@ -205,8 +206,8 @@ static IndexMode resolveMode(
205206
state.metadata(),
206207
Instant.now(),
207208
settings,
208-
List.of()
209-
);
209+
List.of(),
210+
ImmutableOpenMap.builder());
210211
var rawMode = addlSettinsg.get(IndexSettings.MODE.getKey());
211212
if (rawMode != null) {
212213
indexMode = Enum.valueOf(IndexMode.class, rawMode.toUpperCase(Locale.ROOT));

0 commit comments

Comments
 (0)