gitlab-labkit 0.10.0 → 0.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/labkit/context.rb +2 -1
- data/lib/labkit/tracing.rb +4 -0
- data/lib/labkit/tracing/rails.rb +8 -3
- data/lib/labkit/tracing/rails/abstract_instrumenter.rb +46 -0
- data/lib/labkit/tracing/rails/action_view.rb +16 -0
- data/lib/labkit/tracing/rails/action_view/render_collection_instrumenter.rb +25 -0
- data/lib/labkit/tracing/rails/action_view/render_partial_instrumenter.rb +20 -0
- data/lib/labkit/tracing/rails/action_view/render_template_instrumenter.rb +20 -0
- data/lib/labkit/tracing/rails/action_view/subscriber.rb +31 -0
- data/lib/labkit/tracing/rails/active_record.rb +14 -0
- data/lib/labkit/tracing/rails/active_record/sql_instrumenter.rb +30 -0
- data/lib/labkit/tracing/rails/active_record/subscriber.rb +25 -0
- data/lib/labkit/tracing/rails/active_support.rb +18 -0
- data/lib/labkit/tracing/rails/active_support/cache_delete_instrumenter.rb +20 -0
- data/lib/labkit/tracing/rails/active_support/cache_fetch_hit_instrumenter.rb +20 -0
- data/lib/labkit/tracing/rails/active_support/cache_generate_instrumenter.rb +20 -0
- data/lib/labkit/tracing/rails/active_support/cache_read_instrumenter.rb +25 -0
- data/lib/labkit/tracing/rails/active_support/cache_write_instrumenter.rb +20 -0
- data/lib/labkit/tracing/rails/active_support/subscriber.rb +35 -0
- data/lib/labkit/tracing/rails/rails_common.rb +2 -8
- data/lib/labkit/tracing/redis/redis_interceptor_helper.rb +2 -1
- data/lib/labkit/tracing/tracing_utils.rb +17 -3
- metadata +18 -5
- data/lib/labkit/tracing/rails/action_view_subscriber.rb +0 -70
- data/lib/labkit/tracing/rails/active_record_subscriber.rb +0 -52
- data/lib/labkit/tracing/rails/active_support_subscriber.rb +0 -86
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4aea03a17735936eac617c462fb55b220f639d99d13c029de0c15dc7ace629e
|
4
|
+
data.tar.gz: fbf9048f2750ce87927864deb37b82d69652b27695aff4876745f509b9d4d4de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 994ef11d2b1911eba33581b62136d4cc67b112491280710f31ea50ac04a6fb0037aa820ff3315c3146827acd6b017e10c3d6d1817d4a7aabd587c4567bcb2504
|
7
|
+
data.tar.gz: c522466510fad218e8ecb0376da5fe0478124f3a2adebfccedda7727b76cfa3d753f10ccb39ca94242746a0feee5d357cfd1ea2078b9b3ca9b823e688887e7dd
|
data/lib/labkit/context.rb
CHANGED
@@ -21,7 +21,8 @@ module Labkit
|
|
21
21
|
LOG_KEY = "meta"
|
22
22
|
CORRELATION_ID_KEY = "correlation_id"
|
23
23
|
RAW_KEYS = [CORRELATION_ID_KEY].freeze
|
24
|
-
KNOWN_KEYS = %w[user project root_namespace subscription_plan caller_id
|
24
|
+
KNOWN_KEYS = %w[user project root_namespace subscription_plan caller_id
|
25
|
+
related_class feature_category].freeze
|
25
26
|
|
26
27
|
class << self
|
27
28
|
def with_context(attributes = {})
|
data/lib/labkit/tracing.rb
CHANGED
@@ -28,6 +28,10 @@ module Labkit
|
|
28
28
|
ENV["GITLAB_TRACING_URL"]
|
29
29
|
end
|
30
30
|
|
31
|
+
def self.stacktrace_operations
|
32
|
+
@stacktrace_operations ||= Set.new(ENV["GITLAB_TRACING_INCLUDE_STACKTRACE"].to_s.split(",").map(&:strip))
|
33
|
+
end
|
34
|
+
|
31
35
|
def self.tracing_url_enabled?
|
32
36
|
enabled? && tracing_url_template.present?
|
33
37
|
end
|
data/lib/labkit/tracing/rails.rb
CHANGED
@@ -4,10 +4,15 @@ module Labkit
|
|
4
4
|
module Tracing
|
5
5
|
# Rails provides classes for instrumenting Rails events
|
6
6
|
module Rails
|
7
|
-
autoload :
|
8
|
-
autoload :
|
9
|
-
autoload :
|
7
|
+
autoload :AbstractInstrumenter, "labkit/tracing/rails/abstract_instrumenter"
|
8
|
+
autoload :ActionView, "labkit/tracing/rails/action_view"
|
9
|
+
autoload :ActiveRecord, "labkit/tracing/rails/active_record"
|
10
|
+
autoload :ActiveSupport, "labkit/tracing/rails/active_support"
|
10
11
|
autoload :RailsCommon, "labkit/tracing/rails/rails_common"
|
12
|
+
|
13
|
+
ActionViewSubscriber = ActionView::Subscriber
|
14
|
+
ActiveRecordSubscriber = ActiveRecord::Subscriber
|
15
|
+
ActiveSupportSubscriber = ActiveSupport::Subscriber
|
11
16
|
end
|
12
17
|
end
|
13
18
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/all"
|
4
|
+
|
5
|
+
module Labkit
|
6
|
+
module Tracing
|
7
|
+
module Rails
|
8
|
+
# https://edgeapi.rubyonrails.org/classes/ActiveSupport/Notifications/Instrumenter.html#method-c-new
|
9
|
+
class AbstractInstrumenter
|
10
|
+
def start(name, id, payload)
|
11
|
+
scope = OpenTracing.start_active_span(span_name(payload))
|
12
|
+
|
13
|
+
scope_stack.push scope
|
14
|
+
end
|
15
|
+
|
16
|
+
def finish(name, id, payload)
|
17
|
+
scope = scope_stack.pop
|
18
|
+
span = scope.span
|
19
|
+
|
20
|
+
Labkit::Tracing::TracingUtils.log_common_fields_on_span(span, span_name(payload))
|
21
|
+
|
22
|
+
exception = payload[:exception]
|
23
|
+
Labkit::Tracing::TracingUtils.log_exception_on_span(span, exception) if exception
|
24
|
+
|
25
|
+
tags(payload).each do |k, v|
|
26
|
+
span.set_tag(k, v)
|
27
|
+
end
|
28
|
+
|
29
|
+
scope.close
|
30
|
+
end
|
31
|
+
|
32
|
+
def scope_stack
|
33
|
+
Thread.current[:_labkit_trace_scope_stack] ||= []
|
34
|
+
end
|
35
|
+
|
36
|
+
def span_name(payload)
|
37
|
+
raise "span_name not implemented"
|
38
|
+
end
|
39
|
+
|
40
|
+
def tags(payload)
|
41
|
+
{}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActionView
|
7
|
+
autoload :RenderCollectionInstrumenter, "labkit/tracing/rails/action_view/render_collection_instrumenter"
|
8
|
+
autoload :RenderPartialInstrumenter, "labkit/tracing/rails/action_view/render_partial_instrumenter"
|
9
|
+
autoload :RenderTemplateInstrumenter, "labkit/tracing/rails/action_view/render_template_instrumenter"
|
10
|
+
autoload :Subscriber, "labkit/tracing/rails/action_view/subscriber"
|
11
|
+
|
12
|
+
COMPONENT_TAG = "ActionView"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActionView
|
7
|
+
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
8
|
+
class RenderCollectionInstrumenter < AbstractInstrumenter
|
9
|
+
def span_name(payload)
|
10
|
+
"render_collection"
|
11
|
+
end
|
12
|
+
|
13
|
+
def tags(payload)
|
14
|
+
{
|
15
|
+
"component" => COMPONENT_TAG,
|
16
|
+
"template.id" => payload[:identifier],
|
17
|
+
"template.count" => payload[:count] || 0,
|
18
|
+
"template.cache.hits" => payload[:cache_hits] || 0,
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActionView
|
7
|
+
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
8
|
+
class RenderPartialInstrumenter < AbstractInstrumenter
|
9
|
+
def span_name(payload)
|
10
|
+
"render_partial"
|
11
|
+
end
|
12
|
+
|
13
|
+
def tags(payload)
|
14
|
+
{ "component" => COMPONENT_TAG, "template.id" => payload[:identifier] }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActionView
|
7
|
+
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
8
|
+
class RenderTemplateInstrumenter < AbstractInstrumenter
|
9
|
+
def span_name(payload)
|
10
|
+
"render_template"
|
11
|
+
end
|
12
|
+
|
13
|
+
def tags(payload)
|
14
|
+
{ "component" => COMPONENT_TAG, "template.id" => payload[:identifier], "template.layout" => payload[:layout] }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActionView
|
7
|
+
# ActionView bridges action view notifications to
|
8
|
+
# the distributed tracing subsystem
|
9
|
+
class Subscriber
|
10
|
+
include RailsCommon
|
11
|
+
|
12
|
+
RENDER_TEMPLATE_NOTIFICATION_TOPIC = "render_template.action_view"
|
13
|
+
RENDER_COLLECTION_NOTIFICATION_TOPIC = "render_collection.action_view"
|
14
|
+
RENDER_PARTIAL_NOTIFICATION_TOPIC = "render_partial.action_view"
|
15
|
+
|
16
|
+
# Instruments Rails ActionView events for opentracing.
|
17
|
+
# Returns a lambda, which, when called will unsubscribe from the notifications
|
18
|
+
def self.instrument
|
19
|
+
subscriptions = [
|
20
|
+
::ActiveSupport::Notifications.subscribe(RENDER_TEMPLATE_NOTIFICATION_TOPIC, RenderTemplateInstrumenter.new),
|
21
|
+
::ActiveSupport::Notifications.subscribe(RENDER_COLLECTION_NOTIFICATION_TOPIC, RenderCollectionInstrumenter.new),
|
22
|
+
::ActiveSupport::Notifications.subscribe(RENDER_PARTIAL_NOTIFICATION_TOPIC, RenderPartialInstrumenter.new),
|
23
|
+
]
|
24
|
+
|
25
|
+
create_unsubscriber subscriptions
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveRecord
|
7
|
+
autoload :SqlInstrumenter, "labkit/tracing/rails/active_record/sql_instrumenter"
|
8
|
+
autoload :Subscriber, "labkit/tracing/rails/active_record/subscriber"
|
9
|
+
|
10
|
+
COMPONENT_TAG = "ActiveRecord"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveRecord
|
7
|
+
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
8
|
+
class SqlInstrumenter < AbstractInstrumenter
|
9
|
+
OPERATION_NAME_PREFIX = "active_record:"
|
10
|
+
DEFAULT_OPERATION_NAME = "sqlquery"
|
11
|
+
|
12
|
+
def span_name(payload)
|
13
|
+
OPERATION_NAME_PREFIX + (payload[:name].presence || DEFAULT_OPERATION_NAME)
|
14
|
+
end
|
15
|
+
|
16
|
+
def tags(payload)
|
17
|
+
{
|
18
|
+
"component" => COMPONENT_TAG,
|
19
|
+
"span.kind" => "client",
|
20
|
+
"db.type" => "sql",
|
21
|
+
"db.connection_id" => payload[:connection_id],
|
22
|
+
"db.cached" => payload[:cached] || false,
|
23
|
+
"db.statement" => payload[:sql],
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveRecord
|
7
|
+
# ActiveRecord bridges active record notifications to
|
8
|
+
# the distributed tracing subsystem
|
9
|
+
class Subscriber
|
10
|
+
include RailsCommon
|
11
|
+
|
12
|
+
ACTIVE_RECORD_NOTIFICATION_TOPIC = "sql.active_record"
|
13
|
+
|
14
|
+
# Instruments Rails ActiveRecord events for opentracing.
|
15
|
+
# Returns a lambda, which, when called will unsubscribe from the notifications
|
16
|
+
def self.instrument
|
17
|
+
subscription = ::ActiveSupport::Notifications.subscribe(ACTIVE_RECORD_NOTIFICATION_TOPIC, SqlInstrumenter.new)
|
18
|
+
|
19
|
+
create_unsubscriber [subscription]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveSupport
|
7
|
+
autoload :CacheDeleteInstrumenter, "labkit/tracing/rails/active_support/cache_delete_instrumenter"
|
8
|
+
autoload :CacheFetchHitInstrumenter, "labkit/tracing/rails/active_support/cache_fetch_hit_instrumenter"
|
9
|
+
autoload :CacheGenerateInstrumenter, "labkit/tracing/rails/active_support/cache_generate_instrumenter"
|
10
|
+
autoload :CacheReadInstrumenter, "labkit/tracing/rails/active_support/cache_read_instrumenter"
|
11
|
+
autoload :CacheWriteInstrumenter, "labkit/tracing/rails/active_support/cache_write_instrumenter"
|
12
|
+
autoload :Subscriber, "labkit/tracing/rails/active_support/subscriber"
|
13
|
+
|
14
|
+
COMPONENT_TAG = "ActiveSupport"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveSupport
|
7
|
+
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
8
|
+
class CacheDeleteInstrumenter < AbstractInstrumenter
|
9
|
+
def span_name(payload)
|
10
|
+
"cache_delete"
|
11
|
+
end
|
12
|
+
|
13
|
+
def tags(payload)
|
14
|
+
{ "component" => COMPONENT_TAG, "cache.key" => payload[:key] }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveSupport
|
7
|
+
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
8
|
+
class CacheFetchHitInstrumenter < AbstractInstrumenter
|
9
|
+
def span_name(payload)
|
10
|
+
"cache_fetch_hit"
|
11
|
+
end
|
12
|
+
|
13
|
+
def tags(payload)
|
14
|
+
{ "component" => COMPONENT_TAG, "cache.key" => payload[:key] }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveSupport
|
7
|
+
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
8
|
+
class CacheGenerateInstrumenter < AbstractInstrumenter
|
9
|
+
def span_name(payload)
|
10
|
+
"cache_generate"
|
11
|
+
end
|
12
|
+
|
13
|
+
def tags(payload)
|
14
|
+
{ "component" => COMPONENT_TAG, "cache.key" => payload[:key] }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveSupport
|
7
|
+
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
8
|
+
class CacheReadInstrumenter < AbstractInstrumenter
|
9
|
+
def span_name(payload)
|
10
|
+
"cache_read"
|
11
|
+
end
|
12
|
+
|
13
|
+
def tags(payload)
|
14
|
+
{
|
15
|
+
"component" => COMPONENT_TAG,
|
16
|
+
"cache.key" => payload[:key],
|
17
|
+
"cache.hit" => payload[:hit],
|
18
|
+
"cache.super_operation" => payload[:super_operation],
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveSupport
|
7
|
+
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
8
|
+
class CacheWriteInstrumenter < AbstractInstrumenter
|
9
|
+
def span_name(payload)
|
10
|
+
"cache_write"
|
11
|
+
end
|
12
|
+
|
13
|
+
def tags(payload)
|
14
|
+
{ "component" => COMPONENT_TAG, "cache.key" => payload[:key] }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labkit
|
4
|
+
module Tracing
|
5
|
+
module Rails
|
6
|
+
module ActiveSupport
|
7
|
+
# ActiveSupport bridges action active support notifications to
|
8
|
+
# the distributed tracing subsystem
|
9
|
+
class Subscriber
|
10
|
+
include RailsCommon
|
11
|
+
|
12
|
+
CACHE_READ_TOPIC = "cache_read.active_support"
|
13
|
+
CACHE_GENERATE_TOPIC = "cache_generate.active_support"
|
14
|
+
CACHE_FETCH_HIT_TOPIC = "cache_fetch_hit.active_support"
|
15
|
+
CACHE_WRITE_TOPIC = "cache_write.active_support"
|
16
|
+
CACHE_DELETE_TOPIC = "cache_delete.active_support"
|
17
|
+
|
18
|
+
# Instruments Rails ActiveSupport events for opentracing.
|
19
|
+
# Returns a lambda, which, when called will unsubscribe from the notifications
|
20
|
+
def self.instrument
|
21
|
+
subscriptions = [
|
22
|
+
::ActiveSupport::Notifications.subscribe(CACHE_READ_TOPIC, CacheReadInstrumenter.new),
|
23
|
+
::ActiveSupport::Notifications.subscribe(CACHE_GENERATE_TOPIC, CacheGenerateInstrumenter.new),
|
24
|
+
::ActiveSupport::Notifications.subscribe(CACHE_FETCH_HIT_TOPIC, CacheFetchHitInstrumenter.new),
|
25
|
+
::ActiveSupport::Notifications.subscribe(CACHE_WRITE_TOPIC, CacheWriteInstrumenter.new),
|
26
|
+
::ActiveSupport::Notifications.subscribe(CACHE_DELETE_TOPIC, CacheDeleteInstrumenter.new),
|
27
|
+
]
|
28
|
+
|
29
|
+
create_unsubscriber subscriptions
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -8,19 +8,13 @@ module Labkit
|
|
8
8
|
# RailsCommon is a mixin for providing instrumentation
|
9
9
|
# functionality for the rails instrumentation classes
|
10
10
|
module RailsCommon
|
11
|
-
extend ActiveSupport::Concern
|
11
|
+
extend ::ActiveSupport::Concern
|
12
12
|
|
13
13
|
class_methods do
|
14
14
|
def create_unsubscriber(subscriptions)
|
15
|
-
-> { subscriptions.each { |subscriber| ActiveSupport::Notifications.unsubscribe(subscriber) } }
|
15
|
+
-> { subscriptions.each { |subscriber| ::ActiveSupport::Notifications.unsubscribe(subscriber) } }
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
19
|
-
def generate_span_for_notification(operation_name, start, finish, payload, tags)
|
20
|
-
exception = payload[:exception]
|
21
|
-
|
22
|
-
TracingUtils.postnotify_span(operation_name, start, finish, tags: tags, exception: exception)
|
23
|
-
end
|
24
18
|
end
|
25
19
|
end
|
26
20
|
end
|
@@ -8,7 +8,7 @@ module Labkit
|
|
8
8
|
# RedisInterceptorHelper is a helper for the RedisInterceptor. This is not a public API
|
9
9
|
class RedisInterceptorHelper
|
10
10
|
# For optimization, compile this once
|
11
|
-
MASK_REDIS_RE = /^([\w-]+(?:\W+[\w-]+(?:\W+[\w-]+)?)?)(.?)/.freeze
|
11
|
+
MASK_REDIS_RE = /^([\w{}-]+(?:\W+[\w{}-]+(?:\W+[\w{}-]+)?)?)(.?)/.freeze
|
12
12
|
|
13
13
|
def self.call_with_tracing(command, client)
|
14
14
|
Labkit::Tracing::TracingUtils.with_tracing(operation_name: "redis.call", tags: tags_from_command(command, client)) do |_span|
|
@@ -99,6 +99,7 @@ module Labkit
|
|
99
99
|
return "" if argument.empty?
|
100
100
|
|
101
101
|
matches = argument.match(MASK_REDIS_RE)
|
102
|
+
|
102
103
|
matches[2].empty? ? matches[0] : matches[0] + "*****"
|
103
104
|
end
|
104
105
|
private_class_method :mask_redis_arg
|
@@ -12,9 +12,7 @@ module Labkit
|
|
12
12
|
scope = tracer.start_active_span(operation_name, child_of: child_of, tags: tags)
|
13
13
|
span = scope.span
|
14
14
|
|
15
|
-
|
16
|
-
correlation_id = Labkit::Correlation::CorrelationId.current_id
|
17
|
-
span.set_tag("correlation_id", correlation_id) if correlation_id
|
15
|
+
log_common_fields_on_span(span, operation_name)
|
18
16
|
|
19
17
|
begin
|
20
18
|
yield span
|
@@ -35,11 +33,19 @@ module Labkit
|
|
35
33
|
def self.postnotify_span(operation_name, start_time, end_time, tags: nil, child_of: nil, exception: nil)
|
36
34
|
span = OpenTracing.start_span(operation_name, start_time: start_time, tags: tags, child_of: child_of)
|
37
35
|
|
36
|
+
log_common_fields_on_span(span, operation_name)
|
38
37
|
log_exception_on_span(span, exception) if exception
|
39
38
|
|
40
39
|
span.finish(end_time: end_time)
|
41
40
|
end
|
42
41
|
|
42
|
+
# Add common fields to a span
|
43
|
+
def self.log_common_fields_on_span(span, operation_name)
|
44
|
+
correlation_id = Labkit::Correlation::CorrelationId.current_id
|
45
|
+
span.set_tag("correlation_id", correlation_id) if correlation_id
|
46
|
+
span.log_kv(stack: caller.join('\n')) if include_stacktrace?(operation_name)
|
47
|
+
end
|
48
|
+
|
43
49
|
# Add exception logging to a span
|
44
50
|
def self.log_exception_on_span(span, exception)
|
45
51
|
span.set_tag("error", true)
|
@@ -60,6 +66,14 @@ module Labkit
|
|
60
66
|
{ :"event" => "error", :"error.kind" => exception.class.to_s, :"error.object" => Labkit::Logging::Sanitizer.sanitize_field(exception.to_s) }
|
61
67
|
end
|
62
68
|
end
|
69
|
+
|
70
|
+
def self.include_stacktrace?(operation_name)
|
71
|
+
@include_stacktrace ||= Hash.new do |result, name|
|
72
|
+
result[name] = Tracing.stacktrace_operations.any? { |stacktrace_operation| name.starts_with?(stacktrace_operation) }
|
73
|
+
end
|
74
|
+
|
75
|
+
@include_stacktrace[operation_name]
|
76
|
+
end
|
63
77
|
end
|
64
78
|
end
|
65
79
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab-labkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Newdigate
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -301,9 +301,22 @@ files:
|
|
301
301
|
- lib/labkit/tracing/jaeger_factory.rb
|
302
302
|
- lib/labkit/tracing/rack_middleware.rb
|
303
303
|
- lib/labkit/tracing/rails.rb
|
304
|
-
- lib/labkit/tracing/rails/
|
305
|
-
- lib/labkit/tracing/rails/
|
306
|
-
- lib/labkit/tracing/rails/
|
304
|
+
- lib/labkit/tracing/rails/abstract_instrumenter.rb
|
305
|
+
- lib/labkit/tracing/rails/action_view.rb
|
306
|
+
- lib/labkit/tracing/rails/action_view/render_collection_instrumenter.rb
|
307
|
+
- lib/labkit/tracing/rails/action_view/render_partial_instrumenter.rb
|
308
|
+
- lib/labkit/tracing/rails/action_view/render_template_instrumenter.rb
|
309
|
+
- lib/labkit/tracing/rails/action_view/subscriber.rb
|
310
|
+
- lib/labkit/tracing/rails/active_record.rb
|
311
|
+
- lib/labkit/tracing/rails/active_record/sql_instrumenter.rb
|
312
|
+
- lib/labkit/tracing/rails/active_record/subscriber.rb
|
313
|
+
- lib/labkit/tracing/rails/active_support.rb
|
314
|
+
- lib/labkit/tracing/rails/active_support/cache_delete_instrumenter.rb
|
315
|
+
- lib/labkit/tracing/rails/active_support/cache_fetch_hit_instrumenter.rb
|
316
|
+
- lib/labkit/tracing/rails/active_support/cache_generate_instrumenter.rb
|
317
|
+
- lib/labkit/tracing/rails/active_support/cache_read_instrumenter.rb
|
318
|
+
- lib/labkit/tracing/rails/active_support/cache_write_instrumenter.rb
|
319
|
+
- lib/labkit/tracing/rails/active_support/subscriber.rb
|
307
320
|
- lib/labkit/tracing/rails/rails_common.rb
|
308
321
|
- lib/labkit/tracing/redis.rb
|
309
322
|
- lib/labkit/tracing/redis/redis_interceptor.rb
|
@@ -1,70 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Labkit
|
4
|
-
module Tracing
|
5
|
-
module Rails
|
6
|
-
# ActionViewSubscriber bridges action view notifications to
|
7
|
-
# the distributed tracing subsystem
|
8
|
-
class ActionViewSubscriber
|
9
|
-
include RailsCommon
|
10
|
-
|
11
|
-
COMPONENT_TAG = "ActionView"
|
12
|
-
RENDER_TEMPLATE_NOTIFICATION_TOPIC = "render_template.action_view"
|
13
|
-
RENDER_COLLECTION_NOTIFICATION_TOPIC = "render_collection.action_view"
|
14
|
-
RENDER_PARTIAL_NOTIFICATION_TOPIC = "render_partial.action_view"
|
15
|
-
|
16
|
-
# Instruments Rails ActionView events for opentracing.
|
17
|
-
# Returns a lambda, which, when called will unsubscribe from the notifications
|
18
|
-
def self.instrument
|
19
|
-
subscriber = new
|
20
|
-
|
21
|
-
subscriptions = [
|
22
|
-
ActiveSupport::Notifications.subscribe(RENDER_TEMPLATE_NOTIFICATION_TOPIC) do |_, start, finish, _, payload|
|
23
|
-
subscriber.notify_render_template(start, finish, payload)
|
24
|
-
end,
|
25
|
-
ActiveSupport::Notifications.subscribe(RENDER_COLLECTION_NOTIFICATION_TOPIC) do |_, start, finish, _, payload|
|
26
|
-
subscriber.notify_render_collection(start, finish, payload)
|
27
|
-
end,
|
28
|
-
ActiveSupport::Notifications.subscribe(RENDER_PARTIAL_NOTIFICATION_TOPIC) do |_, start, finish, _, payload|
|
29
|
-
subscriber.notify_render_partial(start, finish, payload)
|
30
|
-
end,
|
31
|
-
]
|
32
|
-
|
33
|
-
create_unsubscriber subscriptions
|
34
|
-
end
|
35
|
-
|
36
|
-
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
37
|
-
def notify_render_template(start, finish, payload)
|
38
|
-
generate_span_for_notification("render_template", start, finish, payload, tags_for_render_template(payload))
|
39
|
-
end
|
40
|
-
|
41
|
-
def notify_render_collection(start, finish, payload)
|
42
|
-
generate_span_for_notification("render_collection", start, finish, payload, tags_for_render_collection(payload))
|
43
|
-
end
|
44
|
-
|
45
|
-
def notify_render_partial(start, finish, payload)
|
46
|
-
generate_span_for_notification("render_partial", start, finish, payload, tags_for_render_partial(payload))
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def tags_for_render_template(payload)
|
52
|
-
{ "component" => COMPONENT_TAG, "template.id" => payload[:identifier], "template.layout" => payload[:layout] }
|
53
|
-
end
|
54
|
-
|
55
|
-
def tags_for_render_collection(payload)
|
56
|
-
{
|
57
|
-
"component" => COMPONENT_TAG,
|
58
|
-
"template.id" => payload[:identifier],
|
59
|
-
"template.count" => payload[:count] || 0,
|
60
|
-
"template.cache.hits" => payload[:cache_hits] || 0,
|
61
|
-
}
|
62
|
-
end
|
63
|
-
|
64
|
-
def tags_for_render_partial(payload)
|
65
|
-
{ "component" => COMPONENT_TAG, "template.id" => payload[:identifier] }
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Labkit
|
4
|
-
module Tracing
|
5
|
-
module Rails
|
6
|
-
# ActiveRecordSubscriber bridges active record notifications to
|
7
|
-
# the distributed tracing subsystem
|
8
|
-
class ActiveRecordSubscriber
|
9
|
-
include RailsCommon
|
10
|
-
|
11
|
-
ACTIVE_RECORD_NOTIFICATION_TOPIC = "sql.active_record"
|
12
|
-
OPERATION_NAME_PREFIX = "active_record:"
|
13
|
-
DEFAULT_OPERATION_NAME = "sqlquery"
|
14
|
-
|
15
|
-
# Instruments Rails ActiveRecord events for opentracing.
|
16
|
-
# Returns a lambda, which, when called will unsubscribe from the notifications
|
17
|
-
def self.instrument
|
18
|
-
subscriber = new
|
19
|
-
|
20
|
-
subscription =
|
21
|
-
ActiveSupport::Notifications.subscribe(ACTIVE_RECORD_NOTIFICATION_TOPIC) do |_, start, finish, _, payload|
|
22
|
-
subscriber.notify(start, finish, payload)
|
23
|
-
end
|
24
|
-
|
25
|
-
create_unsubscriber [subscription]
|
26
|
-
end
|
27
|
-
|
28
|
-
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
29
|
-
def notify(start, finish, payload)
|
30
|
-
generate_span_for_notification(notification_name(payload), start, finish, payload, tags_for_notification(payload))
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def notification_name(payload)
|
36
|
-
OPERATION_NAME_PREFIX + (payload[:name].presence || DEFAULT_OPERATION_NAME)
|
37
|
-
end
|
38
|
-
|
39
|
-
def tags_for_notification(payload)
|
40
|
-
{
|
41
|
-
"component" => "ActiveRecord",
|
42
|
-
"span.kind" => "client",
|
43
|
-
"db.type" => "sql",
|
44
|
-
"db.connection_id" => payload[:connection_id],
|
45
|
-
"db.cached" => payload[:cached] || false,
|
46
|
-
"db.statement" => payload[:sql],
|
47
|
-
}
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Labkit
|
4
|
-
module Tracing
|
5
|
-
module Rails
|
6
|
-
# ActiveSupport bridges action active support notifications to
|
7
|
-
# the distributed tracing subsystem
|
8
|
-
class ActiveSupportSubscriber
|
9
|
-
include RailsCommon
|
10
|
-
|
11
|
-
COMPONENT_TAG = "ActiveSupport"
|
12
|
-
|
13
|
-
CACHE_READ_TOPIC = "cache_read.active_support"
|
14
|
-
CACHE_GENERATE_TOPIC = "cache_generate.active_support"
|
15
|
-
CACHE_FETCH_HIT_TOPIC = "cache_fetch_hit.active_support"
|
16
|
-
CACHE_WRITE_TOPIC = "cache_write.active_support"
|
17
|
-
CACHE_DELETE_TOPIC = "cache_delete.active_support"
|
18
|
-
|
19
|
-
# Instruments Rails ActiveSupport events for opentracing.
|
20
|
-
# Returns a lambda, which, when called will unsubscribe from the notifications
|
21
|
-
def self.instrument
|
22
|
-
subscriber = new
|
23
|
-
|
24
|
-
subscriptions = [
|
25
|
-
ActiveSupport::Notifications.subscribe(CACHE_READ_TOPIC) do |_, start, finish, _, payload|
|
26
|
-
subscriber.notify_cache_read(start, finish, payload)
|
27
|
-
end,
|
28
|
-
ActiveSupport::Notifications.subscribe(CACHE_GENERATE_TOPIC) do |_, start, finish, _, payload|
|
29
|
-
subscriber.notify_cache_generate(start, finish, payload)
|
30
|
-
end,
|
31
|
-
ActiveSupport::Notifications.subscribe(CACHE_FETCH_HIT_TOPIC) do |_, start, finish, _, payload|
|
32
|
-
subscriber.notify_cache_fetch_hit(start, finish, payload)
|
33
|
-
end,
|
34
|
-
ActiveSupport::Notifications.subscribe(CACHE_WRITE_TOPIC) do |_, start, finish, _, payload|
|
35
|
-
subscriber.notify_cache_write(start, finish, payload)
|
36
|
-
end,
|
37
|
-
ActiveSupport::Notifications.subscribe(CACHE_DELETE_TOPIC) do |_, start, finish, _, payload|
|
38
|
-
subscriber.notify_cache_delete(start, finish, payload)
|
39
|
-
end,
|
40
|
-
]
|
41
|
-
|
42
|
-
create_unsubscriber subscriptions
|
43
|
-
end
|
44
|
-
|
45
|
-
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html#active-support
|
46
|
-
def notify_cache_read(start, finish, payload)
|
47
|
-
generate_span_for_notification("cache_read", start, finish, payload, tags_for_cache_read(payload))
|
48
|
-
end
|
49
|
-
|
50
|
-
def notify_cache_generate(start, finish, payload)
|
51
|
-
generate_span_for_notification("cache_generate", start, finish, payload, tags_for_key(payload))
|
52
|
-
end
|
53
|
-
|
54
|
-
def notify_cache_fetch_hit(start, finish, payload)
|
55
|
-
generate_span_for_notification("cache_fetch_hit", start, finish, payload, tags_for_key(payload))
|
56
|
-
end
|
57
|
-
|
58
|
-
def notify_cache_write(start, finish, payload)
|
59
|
-
generate_span_for_notification("cache_write", start, finish, payload, tags_for_key(payload))
|
60
|
-
end
|
61
|
-
|
62
|
-
def notify_cache_delete(start, finish, payload)
|
63
|
-
generate_span_for_notification("cache_delete", start, finish, payload, tags_for_key(payload))
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def tags_for_cache_read(payload)
|
69
|
-
{
|
70
|
-
"component" => COMPONENT_TAG,
|
71
|
-
"cache.key" => payload[:key],
|
72
|
-
"cache.hit" => payload[:hit],
|
73
|
-
"cache.super_operation" => payload[:super_operation],
|
74
|
-
}
|
75
|
-
end
|
76
|
-
|
77
|
-
def tags_for_key(payload)
|
78
|
-
{
|
79
|
-
"component" => COMPONENT_TAG,
|
80
|
-
"cache.key" => payload[:key],
|
81
|
-
}
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|