class Datadog::Transport::Traces::Transport

Sends traces based on transport API configuration.

This class initializes the HTTP client, breaks down large batches of traces into smaller chunks and handles API version downgrade handshake.

Attributes

apis[R]
client[R]
current_api_id[R]
default_api[R]

Public Class Methods

new(apis, default_api) click to toggle source
# File lib/ddtrace/transport/traces.rb, line 101
def initialize(apis, default_api)
  @apis = apis
  @default_api = default_api

  change_api!(default_api)
end

Public Instance Methods

current_api() click to toggle source
# File lib/ddtrace/transport/traces.rb, line 132
def current_api
  apis[@current_api_id]
end
send_traces(traces) click to toggle source
# File lib/ddtrace/transport/traces.rb, line 108
def send_traces(traces)
  encoder = current_api.encoder
  chunker = Datadog::Transport::Traces::Chunker.new(encoder)

  responses = chunker.encode_in_chunks(traces.lazy).map do |encoded_traces, trace_count|
    request = Request.new(EncodedParcel.new(encoded_traces, trace_count))

    client.send_payload(request).tap do |response|
      if downgrade?(response)
        downgrade!
        return send_traces(traces)
      end
    end
  end.force

  Datadog.health_metrics.transport_chunked(responses.size)

  responses
end
stats() click to toggle source
# File lib/ddtrace/transport/traces.rb, line 128
def stats
  @client.stats
end

Private Instance Methods

change_api!(api_id) click to toggle source
# File lib/ddtrace/transport/traces.rb, line 149
def change_api!(api_id)
  raise UnknownApiVersionError, api_id unless apis.key?(api_id)
  @current_api_id = api_id
  @client = HTTP::Client.new(current_api)
end
downgrade!() click to toggle source
# File lib/ddtrace/transport/traces.rb, line 143
def downgrade!
  downgrade_api_id = apis.fallbacks[@current_api_id]
  raise NoDowngradeAvailableError, @current_api_id if downgrade_api_id.nil?
  change_api!(downgrade_api_id)
end
downgrade?(response) click to toggle source
# File lib/ddtrace/transport/traces.rb, line 138
def downgrade?(response)
  return false unless apis.fallbacks.key?(@current_api_id)
  response.not_found? || response.unsupported?
end