class OpenCensus::Trace::Exporters::Datadog::Converter

Constants

CANONICAL_CODES
DATADOG_MAX_TRACE_ID
DATADOG_RESOURCE_NAME_KEY
DATADOG_SAMPLING_PRIORITY_KEY
DATADOG_SERVICE_NAME_KEY
DATADOG_SPAN_TYPE_KEY
STATUS_DESCRIPTION_KEY

Public Class Methods

new(service) click to toggle source
# File lib/opencensus/trace/exporters/datadog/converter.rb, line 40
def initialize(service)
  @service = service
end

Public Instance Methods

convert_span(span) click to toggle source
# File lib/opencensus/trace/exporters/datadog/converter.rb, line 44
def convert_span(span)
  dd_span = {
    span_id: span.span_id.to_i(16),
    parent_id: span.parent_span_id.to_i(16),
    trace_id: (span.trace_id.to_i(16) & DATADOG_MAX_TRACE_ID),
    name: span.name.to_s,
    service: @service,
    resource: span.name.to_s,
    type: span_type(span.kind.to_s),
    meta: {},
    metrics: {},
    error: 0,
    start: (span.start_time.to_f * 1e9).to_i,
    duration: ((span.end_time.to_f - span.start_time.to_f) * 1e9).to_i,
  }

  dd_span[:metrics][DATADOG_SAMPLING_PRIORITY_KEY] = ::Datadog::Ext::Priority::AUTO_KEEP

  convert_status(dd_span, span.status)

  span.attributes.each do |k, v|
    case v
    when Integer
      if k == DATADOG_SAMPLING_PRIORITY_KEY
        dd_span[:metrics][DATADOG_SAMPLING_PRIORITY_KEY] = v
      else
        dd_span[:metrics][k] = v
      end
    when ::OpenCensus::Trace::TruncatableString
      case k
      when DATADOG_SPAN_TYPE_KEY
        dd_span[:type] = v.to_s
      when DATADOG_SERVICE_NAME_KEY
        dd_span[:service] = v.to_s
      when DATADOG_RESOURCE_NAME_KEY
        dd_span[:resource] = v.to_s
      else
        dd_span[:meta][k] = v.to_s
      end
    else
      dd_span[:meta][k] = v.to_s
    end
  end

  dd_span
end
convert_status(dd_span, status) click to toggle source
# File lib/opencensus/trace/exporters/datadog/converter.rb, line 91
def convert_status(dd_span, status)
  status_key = STATUS_DESCRIPTION_KEY
  return if status.nil?
  if status.code != 0 then
    status_key = ::Datadog::Ext::Errors::MSG
    dd_span[:error] = 1
    code = status.code.to_i
    return if code < 0 || code >= CANONICAL_CODES.length
    dd_span[:meta][status_key] = CANONICAL_CODES[code]
  end
  dd_span[:meta][status_key] = status.message.to_s unless status.message.empty?
  return
end
span_type(kind) click to toggle source
# File lib/opencensus/trace/exporters/datadog/converter.rb, line 105
def span_type(kind)
  case kind
  when OpenCensus::Trace::Span::SERVER
    'server'
  when OpenCensus::Trace::Span::CLIENT
    'client'
  else
    ''
  end
end