diff --git a/utils/build/docker/ruby/parametric/server.rb b/utils/build/docker/ruby/parametric/server.rb index c8b8db3e3b7..dc9caa1ab87 100644 --- a/utils/build/docker/ruby/parametric/server.rb +++ b/utils/build/docker/ruby/parametric/server.rb @@ -45,14 +45,8 @@ c.logger.instance = Logger.new(STDOUT) # Make sure logs are available for inspection from outside the container. end -if Datadog::Core::Remote.active_remote - # TODO: Remove this whole `if` condition if remote configuration is started by default. - if Datadog::Core::Remote.active_remote.started? - raise 'Remote Configuration worker already started! Remove this check and `Datadog::Core::Remote.active_remote.start` below.' - end - - Datadog::Core::Remote.active_remote.start -end +remote = Datadog::Core::Remote.active_remote +remote&.start unless remote&.started? def otel_tracer OpenTelemetry.tracer_provider.tracer('otel-tracer') @@ -842,22 +836,27 @@ def extract_http_headers(headers) end end -def handle_ffe_start(req, res) - OpenFeature::SDK.set_provider(Datadog::OpenFeature::Provider.new) +def handle_ffe_start(_req, res) + provider = Datadog::OpenFeature::Provider.new + feature_flagging_configured = %w[ + DD_FEATURE_FLAGS_ENABLED + DD_FEATURE_FLAGS_CONFIGURATION_SOURCE + DD_FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_BASE_URL + DD_FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_POLL_INTERVAL_SECONDS + DD_FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_REQUEST_TIMEOUT_SECONDS + DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED + DD_EXPERIMENTAL_FLAGGING_PROVIDER_INITIALIZATION_TIMEOUT_MS + ].any? { |name| ENV.key?(name) } - # NOTE: There is no set_provider_and_wait in Ruby OpenFeature::SDK, but this is - # a subject to change. - # - # Remote Configuration will be received at this point because of the short - # polling delay. - 10.times do - evaluator = Datadog::OpenFeature.engine.instance_variable_get(:@evaluator) - break unless evaluator.instance_variable_get(:@configuration).nil? - - sleep 0.5 + if feature_flagging_configured + OpenFeature::SDK.set_provider_and_wait(provider) + else + OpenFeature::SDK.set_provider(provider) end - res.write({}.to_json) +rescue => e + res.status = 500 + res.write({error: e.message}.to_json) end def handle_ffe_evaluation(req, res) diff --git a/utils/build/docker/ruby/rails72/app/controllers/open_feature_controller.rb b/utils/build/docker/ruby/rails72/app/controllers/open_feature_controller.rb index db75aecc130..61811a42641 100644 --- a/utils/build/docker/ruby/rails72/app/controllers/open_feature_controller.rb +++ b/utils/build/docker/ruby/rails72/app/controllers/open_feature_controller.rb @@ -4,15 +4,10 @@ class OpenFeatureController < ApplicationController skip_before_action :verify_authenticity_token def start - OpenFeature::SDK.set_provider(Datadog::OpenFeature::Provider.new) - - # NOTE: There is no set_provider_and_wait in OpenFeature::SDK - loop do - break unless Datadog::OpenFeature.evaluator.ufc_json.nil? - sleep 0.1 - end - + OpenFeature::SDK.set_provider_and_wait(Datadog::OpenFeature::Provider.new) render json: {} + rescue => e + render json: {error: e.message}, status: :internal_server_error end def evaluate