Module: GrpcInterceptors::Common::Logging

Defined in:
lib/grpc_interceptors/common/logging.rb

Class Method Summary collapse

Class Method Details

.build_payload(method, method_type, kind) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/grpc_interceptors/common/logging.rb', line 60

def self.build_payload(method, method_type, kind)
  service = GrpcHelper.service_name(method)
  method = GrpcHelper.method_name(method)

  payload = {
    'pid' => Process.pid,
    'grpc.component' => kind, # the caller, server or client
    'grpc.service' => service,
    'grpc.method' => method,
    'grpc.method_type' => method_type
  }

  if defined?(OpenTelemetry) && OpenTelemetry::Trace.current_span.recording?
    tracing_context = OpenTelemetry::Trace.current_span.context
    payload['span_id'] = tracing_context.hex_span_id
    payload['trace_id'] = tracing_context.hex_trace_id
  end

  payload
end

.log(logger: nil, request: nil, method: nil, method_type: nil, kind: nil, extra_fields: {}) ⇒ Object

Log a gRPC interaction.

If the current log level is INFO, then it logs out basic facts. If the current log level is DEBUG, then it additionally adds to the log request and response. If the server responds with error, then the error is added to the log.

Parameters:

  • request (Object) (defaults to: nil)

    The request object

  • method (String) (defaults to: nil)

    The method passed to the intercepting function

  • method_type (String) (defaults to: nil)

    The used method_type, unary or one of the streams



45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/grpc_interceptors/common/logging.rb', line 45

def self.log(
  logger: nil, request: nil, method: nil, method_type: nil, kind: nil,
  extra_fields: {}
)
  payload = build_payload(method, method_type, kind)
  payload.merge!(extra_fields)

  if logger.level == ::Logger::Severity::INFO
    logger.info(payload)
  elsif logger.level == ::Logger::Severity::DEBUG
    payload['request'] = Common::GrpcHelper.proto_to_h(request) unless request.nil?
    logger.debug(payload)
  end
end

.yield_and_log(logger: nil, request: nil, method: nil, method_type: nil, kind: nil) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/grpc_interceptors/common/logging.rb', line 6

def self.yield_and_log(
  logger: nil, request: nil, method: nil, method_type: nil, kind: nil
)
  grpc_code = ::GRPC::Core::StatusCodes::OK
  response = yield
rescue StandardError => e
  grpc_code = e.is_a?(::GRPC::BadStatus) ? e.code : ::GRPC::Core::StatusCodes::UNKNOWN
  extra_fields = {
    'error' => e.class.to_s,
    'error_message' => e.message,
    'backtrace' => e.backtrace
  }

  raise
ensure
  extra_fields ||= {}
  extra_fields['grpc.code'] = grpc_code

  if logger.level == ::Logger::Severity::DEBUG && !response.nil? && !response.is_a?(Enumerator)
    extra_fields['response'] = Common::GrpcHelper.proto_to_h(response)
  end

  log(
    logger: logger, request: request, method: method,
    method_type: method_type, kind: kind, extra_fields: extra_fields
  )
end