54 lines
1.3 KiB
Ruby
54 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'opentracing'
|
|
require 'grpc'
|
|
|
|
module Gitlab
|
|
module Tracing
|
|
class GRPCInterceptor < GRPC::ClientInterceptor
|
|
include Common
|
|
include Singleton
|
|
|
|
def request_response(request:, call:, method:, metadata:)
|
|
wrap_with_tracing(method, 'unary', metadata) do
|
|
yield
|
|
end
|
|
end
|
|
|
|
def client_streamer(requests:, call:, method:, metadata:)
|
|
wrap_with_tracing(method, 'client_stream', metadata) do
|
|
yield
|
|
end
|
|
end
|
|
|
|
def server_streamer(request:, call:, method:, metadata:)
|
|
wrap_with_tracing(method, 'server_stream', metadata) do
|
|
yield
|
|
end
|
|
end
|
|
|
|
def bidi_streamer(requests:, call:, method:, metadata:)
|
|
wrap_with_tracing(method, 'bidi_stream', metadata) do
|
|
yield
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def wrap_with_tracing(method, grpc_type, metadata)
|
|
tags = {
|
|
'component' => 'grpc',
|
|
'span.kind' => 'client',
|
|
'grpc.method' => method,
|
|
'grpc.type' => grpc_type
|
|
}
|
|
|
|
in_tracing_span(operation_name: "grpc:#{method}", tags: tags) do |span|
|
|
OpenTracing.inject(span.context, OpenTracing::FORMAT_TEXT_MAP, metadata)
|
|
|
|
yield
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|