diff options
author | Kamil Trzciński <ayufan@ayufan.eu> | 2019-01-25 10:48:50 +0000 |
---|---|---|
committer | Kamil Trzciński <ayufan@ayufan.eu> | 2019-01-25 10:48:50 +0000 |
commit | ca52a1254edc89fdb195f5d10fbf7cbd233644a9 (patch) | |
tree | 7cb982258c5fefba5573c4ee0738452dff66b943 /lib | |
parent | 15a7f3c6af5286dee5188af045d3e80f95323472 (diff) | |
parent | 1b90ffc57336a74ba3417e8f7c0f75718d930dda (diff) | |
download | gitlab-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.rb | 12 | ||||
-rw-r--r-- | lib/gitlab/tracing/rails/active_record_subscriber.rb | 38 |
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 |