module OpenTelemetry::Exporter::Jaeger::Encoder

@api private

Constants

BOOL
DEFAULT_SERVICE_NAME
DOUBLE
EMPTY_ARRAY
KEY
KIND_MAP
LONG
STRING
TYPE
TYPE_MAP

Public Instance Methods

encoded_instrumentation_library(instrumentation_library) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 134
def encoded_instrumentation_library(instrumentation_library)
  return EMPTY_ARRAY unless instrumentation_library

  tags = []
  tags << encoded_tag('otel.library.name', instrumentation_library.name) if instrumentation_library.name
  tags << encoded_tag('otel.library.version', instrumentation_library.version) if instrumentation_library.version
  tags
end
encoded_kind(kind) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 89
def encoded_kind(kind)
  value = KIND_MAP[kind]
  return EMPTY_ARRAY unless value

  Array(
    Thrift::Tag.new(
      KEY => 'span.kind',
      TYPE => Thrift::TagType::STRING,
      STRING => value
    )
  )
end
encoded_logs(events) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 102
def encoded_logs(events)
  events&.map do |event|
    Thrift::Log.new(
      'timestamp' => event.timestamp / 1_000,
      'fields' => encoded_tags(event.attributes) + encoded_tags('name' => event.name)
    )
  end
end
encoded_process(resource) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 36
def encoded_process(resource)
  service_name = DEFAULT_SERVICE_NAME
  tags = resource&.attribute_enumerator&.select do |key, value|
    service_name = value if key == 'service.name'
    key != 'service.name'
  end
  tags = encoded_tags(tags)
  Thrift::Process.new('serviceName' => service_name, 'tags' => tags)
end
encoded_references(links) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 111
def encoded_references(links)
  links&.map do |link|
    Thrift::SpanRef.new(
      'refType' => Thrift::SpanRefType::FOLLOWS_FROM,
      'traceIdLow' => int64(link.span_context.trace_id[8, 8]),
      'traceIdHigh' => int64(link.span_context.trace_id[0, 8]),
      'spanId' => int64(link.span_context.span_id)
    )
  end
end
encoded_span(span_data) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 67
def encoded_span(span_data) # rubocop:disable Metrics/AbcSize
  start_time = span_data.start_timestamp / 1_000
  duration = span_data.end_timestamp / 1_000 - start_time

  Thrift::Span.new(
    'traceIdLow' => int64(span_data.trace_id[8, 8]),
    'traceIdHigh' => int64(span_data.trace_id[0, 8]),
    'spanId' => int64(span_data.span_id),
    'parentSpanId' => int64(span_data.parent_span_id),
    'operationName' => span_data.name,
    'references' => encoded_references(span_data.links),
    'flags' => span_data.trace_flags.sampled? ? 1 : 0,
    'startTime' => start_time,
    'duration' => duration,
    'tags' => encoded_tags(span_data.attributes) +
        encoded_status(span_data.status) +
        encoded_kind(span_data.kind) +
        encoded_instrumentation_library(span_data.instrumentation_library),
    'logs' => encoded_logs(span_data.events)
  )
end
encoded_status(status) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 122
def encoded_status(status)
  return EMPTY_ARRAY unless status&.code == OpenTelemetry::Trace::Status::ERROR

  Array(
    Thrift::Tag.new(
      KEY => 'error',
      TYPE => Thrift::TagType::BOOL,
      BOOL => true
    )
  )
end
encoded_tag(key, value) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 52
def encoded_tag(key, value)
  value_key = case value
              when Integer then LONG
              when Float then DOUBLE
              when String, Array then STRING
              when false, true then BOOL
              end
  value = value.to_json if value.is_a?(Array)
  Thrift::Tag.new(
    KEY => key,
    TYPE => TYPE_MAP[value_key],
    value_key => value
  )
end
encoded_tags(attributes) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 46
def encoded_tags(attributes)
  attributes&.map do |key, value|
    encoded_tag(key, value)
  end || EMPTY_ARRAY
end
int64(byte_string) click to toggle source
# File lib/opentelemetry/exporter/jaeger/encoder.rb, line 143
def int64(byte_string)
  int = byte_string.unpack1('Q>')
  int < (1 << 63) ? int : int - (1 << 64)
end