Skip to content

Commit 6eb6635

Browse files
authored
Merge branch 'main' into fix_136365_prune_columns_when_fork
2 parents 6e6b720 + 26a95cb commit 6eb6635

File tree

25 files changed

+627
-114
lines changed

25 files changed

+627
-114
lines changed

server/src/main/java/org/elasticsearch/action/IndicesRequest.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,27 @@ default boolean includeDataStreams() {
4343
return false;
4444
}
4545

46-
interface Replaceable extends IndicesRequest {
46+
/**
47+
* Interface for indicating potential work related to cross-project authentication and authorization.
48+
*/
49+
interface CrossProjectCandidate {
50+
51+
/**
52+
* Determines whether the request type can support cross-project processing. Cross-project processing entails
53+
* 1. UIAM authentication and authorization projects resolution.
54+
* 2. If applicable, cross-project flat-world index resolution and error handling
55+
* Note: this method only determines in the request _supports_ cross-project. Whether cross-project processing
56+
* is actually performed depends on other factors such as:
57+
* - Whether CPS is enabled which impacts both 1 and 2.
58+
* - Whether {@link IndicesOptions} supports it when the request is an {@link IndicesRequest}. This only impacts 2.
59+
* See also {@link org.elasticsearch.search.crossproject.CrossProjectModeDecider}.
60+
*/
61+
default boolean allowsCrossProject() {
62+
return false;
63+
}
64+
}
65+
66+
interface Replaceable extends IndicesRequest, CrossProjectCandidate {
4767
/**
4868
* Sets the indices that the action relates to.
4969
*/
@@ -81,15 +101,6 @@ default boolean allowsRemoteIndices() {
81101
return false;
82102
}
83103

84-
/**
85-
* Determines whether the request type allows cross-project processing. Cross-project processing entails cross-project search
86-
* index resolution and error handling. Note: this method only determines in the request _supports_ cross-project.
87-
* Whether cross-project processing is actually performed is determined by {@link IndicesOptions}.
88-
*/
89-
default boolean allowsCrossProject() {
90-
return false;
91-
}
92-
93104
@Nullable // if no routing is specified
94105
default String getProjectRouting() {
95106
return null;
@@ -103,7 +114,7 @@ default String getProjectRouting() {
103114
*
104115
* This may change with https://github.com/elastic/elasticsearch/issues/105598
105116
*/
106-
interface SingleIndexNoWildcards extends IndicesRequest {
117+
interface SingleIndexNoWildcards extends IndicesRequest, CrossProjectCandidate {
107118
default boolean allowsRemoteIndices() {
108119
return true;
109120
}

server/src/main/java/org/elasticsearch/search/crossproject/CrossProjectModeDecider.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,18 @@ public boolean crossProjectEnabled() {
4444
return crossProjectEnabled;
4545
}
4646

47-
public boolean resolvesCrossProject(IndicesRequest.Replaceable request) {
47+
public boolean resolvesCrossProject(IndicesRequest.CrossProjectCandidate request) {
4848
if (crossProjectEnabled == false) {
4949
return false;
5050
}
51+
5152
// TODO: The following check can be an method on the request itself
52-
return request.allowsCrossProject() && request.indicesOptions().resolveCrossProjectIndexExpression();
53+
if (request.allowsCrossProject() == false) {
54+
return false;
55+
}
56+
if (request instanceof IndicesRequest indicesRequest) {
57+
return indicesRequest.indicesOptions().resolveCrossProjectIndexExpression();
58+
}
59+
return true;
5360
}
5461
}

server/src/test/java/org/elasticsearch/cluster/routing/allocation/decider/IndexBalanceAllocationDeciderTests.java

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@
5252

5353
public class IndexBalanceAllocationDeciderTests extends ESAllocationTestCase {
5454

55-
public static final String INCLUDE_DISCOVERY_NODE_FILTERS = "include.discovery.node.filters";
56-
public static final String ALLOW_EXCESS_SHARDS = "allow.excess.shards";
57-
5855
private DiscoveryNode indexNodeOne;
5956
private DiscoveryNode indexNodeTwo;
6057
private DiscoveryNode searchNodeOne;
@@ -75,25 +72,19 @@ public class IndexBalanceAllocationDeciderTests extends ESAllocationTestCase {
7572
private IndexMetadata indexMetadata;
7673
private RoutingAllocation routingAllocation;
7774
private IndexBalanceAllocationDecider indexBalanceAllocationDecider;
78-
private int excessShards;
7975
private ShardRouting indexTierShardRouting;
8076
private ShardRouting searchTierShardRouting;
8177
private List<RoutingNode> indexTier;
8278
private List<RoutingNode> searchIier;
8379

8480
private void setup(Settings settings) {
85-
boolean hasDiscoveryNodeFilters = settings.getAsBoolean(INCLUDE_DISCOVERY_NODE_FILTERS, true);
86-
boolean allowExcessShards = settings.getAsBoolean(ALLOW_EXCESS_SHARDS, true);
87-
8881
final String indexName = "IndexBalanceAllocationDeciderIndex";
8982
final Map<DiscoveryNode, List<ShardRouting>> nodeToShardRoutings = new HashMap<>();
9083

91-
excessShards = allowExcessShards ? randomIntBetween(1, 5) : 0;
92-
9384
Settings.Builder builder = Settings.builder()
85+
.put(settings)
9486
.put("stateless.enabled", "true")
95-
.put(IndexBalanceConstraintSettings.INDEX_BALANCE_DECIDER_ENABLED_SETTING.getKey(), "true")
96-
.put(IndexBalanceConstraintSettings.INDEX_BALANCE_DECIDER_EXCESS_SHARDS.getKey(), excessShards);
87+
.put(IndexBalanceConstraintSettings.INDEX_BALANCE_DECIDER_ENABLED_SETTING.getKey(), "true");
9788

9889
numberOfPrimaryShards = randomIntBetween(2, 10) * 2;
9990
replicationFactor = 2;
@@ -108,18 +99,6 @@ private void setup(Settings settings) {
10899
.build();
109100
allNodes = List.of(indexNodeOne, indexNodeTwo, searchNodeOne, searchNodeTwo, masterNode, machineLearningNode);
110101

111-
if (hasDiscoveryNodeFilters) {
112-
String setting = randomFrom(
113-
CLUSTER_ROUTING_REQUIRE_GROUP_PREFIX,
114-
CLUSTER_ROUTING_INCLUDE_GROUP_PREFIX,
115-
CLUSTER_ROUTING_EXCLUDE_GROUP_PREFIX
116-
);
117-
String attribute = randomFrom("_value", "name");
118-
String name = randomFrom("indexNodeOne", "indexNodeTwo", "searchNodeOne", "searchNodeTwo");
119-
String ip = randomFrom("192.168.0.1", "192.168.0.2", "192.168.7.1", "10.17.0.1");
120-
builder.put(setting + "." + attribute, attribute.equals("name") ? name : ip);
121-
}
122-
123102
DiscoveryNodes.Builder discoveryNodeBuilder = DiscoveryNodes.builder();
124103
for (DiscoveryNode node : allNodes) {
125104
discoveryNodeBuilder.add(node);
@@ -232,8 +211,9 @@ private void setup(Settings settings) {
232211
}
233212

234213
public void testCanAllocateUnderThresholdWithExcessShards() {
235-
Settings testSettings = Settings.builder().put(INCLUDE_DISCOVERY_NODE_FILTERS, false).put(ALLOW_EXCESS_SHARDS, true).build();
236-
setup(testSettings);
214+
Settings settings = allowExcessShards(Settings.EMPTY);
215+
setup(settings);
216+
237217
ShardRouting newIndexShardRouting = TestShardRouting.newShardRouting(
238218
new ShardId("newIndex", "uuid", 1),
239219
indexNodeTwo.getId(),
@@ -299,8 +279,7 @@ private void verifyCanAllocate() {
299279
}
300280

301281
public void testCanAllocateExceedThreshold() {
302-
Settings testSettings = Settings.builder().put(INCLUDE_DISCOVERY_NODE_FILTERS, false).put(ALLOW_EXCESS_SHARDS, false).build();
303-
setup(testSettings);
282+
setup(Settings.EMPTY);
304283

305284
int ideal = numberOfPrimaryShards / 2;
306285
int current = numberOfPrimaryShards / 2;
@@ -337,11 +316,11 @@ public void testCanAllocateExceedThreshold() {
337316
}
338317

339318
public void testCanAllocateHasDiscoveryNodeFilters() {
340-
Settings testSettings = Settings.builder()
341-
.put(INCLUDE_DISCOVERY_NODE_FILTERS, true)
342-
.put(ALLOW_EXCESS_SHARDS, randomBoolean())
343-
.build();
344-
setup(testSettings);
319+
Settings settings = addRandomFilterSetting(Settings.EMPTY);
320+
if (randomBoolean()) {
321+
settings = allowExcessShards(settings);
322+
}
323+
setup(settings);
345324

346325
for (RoutingNode routingNode : indexTier) {
347326
assertDecisionMatches(
@@ -362,4 +341,25 @@ public void testCanAllocateHasDiscoveryNodeFilters() {
362341
}
363342
}
364343

344+
public Settings addRandomFilterSetting(Settings settings) {
345+
String setting = randomFrom(
346+
CLUSTER_ROUTING_REQUIRE_GROUP_PREFIX,
347+
CLUSTER_ROUTING_INCLUDE_GROUP_PREFIX,
348+
CLUSTER_ROUTING_EXCLUDE_GROUP_PREFIX
349+
);
350+
String attribute = randomFrom("_value", "name");
351+
String name = randomFrom("indexNodeOne", "indexNodeTwo", "searchNodeOne", "searchNodeTwo");
352+
String ip = randomFrom("192.168.0.1", "192.168.0.2", "192.168.7.1", "10.17.0.1");
353+
return Settings.builder().put(settings).put(setting + "." + attribute, attribute.equals("name") ? name : ip).build();
354+
}
355+
356+
public Settings allowExcessShards(Settings settings) {
357+
int excessShards = randomIntBetween(1, 5);
358+
359+
return Settings.builder()
360+
.put(settings)
361+
.put(IndexBalanceConstraintSettings.INDEX_BALANCE_DECIDER_EXCESS_SHARDS.getKey(), excessShards)
362+
.build();
363+
}
364+
365365
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.search.crossproject;
11+
12+
import org.elasticsearch.action.IndicesRequest;
13+
import org.elasticsearch.action.support.IndicesOptions;
14+
import org.elasticsearch.common.settings.Settings;
15+
import org.elasticsearch.test.ESTestCase;
16+
17+
import static org.hamcrest.Matchers.is;
18+
19+
public class CrossProjectModeDeciderTests extends ESTestCase {
20+
21+
public void testResolvesCrossProject() {
22+
doTestResolvesCrossProject(new CrossProjectModeDecider(Settings.builder().build()), false);
23+
doTestResolvesCrossProject(
24+
new CrossProjectModeDecider(Settings.builder().put("serverless.cross_project.enabled", true).build()),
25+
true
26+
);
27+
}
28+
29+
private void doTestResolvesCrossProject(CrossProjectModeDecider crossProjectModeDecider, boolean expected) {
30+
final var cpsIndicesOptions = IndicesOptions.builder(org.elasticsearch.action.support.IndicesOptions.DEFAULT)
31+
.crossProjectModeOptions(new IndicesOptions.CrossProjectModeOptions(true))
32+
.build();
33+
34+
final var candidateButNotAllowed = randomFrom(
35+
new CrossProjectCandidateImpl(false),
36+
new IndicesRequestImpl(false, randomFrom(IndicesOptions.DEFAULT, cpsIndicesOptions))
37+
);
38+
final var candidateAndAllowed = new CrossProjectCandidateImpl(true);
39+
40+
final var indicesRequestNoCpsOption = new IndicesRequestImpl(true, IndicesOptions.DEFAULT);
41+
final var indicesRequestWithCpsOption = new IndicesRequestImpl(true, cpsIndicesOptions);
42+
43+
assertFalse(crossProjectModeDecider.resolvesCrossProject(candidateButNotAllowed));
44+
assertFalse(crossProjectModeDecider.resolvesCrossProject(indicesRequestNoCpsOption));
45+
46+
assertThat(crossProjectModeDecider.resolvesCrossProject(candidateAndAllowed), is(expected));
47+
assertThat(crossProjectModeDecider.resolvesCrossProject(indicesRequestWithCpsOption), is(expected));
48+
}
49+
50+
private static class CrossProjectCandidateImpl implements IndicesRequest.CrossProjectCandidate {
51+
52+
private boolean allowsCrossProject;
53+
54+
CrossProjectCandidateImpl(boolean allowsCrossProject) {
55+
this.allowsCrossProject = allowsCrossProject;
56+
}
57+
58+
@Override
59+
public boolean allowsCrossProject() {
60+
return allowsCrossProject;
61+
}
62+
}
63+
64+
private static class IndicesRequestImpl extends CrossProjectCandidateImpl implements IndicesRequest {
65+
66+
private IndicesOptions indicesOptions;
67+
68+
IndicesRequestImpl(boolean allowsCrossProject, IndicesOptions indicesOptions) {
69+
super(allowsCrossProject);
70+
this.indicesOptions = indicesOptions;
71+
}
72+
73+
@Override
74+
public String[] indices() {
75+
return new String[0];
76+
}
77+
78+
@Override
79+
public IndicesOptions indicesOptions() {
80+
return indicesOptions;
81+
}
82+
}
83+
}

x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,11 +430,11 @@ protected boolean supportsExponentialHistograms() {
430430
try {
431431
return RestEsqlTestCase.hasCapabilities(
432432
client(),
433-
List.of(EsqlCapabilities.Cap.EXPONENTIAL_HISTOGRAM_PRE_TECH_PREVIEW_V4.capabilityName())
433+
List.of(EsqlCapabilities.Cap.EXPONENTIAL_HISTOGRAM_PRE_TECH_PREVIEW_V5.capabilityName())
434434
)
435435
&& RestEsqlTestCase.hasCapabilities(
436436
remoteClusterClient(),
437-
List.of(EsqlCapabilities.Cap.EXPONENTIAL_HISTOGRAM_PRE_TECH_PREVIEW_V4.capabilityName())
437+
List.of(EsqlCapabilities.Cap.EXPONENTIAL_HISTOGRAM_PRE_TECH_PREVIEW_V5.capabilityName())
438438
);
439439
} catch (IOException e) {
440440
throw new RuntimeException(e);

x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/EsqlSpecIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ protected boolean supportsSourceFieldMapping() {
5858
protected boolean supportsExponentialHistograms() {
5959
return RestEsqlTestCase.hasCapabilities(
6060
client(),
61-
List.of(EsqlCapabilities.Cap.EXPONENTIAL_HISTOGRAM_PRE_TECH_PREVIEW_V4.capabilityName())
61+
List.of(EsqlCapabilities.Cap.EXPONENTIAL_HISTOGRAM_PRE_TECH_PREVIEW_V5.capabilityName())
6262
);
6363
}
6464

x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/EsqlSpecTestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ protected boolean supportsSourceFieldMapping() throws IOException {
289289
protected boolean supportsExponentialHistograms() {
290290
return RestEsqlTestCase.hasCapabilities(
291291
client(),
292-
List.of(EsqlCapabilities.Cap.EXPONENTIAL_HISTOGRAM_PRE_TECH_PREVIEW_V4.capabilityName())
292+
List.of(EsqlCapabilities.Cap.EXPONENTIAL_HISTOGRAM_PRE_TECH_PREVIEW_V5.capabilityName())
293293
);
294294
}
295295

x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/CsvTestsDataLoader.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,11 @@ public class CsvTestsDataLoader {
172172
private static final TestDataset DENSE_VECTOR = new TestDataset("dense_vector");
173173
private static final TestDataset COLORS = new TestDataset("colors");
174174
private static final TestDataset COLORS_CMYK_LOOKUP = new TestDataset("colors_cmyk").withSetting("lookup-settings.json");
175-
private static final TestDataset EXP_HISTO_SAMPLE = new TestDataset("exp_histo_sample");
175+
private static final TestDataset EXP_HISTO_SAMPLE = new TestDataset(
176+
"exp_histo_sample",
177+
"exp_histo_sample-mappings.json",
178+
"exp_histo_sample.csv"
179+
).withSetting("exp_histo_sample-settings.json");
176180

177181
public static final Map<String, TestDataset> CSV_DATASET_MAP = Map.ofEntries(
178182
Map.entry(EMPLOYEES.indexName, EMPLOYEES),

x-pack/plugin/esql/qa/testFixtures/src/main/resources/data/exp_histo_sample.csv

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
@timestamp:date,instance:keyword,responseTime:exponential_histogram
2-
2025-01-01T00:00:00Z,dummy-empty,{"scale":-7}
3-
2025-01-01T00:00:00Z,dummy-full,{"scale":0\,"sum":-3775.0\,"min":-100.0\,"max":50.0\,"zero":{"count":1\,"threshold":1.0E-4}\,"positive":{"indices":[-1\,0\,1\,2\,3\,4\,5]\,"counts":[1\,1\,2\,4\,8\,16\,18]}\,"negative":{"indices":[-1\,0\,1\,2\,3\,4\,5\,6]\,"counts":[1\,1\,2\,4\,8\,16\,32\,36]}}
4-
2025-01-01T00:00:00Z,dummy-no_zero_bucket,{"scale":0\,"sum":-3775.0\,"min":-100.0\,"max":50.0\,"positive":{"indices":[-1\,0\,1\,2\,3\,4\,5]\,"counts":[1\,1\,2\,4\,8\,16\,18]}\,"negative":{"indices":[-1\,0\,1\,2\,3\,4\,5\,6]\,"counts":[1\,1\,2\,4\,8\,16\,32\,36]}}
5-
2025-01-01T00:00:00Z,dummy-positive_only,{"scale":2\,"sum":1275.0\,"min":1.0\,"max":50.0\,"positive":{"indices":[-1\,3\,6\,7\,9\,10\,11\,12\,13\,14\,15\,16\,17\,18\,19\,20\,21\,22]\,"counts":[1\,1\,1\,1\,1\,1\,2\,1\,2\,2\,3\,3\,3\,4\,6\,6\,7\,5]}}
6-
2025-01-01T00:00:00Z,dummy-negative_only,{"scale":2\,"sum":-1275.0\,"min":-50.0\,"max":-1.0\,"negative":{"indices":[-1\,3\,6\,7\,9\,10\,11\,12\,13\,14\,15\,16\,17\,18\,19\,20\,21\,22]\,"counts":[1\,1\,1\,1\,1\,1\,2\,1\,2\,2\,3\,3\,3\,4\,6\,6\,7\,5]}}
7-
2025-01-01T00:00:00Z,dummy-zero_threshold_only,{"scale":0\,"zero":{"threshold":2.0E-5}}
8-
2025-01-01T00:00:00Z,dummy-zero_count_only,{"scale":2\,"min":0\,"max":0\,"zero":{"count":101}}
2+
2025-09-24T00:00:00Z,dummy-empty,{"scale":-7}
3+
2025-09-24T00:00:00Z,dummy-full,{"scale":0\,"sum":-3775.0\,"min":-100.0\,"max":50.0\,"zero":{"count":1\,"threshold":1.0E-4}\,"positive":{"indices":[-1\,0\,1\,2\,3\,4\,5]\,"counts":[1\,1\,2\,4\,8\,16\,18]}\,"negative":{"indices":[-1\,0\,1\,2\,3\,4\,5\,6]\,"counts":[1\,1\,2\,4\,8\,16\,32\,36]}}
4+
2025-09-24T00:00:00Z,dummy-no_zero_bucket,{"scale":0\,"sum":-3775.0\,"min":-100.0\,"max":50.0\,"positive":{"indices":[-1\,0\,1\,2\,3\,4\,5]\,"counts":[1\,1\,2\,4\,8\,16\,18]}\,"negative":{"indices":[-1\,0\,1\,2\,3\,4\,5\,6]\,"counts":[1\,1\,2\,4\,8\,16\,32\,36]}}
5+
2025-09-24T00:00:00Z,dummy-positive_only,{"scale":2\,"sum":1275.0\,"min":1.0\,"max":50.0\,"positive":{"indices":[-1\,3\,6\,7\,9\,10\,11\,12\,13\,14\,15\,16\,17\,18\,19\,20\,21\,22]\,"counts":[1\,1\,1\,1\,1\,1\,2\,1\,2\,2\,3\,3\,3\,4\,6\,6\,7\,5]}}
6+
2025-09-24T00:00:00Z,dummy-negative_only,{"scale":2\,"sum":-1275.0\,"min":-50.0\,"max":-1.0\,"negative":{"indices":[-1\,3\,6\,7\,9\,10\,11\,12\,13\,14\,15\,16\,17\,18\,19\,20\,21\,22]\,"counts":[1\,1\,1\,1\,1\,1\,2\,1\,2\,2\,3\,3\,3\,4\,6\,6\,7\,5]}}
7+
2025-09-24T00:00:00Z,dummy-zero_threshold_only,{"scale":0\,"zero":{"threshold":2.0E-5}}
8+
2025-09-24T00:00:00Z,dummy-zero_count_only,{"scale":2\,"min":0\,"max":0\,"zero":{"count":101}}
99
2025-09-25T00:01:00Z,instance-2,{"scale":4\,"sum":0.10814399999999999\,"min":2.65E-4\,"max":0.067933\,"positive":{"indices":[-191\,-188\,-184\,-182\,-181\,-180\,-179\,-178\,-176\,-175\,-172\,-171\,-170\,-169\,-168\,-167\,-152\,-150\,-149\,-137\,-131\,-112\,-110\,-63]\,"counts":[1\,1\,1\,2\,2\,5\,2\,1\,1\,1\,1\,1\,1\,2\,3\,1\,1\,1\,1\,1\,1\,1\,1\,1]}}
1010
2025-09-25T00:01:00Z,instance-0,{"scale":3\,"sum":9.269670999999999\,"min":3.79E-4\,"max":0.873616\,"positive":{"indices":[-91\,-90\,-88\,-87\,-86\,-85\,-84\,-83\,-82\,-77\,-76\,-75\,-73\,-72\,-66\,-65\,-63\,-61\,-58\,-55\,-54\,-53\,-51\,-49\,-46\,-44\,-43\,-38\,-35\,-31\,-30\,-24\,-23\,-22\,-21\,-19\,-17\,-16\,-15\,-14\,-13\,-10\,-9\,-8\,-5\,-4\,-2]\,"counts":[2\,2\,1\,6\,2\,1\,1\,1\,1\,2\,1\,3\,1\,1\,1\,1\,1\,1\,2\,1\,1\,1\,1\,2\,1\,2\,1\,2\,1\,1\,1\,1\,1\,1\,1\,1\,1\,2\,1\,3\,2\,2\,2\,1\,1\,2\,1]}}
1111
2025-09-25T00:01:00Z,instance-1,{"scale":4\,"sum":0.149232\,"min":2.58E-4\,"max":0.061096\,"positive":{"indices":[-191\,-183\,-182\,-181\,-180\,-179\,-177\,-175\,-174\,-172\,-171\,-168\,-167\,-166\,-155\,-153\,-151\,-150\,-148\,-113\,-66\,-65]\,"counts":[1\,1\,3\,2\,2\,1\,1\,4\,1\,1\,1\,1\,2\,1\,1\,1\,3\,1\,1\,1\,1\,1]}}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"properties": {
3+
"@timestamp": {
4+
"type": "date"
5+
},
6+
"instance": {
7+
"type": "keyword",
8+
"time_series_dimension": true
9+
},
10+
"responseTime": {
11+
"type": "exponential_histogram",
12+
"time_series_metric": "histogram"
13+
}
14+
}
15+
}

0 commit comments

Comments
 (0)