Class: OpenCensus::Trace::Exporters::Datadog::Converter

Inherits:
Object
  • Object
show all
Defined in:
lib/opencensus/trace/exporters/datadog/converter.rb

Constant Summary collapse

DATADOG_MAX_TRACE_ID =
0xffff_ffff_ffff_ffff
DATADOG_SPAN_TYPE_KEY =
'span.type'.freeze
DATADOG_SERVICE_NAME_KEY =
'service.name'.freeze
DATADOG_RESOURCE_NAME_KEY =
'resource.name'.freeze
DATADOG_SAMPLING_PRIORITY_KEY =
::Datadog::Ext::DistributedTracing::SAMPLING_PRIORITY_KEY
STATUS_DESCRIPTION_KEY =
'opencensus.status_description'.freeze
CANONICAL_CODES =
[
  'ok',
  'cancelled',
  'unknown',
  'invalid_argument',
  'deadline_exceeded',
  'not_found',
  'already_exists',
  'permission_denied',
  'resource_exhausted',
  'failed_precondition',
  'aborted',
  'out_of_range',
  'unimplemented',
  'internal',
  'unavailable',
  'data_loss',
  'unauthenticated'
]

Instance Method Summary collapse

Constructor Details

#initialize(service) ⇒ Converter

Returns a new instance of Converter.



40
41
42
# File 'lib/opencensus/trace/exporters/datadog/converter.rb', line 40

def initialize(service)
  @service = service
end

Instance Method Details

#convert_span(span) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# 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) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
# 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) ⇒ Object



105
106
107
108
109
110
111
112
113
114
# 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