opentelemetry-instrumentation-rack 0.22.1 → 0.23.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 766d30a643636adfbfb357b96dda9addc63c8cfb7e2b8ee35a893c34f4233c25
4
- data.tar.gz: 790c9adba407dc6d7fd85d897dec535e862df9c55bf6f91a80f444ca43f8435f
3
+ metadata.gz: efa36f4ae67d3a3e2de6f92da89a95d06ec9e65ed2064ee27d797f9435260155
4
+ data.tar.gz: 88a07f80089ee518f2cffbc06369420ec01bd899edcef5cd3deb0ac2cafdf5e6
5
5
  SHA512:
6
- metadata.gz: a1be43a42526e9b0719b6662ac66375679a5e3d4c9375832db919ced6d1f64124de7e2d5aefb50d8bede8d1285d2405379abb5c3babc96d642379976a3dcbbac
7
- data.tar.gz: 701c79134f82f16c4485e084546359c76e47dfd66e9fef67da3e9c77744446650260360302458adea7a43d09562cc9f21eb6699be6ea498f63b4a3228b174eb4
6
+ metadata.gz: 53813669484205e7de27a9f02d63afdd3073e9668a93d1c268471dcfd71af41c0244d5b8d0b1946309cf35aa810cce6ae9cf40fc1e2b894d7c588af843c3c84f
7
+ data.tar.gz: b80006cc0690a53f42253146c4885fc124a9f19596309babad229fef80b420688c73f0903bf0721702f4cadae730dbb648f37cb3e8785abb54cab76c3c5a442d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Release History: opentelemetry-instrumentation-rack
2
2
 
3
+ ### v0.23.1 / 2023-06-05
4
+
5
+ * FIXED: Base config options
6
+
7
+ ### v0.23.0 / 2023-04-17
8
+
9
+ * BREAKING CHANGE: Remove retain_middleware_names Rack Option
10
+ * BREAKING CHANGE: Drop support for EoL Ruby 2.7
11
+
12
+ * ADDED: Remove retain_middleware_names Rack Option
13
+ * ADDED: Drop support for EoL Ruby 2.7
14
+ * ADDED: Use Rack::Events for instrumentation
15
+
3
16
  ### v0.22.1 / 2023-01-14
4
17
 
5
18
  * DOCS: Fix gem homepage
@@ -12,10 +12,8 @@ module OpenTelemetry
12
12
  # The Instrumentation class contains logic to detect and install the Rack
13
13
  # instrumentation
14
14
  class Instrumentation < OpenTelemetry::Instrumentation::Base
15
- install do |config|
15
+ install do |_config|
16
16
  require_dependencies
17
-
18
- retain_middleware_names if config[:retain_middleware_names]
19
17
  end
20
18
 
21
19
  present do
@@ -26,40 +24,59 @@ module OpenTelemetry
26
24
  option :allowed_response_headers, default: [], validate: :array
27
25
  option :application, default: nil, validate: :callable
28
26
  option :record_frontend_span, default: false, validate: :boolean
29
- option :retain_middleware_names, default: false, validate: :boolean
30
27
  option :untraced_endpoints, default: [], validate: :array
31
28
  option :url_quantization, default: nil, validate: :callable
32
29
  option :untraced_requests, default: nil, validate: :callable
33
30
  option :response_propagators, default: [], validate: :array
31
+ # This option is only valid for applicaitons using Rack 2.0 or greater
32
+ option :use_rack_events, default: false, validate: :boolean
33
+
34
+ # Temporary Helper for Sinatra and ActionPack middleware to use during installation
35
+ #
36
+ # @example Default usage
37
+ # Rack::Builder.new do
38
+ # use *OpenTelemetry::Instrumentation::Rack::Instrumenation.instance.middleware_args
39
+ # run lambda { |_arg| [200, { 'Content-Type' => 'text/plain' }, body] }
40
+ # end
41
+ # @return [Array] consisting of a middleware and arguments used in rack builders
42
+ def middleware_args
43
+ if config.fetch(:use_rack_events, false) == true && defined?(::Rack::Events)
44
+ [::Rack::Events, [OpenTelemetry::Instrumentation::Rack::Middlewares::EventHandler.new]]
45
+ else
46
+ [OpenTelemetry::Instrumentation::Rack::Middlewares::TracerMiddleware]
47
+ end
48
+ end
34
49
 
35
50
  private
36
51
 
37
52
  def require_dependencies
53
+ require_relative 'middlewares/event_handler' if defined?(Rack::Events)
38
54
  require_relative 'middlewares/tracer_middleware'
39
55
  end
40
56
 
41
- MissingApplicationError = Class.new(StandardError)
42
-
43
- # intercept all middleware-compatible calls, retain class name
44
- def retain_middleware_names
45
- next_middleware = config[:application]
46
- raise MissingApplicationError unless next_middleware
47
-
48
- while next_middleware
49
- if next_middleware.respond_to?(:call)
50
- next_middleware.singleton_class.class_eval do
51
- alias_method :__call, :call
52
-
53
- def call(env)
54
- env['RESPONSE_MIDDLEWARE'] = self.class.to_s
55
- __call(env)
56
- end
57
- end
57
+ def config_options(user_config)
58
+ config = super(user_config)
59
+ config[:allowed_rack_request_headers] = config[:allowed_request_headers].compact.each_with_object({}) do |header, memo|
60
+ key = header.to_s.upcase.gsub(/[-\s]/, '_')
61
+ case key
62
+ when 'CONTENT_TYPE', 'CONTENT_LENGTH'
63
+ memo[key] = build_attribute_name('http.request.header.', header)
64
+ else
65
+ memo["HTTP_#{key}"] = build_attribute_name('http.request.header.', header)
58
66
  end
67
+ end
59
68
 
60
- next_middleware = next_middleware.instance_variable_defined?('@app') &&
61
- next_middleware.instance_variable_get('@app')
69
+ config[:allowed_rack_response_headers] = config[:allowed_response_headers].each_with_object({}) do |header, memo|
70
+ memo[header] = build_attribute_name('http.response.header.', header)
71
+ memo[header.to_s.upcase] = build_attribute_name('http.response.header.', header)
62
72
  end
73
+
74
+ config[:untraced_endpoints]&.compact!
75
+ config
76
+ end
77
+
78
+ def build_attribute_name(prefix, suffix)
79
+ prefix + suffix.to_s.downcase.gsub(/[-\s]/, '_')
63
80
  end
64
81
  end
65
82
  end
@@ -0,0 +1,271 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ require_relative '../util'
8
+ require 'opentelemetry/trace/status'
9
+
10
+ module OpenTelemetry
11
+ module Instrumentation
12
+ module Rack
13
+ module Middlewares
14
+ # OTel Rack Event Handler
15
+ #
16
+ # This seeds the root context for this service with the server span as the `current_span`
17
+ # allowing for callers later in the stack to reference it using {OpenTelemetry::Trace.current_span}
18
+ #
19
+ # It also registers the server span in a context dedicated to this instrumentation that users may look up
20
+ # using {OpenTelemetry::Instrumentation::Rack.current_span}, which makes it possible for users to mutate the span,
21
+ # e.g. add events or update the span name like in the {ActionPack} instrumentation.
22
+ #
23
+ # @example Rack App Using BodyProxy
24
+ # GLOBAL_LOGGER = Logger.new($stderr)
25
+ # APP_TRACER = OpenTelemetry.tracer_provider.tracer('my-app', '1.0.0')
26
+ #
27
+ # Rack::Builder.new do
28
+ # use Rack::Events, [OpenTelemetry::Instrumentation::Rack::Middlewares::EventHandler.new]
29
+ # run lambda { |_arg|
30
+ # APP_TRACER.in_span('hello-world') do |_span|
31
+ # body = Rack::BodyProxy.new(['hello world!']) do
32
+ # rack_span = OpenTelemetry::Instrumentation::Rack.current_span
33
+ # GLOBAL_LOGGER.info("otel.trace_id=#{rack_span.context.hex_trace_id} otel.span_id=#{rack_span.context.hex_span_id}")
34
+ # end
35
+ # [200, { 'Content-Type' => 'text/plain' }, body]
36
+ # end
37
+ # }
38
+ # end
39
+ #
40
+ # @see Rack::Events
41
+ # @see OpenTelemetry::Instrumentation::Rack.current_span
42
+ class EventHandler
43
+ include ::Rack::Events::Abstract
44
+
45
+ TOKENS_KEY = 'otel.context.tokens'
46
+ GOOD_HTTP_STATUSES = (100..499)
47
+
48
+ # Creates a server span for this current request using the incoming parent context
49
+ # and registers them as the {current_span}
50
+ #
51
+ # @param [Rack::Request] The current HTTP request
52
+ # @param [Rack::Response] This is nil in practice
53
+ # @return [void]
54
+ def on_start(request, _)
55
+ return if untraced_request?(request.env)
56
+
57
+ parent_context = extract_remote_context(request)
58
+ span = create_span(parent_context, request)
59
+ request.env[TOKENS_KEY] = register_current_span(span)
60
+ rescue StandardError => e
61
+ OpenTelemetry.handle_error(exception: e)
62
+ end
63
+
64
+ # Optionally adds debugging response headers injected from {response_propagators}
65
+ #
66
+ # @param [Rack::Request] The current HTTP request
67
+ # @param [Rack::Response] This current HTTP response
68
+ # @return [void]
69
+ def on_commit(request, response)
70
+ span = OpenTelemetry::Instrumentation::Rack.current_span
71
+ return unless span.recording?
72
+
73
+ response_propagators&.each do |propagator|
74
+ propagator.inject(response.headers)
75
+ rescue StandardError => e
76
+ OpenTelemetry.handle_error(message: 'Unable to inject response propagation headers', exception: e)
77
+ end
78
+ rescue StandardError => e
79
+ OpenTelemetry.handle_error(exception: e)
80
+ end
81
+
82
+ # Records Unexpected Exceptions on the Rack span and set the Span Status to Error
83
+ #
84
+ # @note does nothing if the span is a non-recording span
85
+ # @param [Rack::Request] The current HTTP request
86
+ # @param [Rack::Response] The current HTTP response
87
+ # @param [Exception] An unxpected error raised by the application
88
+ def on_error(request, _, error)
89
+ span = OpenTelemetry::Instrumentation::Rack.current_span
90
+ return unless span.recording?
91
+
92
+ span.record_exception(error)
93
+ span.status = OpenTelemetry::Trace::Status.error
94
+ rescue StandardError => e
95
+ OpenTelemetry.handle_error(exception: e)
96
+ end
97
+
98
+ # Finishes the span making it eligible to be exported and cleans up existing contexts
99
+ #
100
+ # @note does nothing if the span is a non-recording span
101
+ # @param [Rack::Request] The current HTTP request
102
+ # @param [Rack::Response] The current HTTP response
103
+ def on_finish(request, response)
104
+ span = OpenTelemetry::Instrumentation::Rack.current_span
105
+ return unless span.recording?
106
+
107
+ add_response_attributes(span, response) if response
108
+ rescue StandardError => e
109
+ OpenTelemetry.handle_error(exception: e)
110
+ ensure
111
+ detach_contexts(request)
112
+ end
113
+
114
+ private
115
+
116
+ EMPTY_HASH = {}.freeze
117
+ def extract_request_headers(env)
118
+ return EMPTY_HASH if allowed_request_headers.empty?
119
+
120
+ allowed_request_headers.each_with_object({}) do |(key, value), result|
121
+ result[value] = env[key] if env.key?(key)
122
+ end
123
+ end
124
+
125
+ def extract_response_attributes(response)
126
+ attributes = { 'http.status_code' => response.status.to_i }
127
+ attributes.merge!(extract_response_headers(response.headers))
128
+ attributes
129
+ end
130
+
131
+ def extract_response_headers(headers)
132
+ return EMPTY_HASH if allowed_response_headers.empty?
133
+
134
+ allowed_response_headers.each_with_object({}) do |(key, value), result|
135
+ if headers.key?(key)
136
+ result[value] = headers[key]
137
+ else
138
+ # do case-insensitive match:
139
+ headers.each do |k, v|
140
+ if k.upcase == key
141
+ result[value] = v
142
+ break
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+
149
+ def untraced_request?(env)
150
+ return true if untraced_endpoints.include?(env['PATH_INFO'])
151
+ return true if untraced_requests&.call(env)
152
+
153
+ false
154
+ end
155
+
156
+ # https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md#name
157
+ #
158
+ # recommendation: span.name(s) should be low-cardinality (e.g.,
159
+ # strip off query param value, keep param name)
160
+ #
161
+ # see http://github.com/open-telemetry/opentelemetry-specification/pull/416/files
162
+ def create_request_span_name(request)
163
+ # NOTE: dd-trace-rb has implemented 'quantization' (which lowers url cardinality)
164
+ # see Datadog::Quantization::HTTP.url
165
+
166
+ if (implementation = url_quantization)
167
+ request_uri_or_path_info = request.env['REQUEST_URI'] || request.path_info
168
+ implementation.call(request_uri_or_path_info, request.env)
169
+ else
170
+ "HTTP #{request.request_method}"
171
+ end
172
+ end
173
+
174
+ def extract_remote_context(request)
175
+ OpenTelemetry.propagation.extract(
176
+ request.env,
177
+ getter: OpenTelemetry::Common::Propagation.rack_env_getter
178
+ )
179
+ end
180
+
181
+ def request_span_attributes(env)
182
+ attributes = {
183
+ 'http.method' => env['REQUEST_METHOD'],
184
+ 'http.host' => env['HTTP_HOST'] || 'unknown',
185
+ 'http.scheme' => env['rack.url_scheme'],
186
+ 'http.target' => env['QUERY_STRING'].empty? ? env['PATH_INFO'] : "#{env['PATH_INFO']}?#{env['QUERY_STRING']}"
187
+ }
188
+
189
+ attributes['http.user_agent'] = env['HTTP_USER_AGENT'] if env['HTTP_USER_AGENT']
190
+ attributes.merge!(extract_request_headers(env))
191
+ attributes
192
+ end
193
+
194
+ def detach_contexts(request)
195
+ request.env[TOKENS_KEY]&.reverse&.each do |token|
196
+ OpenTelemetry::Context.detach(token)
197
+ OpenTelemetry::Trace.current_span.finish
198
+ end
199
+ rescue StandardError => e
200
+ OpenTelemetry.handle_error(exception: e)
201
+ end
202
+
203
+ def add_response_attributes(span, response)
204
+ span.status = OpenTelemetry::Trace::Status.error unless GOOD_HTTP_STATUSES.include?(response.status.to_i)
205
+ attributes = extract_response_attributes(response)
206
+ span.add_attributes(attributes)
207
+ rescue StandardError => e
208
+ OpenTelemetry.handle_error(exception: e)
209
+ end
210
+
211
+ def record_frontend_span?
212
+ config[:record_frontend_span] == true
213
+ end
214
+
215
+ def untraced_endpoints
216
+ config[:untraced_endpoints]
217
+ end
218
+
219
+ def untraced_requests
220
+ config[:untraced_requests]
221
+ end
222
+
223
+ def url_quantization
224
+ config[:url_quantization]
225
+ end
226
+
227
+ def response_propagators
228
+ config[:response_propagators]
229
+ end
230
+
231
+ def allowed_request_headers
232
+ config[:allowed_rack_request_headers]
233
+ end
234
+
235
+ def allowed_response_headers
236
+ config[:allowed_rack_response_headers]
237
+ end
238
+
239
+ def tracer
240
+ OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.tracer
241
+ end
242
+
243
+ def config
244
+ OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.config
245
+ end
246
+
247
+ def register_current_span(span)
248
+ ctx = OpenTelemetry::Trace.context_with_span(span)
249
+ rack_ctx = OpenTelemetry::Instrumentation::Rack.context_with_span(span, parent_context: ctx)
250
+
251
+ contexts = [ctx, rack_ctx]
252
+ contexts.compact!
253
+ contexts.map { |context| OpenTelemetry::Context.attach(context) }
254
+ end
255
+
256
+ def create_span(parent_context, request)
257
+ span = tracer.start_span(
258
+ create_request_span_name(request),
259
+ with_parent: parent_context,
260
+ kind: :server,
261
+ attributes: request_span_attributes(request.env)
262
+ )
263
+ request_start_time = OpenTelemetry::Instrumentation::Rack::Util::QueueTime.get_request_start(request.env)
264
+ span.add_event('http.proxy.request.started', timestamp: request_start_time) unless request_start_time.nil?
265
+ span
266
+ end
267
+ end
268
+ end
269
+ end
270
+ end
271
+ end
@@ -6,15 +6,13 @@
6
6
 
7
7
  require 'opentelemetry/trace/status'
8
8
 
9
- require_relative '../util/queue_time'
10
-
11
9
  module OpenTelemetry
12
10
  module Instrumentation
13
11
  module Rack
14
12
  module Middlewares
15
13
  # TracerMiddleware propagates context and instruments Rack requests
16
14
  # by way of its middleware system
17
- class TracerMiddleware # rubocop:disable Metrics/ClassLength
15
+ class TracerMiddleware
18
16
  class << self
19
17
  def allowed_rack_request_headers
20
18
  @allowed_rack_request_headers ||= Array(config[:allowed_request_headers]).each_with_object({}) do |header, memo|
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ module Instrumentation
9
+ module Rack
10
+ # Provides utilities methods for creating Rack spans
11
+ module Util
12
+ require_relative 'util/queue_time'
13
+ end
14
+ end
15
+ end
16
+ end
@@ -7,7 +7,7 @@
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
9
  module Rack
10
- VERSION = '0.22.1'
10
+ VERSION = '0.23.1'
11
11
  end
12
12
  end
13
13
  end
@@ -14,7 +14,6 @@ module OpenTelemetry
14
14
  extend self
15
15
 
16
16
  CURRENT_SPAN_KEY = Context.create_key('current-span')
17
-
18
17
  private_constant :CURRENT_SPAN_KEY
19
18
 
20
19
  # Returns the current span from the current or provided context
@@ -50,4 +49,5 @@ module OpenTelemetry
50
49
  end
51
50
 
52
51
  require_relative './rack/instrumentation'
52
+ require_relative './rack/util'
53
53
  require_relative './rack/version'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-instrumentation-rack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.1
4
+ version: 0.23.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-14 00:00:00.000000000 Z
11
+ date: 2023-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.21.0
47
+ version: 0.22.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.21.0
54
+ version: 0.22.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: appraisal
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -126,44 +126,44 @@ dependencies:
126
126
  name: opentelemetry-test-helpers
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '0'
131
+ version: '0.3'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '0'
138
+ version: '0.3'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rack
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - "~>"
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
- version: 2.0.8
145
+ version: '0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - "~>"
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
- version: 2.0.8
152
+ version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: rack-test
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - "~>"
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
- version: 1.1.0
159
+ version: '0'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - "~>"
164
+ - - ">="
165
165
  - !ruby/object:Gem::Version
166
- version: 1.1.0
166
+ version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: rake
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -178,20 +178,34 @@ dependencies:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
180
  version: '13.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rspec-mocks
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: rubocop
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
199
  - - "~>"
186
200
  - !ruby/object:Gem::Version
187
- version: 1.41.1
201
+ version: 1.50.2
188
202
  type: :development
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
206
  - - "~>"
193
207
  - !ruby/object:Gem::Version
194
- version: 1.41.1
208
+ version: 1.50.2
195
209
  - !ruby/object:Gem::Dependency
196
210
  name: simplecov
197
211
  requirement: !ruby/object:Gem::Requirement
@@ -263,17 +277,19 @@ files:
263
277
  - lib/opentelemetry/instrumentation.rb
264
278
  - lib/opentelemetry/instrumentation/rack.rb
265
279
  - lib/opentelemetry/instrumentation/rack/instrumentation.rb
280
+ - lib/opentelemetry/instrumentation/rack/middlewares/event_handler.rb
266
281
  - lib/opentelemetry/instrumentation/rack/middlewares/tracer_middleware.rb
282
+ - lib/opentelemetry/instrumentation/rack/util.rb
267
283
  - lib/opentelemetry/instrumentation/rack/util/queue_time.rb
268
284
  - lib/opentelemetry/instrumentation/rack/version.rb
269
285
  homepage: https://github.com/open-telemetry/opentelemetry-ruby-contrib
270
286
  licenses:
271
287
  - Apache-2.0
272
288
  metadata:
273
- changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-rack/0.22.1/file/CHANGELOG.md
289
+ changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-rack/0.23.1/file/CHANGELOG.md
274
290
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/tree/main/instrumentation/rack
275
291
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/issues
276
- documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-rack/0.22.1
292
+ documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-rack/0.23.1
277
293
  post_install_message:
278
294
  rdoc_options: []
279
295
  require_paths:
@@ -282,14 +298,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
282
298
  requirements:
283
299
  - - ">="
284
300
  - !ruby/object:Gem::Version
285
- version: 2.6.0
301
+ version: '3.0'
286
302
  required_rubygems_version: !ruby/object:Gem::Requirement
287
303
  requirements:
288
304
  - - ">="
289
305
  - !ruby/object:Gem::Version
290
306
  version: '0'
291
307
  requirements: []
292
- rubygems_version: 3.1.6
308
+ rubygems_version: 3.2.33
293
309
  signing_key:
294
310
  specification_version: 4
295
311
  summary: Rack instrumentation for the OpenTelemetry framework