From 2a1df73e6eb30a5eafdb9c9bf9fdd06c237703e2 Mon Sep 17 00:00:00 2001 From: Matthew Keeler Date: Mon, 2 Nov 2026 11:35:27 -0500 Subject: [PATCH] feat!: Compress event payloads by default The compress_events option now defaults to true. The SDK gzip-compresses analytics and diagnostic event payloads and sends them with a Content-Encoding: gzip header. This reduces egress bandwidth for customers who send events directly to LaunchDarkly. Relay Proxy versions before 8.9 cannot accept compressed events. Customers who send events through the Relay Proxy should set compress_events: false. Older Relay Proxy versions cannot decode the payloads, and newer versions decode and re-encode them, which adds overhead. The stub HTTP server in the specs now decodes a request body based on its Content-Encoding header instead of a constructor flag. --- lib/ldclient-rb/config.rb | 12 ++++++------ spec/config_spec.rb | 8 ++++++++ spec/http_util.rb | 9 ++++----- spec/impl/event_sender_spec.rb | 16 ++++++++++++++-- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/ldclient-rb/config.rb b/lib/ldclient-rb/config.rb index 1b77ac16..4a54093a 100644 --- a/lib/ldclient-rb/config.rb +++ b/lib/ldclient-rb/config.rb @@ -281,11 +281,11 @@ def offline? attr_reader :send_events # - # Should the event payload sent to LaunchDarkly use gzip compression. By default this is false to prevent backward - # breaking compatibility issues with older versions of the relay proxy. + # Should the event payload sent to LaunchDarkly use gzip compression. The default is true. # - # Customers not using the relay proxy are strongly encouraged to enable this feature to reduce egress bandwidth - # cost. + # Relay Proxy versions before 8.9 cannot accept compressed events. If you send events through the Relay Proxy, + # set this to false. Older Relay Proxy versions cannot decode compressed payloads. Newer versions decode and + # compress the payloads again, which adds CPU overhead. # # @return [Boolean] # @@ -622,10 +622,10 @@ def self.default_send_events # # The default value for {#compress_events}. - # @return [Boolean] false + # @return [Boolean] true # def self.default_compress_events - false + true end # diff --git a/spec/config_spec.rb b/spec/config_spec.rb index 687b9b09..f66f8ae1 100644 --- a/spec/config_spec.rb +++ b/spec/config_spec.rb @@ -135,5 +135,13 @@ module LaunchDarkly expect(subject.new(omit_anonymous_contexts: true).omit_anonymous_contexts).to eq true end end + describe ".compress_events" do + it "defaults to true" do + expect(subject.new.compress_events).to eq true + end + it "can be set to false" do + expect(subject.new(compress_events: false).compress_events).to eq false + end + end end end diff --git a/spec/http_util.rb b/spec/http_util.rb index 3198cdcb..37b466dc 100644 --- a/spec/http_util.rb +++ b/spec/http_util.rb @@ -7,8 +7,7 @@ class StubHTTPServer attr_reader :requests, :port - def initialize(enable_compression: false) - @enable_compression = enable_compression + def initialize base_opts = { BindAddress: '127.0.0.1', Port: 0, # Let OS assign an available port @@ -70,7 +69,7 @@ def await_request_with_body request = r[0] body = r[1] - return [request, body.to_s] unless @enable_compression + return [request, body.to_s] unless request.header['content-encoding'] == ['gzip'] gz = Zlib::GzipReader.new(StringIO.new(body.to_s)) @@ -84,8 +83,8 @@ def method_missing(*) end end -def with_server(enable_compression: false) - server = StubHTTPServer.new(enable_compression: enable_compression) +def with_server + server = StubHTTPServer.new begin server.start yield server diff --git a/spec/impl/event_sender_spec.rb b/spec/impl/event_sender_spec.rb index 0e82eb21..5760e94b 100644 --- a/spec/impl/event_sender_spec.rb +++ b/spec/impl/event_sender_spec.rb @@ -42,8 +42,7 @@ def make_sender(config_options = {}) end def with_sender_and_server(config_options = {}) - enable_compression = config_options[:compress_events] || false - with_server(enable_compression: enable_compression) do |server| + with_server do |server| config_options[:events_uri] = server.base_uri.to_s yield make_sender(config_options), server end @@ -101,6 +100,19 @@ def with_sender_and_server(config_options = {}) end end + it "sends analytics event data with compression by default" do + with_sender_and_server do |es, server| + server.setup_ok_response("/bulk", "") + + result = es.send_event_data(fake_data, "", false) + + expect(result.success).to be true + req, body = server.await_request_with_body + expect(body).to eq fake_data + expect(req.header['content-encoding']).to eq [ "gzip" ] + end + end + it "can use a socket factory" do with_server do |server| server.setup_ok_response("/bulk", "")