class ElasticAPM::GRPC::ClientInterceptor

@api private

Constants

SUBTYPE
TYPE

Public Instance Methods

request_response(request:, call:, method:, metadata:) { || ... } click to toggle source

rubocop:disable Lint/UnusedMethodArgument, Style/ExplicitBlockArgument

# File lib/elastic_apm/grpc.rb, line 29
def request_response(request:, call:, method:, metadata:)
  return yield unless (transaction = ElasticAPM.current_transaction)
  if (trace_context = transaction.trace_context)
    trace_context.apply_headers { |k, v| metadata[k.downcase] = v }
  end

  ElasticAPM.with_span(
    method, TYPE,
    subtype: SUBTYPE,
    context: span_context(call)
  ) do
    yield
  end
end

Private Instance Methods

span_context(call) click to toggle source

rubocop:enable Lint/UnusedMethodArgument, Style/ExplicitBlockArgument

# File lib/elastic_apm/grpc.rb, line 47
def span_context(call)
  peer = call.instance_variable_get(:@wrapped)&.peer
  return unless peer

  split_peer = URI.split(peer)
  destination = ElasticAPM::Span::Context::Destination.new(
    address: split_peer[0],
    port: split_peer[6],
    service: { type: TYPE, name: SUBTYPE, resource: peer }
  )
  ElasticAPM::Span::Context.new(destination: destination)
end