opentelemetry-instrumentation-action_view 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 90c7bcecc2f3949e79523c0406503212f2bc54477aaf4dd677314e164a09067c
4
- data.tar.gz: 042d4e54e62d8650079a50066e6a9b739524f5fa47f68cf9980e41c0babdaa92
3
+ metadata.gz: 62bb2b892d835cb28873c5dd2e5a682ef3a041853a05a8cad2e697c5d4e55d55
4
+ data.tar.gz: 3033a19d95b625d9503344aa907d5fdd51ef8275c7f3a9e9978aee3eafd6416f
5
5
  SHA512:
6
- metadata.gz: 165bcf906fd27e99c35acbd3421375544a9fc7531eef8939f75713fa6b2f94b557c5d6e929981928cf1fcca71683f9c2120535ce30ff6bab0ea36569a51fd9b5
7
- data.tar.gz: f2ee6bfee8771aae53d7301ad9c0eb56df55996fde55a4b5a38b2c9d2d9cf3ea7e06be7621d6dbdbf83f4d802bbc026455b65389cc601e6e8a40310c22432911
6
+ metadata.gz: 2ebd63ee4576b464dccce7fe51abd02c3b3eb86411a1d4b709e39c2590c0d09999ae8dc5f63c551be1f4a4003ec89dd1972c58eb29138d175312a6839a66fe5e
7
+ data.tar.gz: 54cd21b7714c1d78790eed3ab1627b6eaf5142f26016b3e3dbd57083adda41466500effbbb5170d5693fa190d89fdc4df9b428ba3a2e507639101126ef5fd6f3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Release History: opentelemetry-instrumentation-action_view
2
2
 
3
+ ### v0.1.3 / 2021-10-06
4
+
5
+ * FIXED: Do not replace fanout
6
+
3
7
  ### v0.1.2 / 2021-09-29
4
8
 
5
9
  * (No significant changes)
data/README.md CHANGED
@@ -36,6 +36,22 @@ end
36
36
 
37
37
  Example usage can be seen in the `./example/trace_request_demonstration.ru` file [here](https://github.com/open-telemetry/opentelemetry-ruby/blob/main/instrumentation/action_view/example/trace_request_demonstration.ru)
38
38
 
39
+ ## Known issues
40
+
41
+ ActionView instrumentation uses ActiveSupport notifications and in the case when a subscriber raises in start method an unclosed span would break successive spans ends. Example:
42
+
43
+ ```ruby
44
+ class CrashingEndSubscriber
45
+ def start(name, id, payload)
46
+ raise 'boom'
47
+ end
48
+
49
+ def finish(name, id, payload) end
50
+ end
51
+
52
+ ::ActiveSupport::Notifications.subscribe('render_template.action_view', CrashingStartSubscriber.new)
53
+ ```
54
+
39
55
  ## How can I get involved?
40
56
 
41
57
  The `opentelemetry-instrumentation-action_view` gem source is [on github][repo-github], along with related gems including `opentelemetry-api` and `opentelemetry-sdk`.
@@ -28,7 +28,6 @@ module OpenTelemetry
28
28
  private
29
29
 
30
30
  def require_dependencies
31
- require_relative 'fanout'
32
31
  require_relative 'span_subscriber'
33
32
  require_relative 'railtie'
34
33
  end
@@ -15,17 +15,14 @@ module OpenTelemetry
15
15
 
16
16
  # This Railtie sets up subscriptions to relevant ActionView notifications
17
17
  class Railtie < ::Rails::Railtie
18
- config.before_initialize do
19
- ::ActiveSupport::Notifications.notifier = Fanout.new(::ActiveSupport::Notifications.notifier)
20
- end
21
-
22
18
  config.after_initialize do
23
19
  SUBSCRIPTIONS.each do |subscription_name|
24
20
  subscriber = OpenTelemetry::Instrumentation::ActionView::SpanSubscriber.new(
25
21
  name: subscription_name,
26
22
  tracer: ActionView::Instrumentation.instance.tracer
27
23
  )
28
- ::ActiveSupport::Notifications.notifier.subscribe(subscription_name, subscriber)
24
+
25
+ ::OpenTelemetry::Instrumentation::ActionView.subscribe(subscription_name, subscriber)
29
26
  end
30
27
  end
31
28
  end
@@ -6,10 +6,27 @@
6
6
 
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
+ # rubocop:disable Style/Documentation
9
10
  module ActionView
10
11
  # The SpanSubscriber is a special ActiveSupport::Notification subscription
11
12
  # handler which turns notifications into generic spans, taking care to handle
12
13
  # context appropriately.
14
+
15
+ # A very hacky way to make sure that OpenTelemetry::Instrumentation::ActionView::SpanSubscriber
16
+ # gets invoked first
17
+ def self.subscribe(pattern = nil, callable = nil)
18
+ ActiveSupport::Notifications.subscribe(pattern, callable)
19
+ ::ActiveSupport::Notifications.notifier.synchronize do
20
+ if ::Rails::VERSION::MAJOR == 6
21
+ s = ::ActiveSupport::Notifications.notifier.instance_variable_get(:@string_subscribers)[pattern].pop
22
+ ::ActiveSupport::Notifications.notifier.instance_variable_get(:@string_subscribers)[pattern].unshift(s)
23
+ else
24
+ s = ::ActiveSupport::Notifications.notifier.instance_variable_get(:@subscribers).pop
25
+ ::ActiveSupport::Notifications.notifier.instance_variable_get(:@subscribers).unshift(s)
26
+ end
27
+ end
28
+ end
29
+
13
30
  class SpanSubscriber
14
31
  ALWAYS_VALID_PAYLOAD_TYPES = [TrueClass, FalseClass, String, Numeric, Symbol].freeze
15
32
 
@@ -18,16 +35,20 @@ module OpenTelemetry
18
35
  @tracer = tracer
19
36
  end
20
37
 
21
- def start(_name, _id, payload)
38
+ def start(name, id, payload)
22
39
  span = @tracer.start_span(@span_name, kind: :internal)
23
40
  token = OpenTelemetry::Context.attach(
24
41
  OpenTelemetry::Trace.context_with_span(span)
25
42
  )
43
+ payload.merge!(
44
+ __opentelemetry_span: span,
45
+ __opentelemetry_ctx_token: token
46
+ )
26
47
 
27
48
  [span, token]
28
49
  end
29
50
 
30
- def finish(_name, _id, payload) # rubocop:disable Metrics/AbcSize
51
+ def finish(name, id, payload) # rubocop:disable Metrics/AbcSize
31
52
  span = payload.delete(:__opentelemetry_span)
32
53
  token = payload.delete(:__opentelemetry_ctx_token)
33
54
  return unless span && token
@@ -86,4 +107,5 @@ module OpenTelemetry
86
107
  end
87
108
  end
88
109
  end
110
+ # rubocop:enable Style/Documentation
89
111
  end
@@ -7,7 +7,7 @@
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
9
  module ActionView
10
- VERSION = '0.1.2'
10
+ VERSION = '0.1.3'
11
11
  end
12
12
  end
13
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-instrumentation-action_view
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-30 00:00:00.000000000 Z
11
+ date: 2021-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -206,7 +206,6 @@ files:
206
206
  - lib/opentelemetry-instrumentation-action_view.rb
207
207
  - lib/opentelemetry/instrumentation.rb
208
208
  - lib/opentelemetry/instrumentation/action_view.rb
209
- - lib/opentelemetry/instrumentation/action_view/fanout.rb
210
209
  - lib/opentelemetry/instrumentation/action_view/instrumentation.rb
211
210
  - lib/opentelemetry/instrumentation/action_view/railtie.rb
212
211
  - lib/opentelemetry/instrumentation/action_view/span_subscriber.rb
@@ -215,10 +214,10 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
215
214
  licenses:
216
215
  - Apache-2.0
217
216
  metadata:
218
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-action_view/v0.1.2/file.CHANGELOG.html
217
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-action_view/v0.1.3/file.CHANGELOG.html
219
218
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/instrumentation/action_view
220
219
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
221
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-action_view/v0.1.2
220
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-action_view/v0.1.3
222
221
  post_install_message:
223
222
  rdoc_options: []
224
223
  require_paths:
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright The OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
- #
7
- require 'delegate'
8
-
9
- module OpenTelemetry
10
- module Instrumentation
11
- module ActionView
12
- # This is a replacement for the default Fanout notifications queue, which adds special
13
- # handling around returned context from the SpanSubscriber notification handlers.
14
- # Used together, it allows us to trace arbitrary ActiveSupport::Notifications safely.
15
- class Fanout < DelegateClass(::ActiveSupport::Notifications::Fanout)
16
- def initialize(notifier = ::ActiveSupport::Notifications::Fanout.new)
17
- super(notifier)
18
- end
19
-
20
- def start(name, id, payload)
21
- listeners_for(name).map do |s|
22
- result = [s]
23
- state = s.start(name, id, payload)
24
- if state.is_a?(Array) && state[0].is_a?(OpenTelemetry::Trace::Span) && state[1] # rubocop:disable Style/IfUnlessModifier
25
- result << state
26
- end
27
-
28
- result
29
- end
30
- end
31
-
32
- def finish(name, id, payload, listeners = listeners_for(name))
33
- listeners.each do |(s, arr)|
34
- span, token = arr
35
- if span.is_a?(OpenTelemetry::Trace::Span) && token
36
- s.finish(
37
- name,
38
- id,
39
- payload.merge(
40
- __opentelemetry_span: span,
41
- __opentelemetry_ctx_token: token
42
- )
43
- )
44
- else
45
- s.finish(name, id, payload)
46
- end
47
- end
48
- end
49
-
50
- def listeners_for(name)
51
- listeners = super
52
- listeners.sort_by do |l|
53
- l.instance_variable_get(:@delegate).is_a?(SpanSubscriber) ? -1 : 1
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end