lib/ddtrace/contrib/mongodb/subscribers.rb in ddtrace-0.18.2 vs lib/ddtrace/contrib/mongodb/subscribers.rb in ddtrace-0.18.3
- old
+ new
@@ -15,12 +15,11 @@
# is safe since it's a unique id used to link events together. Also only one
# thread is involved in this execution so thread-local storage should be safe. Reference:
# https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/monitoring.rb#L70
# https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/monitoring/publishable.rb#L38-L56
span = pin.tracer.trace(Ext::SPAN_COMMAND, service: pin.service, span_type: Ext::SPAN_TYPE_COMMAND)
- Thread.current[:datadog_mongo_span] ||= {}
- Thread.current[:datadog_mongo_span][event.request_id] = span
+ set_span(event, span)
# build a quantized Query using the Parser module
query = MongoDB.query_builder(event.command_name, event.database_name, event.command)
serialized_query = query.to_s
@@ -36,11 +35,11 @@
# set the resource with the quantized query
span.resource = serialized_query
end
def failed(event)
- span = Thread.current[:datadog_mongo_span][event.request_id]
+ span = get_span(event)
return unless span
# the failure is not a real exception because it's handled by
# the framework itself, so we set only the error and the message
span.set_error(event)
@@ -48,15 +47,15 @@
Datadog::Tracer.log.debug("error when handling MongoDB 'failed' event: #{e}")
ensure
# whatever happens, the Span must be removed from the local storage and
# it must be finished to prevent any leak
span.finish unless span.nil?
- Thread.current[:datadog_mongo_span].delete(event.request_id)
+ clear_span(event)
end
def succeeded(event)
- span = Thread.current[:datadog_mongo_span][event.request_id]
+ span = get_span(event)
return unless span
# add fields that are available only after executing the query
rows = event.reply.fetch('n', nil)
span.set_tag(Ext::TAG_ROWS, rows) unless rows.nil?
@@ -64,9 +63,26 @@
Datadog::Tracer.log.debug("error when handling MongoDB 'succeeded' event: #{e}")
ensure
# whatever happens, the Span must be removed from the local storage and
# it must be finished to prevent any leak
span.finish unless span.nil?
+ clear_span(event)
+ end
+
+ private
+
+ def get_span(event)
+ Thread.current[:datadog_mongo_span] \
+ && Thread.current[:datadog_mongo_span][event.request_id]
+ end
+
+ def set_span(event, span)
+ Thread.current[:datadog_mongo_span] ||= {}
+ Thread.current[:datadog_mongo_span][event.request_id] = span
+ end
+
+ def clear_span(event)
+ return if Thread.current[:datadog_mongo_span].nil?
Thread.current[:datadog_mongo_span].delete(event.request_id)
end
end
end
end