From c5408f0bb13b6c03e2c14004fbae481c27fb1749 Mon Sep 17 00:00:00 2001 From: jsonbailey Date: Wed, 21 May 2025 13:06:54 +0000 Subject: [PATCH] feat: Enable gzip option for events in server SDK --- lib/sdk/server/build.gradle | 2 +- .../main/java/sdktest/Representations.java | 1 + .../main/java/sdktest/SdkClientEntity.java | 3 ++- .../src/main/java/sdktest/TestService.java | 20 ++++++++++--------- .../sdk/server/ComponentsImpl.java | 1 + .../integrations/EventProcessorBuilder.java | 17 ++++++++++++++++ 6 files changed, 33 insertions(+), 11 deletions(-) diff --git a/lib/sdk/server/build.gradle b/lib/sdk/server/build.gradle index 9d2eac0..a93dab6 100644 --- a/lib/sdk/server/build.gradle +++ b/lib/sdk/server/build.gradle @@ -71,7 +71,7 @@ ext.versions = [ "guava": "32.0.1-jre", "jackson": "2.11.2", "launchdarklyJavaSdkCommon": "2.1.1", - "launchdarklyJavaSdkInternal": "1.4.0", + "launchdarklyJavaSdkInternal": "1.5.0", "launchdarklyLogging": "1.1.0", "okhttp": "4.9.3", // specify this for the SDK build instead of relying on the transitive dependency from okhttp-eventsource "okhttpEventsource": "4.1.0", diff --git a/lib/sdk/server/contract-tests/service/src/main/java/sdktest/Representations.java b/lib/sdk/server/contract-tests/service/src/main/java/sdktest/Representations.java index 5447cfe..94772cc 100644 --- a/lib/sdk/server/contract-tests/service/src/main/java/sdktest/Representations.java +++ b/lib/sdk/server/contract-tests/service/src/main/java/sdktest/Representations.java @@ -45,6 +45,7 @@ public static class SdkConfigEventParams { boolean allAttributesPrivate; int capacity; boolean enableDiagnostics; + boolean enableGzip; String[] globalPrivateAttributes; Long flushIntervalMs; } diff --git a/lib/sdk/server/contract-tests/service/src/main/java/sdktest/SdkClientEntity.java b/lib/sdk/server/contract-tests/service/src/main/java/sdktest/SdkClientEntity.java index c7f43b0..db70d6c 100644 --- a/lib/sdk/server/contract-tests/service/src/main/java/sdktest/SdkClientEntity.java +++ b/lib/sdk/server/contract-tests/service/src/main/java/sdktest/SdkClientEntity.java @@ -390,7 +390,8 @@ private LDConfig buildSdkConfig(SdkConfigParams params, String tag) { } else { endpoints.events(params.events.baseUri); EventProcessorBuilder eb = Components.sendEvents() - .allAttributesPrivate(params.events.allAttributesPrivate); + .allAttributesPrivate(params.events.allAttributesPrivate) + .enableGzipCompression(params.events.enableGzip); if (params.events.capacity > 0) { eb.capacity(params.events.capacity); } diff --git a/lib/sdk/server/contract-tests/service/src/main/java/sdktest/TestService.java b/lib/sdk/server/contract-tests/service/src/main/java/sdktest/TestService.java index 6baa5fc..84bbb3e 100644 --- a/lib/sdk/server/contract-tests/service/src/main/java/sdktest/TestService.java +++ b/lib/sdk/server/contract-tests/service/src/main/java/sdktest/TestService.java @@ -23,22 +23,24 @@ public class TestService { private static final int PORT = 8000; private static final String[] CAPABILITIES = new String[]{ - "server-side", - "strongly-typed", "all-flags-client-side-only", "all-flags-details-only-for-tracked-flags", "all-flags-with-reasons", + "anonymous-redaction", "big-segments", + "client-prereq-events", "context-type", - "service-endpoints", - "tags", - "filtering", - "migrations", + "evaluation-hooks", + "event-gzip", "event-sampling", + "filtering", "inline-context-all", - "anonymous-redaction", - "evaluation-hooks", - "client-prereq-events" + "migrations", + "optional-event-gzip", + "server-side", + "service-endpoints", + "strongly-typed", + "tags", }; static final Gson gson = new GsonBuilder().serializeNulls().create(); diff --git a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/ComponentsImpl.java b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/ComponentsImpl.java index 0433a28..ea40f41 100644 --- a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/ComponentsImpl.java +++ b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/ComponentsImpl.java @@ -222,6 +222,7 @@ public EventProcessor build(ClientContext context) { null, // use default request path for server-side events null, // use default request path for client-side events 0, // 0 means default retry delay + enableGzipCompression, context.getBaseLogger().subLogger(Loggers.EVENTS_LOGGER_NAME)); } else { eventSender = new EventSenderWrapper(eventSenderConfigurer.build(context)); diff --git a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/integrations/EventProcessorBuilder.java b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/integrations/EventProcessorBuilder.java index 4c79c4e..c818c9f 100644 --- a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/integrations/EventProcessorBuilder.java +++ b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/integrations/EventProcessorBuilder.java @@ -66,6 +66,7 @@ public abstract class EventProcessorBuilder implements ComponentConfigurer eventSenderConfigurer = null; + protected boolean enableGzipCompression = false; /** * Sets whether or not all optional user attributes should be hidden from LaunchDarkly. @@ -211,4 +212,20 @@ public EventProcessorBuilder userKeysFlushInterval(Duration userKeysFlushInterva this.userKeysFlushInterval = userKeysFlushInterval == null ? DEFAULT_USER_KEYS_FLUSH_INTERVAL : userKeysFlushInterval; return this; } + + /** + * Enables gzip compression for event payloads. + *

+ * When enabled, event payloads will be compressed using gzip before being sent to LaunchDarkly. + * This can significantly reduce bandwidth usage when sending large event payloads. + *

+ * The default value is false. + * + * @param enableGzipCompression whether to enable gzip compression + * @return the builder + */ + public EventProcessorBuilder enableGzipCompression(boolean enableGzipCompression) { + this.enableGzipCompression = enableGzipCompression; + return this; + } }