summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKamil Trzciński <ayufan@ayufan.eu>2019-01-25 10:48:50 +0000
committerKamil Trzciński <ayufan@ayufan.eu>2019-01-25 10:48:50 +0000
commitca52a1254edc89fdb195f5d10fbf7cbd233644a9 (patch)
tree7cb982258c5fefba5573c4ee0738452dff66b943 /lib
parent15a7f3c6af5286dee5188af045d3e80f95323472 (diff)
parent1b90ffc57336a74ba3417e8f7c0f75718d930dda (diff)
downloadgitlab-ce-ca52a1254edc89fdb195f5d10fbf7cbd233644a9.tar.gz
Merge branch 'an-opentracing-active-record-tracing' into 'master'
Adds tracing support for ActiveRecord notifications See merge request gitlab-org/gitlab-ce!24604
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/tracing/common.rb12
-rw-r--r--lib/gitlab/tracing/rails/active_record_subscriber.rb38
2 files changed, 49 insertions, 1 deletions
diff --git a/lib/gitlab/tracing/common.rb b/lib/gitlab/tracing/common.rb
index 5e2b12e3f90..3a08ede8138 100644
--- a/lib/gitlab/tracing/common.rb
+++ b/lib/gitlab/tracing/common.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'opentracing'
+
module Gitlab
module Tracing
module Common
@@ -32,6 +34,14 @@ module Gitlab
end
end
+ def postnotify_span(operation_name, start_time, end_time, tags: nil, child_of: nil, exception: nil)
+ span = OpenTracing.start_span(operation_name, start_time: start_time, tags: tags, child_of: child_of)
+
+ log_exception_on_span(span, exception) if exception
+
+ span.finish(end_time: end_time)
+ end
+
def log_exception_on_span(span, exception)
span.set_tag('error', true)
span.log_kv(kv_tags_for_exception(exception))
@@ -44,7 +54,7 @@ module Gitlab
'event': 'error',
'error.kind': exception.class.to_s,
'message': Gitlab::UrlSanitizer.sanitize(exception.message),
- 'stack': exception.backtrace.join("\n")
+ 'stack': exception.backtrace&.join("\n")
}
else
{
diff --git a/lib/gitlab/tracing/rails/active_record_subscriber.rb b/lib/gitlab/tracing/rails/active_record_subscriber.rb
new file mode 100644
index 00000000000..214eac47e14
--- /dev/null
+++ b/lib/gitlab/tracing/rails/active_record_subscriber.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Tracing
+ module Rails
+ class ActiveRecordSubscriber
+ include Gitlab::Tracing::Common
+
+ ACTIVE_RECORD_NOTIFICATION_TOPIC = 'sql.active_record'
+ DEFAULT_OPERATION_NAME = "sqlquery"
+
+ def self.instrument
+ subscriber = new
+
+ ActiveSupport::Notifications.subscribe(ACTIVE_RECORD_NOTIFICATION_TOPIC) do |_, start, finish, _, payload|
+ subscriber.notify(start, finish, payload)
+ end
+ end
+
+ # For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
+ def notify(start, finish, payload)
+ operation_name = payload[:name].presence || DEFAULT_OPERATION_NAME
+ exception = payload[:exception]
+ tags = {
+ 'component' => 'ActiveRecord',
+ 'span.kind' => 'client',
+ 'db.type' => 'sql',
+ 'db.connection_id' => payload[:connection_id],
+ 'db.cached' => payload[:cached] || false,
+ 'db.statement' => payload[:sql]
+ }
+
+ postnotify_span("active_record:#{operation_name}", start, finish, tags: tags, exception: exception)
+ end
+ end
+ end
+ end
+end