Skip to content

Commit 131de59

Browse files
committed
feat: Rack semantic stability opt in
1 parent 9e8fe43 commit 131de59

File tree

26 files changed

+3384
-521
lines changed

26 files changed

+3384
-521
lines changed

instrumentation/CONTRIBUTING.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,8 +458,11 @@ end
458458
# Set up fake Rack application
459459
builder = Rack::Builder.app do
460460
# Integration is automatic in web frameworks but plain Rack applications require this line.
461+
# - middleware_args_old to emit old HTTP semantic conventions
462+
# - middleware_args_stable to emit stable HTTP semantic conventions
463+
# - middleware_args_dup to emit both old and stable HTTP semantic conventions
461464
# Enable it in your config.ru.
462-
use *OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args
465+
use *OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args_old
463466
run ExampleAPI
464467
end
465468
app = Rack::MockRequest.new(builder)

instrumentation/action_pack/lib/opentelemetry/instrumentation/action_pack/railtie.rb

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,25 @@ class Railtie < ::Rails::Railtie
1212
config.before_initialize do |app|
1313
OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.install({})
1414

15-
app.middleware.insert_before(
16-
0,
17-
*OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args
18-
)
15+
stability_opt_in = ENV.fetch('OTEL_SEMCONV_STABILITY_OPT_IN', '')
16+
values = stability_opt_in.split(',').map(&:strip)
17+
18+
if values.include?('http/dup')
19+
app.middleware.insert_before(
20+
0,
21+
*OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args_dup
22+
)
23+
elsif values.include?('http')
24+
app.middleware.insert_before(
25+
0,
26+
*OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args_stable
27+
)
28+
else
29+
app.middleware.insert_before(
30+
0,
31+
*OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args_old
32+
)
33+
end
1934
end
2035
end
2136
end

instrumentation/grape/example/trace_demonstration.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,11 @@ class ExampleAPI < Grape::API
4343
# Set up fake Rack application
4444
builder = Rack::Builder.app do
4545
# Integration is automatic in web frameworks but plain Rack applications require this line.
46+
# - middleware_args_old to emit old HTTP semantic conventions
47+
# - middleware_args_stable to emit stable HTTP semantic conventions
48+
# - middleware_args_dup to emit both old and stable HTTP semantic conventions
4649
# Enable it in your config.ru.
47-
use *OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args
50+
use *OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args_old
4851
run ExampleAPI
4952
end
5053
app = Rack::MockRequest.new(builder)

instrumentation/grape/test/test_helper.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,17 @@ def unsubscribe
4141

4242
def build_rack_app(api_class)
4343
builder = Rack::Builder.app do
44-
use(*OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args)
44+
stability_opt_in = ENV.fetch('OTEL_SEMCONV_STABILITY_OPT_IN', '')
45+
values = stability_opt_in.split(',').map(&:strip)
46+
47+
if values.include?('http/dup')
48+
use(*OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args_dup)
49+
elsif values.include?('http')
50+
use(*OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args_stable)
51+
else
52+
use(*OpenTelemetry::Instrumentation::Rack::Instrumentation.instance.middleware_args_old)
53+
end
54+
4555
run api_class
4656
end
4757
Rack::MockRequest.new(builder)

instrumentation/rack/Appraisals

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,31 @@
44
#
55
# SPDX-License-Identifier: Apache-2.0
66

7-
appraise 'rack-latest' do
8-
gem 'rack'
9-
end
7+
# To faclitate HTTP semantic convention stability migration, we are using
8+
# appraisal to test the different semantic convention modes along with different
9+
# HTTP gem versions. For more information on the semantic convention modes, see:
10+
# https://opentelemetry.io/docs/specs/semconv/non-normative/http-migration/
1011

11-
appraise 'rack-3.0' do
12-
gem 'rack', '~> 3.0.0'
13-
end
12+
semconv_stability = %w[stable old dup]
1413

15-
appraise 'rack-2.2.x' do
16-
gem 'rack', '~> 2.2.0'
17-
end
14+
semconv_stability.each do |mode|
15+
appraise "rack-latest-#{mode}" do
16+
gem 'rack'
17+
end
1818

19-
appraise 'rack-2.1' do
20-
gem 'rack', '~> 2.1.2'
21-
end
19+
appraise "rack-3.0-#{mode}" do
20+
gem 'rack', '~> 3.0.0'
21+
end
22+
23+
appraise "rack-2.2.x-#{mode}" do
24+
gem 'rack', '~> 2.2.0'
25+
end
26+
27+
appraise "rack-2.1-#{mode}" do
28+
gem 'rack', '~> 2.1.2'
29+
end
2230

23-
appraise 'rack-2.0' do
24-
gem 'rack', '~> 2.0.8'
31+
appraise "rack-2.0-#{mode}" do
32+
gem 'rack', '~> 2.0.8'
33+
end
2534
end

instrumentation/rack/lib/opentelemetry/instrumentation/rack/instrumentation.rb

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ module Rack
1313
# instrumentation
1414
class Instrumentation < OpenTelemetry::Instrumentation::Base
1515
install do |_config|
16-
require_dependencies
16+
patch_type = determine_semconv
17+
send(:"require_dependencies_#{patch_type}")
1718
end
1819

1920
present do
@@ -35,23 +36,62 @@ class Instrumentation < OpenTelemetry::Instrumentation::Base
3536
#
3637
# @example Default usage
3738
# Rack::Builder.new do
38-
# use *OpenTelemetry::Instrumentation::Rack::Instrumenation.instance.middleware_args
39+
# use *OpenTelemetry::Instrumentation::Rack::Instrumenation.instance.middleware_args_old
3940
# run lambda { |_arg| [200, { 'Content-Type' => 'text/plain' }, body] }
4041
# end
4142
# @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?(OpenTelemetry::Instrumentation::Rack::Middlewares::EventHandler)
44-
[::Rack::Events, [OpenTelemetry::Instrumentation::Rack::Middlewares::EventHandler.new]]
43+
def middleware_args_old
44+
if config.fetch(:use_rack_events, false) == true && defined?(OpenTelemetry::Instrumentation::Rack::Middlewares::Old::EventHandler)
45+
[::Rack::Events, [OpenTelemetry::Instrumentation::Rack::Middlewares::Old::EventHandler.new]]
4546
else
46-
[OpenTelemetry::Instrumentation::Rack::Middlewares::TracerMiddleware]
47+
[OpenTelemetry::Instrumentation::Rack::Middlewares::Old::TracerMiddleware]
48+
end
49+
end
50+
51+
def middleware_args_dup
52+
if config.fetch(:use_rack_events, false) == true && defined?(OpenTelemetry::Instrumentation::Rack::Middlewares::Dup::EventHandler)
53+
[::Rack::Events, [OpenTelemetry::Instrumentation::Rack::Middlewares::Dup::EventHandler.new]]
54+
else
55+
[OpenTelemetry::Instrumentation::Rack::Middlewares::Dup::TracerMiddleware]
56+
end
57+
end
58+
59+
def middleware_args_stable
60+
if config.fetch(:use_rack_events, false) == true && defined?(OpenTelemetry::Instrumentation::Rack::Middlewares::Stable::EventHandler)
61+
[::Rack::Events, [OpenTelemetry::Instrumentation::Rack::Middlewares::Stable::EventHandler.new]]
62+
else
63+
[OpenTelemetry::Instrumentation::Rack::Middlewares::Stable::TracerMiddleware]
4764
end
4865
end
4966

5067
private
5168

52-
def require_dependencies
53-
require_relative 'middlewares/event_handler' if defined?(::Rack::Events)
54-
require_relative 'middlewares/tracer_middleware'
69+
def determine_semconv
70+
stability_opt_in = ENV.fetch('OTEL_SEMCONV_STABILITY_OPT_IN', '')
71+
values = stability_opt_in.split(',').map(&:strip)
72+
73+
if values.include?('http/dup')
74+
'dup'
75+
elsif values.include?('http')
76+
'stable'
77+
else
78+
'old'
79+
end
80+
end
81+
82+
def require_dependencies_old
83+
require_relative 'middlewares/old/event_handler' if defined?(::Rack::Events)
84+
require_relative 'middlewares/old/tracer_middleware'
85+
end
86+
87+
def require_dependencies_stable
88+
require_relative 'middlewares/stable/event_handler' if defined?(::Rack::Events)
89+
require_relative 'middlewares/stable/tracer_middleware'
90+
end
91+
92+
def require_dependencies_dup
93+
require_relative 'middlewares/dup/event_handler' if defined?(::Rack::Events)
94+
require_relative 'middlewares/dup/tracer_middleware'
5595
end
5696

5797
def config_options(user_config)

0 commit comments

Comments
 (0)