Skip to content

Commit fe801f3

Browse files
committed
Add index mode to get data stream API (elastic#122486)
This commit adds the `index_mode` for both the data stream and each backing index to the output of `GET /_data_stream`. An example looks like: ``` { "data_streams" : [ { "name" : "foo-things", "indices" : [ { "index_name" : ".ds-foo-things-2025.02.13-000001", ... "index_mode" : "standard" } ], ... "index_mode" : "standard" }, { "name" : "logs-foo-bar", "indices" : [ { "index_name" : ".ds-logs-foo-bar-2025.02.13-000001", ... "index_mode" : "logsdb" }, { "index_name" : ".ds-logs-foo-bar-2025.02.13-000002", ... "index_mode" : "logsdb" } ], ... "index_mode" : "logsdb", } ] } ``` (cherry picked from commit 47706b5) # Conflicts: # docs/reference/indices/get-data-stream.asciidoc # server/src/main/java/org/elasticsearch/TransportVersions.java # server/src/main/java/org/elasticsearch/action/datastreams/GetDataStreamAction.java # server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java # x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/LogsdbIndexModeSettingsProvider.java # x-pack/plugin/logsdb/src/test/java/org/elasticsearch/xpack/logsdb/LogsdbIndexModeSettingsProviderTests.java
1 parent e3c07ef commit fe801f3

File tree

11 files changed

+217
-29
lines changed

11 files changed

+217
-29
lines changed

docs/changelog/122486.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 122486
2+
summary: Add index mode to get data stream API
3+
area: Data streams
4+
type: enhancement
5+
issues: []

docs/reference/indices/get-data-stream.asciidoc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,21 +304,24 @@ The API returns the following response:
304304
"index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
305305
"prefer_ilm": true,
306306
"ilm_policy": "my-lifecycle-policy",
307-
"managed_by": "Index Lifecycle Management"
307+
"managed_by": "Index Lifecycle Management",
308+
"index_mode": "standard"
308309
},
309310
{
310311
"index_name": ".ds-my-data-stream-2099.03.08-000002",
311312
"index_uuid": "PA_JquKGSiKcAKBA8DJ5gw",
312313
"prefer_ilm": true,
313314
"ilm_policy": "my-lifecycle-policy",
314-
"managed_by": "Index Lifecycle Management"
315+
"managed_by": "Index Lifecycle Management",
316+
"index_mode": "standard"
315317
}
316318
],
317319
"generation": 2,
318320
"_meta": {
319321
"my-meta-field": "foo"
320322
},
321323
"status": "GREEN",
324+
"index_mode": "standard",
322325
"next_generation_managed_by": "Index Lifecycle Management",
323326
"prefer_ilm": true,
324327
"template": "my-index-template",
@@ -340,14 +343,16 @@ The API returns the following response:
340343
"index_uuid": "3liBu2SYS5axasRt6fUIpA",
341344
"prefer_ilm": true,
342345
"ilm_policy": "my-lifecycle-policy",
343-
"managed_by": "Index Lifecycle Management"
346+
"managed_by": "Index Lifecycle Management",
347+
"index_mode": "standard"
344348
}
345349
],
346350
"generation": 1,
347351
"_meta": {
348352
"my-meta-field": "foo"
349353
},
350354
"status": "YELLOW",
355+
"index_mode": "standard",
351356
"next_generation_managed_by": "Index Lifecycle Management",
352357
"prefer_ilm": true,
353358
"template": "my-index-template",

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

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.elasticsearch.cluster.block.ClusterBlockException;
2525
import org.elasticsearch.cluster.block.ClusterBlockLevel;
2626
import org.elasticsearch.cluster.health.ClusterStateHealth;
27+
import org.elasticsearch.cluster.metadata.ComposableIndexTemplate;
2728
import org.elasticsearch.cluster.metadata.DataStream;
2829
import org.elasticsearch.cluster.metadata.DataStreamFailureStoreSettings;
2930
import org.elasticsearch.cluster.metadata.DataStreamGlobalRetentionSettings;
@@ -39,6 +40,9 @@
3940
import org.elasticsearch.core.Tuple;
4041
import org.elasticsearch.index.Index;
4142
import org.elasticsearch.index.IndexMode;
43+
import org.elasticsearch.index.IndexSettingProvider;
44+
import org.elasticsearch.index.IndexSettingProviders;
45+
import org.elasticsearch.index.IndexSettings;
4246
import org.elasticsearch.indices.SystemDataStreamDescriptor;
4347
import org.elasticsearch.indices.SystemIndices;
4448
import org.elasticsearch.injection.guice.Inject;
@@ -52,6 +56,7 @@
5256
import java.util.Comparator;
5357
import java.util.HashMap;
5458
import java.util.List;
59+
import java.util.Locale;
5560
import java.util.Map;
5661
import java.util.stream.Collectors;
5762

@@ -67,6 +72,7 @@ public class TransportGetDataStreamsAction extends TransportMasterNodeReadAction
6772
private final ClusterSettings clusterSettings;
6873
private final DataStreamGlobalRetentionSettings globalRetentionSettings;
6974
private final DataStreamFailureStoreSettings dataStreamFailureStoreSettings;
75+
private final IndexSettingProviders indexSettingProviders;
7076
private final Client client;
7177

7278
@Inject
@@ -79,6 +85,7 @@ public TransportGetDataStreamsAction(
7985
SystemIndices systemIndices,
8086
DataStreamGlobalRetentionSettings globalRetentionSettings,
8187
DataStreamFailureStoreSettings dataStreamFailureStoreSettings,
88+
IndexSettingProviders indexSettingProviders,
8289
Client client
8390
) {
8491
super(
@@ -96,6 +103,7 @@ public TransportGetDataStreamsAction(
96103
this.globalRetentionSettings = globalRetentionSettings;
97104
clusterSettings = clusterService.getClusterSettings();
98105
this.dataStreamFailureStoreSettings = dataStreamFailureStoreSettings;
106+
this.indexSettingProviders = indexSettingProviders;
99107
this.client = new OriginSettingClient(client, "stack");
100108
}
101109

@@ -128,6 +136,7 @@ public void onResponse(DataStreamsStatsAction.Response response) {
128136
clusterSettings,
129137
globalRetentionSettings,
130138
dataStreamFailureStoreSettings,
139+
indexSettingProviders,
131140
maxTimestamps
132141
)
133142
);
@@ -148,12 +157,43 @@ public void onFailure(Exception e) {
148157
clusterSettings,
149158
globalRetentionSettings,
150159
dataStreamFailureStoreSettings,
160+
indexSettingProviders,
151161
null
152162
)
153163
);
154164
}
155165
}
156166

167+
/**
168+
* Resolves the index mode ("index.mode" setting) for the given data stream, from the template or additional setting providers
169+
*/
170+
@Nullable
171+
static IndexMode resolveMode(
172+
ClusterState state,
173+
IndexSettingProviders indexSettingProviders,
174+
DataStream dataStream,
175+
Settings settings,
176+
ComposableIndexTemplate indexTemplate
177+
) {
178+
IndexMode indexMode = state.metadata().retrieveIndexModeFromTemplate(indexTemplate);
179+
for (IndexSettingProvider provider : indexSettingProviders.getIndexSettingProviders()) {
180+
Settings addlSettinsg = provider.getAdditionalIndexSettings(
181+
MetadataIndexTemplateService.VALIDATE_INDEX_NAME,
182+
dataStream.getName(),
183+
indexMode,
184+
state.metadata(),
185+
Instant.now(),
186+
settings,
187+
List.of()
188+
);
189+
var rawMode = addlSettinsg.get(IndexSettings.MODE.getKey());
190+
if (rawMode != null) {
191+
indexMode = Enum.valueOf(IndexMode.class, rawMode.toUpperCase(Locale.ROOT));
192+
}
193+
}
194+
return indexMode;
195+
}
196+
157197
static GetDataStreamAction.Response innerOperation(
158198
ClusterState state,
159199
GetDataStreamAction.Request request,
@@ -162,6 +202,7 @@ static GetDataStreamAction.Response innerOperation(
162202
ClusterSettings clusterSettings,
163203
DataStreamGlobalRetentionSettings globalRetentionSettings,
164204
DataStreamFailureStoreSettings dataStreamFailureStoreSettings,
205+
IndexSettingProviders indexSettingProviders,
165206
@Nullable Map<String, Long> maxTimestamps
166207
) {
167208
List<DataStream> dataStreams = getDataStreams(state, indexNameExpressionResolver, request);
@@ -173,6 +214,7 @@ static GetDataStreamAction.Response innerOperation(
173214
final String indexTemplate;
174215
boolean indexTemplatePreferIlmValue = true;
175216
String ilmPolicyName = null;
217+
IndexMode indexMode = dataStream.getIndexMode();
176218
if (dataStream.isSystem()) {
177219
SystemDataStreamDescriptor dataStreamDescriptor = systemIndices.findMatchingDataStreamDescriptor(dataStream.getName());
178220
indexTemplate = dataStreamDescriptor != null ? dataStreamDescriptor.getDataStreamName() : null;
@@ -182,13 +224,31 @@ static GetDataStreamAction.Response innerOperation(
182224
dataStreamDescriptor.getComponentTemplates()
183225
);
184226
ilmPolicyName = settings.get(IndexMetadata.LIFECYCLE_NAME);
227+
if (indexMode == null) {
228+
indexMode = resolveMode(
229+
state,
230+
indexSettingProviders,
231+
dataStream,
232+
settings,
233+
dataStreamDescriptor.getComposableIndexTemplate()
234+
);
235+
}
185236
indexTemplatePreferIlmValue = PREFER_ILM_SETTING.get(settings);
186237
}
187238
} else {
188239
indexTemplate = MetadataIndexTemplateService.findV2Template(state.metadata(), dataStream.getName(), false);
189240
if (indexTemplate != null) {
190241
Settings settings = MetadataIndexTemplateService.resolveSettings(state.metadata(), indexTemplate);
191242
ilmPolicyName = settings.get(IndexMetadata.LIFECYCLE_NAME);
243+
if (indexMode == null && state.metadata().templatesV2().get(indexTemplate) != null) {
244+
indexMode = resolveMode(
245+
state,
246+
indexSettingProviders,
247+
dataStream,
248+
settings,
249+
state.metadata().templatesV2().get(indexTemplate)
250+
);
251+
}
192252
indexTemplatePreferIlmValue = PREFER_ILM_SETTING.get(settings);
193253
} else {
194254
LOGGER.warn(
@@ -280,7 +340,9 @@ public int compareTo(IndexInfo o) {
280340
timeSeries,
281341
backingIndicesSettingsValues,
282342
indexTemplatePreferIlmValue,
283-
maxTimestamps == null ? null : maxTimestamps.get(dataStream.getName())
343+
maxTimestamps == null ? null : maxTimestamps.get(dataStream.getName()),
344+
// Default to standard mode if not specified; should we set this to "unset" or "unspecified" instead?
345+
indexMode == null ? IndexMode.STANDARD.getName() : indexMode.getName()
284346
)
285347
);
286348
}
@@ -310,7 +372,11 @@ private static void collectIndexSettingsValues(
310372
} else {
311373
managedBy = ManagedBy.UNMANAGED;
312374
}
313-
backingIndicesSettingsValues.put(index, new IndexProperties(preferIlm, indexMetadata.getLifecyclePolicyName(), managedBy));
375+
String indexMode = IndexSettings.MODE.get(indexMetadata.getSettings()).getName();
376+
backingIndicesSettingsValues.put(
377+
index,
378+
new IndexProperties(preferIlm, indexMetadata.getLifecyclePolicyName(), managedBy, indexMode)
379+
);
314380
}
315381
}
316382

modules/data-streams/src/test/java/org/elasticsearch/datastreams/action/GetDataStreamsResponseTests.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,13 @@ public void testResponseIlmAndDataStreamLifecycleRepresentation() throws Excepti
9292
String ilmPolicyName = "rollover-30days";
9393
Map<Index, Response.IndexProperties> indexSettingsValues = Map.of(
9494
firstGenerationIndex,
95-
new Response.IndexProperties(true, ilmPolicyName, ManagedBy.ILM),
95+
new Response.IndexProperties(true, ilmPolicyName, ManagedBy.ILM, null),
9696
secondGenerationIndex,
97-
new Response.IndexProperties(false, ilmPolicyName, ManagedBy.LIFECYCLE),
97+
new Response.IndexProperties(false, ilmPolicyName, ManagedBy.LIFECYCLE, null),
9898
writeIndex,
99-
new Response.IndexProperties(false, null, ManagedBy.LIFECYCLE),
99+
new Response.IndexProperties(false, null, ManagedBy.LIFECYCLE, null),
100100
failureStoreIndex,
101-
new Response.IndexProperties(false, null, ManagedBy.LIFECYCLE)
101+
new Response.IndexProperties(false, null, ManagedBy.LIFECYCLE, null)
102102
);
103103

104104
Response.DataStreamInfo dataStreamInfo = new Response.DataStreamInfo(
@@ -110,6 +110,7 @@ public void testResponseIlmAndDataStreamLifecycleRepresentation() throws Excepti
110110
null,
111111
indexSettingsValues,
112112
false,
113+
null,
113114
null
114115
);
115116
Response response = new Response(List.of(dataStreamInfo));
@@ -191,13 +192,13 @@ public void testResponseIlmAndDataStreamLifecycleRepresentation() throws Excepti
191192
String ilmPolicyName = "rollover-30days";
192193
Map<Index, Response.IndexProperties> indexSettingsValues = Map.of(
193194
firstGenerationIndex,
194-
new Response.IndexProperties(true, ilmPolicyName, ManagedBy.ILM),
195+
new Response.IndexProperties(true, ilmPolicyName, ManagedBy.ILM, null),
195196
secondGenerationIndex,
196-
new Response.IndexProperties(true, ilmPolicyName, ManagedBy.ILM),
197+
new Response.IndexProperties(true, ilmPolicyName, ManagedBy.ILM, null),
197198
writeIndex,
198-
new Response.IndexProperties(false, null, ManagedBy.UNMANAGED),
199+
new Response.IndexProperties(false, null, ManagedBy.UNMANAGED, null),
199200
failureStoreIndex,
200-
new Response.IndexProperties(false, null, ManagedBy.UNMANAGED)
201+
new Response.IndexProperties(false, null, ManagedBy.UNMANAGED, null)
201202
);
202203

203204
Response.DataStreamInfo dataStreamInfo = new Response.DataStreamInfo(
@@ -209,6 +210,7 @@ public void testResponseIlmAndDataStreamLifecycleRepresentation() throws Excepti
209210
null,
210211
indexSettingsValues,
211212
false,
213+
null,
212214
null
213215
);
214216
Response response = new Response(List.of(dataStreamInfo));
@@ -359,7 +361,8 @@ private Response.DataStreamInfo mutateInstance(Response.DataStreamInfo instance)
359361
new Response.IndexProperties(
360362
randomBoolean(),
361363
randomAlphaOfLengthBetween(50, 100),
362-
randomBoolean() ? ManagedBy.ILM : ManagedBy.LIFECYCLE
364+
randomBoolean() ? ManagedBy.ILM : ManagedBy.LIFECYCLE,
365+
null
363366
)
364367
)
365368
);
@@ -378,7 +381,8 @@ private Response.DataStreamInfo mutateInstance(Response.DataStreamInfo instance)
378381
timeSeries,
379382
indexSettings,
380383
templatePreferIlm,
381-
maximumTimestamp
384+
maximumTimestamp,
385+
null
382386
);
383387
}
384388

@@ -399,7 +403,8 @@ private Map<Index, Response.IndexProperties> generateRandomIndexSettingsValues()
399403
new Response.IndexProperties(
400404
randomBoolean(),
401405
randomAlphaOfLengthBetween(50, 100),
402-
randomBoolean() ? ManagedBy.ILM : ManagedBy.LIFECYCLE
406+
randomBoolean() ? ManagedBy.ILM : ManagedBy.LIFECYCLE,
407+
randomBoolean() ? randomFrom(IndexMode.values()).getName() : null
403408
)
404409
);
405410
}
@@ -417,7 +422,8 @@ private Response.DataStreamInfo generateRandomDataStreamInfo() {
417422
timeSeries != null ? new Response.TimeSeries(timeSeries) : null,
418423
generateRandomIndexSettingsValues(),
419424
randomBoolean(),
420-
usually() ? randomNonNegativeLong() : null
425+
usually() ? randomNonNegativeLong() : null,
426+
usually() ? randomFrom(IndexMode.values()).getName() : null
421427
);
422428
}
423429
}

0 commit comments

Comments
 (0)