12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# File 'lib/opentelemetry/instrumentation/gruf/interceptors/client.rb', line 12
def call(request_context:)
return yield if instrumentation_config.empty?
service = request_context.method.split('/')[1]
method = request_context.method_name
method_name_with_service = [service.underscore, method].join('.').downcase
return yield if instrumentation_config[:grpc_ignore_methods_on_client].include?(method_name_with_service)
metadata = request_context.metadata
attributes = {
OpenTelemetry::SemanticConventions::Trace::RPC_SYSTEM => 'grpc',
OpenTelemetry::SemanticConventions::Trace::RPC_SERVICE => service,
OpenTelemetry::SemanticConventions::Trace::RPC_METHOD => method,
OpenTelemetry::SemanticConventions::Trace::PEER_SERVICE => instrumentation_config[:peer_service],
'rpc.type' => request_context.type.to_s,
'net.sock.peer.addr' => request_context.call.instance_variable_get(:@wrapped)&.peer
}.compact
attributes.merge!((metadata.transform_keys(&:to_s)))
instrumentation_tracer.in_span(
request_context.method.to_s,
attributes: attributes,
kind: OpenTelemetry::Trace::SpanKind::CLIENT
) do |span|
OpenTelemetry.propagation.inject(metadata)
yield.tap do
span&.set_attribute(OpenTelemetry::SemanticConventions::Trace::RPC_GRPC_STATUS_CODE, 0)
end
rescue StandardError => e
span&.set_attribute(OpenTelemetry::SemanticConventions::Trace::RPC_GRPC_STATUS_CODE, e.code)
raise e
end
end
|