diff --git a/changelog/unreleased/pr-24626.toml b/changelog/unreleased/pr-24626.toml
new file mode 100644
index 000000000000..665fe75c17be
--- /dev/null
+++ b/changelog/unreleased/pr-24626.toml
@@ -0,0 +1,5 @@
+type = "a"
+message = "Enable opensearch 3 client by default, via feature flag opensearch3_client"
+
+issues = []
+pulls = ["24626"]
diff --git a/distribution/pom.xml b/distribution/pom.xml
index 60977b1b6e8e..11eb73c7d909 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -82,5 +82,10 @@
graylog-storage-opensearch2
${project.version}
+
+ org.graylog
+ graylog-storage-opensearch3
+ ${project.version}
+
diff --git a/distribution/src/main/assembly/graylog.xml b/distribution/src/main/assembly/graylog.xml
index 3a6e57ff5f24..0ae8fddadc8d 100644
--- a/distribution/src/main/assembly/graylog.xml
+++ b/distribution/src/main/assembly/graylog.xml
@@ -66,5 +66,9 @@
${project.basedir}/../graylog-storage-opensearch2/target/graylog-storage-opensearch2-${project.version}.jar
plugin/
+
+ ${project.basedir}/../graylog-storage-opensearch3/target/graylog-storage-opensearch3-${project.version}.jar
+ plugin/
+
diff --git a/full-backend-tests/pom.xml b/full-backend-tests/pom.xml
index aec67e4bcf2e..7e0c771796e2 100644
--- a/full-backend-tests/pom.xml
+++ b/full-backend-tests/pom.xml
@@ -82,6 +82,19 @@
test
+
+ org.graylog
+ graylog-storage-opensearch3
+ ${project.version}
+
+
+ org.graylog
+ graylog-storage-opensearch3
+ ${project.version}
+ test-jar
+ test
+
+
org.apache.logging.log4j
diff --git a/graylog-storage-opensearch3/assembly.xml b/graylog-storage-opensearch3/assembly.xml
index 60de944a4f75..6b32750a6d37 100644
--- a/graylog-storage-opensearch3/assembly.xml
+++ b/graylog-storage-opensearch3/assembly.xml
@@ -16,6 +16,11 @@
true
org.graylog:graylog-storage-opensearch3
+ org.opensearch.client:opensearch-java
+ org.apache.httpcomponents.client5:httpclient5
+ org.apache.httpcomponents.core5:httpcore5
+ org.apache.httpcomponents.core5:httpcore5-h2
+ jakarta.json:jakarta.json-api
diff --git a/graylog-storage-opensearch3/pom.xml b/graylog-storage-opensearch3/pom.xml
index 79e3a53cfb41..14bd176fdb2c 100644
--- a/graylog-storage-opensearch3/pom.xml
+++ b/graylog-storage-opensearch3/pom.xml
@@ -43,6 +43,7 @@
org.graylog2
graylog2-server
${project.parent.version}
+ provided
com.google.guava
@@ -91,6 +92,15 @@
io.jsonwebtoken
jjwt-api
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ jakarta.annotation
+ jakarta.annotation-api
+ ${jakarta.annotation-api.version}
+
io.jsonwebtoken
jjwt-impl
@@ -180,21 +190,35 @@
org.apache.maven.plugins
- maven-assembly-plugin
+ maven-shade-plugin
- assembly.xml
-
-
- ${project.groupId}.${project.artifactId}
-
-
+ false
+ false
+
+
+
+ org.eclipse.osgi:*
+
+ META-INF/*.SF
+ META-INF/*.DSA
+ META-INF/*.RSA
+
+
+
package
- single
+ shade
+
+
+
+
+
diff --git a/graylog2-server/src/main/java/org/graylog2/bootstrap/CmdLineTool.java b/graylog2-server/src/main/java/org/graylog2/bootstrap/CmdLineTool.java
index 3b38c6ebd07e..2cf94fd49524 100644
--- a/graylog2-server/src/main/java/org/graylog2/bootstrap/CmdLineTool.java
+++ b/graylog2-server/src/main/java/org/graylog2/bootstrap/CmdLineTool.java
@@ -650,9 +650,10 @@ protected void annotateInjectorExceptions(Collection messages) {
} else if (rootCause instanceof AccessDeniedException) {
LOG.error(UI.wallString("Unable to access file " + rootCause.getMessage()));
System.exit(-2);
- } else if (rootCause instanceof UnsupportedSearchException) {
- final SearchVersion search = ((UnsupportedSearchException) rootCause).getSearchMajorVersion();
- LOG.error(UI.wallString("Unsupported search version: " + search, DocsHelper.PAGE_ES_VERSIONS.toString()));
+ } else if (rootCause instanceof final UnsupportedSearchException searchException) {
+ final SearchVersion search = searchException.getSearchMajorVersion();
+ final String component = searchException.getMessage();
+ LOG.error(UI.wallString("Unsupported search version: " + search + "(component: " + component + ")", DocsHelper.PAGE_ES_VERSIONS.toString()));
System.exit(-3);
} else if (rootCause instanceof ElasticsearchProbeException) {
LOG.error(UI.wallString(rootCause.getMessage(), DocsHelper.PAGE_ES_CONFIGURATION.toString()));
diff --git a/graylog2-server/src/main/java/org/graylog2/storage/VersionAwareProvider.java b/graylog2-server/src/main/java/org/graylog2/storage/VersionAwareProvider.java
index 8bb907475e40..16e78d53e74f 100644
--- a/graylog2-server/src/main/java/org/graylog2/storage/VersionAwareProvider.java
+++ b/graylog2-server/src/main/java/org/graylog2/storage/VersionAwareProvider.java
@@ -23,10 +23,12 @@
public class VersionAwareProvider implements Provider {
private final SearchVersion elasticsearchMajorVersion;
+ private final SearchVersion actualVersion;
private final Map> pluginBindings;
@Inject
public VersionAwareProvider(@DetectedSearchVersion SearchVersion indexerVersion, Map> pluginBindings) {
+ this.actualVersion = indexerVersion;
this.elasticsearchMajorVersion = majorVersionFrom(indexerVersion);
this.pluginBindings = pluginBindings;
}
@@ -35,7 +37,7 @@ public VersionAwareProvider(@DetectedSearchVersion SearchVersion indexerVersion,
public T get() {
final Provider provider = this.pluginBindings.get(elasticsearchMajorVersion);
if (provider == null) {
- throw new UnsupportedSearchException(elasticsearchMajorVersion, this.getClass().getName());
+ throw new UnsupportedSearchException(actualVersion, this.getClass().getName());
}
return provider.get();
}
diff --git a/graylog2-server/src/main/resources/org/graylog2/featureflag/feature-flag.config b/graylog2-server/src/main/resources/org/graylog2/featureflag/feature-flag.config
index 749ffa4a361a..6096172d6cc6 100644
--- a/graylog2-server/src/main/resources/org/graylog2/featureflag/feature-flag.config
+++ b/graylog2-server/src/main/resources/org/graylog2/featureflag/feature-flag.config
@@ -114,3 +114,6 @@ quick_jump=off
# Enable message table favorite fields
message_table_favorite_fields=on
+
+# Enable for OS3 client usage, disable for OS2 usage.
+opensearch3_client=on
diff --git a/graylog2-server/src/test/java/org/graylog/testing/completebackend/DefaultPluginJarsProvider.java b/graylog2-server/src/test/java/org/graylog/testing/completebackend/DefaultPluginJarsProvider.java
index 4b6ff3103d48..73c67bd7f012 100644
--- a/graylog2-server/src/test/java/org/graylog/testing/completebackend/DefaultPluginJarsProvider.java
+++ b/graylog2-server/src/test/java/org/graylog/testing/completebackend/DefaultPluginJarsProvider.java
@@ -37,6 +37,8 @@ public List getJars() {
"graylog-storage-elasticsearch7-" + projectVersion + ".jar"),
Paths.get(reposDir, "graylog2-server/graylog-storage-opensearch2/target",
"graylog-storage-opensearch2-" + projectVersion + ".jar"),
+ Paths.get(reposDir, "graylog2-server/graylog-storage-opensearch3/target",
+ "graylog-storage-opensearch3-" + projectVersion + ".jar"),
Paths.get(reposDir, "graylog-plugin-aws/target",
"graylog-plugin-aws-" + projectVersion + ".jar"),
Paths.get(reposDir, "graylog-plugin-threatintel/target",