Skip to content

Commit d5bbcd5

Browse files
committed
Refactor batching of exposure events
1 parent ba71b0a commit d5bbcd5

File tree

11 files changed

+230
-105
lines changed

11 files changed

+230
-105
lines changed

lib/datadog/open_feature/component.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def initialize(settings, agent_settings, logger:, telemetry:)
3333
@telemetry = telemetry
3434

3535
transport = Transport::HTTP.exposures(agent_settings: agent_settings, logger: logger)
36-
@worker = Exposures::Worker.new(transport: transport, logger: logger)
36+
@worker = Exposures::Worker.new(settings: settings, transport: transport, logger: logger)
3737
@reporter = Exposures::Reporter.new(@worker, telemetry: telemetry, logger: logger)
3838
@engine = EvaluationEngine.new(@reporter, telemetry: telemetry, logger: logger)
3939
end

lib/datadog/open_feature/exposures.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ module Exposures
88
end
99

1010
require_relative 'exposures/context'
11-
require_relative 'exposures/batch'
1211
require_relative 'exposures/buffer'
1312
require_relative 'exposures/worker'
1413
require_relative 'exposures/deduplicator'

lib/datadog/open_feature/exposures/batch.rb

Lines changed: 0 additions & 62 deletions
This file was deleted.
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# frozen_string_literal: true
2+
3+
module Datadog
4+
module OpenFeature
5+
module Exposures
6+
# This class builds a batch of exposures and context to be sent to the Agent
7+
class BatchBuilder
8+
def initialize(settings)
9+
@context = build_context(settings)
10+
end
11+
12+
def payload_for(events)
13+
{
14+
context: @context,
15+
exposures: events.map(&:to_h)
16+
}
17+
end
18+
19+
private
20+
21+
def build_context(settings)
22+
env = extract_env(settings)
23+
service = extract_service(settings)
24+
version = extract_version(settings)
25+
26+
context = {}
27+
context[:env] = env if env
28+
context[:service] = service if service
29+
context[:version] = version if version
30+
31+
context
32+
end
33+
34+
def extract_env(settings)
35+
return settings.env if settings.respond_to?(:env)
36+
return settings.tags['env'] if settings.respond_to?(:tags)
37+
38+
nil
39+
end
40+
41+
def extract_service(settings)
42+
return settings.service if settings.respond_to?(:service)
43+
return settings.tags['service'] if settings.respond_to?(:tags)
44+
45+
nil
46+
end
47+
48+
def extract_version(settings)
49+
return settings.version if settings.respond_to?(:version)
50+
return settings.tags['version'] if settings.respond_to?(:tags)
51+
52+
nil
53+
end
54+
end
55+
end
56+
end
57+
end

lib/datadog/open_feature/exposures/models/event.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module Datadog
66
module OpenFeature
77
module Exposures
88
module Models
9-
# A data model for an exposure event.
9+
# A data model for an exposure event
1010
class Event
1111
TARGETING_KEY_FIELD = 'targeting_key'
1212
ALLOWED_FIELD_TYPES = [
@@ -95,8 +95,6 @@ def variation_key
9595
@payload.dig(:variant, :key).to_s
9696
end
9797

98-
# NOTE: The schema is this
99-
# https://github.com/DataDog/dd-source/blob/c10946901aaa103db960883c20161833a664e093/domains/evp-workers/apps/exposures-worker/schemas/exposure.json
10098
def to_h
10199
@payload
102100
end

lib/datadog/open_feature/exposures/worker.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
# frozen_string_literal: true
22

3+
require_relative '../../core/workers/queue'
34
require_relative '../../core/workers/polling'
45

5-
require_relative 'batch'
66
require_relative 'buffer'
7-
require_relative 'context'
7+
require_relative 'batch_builder'
88

99
module Datadog
1010
module OpenFeature
1111
module Exposures
12+
# This class is responsible for sending exposures to the Agent
1213
class Worker
1314
include Datadog::Core::Workers::Queue
1415
include Datadog::Core::Workers::Polling
@@ -18,17 +19,16 @@ class Worker
1819

1920
attr_reader :logger
2021

21-
# NOTE: Context builder and the data model is not finished
2222
def initialize(
23+
settings:,
2324
transport:,
2425
logger: Datadog.logger,
2526
flush_interval_seconds: DEFAULT_FLUSH_INTERVAL_SECONDS,
26-
buffer_limit: DEFAULT_BUFFER_LIMIT,
27-
context_builder: nil
27+
buffer_limit: DEFAULT_BUFFER_LIMIT
2828
)
2929
@logger = logger
3030
@transport = transport
31-
@context_builder = context_builder || -> { Context.build }
31+
@batch_builder = BatchBuilder.new(settings)
3232
@buffer_limit = buffer_limit
3333
@flush_mutex = Mutex.new
3434

@@ -67,12 +67,12 @@ def dequeue
6767

6868
def flush
6969
events, dropped = dequeue
70-
send_events(events || [], dropped || 0)
70+
send_events(events || [], dropped.to_i)
7171
end
7272

7373
def perform(*args)
7474
events, dropped = args
75-
send_events(events || [], dropped || 0)
75+
send_events(events || [], dropped.to_i)
7676
end
7777

7878
private
@@ -84,7 +84,7 @@ def send_events(events, dropped)
8484
logger.debug { "OpenFeature: Exposure worker dropped #{dropped} event(s) due to full buffer" }
8585
end
8686

87-
payload = Batch.new(context: @context_builder.call, exposures: events).to_h
87+
payload = @batch_builder.payload_for(events)
8888
send_payload(payload)
8989
end
9090

sig/datadog/open_feature/exposures/batch.rbs

Lines changed: 0 additions & 24 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
module Datadog
2+
module OpenFeature
3+
module Exposures
4+
class BatchBuilder
5+
@context: ::Hash[::Symbol, ::String]
6+
7+
def initialize: (Core::Configuration::Settings settings) -> void
8+
9+
def payload_for: (::Array[Models::Event] events) -> ::Hash[::Symbol, untyped]
10+
11+
private
12+
13+
def build_context: (Core::Configuration::Settings settings) -> ::Hash[::Symbol, ::String]
14+
15+
def extract_env: (Core::Configuration::Settings settings) -> ::String?
16+
17+
def extract_service: (Core::Configuration::Settings settings) -> ::String?
18+
19+
def extract_version: (Core::Configuration::Settings settings) -> ::String?
20+
end
21+
end
22+
end
23+
end
24+

sig/datadog/open_feature/exposures/worker.rbs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ module Datadog
88
DEFAULT_FLUSH_INTERVAL_SECONDS: ::Integer
99
DEFAULT_BUFFER_LIMIT: ::Integer
1010

11-
attr_reader logger: ::Datadog::Core::Logger
11+
attr_reader logger: Core::Logger
1212

1313
def initialize: (
14+
settings: Core::Configuration::Settings,
1415
transport: Transport::Exposures::Transport,
1516
logger: Core::Logger,
1617
?flush_interval_seconds: ::Integer,
17-
?buffer_limit: ::Integer,
18-
?context_builder: (^() -> ::Hash[::Symbol, untyped])
18+
?buffer_limit: ::Integer
1919
) -> void
2020

2121
def start: () -> void

0 commit comments

Comments
 (0)