opentelemetry-instrumentation-rack 0.22.1 → 0.23.1

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: 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