Method: Datadog::Core::Remote::Component#initialize

Defined in:
lib/datadog/core/remote/component.rb

#initialize(settings, capabilities, agent_settings, logger:) ⇒ Component

Returns a new instance of Component.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/datadog/core/remote/component.rb', line 18

def initialize(settings, capabilities, agent_settings, logger:)
  @logger = logger

  negotiation = Negotiation.new(settings, agent_settings, logger: logger)
  transport_v7 = Datadog::Core::Remote::Transport::HTTP.v7(agent_settings: agent_settings, logger: logger)

  @barrier = Barrier.new(settings.remote.boot_timeout_seconds)

  @client = Client.new(transport_v7, capabilities, logger: logger)
  @healthy = false
  logger.debug { "new remote configuration client: #{@client.id}" }

  @worker = Worker.new(interval: settings.remote.poll_interval_seconds, logger: logger) do
    unless @healthy || negotiation.endpoint?('/v0.7/config')
      @barrier.lift

      next
    end

    begin
      @client.sync
      @healthy ||= true
    rescue Client::SyncError => e
      # Transient errors due to network or agent. Logged the error but not via telemetry
      logger.error do
        "remote worker client sync error: #{e.message} location: #{Array(e.backtrace).first}. skipping sync"
      end
    rescue => e
      # In case of unexpected errors, reset the negotiation object
      # given external conditions have changed and the negotiation
      # negotiation object stores error logging state that should be reset.
      negotiation = Negotiation.new(settings, agent_settings, logger: logger)

      # Transient errors due to network or agent. Logged the error but not via telemetry
      logger.error do
        "remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}. " \
        'resetting client state'
      end

      # client state is unknown, state might be corrupted
      @client = Client.new(transport_v7, capabilities, logger: logger)
      @healthy = false
      logger.debug { "new remote configuration client: #{@client.id}" }

      # TODO: bail out if too many errors?
    end

    @barrier.lift
  end
end