Skip to content

Commit 7d6830a

Browse files
authored
Pass ES version in EIS inference request header (elastic#137643) (elastic#137734)
* Pass ES version in EIS inference request header * Use convenience function
1 parent c95a6a4 commit 7d6830a

File tree

6 files changed

+35
-12
lines changed

6 files changed

+35
-12
lines changed

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ public class InferencePlugin extends Plugin
204204
);
205205

206206
public static final String X_ELASTIC_PRODUCT_USE_CASE_HTTP_HEADER = "X-elastic-product-use-case";
207+
public static final String X_ELASTIC_ES_VERSION = "X-elastic-es-version";
207208

208209
public static final String NAME = "inference";
209210
public static final String UTILITY_THREAD_POOL_NAME = "inference_utility";

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elastic/request/ElasticInferenceServiceRequest.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
package org.elasticsearch.xpack.inference.services.elastic.request;
99

1010
import org.apache.http.client.methods.HttpRequestBase;
11+
import org.elasticsearch.Version;
12+
import org.elasticsearch.common.Strings;
1113
import org.elasticsearch.common.util.concurrent.ThreadContext;
1214
import org.elasticsearch.tasks.Task;
1315
import org.elasticsearch.xpack.inference.external.request.HttpRequest;
1416
import org.elasticsearch.xpack.inference.external.request.Request;
1517

16-
import java.util.Objects;
17-
18+
import static org.elasticsearch.xpack.inference.InferencePlugin.X_ELASTIC_ES_VERSION;
1819
import static org.elasticsearch.xpack.inference.InferencePlugin.X_ELASTIC_PRODUCT_USE_CASE_HTTP_HEADER;
1920

2021
public abstract class ElasticInferenceServiceRequest implements Request {
@@ -36,13 +37,18 @@ public final HttpRequest createHttpRequest() {
3637

3738
var productOrigin = metadata.productOrigin();
3839
var productUseCase = metadata.productUseCase();
40+
var esVersion = metadata.esVersion();
41+
42+
if (Strings.isNullOrEmpty(productOrigin) == false) {
43+
request.setHeader(Task.X_ELASTIC_PRODUCT_ORIGIN_HTTP_HEADER, productOrigin);
44+
}
3945

40-
if (Objects.nonNull(productOrigin) && productOrigin.isEmpty() == false) {
41-
request.setHeader(Task.X_ELASTIC_PRODUCT_ORIGIN_HTTP_HEADER, metadata.productOrigin());
46+
if (Strings.isNullOrEmpty(productUseCase) == false) {
47+
request.addHeader(X_ELASTIC_PRODUCT_USE_CASE_HTTP_HEADER, productUseCase);
4248
}
4349

44-
if (Objects.nonNull(productUseCase) && productUseCase.isEmpty() == false) {
45-
request.addHeader(X_ELASTIC_PRODUCT_USE_CASE_HTTP_HEADER, metadata.productUseCase());
50+
if (Strings.isNullOrEmpty(esVersion) == false) {
51+
request.addHeader(X_ELASTIC_ES_VERSION, esVersion);
4652
}
4753

4854
return new HttpRequest(request, getInferenceEntityId());
@@ -55,7 +61,8 @@ public static ElasticInferenceServiceRequestMetadata extractRequestMetadataFromT
5561
// 'X-Elastic-Product-Use-Case' is Elastic Inference Service specific and is therefore not propagated through the ES-wide Task.
5662
return new ElasticInferenceServiceRequestMetadata(
5763
context.getHeader(Task.X_ELASTIC_PRODUCT_ORIGIN_HTTP_HEADER),
58-
context.getHeader(X_ELASTIC_PRODUCT_USE_CASE_HTTP_HEADER)
64+
context.getHeader(X_ELASTIC_PRODUCT_USE_CASE_HTTP_HEADER),
65+
Version.CURRENT.toString()
5966
);
6067
}
6168
}

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elastic/request/ElasticInferenceServiceRequestMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@
1212
* @param productOrigin - product origin of the inference request (usually a whole system like "kibana", "logstash" etc.)
1313
* @param productUseCase - product use case of the inference request (more granular view on a user flow like "security ai assistant" etc.)
1414
*/
15-
public record ElasticInferenceServiceRequestMetadata(String productOrigin, String productUseCase) {}
15+
public record ElasticInferenceServiceRequestMetadata(String productOrigin, String productUseCase, String esVersion) {}

x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/elastic/request/ElasticInferenceServiceDenseTextEmbeddingsRequestTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public void testDecorate_HttpRequest_WithProductUseCase() {
157157
ElasticInferenceServiceDenseTextEmbeddingsModelTests.createModel(url, modelId),
158158
List.of(input),
159159
new TraceContext(randomAlphaOfLength(10), randomAlphaOfLength(10)),
160-
new ElasticInferenceServiceRequestMetadata("my-product-origin", "my-product-use-case-from-metadata"),
160+
new ElasticInferenceServiceRequestMetadata("my-product-origin", "my-product-use-case-from-metadata", "1.2.3"),
161161
inputType
162162
);
163163

x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/elastic/request/ElasticInferenceServiceRequestTests.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import java.net.URI;
1717

18+
import static org.elasticsearch.xpack.inference.InferencePlugin.X_ELASTIC_ES_VERSION;
1819
import static org.elasticsearch.xpack.inference.InferencePlugin.X_ELASTIC_PRODUCT_USE_CASE_HTTP_HEADER;
1920
import static org.hamcrest.Matchers.equalTo;
2021

@@ -23,7 +24,7 @@ public class ElasticInferenceServiceRequestTests extends ESTestCase {
2324
public void testElasticInferenceServiceRequestSubclasses_Decorate_HttpRequest_WithProductOrigin() {
2425
var productOrigin = "elastic";
2526
var elasticInferenceServiceRequestWrapper = getDummyElasticInferenceServiceRequest(
26-
new ElasticInferenceServiceRequestMetadata(productOrigin, null)
27+
new ElasticInferenceServiceRequestMetadata(productOrigin, null, null)
2728
);
2829
var httpRequest = elasticInferenceServiceRequestWrapper.createHttpRequest();
2930
var productOriginHeader = httpRequest.httpRequestBase().getFirstHeader(Task.X_ELASTIC_PRODUCT_ORIGIN_HTTP_HEADER);
@@ -36,7 +37,7 @@ public void testElasticInferenceServiceRequestSubclasses_Decorate_HttpRequest_Wi
3637
public void testElasticInferenceServiceRequestSubclasses_Decorate_HttpRequest_WithProductUseCase() {
3738
var productUseCase = "ai assistant";
3839
var elasticInferenceServiceRequestWrapper = getDummyElasticInferenceServiceRequest(
39-
new ElasticInferenceServiceRequestMetadata(null, productUseCase)
40+
new ElasticInferenceServiceRequestMetadata(null, productUseCase, null)
4041
);
4142
var httpRequest = elasticInferenceServiceRequestWrapper.createHttpRequest();
4243
var productUseCaseHeader = httpRequest.httpRequestBase().getFirstHeader(X_ELASTIC_PRODUCT_USE_CASE_HTTP_HEADER);
@@ -46,6 +47,19 @@ public void testElasticInferenceServiceRequestSubclasses_Decorate_HttpRequest_Wi
4647
assertThat(productUseCaseHeader.getValue(), equalTo(productUseCase));
4748
}
4849

50+
public void testElasticInferenceServiceRequestSubclasses_Decorate_HttpRequest_WithEsVersion() {
51+
var esVersion = "1.2.3";
52+
var elasticInferenceServiceRequestWrapper = getDummyElasticInferenceServiceRequest(
53+
new ElasticInferenceServiceRequestMetadata(null, null, esVersion)
54+
);
55+
var httpRequest = elasticInferenceServiceRequestWrapper.createHttpRequest();
56+
var productUseCaseHeader = httpRequest.httpRequestBase().getFirstHeader(X_ELASTIC_ES_VERSION);
57+
58+
// Make sure the product use case header only exists once
59+
assertThat(httpRequest.httpRequestBase().getHeaders(X_ELASTIC_ES_VERSION).length, equalTo(1));
60+
assertThat(productUseCaseHeader.getValue(), equalTo(esVersion));
61+
}
62+
4963
private static ElasticInferenceServiceRequest getDummyElasticInferenceServiceRequest(
5064
ElasticInferenceServiceRequestMetadata requestMetadata
5165
) {
@@ -79,6 +93,7 @@ public String getInferenceEntityId() {
7993

8094
public static ElasticInferenceServiceRequestMetadata randomElasticInferenceServiceRequestMetadata() {
8195
return new ElasticInferenceServiceRequestMetadata(
96+
randomFrom(new String[] { null, randomAlphaOfLength(10) }),
8297
randomFrom(new String[] { null, randomAlphaOfLength(10) }),
8398
randomFrom(new String[] { null, randomAlphaOfLength(10) })
8499
);

x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/elastic/request/ElasticInferenceServiceSparseEmbeddingsRequestTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void testDecorate_HttpRequest_WithProductUseCase() {
109109
new Truncator.TruncationResult(List.of(input), new boolean[] { false }),
110110
ElasticInferenceServiceSparseEmbeddingsModelTests.createModel(url, modelId),
111111
new TraceContext(randomAlphaOfLength(10), randomAlphaOfLength(10)),
112-
new ElasticInferenceServiceRequestMetadata("my-product-origin", "my-product-use-case-from-metadata"),
112+
new ElasticInferenceServiceRequestMetadata("my-product-origin", "my-product-use-case-from-metadata", "1.2.3"),
113113
inputType
114114
);
115115

0 commit comments

Comments
 (0)