lib/opentelemetry/instrumentation/aws_sdk/handler.rb in aspecto-opentelemetry-instrumentation-aws_sdk-0.1.8 vs lib/opentelemetry/instrumentation/aws_sdk/handler.rb in aspecto-opentelemetry-instrumentation-aws_sdk-0.3.0
- old
+ new
@@ -15,11 +15,11 @@
SNS_PUBLISH = 'SNS.Publish'
def call(context) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
return super unless context
- service_name = context.client.class.api.metadata['serviceId'] || context.client.class.to_s.split('::')[1] rescue context.client.class.to_s.split('::')[1] # rubocop:disable Style/RescueModifier
+ service_name = service_name(context)
operation = context.operation&.name
client_method = "#{service_name}.#{operation}"
attributes = {
'aws.region' => context.config.region,
OpenTelemetry::SemanticConventions::Trace::RPC_SYSTEM => 'aws-api',
@@ -28,25 +28,24 @@
}
attributes[SemanticConventions::Trace::DB_SYSTEM] = 'dynamodb' if service_name == 'DynamoDB'
MessagingHelper.apply_sqs_attributes(attributes, context, client_method) if service_name == 'SQS'
MessagingHelper.apply_sns_attributes(attributes, context, client_method) if service_name == 'SNS'
- prepare_extract_context(context, client_method)
tracer.in_span(span_name(context, client_method), attributes: attributes, kind: span_kind(client_method)) do |span|
inject_context(context, client_method)
-
if instrumentation_config[:suppress_internal_instrumentation]
OpenTelemetry::Common::Utilities.untraced { super }
else
super
end.tap do |response|
+ span.set_attribute(OpenTelemetry::SemanticConventions::Trace::HTTP_STATUS_CODE,
+ context.http_response.status_code)
+
if (err = response.error)
span.record_exception(err)
span.status = Trace::Status.error(err.to_s)
end
-
- MessagingHelper.create_sqs_processing_spans(context, tracer, response.messages) if client_method == SQS_RECEIVE_MESSAGE && response.respond_to?(:messages)
end
end
end
private
@@ -57,12 +56,20 @@
def instrumentation_config
AwsSdk::Instrumentation.instance.config
end
+ def service_name(context) # rubocop:disable Metrics/AbcSize
+ # Support aws-sdk v2.0.x, which 'metadata' has a setter method only
+ return context.client.class.to_s.split('::')[1] if ::Seahorse::Model::Api.instance_method(:metadata).parameters.length.positive?
+
+ context.client.class.api.metadata['serviceId'] || context.client.class.to_s.split('::')[1]
+ end
+
+ SEND_MESSAGE_CLIENT_METHODS = [SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH].freeze
def inject_context(context, client_method)
- return unless [SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH].include? client_method
+ return unless SEND_MESSAGE_CLIENT_METHODS.include? client_method
return unless instrumentation_config[:inject_messaging_context]
if client_method == SQS_SEND_MESSAGE_BATCH
context.params[:entries].each do |entry|
entry[:message_attributes] ||= {}
@@ -72,17 +79,10 @@
context.params[:message_attributes] ||= {}
OpenTelemetry.propagation.inject(context.params[:message_attributes], setter: MessageAttributeSetter)
end
end
- def prepare_extract_context(context, client_method)
- return unless client_method == SQS_RECEIVE_MESSAGE
- return unless instrumentation_config[:extract_messaging_context]
-
- context.params[:message_attribute_names] = ['All']
- end
-
def span_kind(client_method)
case client_method
when SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH
OpenTelemetry::Trace::SpanKind::PRODUCER
when SQS_RECEIVE_MESSAGE
@@ -93,12 +93,12 @@
end
def span_name(context, client_method)
case client_method
when SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH
- "#{MessagingHelper.destination_name(context)} send"
+ "#{MessagingHelper.queue_name(context)} send"
when SQS_RECEIVE_MESSAGE
- "#{MessagingHelper.destination_name(context)} receive"
+ "#{MessagingHelper.queue_name(context)} receive"
else
client_method
end
end
end