diff --git a/src/main/java/io/weaviate/client6/v1/api/Config.java b/src/main/java/io/weaviate/client6/v1/api/Config.java index 5e50b610..b52b3706 100644 --- a/src/main/java/io/weaviate/client6/v1/api/Config.java +++ b/src/main/java/io/weaviate/client6/v1/api/Config.java @@ -7,6 +7,7 @@ import javax.net.ssl.TrustManagerFactory; +import io.weaviate.client6.v1.internal.BuildInfo; import io.weaviate.client6.v1.internal.ObjectBuilder; import io.weaviate.client6.v1.internal.Timeout; import io.weaviate.client6.v1.internal.TokenProvider; @@ -178,6 +179,7 @@ public SelfT timeout(int initSeconds, int querySeconds, int insertSeconds) { * Service if an appropriate vectorizer is configured for collection. */ private static final String HEADER_X_WEAVIATE_CLUSTER_URL = "X-Weaviate-Cluster-URL"; + private static final String HEADER_X_WEAVIATE_CLIENT = "X-Weaviate-Client"; /** * isWeaviateDomain returns true if the host matches weaviate.io, @@ -190,6 +192,10 @@ private static boolean isWeaviateDomain(String host) { lower.contains("weaviate.cloud"); } + private static final String VERSION = "weaviate-client-java/" + + ((!BuildInfo.TAGS.isBlank() && BuildInfo.TAGS != "unknown") ? BuildInfo.TAGS + : (BuildInfo.BRANCH + "-" + BuildInfo.COMMIT_ID_ABBREV)); + @Override public Config build() { // For clusters hosted on Weaviate Cloud, Weaviate Embedding Service @@ -197,6 +203,7 @@ public Config build() { if (isWeaviateDomain(httpHost) && authentication != null) { setHeader(HEADER_X_WEAVIATE_CLUSTER_URL, "https://" + httpHost + ":" + httpPort); } + setHeader(HEADER_X_WEAVIATE_CLIENT, VERSION); return new Config(this); } } diff --git a/src/main/java/io/weaviate/client6/v1/internal/BuildInfo.java b/src/main/java/io/weaviate/client6/v1/internal/BuildInfo.java index 29fc339c..8ff78b9f 100644 --- a/src/main/java/io/weaviate/client6/v1/internal/BuildInfo.java +++ b/src/main/java/io/weaviate/client6/v1/internal/BuildInfo.java @@ -11,18 +11,22 @@ private BuildInfo() { public static final String BRANCH; public static final String COMMIT_ID; public static final String COMMIT_ID_ABBREV; + public static final String TAGS; static { var properties = new Properties(); - try { - properties.load(BuildInfo.class.getClassLoader().getResourceAsStream("client6-git.properties")); - } catch (IOException | NullPointerException e) { + try (var is = BuildInfo.class.getClassLoader().getResourceAsStream("client6-git.properties")) { + if (is != null) { + properties.load(is); + } + } catch (IOException e) { System.out.println("failed to load client6-git.properties, no build information will be available"); } - BRANCH = String.valueOf(properties.get("git.branch")); - COMMIT_ID = String.valueOf(properties.get("git.commit.id.full")); - COMMIT_ID_ABBREV = String.valueOf(properties.get("git.commit.id.abbrev")); + BRANCH = String.valueOf(properties.getOrDefault("git.branch", "unknown")); + COMMIT_ID = String.valueOf(properties.getOrDefault("git.commit.id.full", "unknown")); + COMMIT_ID_ABBREV = String.valueOf(properties.getOrDefault("git.commit.id.abbrev", "unknown")); + TAGS = String.valueOf(properties.getOrDefault("git.tags", "unknown")); } } diff --git a/src/test/java/io/weaviate/client6/v1/api/ConfigTest.java b/src/test/java/io/weaviate/client6/v1/api/ConfigTest.java new file mode 100644 index 00000000..b38bef7a --- /dev/null +++ b/src/test/java/io/weaviate/client6/v1/api/ConfigTest.java @@ -0,0 +1,24 @@ +package io.weaviate.client6.v1.api; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +public class ConfigTest { + + private static final String HEADER_KEY = "X-Weaviate-Client"; + + @Test + public void testHeaderPresence() { + Config config = new Config.Local().build(); + Assertions.assertThat(config.headers()).containsKey(HEADER_KEY); + Assertions.assertThat(config.headers().get(HEADER_KEY)).isNotEmpty(); + + config = new Config.WeaviateCloud("http://localhost/", Authentication.apiKey("test_key")).build(); + Assertions.assertThat(config.headers()).containsKey(HEADER_KEY); + Assertions.assertThat(config.headers().get(HEADER_KEY)).isNotEmpty(); + + config = new Config.Custom().httpHost("localhost").build(); + Assertions.assertThat(config.headers()).containsKey(HEADER_KEY); + Assertions.assertThat(config.headers().get(HEADER_KEY)).isNotEmpty(); + } +} diff --git a/src/test/java/io/weaviate/client6/v1/internal/BuildInfoTest.java b/src/test/java/io/weaviate/client6/v1/internal/BuildInfoTest.java index 271b14df..dded492c 100644 --- a/src/test/java/io/weaviate/client6/v1/internal/BuildInfoTest.java +++ b/src/test/java/io/weaviate/client6/v1/internal/BuildInfoTest.java @@ -11,6 +11,7 @@ public class BuildInfoTest { private static final String BRANCH = gitBranch(); private static final String COMMIT_ID = gitCommit(); + private static final String TAGS = gitTags(); @Test public void testBuildInfo() throws IOException { @@ -21,6 +22,7 @@ public void testBuildInfo() throws IOException { Assertions.assertThat(BuildInfo.BRANCH).as("branch").isEqualTo(BRANCH); Assertions.assertThat(BuildInfo.COMMIT_ID).as("commit.full").isEqualTo(COMMIT_ID); Assertions.assertThat(COMMIT_ID).as("commit.abbrev").startsWith(BuildInfo.COMMIT_ID_ABBREV); + Assertions.assertThat(BuildInfo.TAGS).as("tags").isEqualTo(TAGS); } /** Get current non-abbreviated Git commit hash. */ @@ -33,6 +35,11 @@ private static String gitBranch() { return runCommand("/usr/bin/git", "branch", "--show-current"); } + /** Get current git tags. */ + private static String gitTags() { + return runCommand("/usr/bin/git", "tag", "--points-at", "HEAD"); + } + /** Run shell command and return the output as multi-line string. */ private static String runCommand(String... cmdarray) { try {