class GrpcNewrelicInterceptor::ClientInterceptor

Public Instance Methods

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

Intercept a unary request response call

@param [Object] request @param [GRPC::ActiveCall] call @param [String] method @param [Hash] metadata

# File lib/grpc_newrelic_interceptor/client_interceptor.rb, line 14
def request_response(request:, call:, method:, metadata:)
  return yield if !newrelic_enabled?

  segment = NewRelic::Agent::Tracer.start_external_request_segment(
    library:   "gRPC".freeze,
    uri:       dummy_uri(method),
    procedure: get_method_name(method),
  )

  begin
    response = nil

    # TODO(south37) Set metadta as reqeust headers
    # segment.add_request_headers something

    # RUBY-1244 Disable further tracing in request to avoid double
    # counting if connection wasn't started (which calls request again).
    NewRelic::Agent.disable_all_tracing do
      response = yield
    end

    # NOTE: Here, we can not get metadata of response.
    # TODO(south37) Improve ClientInterceptor to get metadata and set it as
    # response headers
    # segment.read_response_headers something

    response
  ensure
    segment.finish
  end
end

Private Instance Methods

dummy_uri(method) click to toggle source

@param [String] method @return [URI]

# File lib/grpc_newrelic_interceptor/client_interceptor.rb, line 52
def dummy_uri(method)
  # Here, we use service_name as domain name.
  service_name = get_service_name(method)
  ::NewRelic::Agent::HTTPClients::URIUtil.parse_and_normalize_url("http://#{service_name}")
end
get_method_name(method) click to toggle source

@param [String] method @return [String]

# File lib/grpc_newrelic_interceptor/client_interceptor.rb, line 68
def get_method_name(method)
  # Here, method is a string which represents a full path of gRPC method.
  # e.g. "/wantedly.users.UserService/GetUser"
  method.split('/')[2]
end
get_service_name(method) click to toggle source

@param [String] method @return [String]

# File lib/grpc_newrelic_interceptor/client_interceptor.rb, line 60
def get_service_name(method)
  # Here, method is a string which represents a full path of gRPC method.
  # e.g. "/wantedly.users.UserService/GetUser"
  method.split('/')[1]
end
newrelic_enabled?() click to toggle source

@return [bool]

# File lib/grpc_newrelic_interceptor/client_interceptor.rb, line 75
def newrelic_enabled?
  NewRelic::Agent.instance.started?
end