opentelemetry-instrumentation-faraday 0.24.6 → 0.28.0

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: 8abde7df8501a1f21e16f2cba2fa493f8200477ace289eeceabfd280b3b0dde1
4
- data.tar.gz: 33a53279feb96b8162379ef02c710b625613d76570ff4956123ccb030a5b04b9
3
+ metadata.gz: b79cd4f94a4533971dc6e87e0b7b385be4905ba2fd29ff28483184929c680c03
4
+ data.tar.gz: 5cf513bb53039de6901d33d7327c97b4b539cea350e557da09bafa74a5684af3
5
5
  SHA512:
6
- metadata.gz: 9ea0bfc1c57c39c9605eca52da89127f4d71a7c4ea5a85a358bb3857102cf3da1cecec1c4e38c2a3ae4033694a2196e5dbb2be1fca17468c0b7f045d091d66d0
7
- data.tar.gz: a687d98b26bf0cabb5520c4015b3c6742984b0564bedde8c8476d5426aaa27e91e81329d0f31153bc71074d5357cc20d83728e09ed39a03d91adf704565a5be6
6
+ metadata.gz: 5598c9c8d064e90594e9ad8e4a299bfafe1acb51fb3b5ab23366bfbe6f9761d136b740019c6ad60d25ace28cc9021daac72f1be079f84f3bd4d7777701f87af2
7
+ data.tar.gz: 82180c8e8cf09fd3bcb3c37df9569fbf55cf951a39b560a74ca882d265e14946d2edde143893815fb1c71f8815a205cfed5bfd786fb1306846cac2c478582c41
data/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Release History: opentelemetry-instrumentation-faraday
2
2
 
3
+ ### v0.28.0 / 2025-08-12
4
+
5
+ * ADDED: Add Faraday `OTEL_SEMCONV_STABILITY_OPT_IN` environment variable [#1592](https://github.com/open-telemetry/opentelemetry-ruby-contrib/pull/1592)
6
+
7
+ ### v0.27.0 / 2025-06-03
8
+
9
+ * ADDED: Suppress internal spans with Faraday instrumentation
10
+
11
+ ### v0.26.0 / 2025-01-16
12
+
13
+ * BREAKING CHANGE: Set minimum supported version to Ruby 3.1
14
+
15
+ * ADDED: Set minimum supported version to Ruby 3.1
16
+
17
+ ### v0.25.0 / 2025-01-07
18
+
19
+ * ADDED: Faraday Minimum v1.0
20
+
21
+ ### v0.24.8 / 2024-12-17
22
+
23
+ * FIXED: Share Faraday Attrs with Adapter Spans
24
+
25
+ ### v0.24.7 / 2024-11-26
26
+
27
+ * CHANGED: Performance Freeze all range objects #1222
28
+
3
29
  ### v0.24.6 / 2024-07-23
4
30
 
5
31
  * DOCS: Add cspell to CI
data/README.md CHANGED
@@ -6,7 +6,7 @@ The OpenTelemetry Faraday Ruby gem is a community maintained instrumentation for
6
6
 
7
7
  Install the gem using:
8
8
 
9
- ```
9
+ ```console
10
10
  gem install opentelemetry-instrumentation-faraday
11
11
  ```
12
12
 
@@ -18,7 +18,9 @@ To install the instrumentation, call `use` with the name of the instrumentation.
18
18
 
19
19
  ```ruby
20
20
  OpenTelemetry::SDK.configure do |c|
21
- c.use 'OpenTelemetry::Instrumentation::Faraday'
21
+ c.use 'OpenTelemetry::Instrumentation::Faraday', {
22
+ enable_internal_instrumentation: false
23
+ }
22
24
  end
23
25
  ```
24
26
 
@@ -30,15 +32,20 @@ OpenTelemetry::SDK.configure do |c|
30
32
  end
31
33
  ```
32
34
 
35
+ ### Configuration options
36
+ This instrumentation offers the following configuration options:
37
+ * `enable_internal_instrumentation` (default: `false`): When set to `true`, any spans with
38
+ span kind of `internal` are included in traces.
39
+
33
40
  ## Examples
34
41
 
35
- Example usage of faraday can be seen in the `./example/faraday.rb` file [here](https://github.com/open-telemetry/opentelemetry-ruby-contrib/blob/main/instrumentation/faraday/example/faraday.rb)
42
+ Example usage of faraday can be seen in the [`./example/faraday.rb` file](https://github.com/open-telemetry/opentelemetry-ruby-contrib/blob/main/instrumentation/faraday/example/faraday.rb)
36
43
 
37
44
  ## How can I get involved?
38
45
 
39
46
  The `opentelemetry-instrumentation-faraday` gem source is [on github][repo-github], along with related gems including `opentelemetry-api` and `opentelemetry-sdk`.
40
47
 
41
- The OpenTelemetry Ruby gems are maintained by the OpenTelemetry-Ruby special interest group (SIG). You can get involved by joining us in [GitHub Discussions][discussions-url] or attending our weekly meeting. See the [meeting calendar][community-meetings] for dates and times. For more information on this and other language SIGs, see the OpenTelemetry [community page][ruby-sig].
48
+ The OpenTelemetry Ruby gems are maintained by the OpenTelemetry Ruby special interest group (SIG). You can get involved by joining us on our [GitHub Discussions][discussions-url], [Slack Channel][slack-channel] or attending our weekly meeting. See the [meeting calendar][community-meetings] for dates and times. For more information on this and other language SIGs, see the OpenTelemetry [community page][ruby-sig].
42
49
 
43
50
  ## License
44
51
 
@@ -50,4 +57,21 @@ Apache 2.0 license. See [LICENSE][license-github] for more information.
50
57
  [license-github]: https://github.com/open-telemetry/opentelemetry-ruby-contrib/blob/main/LICENSE
51
58
  [ruby-sig]: https://github.com/open-telemetry/community#ruby-sig
52
59
  [community-meetings]: https://github.com/open-telemetry/community#community-meetings
60
+ [slack-channel]: https://cloud-native.slack.com/archives/C01NWKKMKMY
53
61
  [discussions-url]: https://github.com/open-telemetry/opentelemetry-ruby/discussions
62
+
63
+ ## HTTP semantic convention stability
64
+
65
+ In the OpenTelemetry ecosystem, HTTP semantic conventions have now reached a stable state. However, the initial Faraday instrumentation was introduced before this stability was achieved, which resulted in HTTP attributes being based on an older version of the semantic conventions.
66
+
67
+ To facilitate the migration to stable semantic conventions, you can use the `OTEL_SEMCONV_STABILITY_OPT_IN` environment variable. This variable allows you to opt-in to the new stable conventions, ensuring compatibility and future-proofing your instrumentation.
68
+
69
+ When setting the value for `OTEL_SEMCONV_STABILITY_OPT_IN`, you can specify which conventions you wish to adopt:
70
+
71
+ - `http` - Emits the stable HTTP and networking conventions and ceases emitting the old conventions previously emitted by the instrumentation.
72
+ - `http/dup` - Emits both the old and stable HTTP and networking conventions, enabling a phased rollout of the stable semantic conventions.
73
+ - Default behavior (in the absence of either value) is to continue emitting the old HTTP and networking conventions the instrumentation previously emitted.
74
+
75
+ During the transition from old to stable conventions, Faraday instrumentation code comes in three patch versions: `dup`, `old`, and `stable`. These versions are identical except for the attributes they send. Any changes to Faraday instrumentation should consider all three patches.
76
+
77
+ For additional information on migration, please refer to our [documentation](https://opentelemetry.io/docs/specs/semconv/non-normative/http-migration/).
@@ -10,10 +10,17 @@ module OpenTelemetry
10
10
  # The Instrumentation class contains logic to detect and install the Faraday
11
11
  # instrumentation
12
12
  class Instrumentation < OpenTelemetry::Instrumentation::Base
13
+ MINIMUM_VERSION = Gem::Version.new('1.0')
14
+
13
15
  install do |_config|
14
- require_dependencies
15
- register_tracer_middleware
16
- use_middleware_by_default
16
+ patch_type = determine_semconv
17
+ send(:"require_dependencies_#{patch_type}")
18
+ send(:"register_tracer_middleware_#{patch_type}")
19
+ send(:"use_middleware_by_default_#{patch_type}")
20
+ end
21
+
22
+ compatible do
23
+ gem_version >= MINIMUM_VERSION
17
24
  end
18
25
 
19
26
  present do
@@ -22,27 +29,70 @@ module OpenTelemetry
22
29
 
23
30
  option :span_kind, default: :client, validate: %i[client internal]
24
31
  option :peer_service, default: nil, validate: :string
32
+ option :enable_internal_instrumentation, default: false, validate: :boolean
25
33
 
26
34
  private
27
35
 
28
- def require_dependencies
29
- require_relative 'middlewares/tracer_middleware'
30
- require_relative 'patches/connection'
31
- require_relative 'patches/rack_builder'
36
+ def gem_version
37
+ Gem::Version.new(::Faraday::VERSION)
38
+ end
39
+
40
+ def determine_semconv
41
+ stability_opt_in = ENV.fetch('OTEL_SEMCONV_STABILITY_OPT_IN', '')
42
+ values = stability_opt_in.split(',').map(&:strip)
43
+
44
+ if values.include?('http/dup')
45
+ 'dup'
46
+ elsif values.include?('http')
47
+ 'stable'
48
+ else
49
+ 'old'
50
+ end
51
+ end
52
+
53
+ def require_dependencies_dup
54
+ require_relative 'middlewares/dup/tracer_middleware'
55
+ require_relative 'patches/dup/connection'
56
+ end
57
+
58
+ def require_dependencies_old
59
+ require_relative 'middlewares/old/tracer_middleware'
60
+ require_relative 'patches/old/connection'
61
+ end
62
+
63
+ def require_dependencies_stable
64
+ require_relative 'middlewares/stable/tracer_middleware'
65
+ require_relative 'patches/stable/connection'
32
66
  end
33
67
 
34
- def register_tracer_middleware
68
+ def register_tracer_middleware_dup
35
69
  ::Faraday::Middleware.register_middleware(
36
- open_telemetry: Middlewares::TracerMiddleware
70
+ open_telemetry: Middlewares::Dup::TracerMiddleware
37
71
  )
38
72
  end
39
73
 
40
- def use_middleware_by_default
41
- if Gem::Version.new(::Faraday::VERSION) >= Gem::Version.new('1')
42
- ::Faraday::Connection.prepend(Patches::Connection)
43
- else
44
- ::Faraday::RackBuilder.prepend(Patches::RackBuilder)
45
- end
74
+ def register_tracer_middleware_old
75
+ ::Faraday::Middleware.register_middleware(
76
+ open_telemetry: Middlewares::Old::TracerMiddleware
77
+ )
78
+ end
79
+
80
+ def register_tracer_middleware_stable
81
+ ::Faraday::Middleware.register_middleware(
82
+ open_telemetry: Middlewares::Stable::TracerMiddleware
83
+ )
84
+ end
85
+
86
+ def use_middleware_by_default_dup
87
+ ::Faraday::Connection.prepend(Patches::Dup::Connection)
88
+ end
89
+
90
+ def use_middleware_by_default_old
91
+ ::Faraday::Connection.prepend(Patches::Old::Connection)
92
+ end
93
+
94
+ def use_middleware_by_default_stable
95
+ ::Faraday::Connection.prepend(Patches::Stable::Connection)
46
96
  end
47
97
  end
48
98
  end
@@ -0,0 +1,98 @@
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 Faraday
10
+ module Middlewares
11
+ module Dup
12
+ # TracerMiddleware propagates context and instruments Faraday requests
13
+ # by way of its middleware system
14
+ class TracerMiddleware < ::Faraday::Middleware
15
+ HTTP_METHODS_SYMBOL_TO_STRING = {
16
+ connect: 'CONNECT',
17
+ delete: 'DELETE',
18
+ get: 'GET',
19
+ head: 'HEAD',
20
+ options: 'OPTIONS',
21
+ patch: 'PATCH',
22
+ post: 'POST',
23
+ put: 'PUT',
24
+ trace: 'TRACE'
25
+ }.freeze
26
+
27
+ # Constant for the HTTP status range
28
+ HTTP_STATUS_SUCCESS_RANGE = (100..399)
29
+
30
+ def call(env)
31
+ http_method = HTTP_METHODS_SYMBOL_TO_STRING[env.method]
32
+ config = Faraday::Instrumentation.instance.config
33
+
34
+ attributes = span_creation_attributes(
35
+ http_method: http_method, url: env.url, config: config
36
+ )
37
+
38
+ OpenTelemetry::Common::HTTP::ClientContext.with_attributes(attributes) do |attrs, _|
39
+ tracer.in_span(
40
+ http_method, attributes: attrs, kind: config.fetch(:span_kind)
41
+ ) do |span|
42
+ OpenTelemetry.propagation.inject(env.request_headers)
43
+
44
+ if config[:enable_internal_instrumentation] == false
45
+ OpenTelemetry::Common::Utilities.untraced do
46
+ app.call(env).on_complete { |resp| trace_response(span, resp.status) }
47
+ end
48
+ else
49
+ app.call(env).on_complete { |resp| trace_response(span, resp.status) }
50
+ end
51
+ rescue ::Faraday::Error => e
52
+ trace_response(span, e.response[:status]) if e.response
53
+
54
+ raise
55
+ end
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def span_creation_attributes(http_method:, url:, config:)
62
+ cleansed_url = OpenTelemetry::Common::Utilities.cleanse_url(url.to_s)
63
+ attrs = {
64
+ 'http.method' => http_method,
65
+ 'http.request.method' => http_method,
66
+ 'http.url' => cleansed_url,
67
+ 'url.full' => cleansed_url,
68
+ 'faraday.adapter.name' => app.class.name
69
+ }
70
+ if url.host
71
+ attrs['net.peer.name'] = url.host
72
+ attrs['server.address'] = url.host
73
+ end
74
+ attrs['peer.service'] = config[:peer_service] if config[:peer_service]
75
+
76
+ attrs.merge!(
77
+ OpenTelemetry::Common::HTTP::ClientContext.attributes
78
+ )
79
+ end
80
+
81
+ # Versions prior to 1.0 do not define an accessor for app
82
+ attr_reader :app if Gem::Version.new(Faraday::VERSION) < Gem::Version.new('1.0.0')
83
+
84
+ def tracer
85
+ Faraday::Instrumentation.instance.tracer
86
+ end
87
+
88
+ def trace_response(span, status)
89
+ span.set_attribute('http.status_code', status)
90
+ span.set_attribute('http.response.status_code', status)
91
+ span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(status.to_i)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,91 @@
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 Faraday
10
+ module Middlewares
11
+ module Old
12
+ # TracerMiddleware propagates context and instruments Faraday requests
13
+ # by way of its middleware system
14
+ class TracerMiddleware < ::Faraday::Middleware
15
+ HTTP_METHODS_SYMBOL_TO_STRING = {
16
+ connect: 'CONNECT',
17
+ delete: 'DELETE',
18
+ get: 'GET',
19
+ head: 'HEAD',
20
+ options: 'OPTIONS',
21
+ patch: 'PATCH',
22
+ post: 'POST',
23
+ put: 'PUT',
24
+ trace: 'TRACE'
25
+ }.freeze
26
+
27
+ # Constant for the HTTP status range
28
+ HTTP_STATUS_SUCCESS_RANGE = (100..399)
29
+
30
+ def call(env)
31
+ http_method = HTTP_METHODS_SYMBOL_TO_STRING[env.method]
32
+ config = Faraday::Instrumentation.instance.config
33
+
34
+ attributes = span_creation_attributes(
35
+ http_method: http_method, url: env.url, config: config
36
+ )
37
+
38
+ OpenTelemetry::Common::HTTP::ClientContext.with_attributes(attributes) do |attrs, _|
39
+ tracer.in_span(
40
+ "HTTP #{http_method}", attributes: attrs, kind: config.fetch(:span_kind)
41
+ ) do |span|
42
+ OpenTelemetry.propagation.inject(env.request_headers)
43
+
44
+ if config[:enable_internal_instrumentation] == false
45
+ OpenTelemetry::Common::Utilities.untraced do
46
+ app.call(env).on_complete { |resp| trace_response(span, resp.status) }
47
+ end
48
+ else
49
+ app.call(env).on_complete { |resp| trace_response(span, resp.status) }
50
+ end
51
+ rescue ::Faraday::Error => e
52
+ trace_response(span, e.response[:status]) if e.response
53
+
54
+ raise
55
+ end
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def span_creation_attributes(http_method:, url:, config:)
62
+ attrs = {
63
+ 'http.method' => http_method,
64
+ 'http.url' => OpenTelemetry::Common::Utilities.cleanse_url(url.to_s),
65
+ 'faraday.adapter.name' => app.class.name
66
+ }
67
+ attrs['net.peer.name'] = url.host if url.host
68
+ attrs['peer.service'] = config[:peer_service] if config[:peer_service]
69
+
70
+ attrs.merge!(
71
+ OpenTelemetry::Common::HTTP::ClientContext.attributes
72
+ )
73
+ end
74
+
75
+ # Versions prior to 1.0 do not define an accessor for app
76
+ attr_reader :app if Gem::Version.new(Faraday::VERSION) < Gem::Version.new('1.0.0')
77
+
78
+ def tracer
79
+ Faraday::Instrumentation.instance.tracer
80
+ end
81
+
82
+ def trace_response(span, status)
83
+ span.set_attribute('http.status_code', status)
84
+ span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(status.to_i)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,91 @@
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 Faraday
10
+ module Middlewares
11
+ module Stable
12
+ # TracerMiddleware propagates context and instruments Faraday requests
13
+ # by way of its middleware system
14
+ class TracerMiddleware < ::Faraday::Middleware
15
+ HTTP_METHODS_SYMBOL_TO_STRING = {
16
+ connect: 'CONNECT',
17
+ delete: 'DELETE',
18
+ get: 'GET',
19
+ head: 'HEAD',
20
+ options: 'OPTIONS',
21
+ patch: 'PATCH',
22
+ post: 'POST',
23
+ put: 'PUT',
24
+ trace: 'TRACE'
25
+ }.freeze
26
+
27
+ # Constant for the HTTP status range
28
+ HTTP_STATUS_SUCCESS_RANGE = (100..399)
29
+
30
+ def call(env)
31
+ http_method = HTTP_METHODS_SYMBOL_TO_STRING[env.method]
32
+ config = Faraday::Instrumentation.instance.config
33
+
34
+ attributes = span_creation_attributes(
35
+ http_method: http_method, url: env.url, config: config
36
+ )
37
+
38
+ OpenTelemetry::Common::HTTP::ClientContext.with_attributes(attributes) do |attrs, _|
39
+ tracer.in_span(
40
+ http_method, attributes: attrs, kind: config.fetch(:span_kind)
41
+ ) do |span|
42
+ OpenTelemetry.propagation.inject(env.request_headers)
43
+
44
+ if config[:enable_internal_instrumentation] == false
45
+ OpenTelemetry::Common::Utilities.untraced do
46
+ app.call(env).on_complete { |resp| trace_response(span, resp.status) }
47
+ end
48
+ else
49
+ app.call(env).on_complete { |resp| trace_response(span, resp.status) }
50
+ end
51
+ rescue ::Faraday::Error => e
52
+ trace_response(span, e.response[:status]) if e.response
53
+
54
+ raise
55
+ end
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def span_creation_attributes(http_method:, url:, config:)
62
+ attrs = {
63
+ 'http.request.method' => http_method,
64
+ 'url.full' => OpenTelemetry::Common::Utilities.cleanse_url(url.to_s),
65
+ 'faraday.adapter.name' => app.class.name
66
+ }
67
+ attrs['server.address'] = url.host if url.host
68
+ attrs['peer.service'] = config[:peer_service] if config[:peer_service]
69
+
70
+ attrs.merge!(
71
+ OpenTelemetry::Common::HTTP::ClientContext.attributes
72
+ )
73
+ end
74
+
75
+ # Versions prior to 1.0 do not define an accessor for app
76
+ attr_reader :app if Gem::Version.new(Faraday::VERSION) < Gem::Version.new('1.0.0')
77
+
78
+ def tracer
79
+ Faraday::Instrumentation.instance.tracer
80
+ end
81
+
82
+ def trace_response(span, status)
83
+ span.set_attribute('http.response.status_code', status)
84
+ span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(status.to_i)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,29 @@
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 Faraday
10
+ module Patches
11
+ module Dup
12
+ # Module to be prepended to force Faraday to use the middleware by
13
+ # default so the user doesn't have to call `use` for every connection.
14
+ module Connection
15
+ # Wraps Faraday::Connection#initialize:
16
+ # https://github.com/lostisland/faraday/blob/ff9dc1d1219a1bbdba95a9a4cf5d135b97247ee2/lib/faraday/connection.rb#L62-L92
17
+ def initialize(...)
18
+ super.tap do
19
+ use(:open_telemetry) unless builder.handlers.any? do |handler|
20
+ handler.klass == Middlewares::Dup::TracerMiddleware
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
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 Faraday
10
+ module Patches
11
+ module Old
12
+ # Module to be prepended to force Faraday to use the middleware by
13
+ # default so the user doesn't have to call `use` for every connection.
14
+ module Connection
15
+ # Wraps Faraday::Connection#initialize:
16
+ # https://github.com/lostisland/faraday/blob/ff9dc1d1219a1bbdba95a9a4cf5d135b97247ee2/lib/faraday/connection.rb#L62-L92
17
+ def initialize(...)
18
+ super.tap do
19
+ use(:open_telemetry) unless builder.handlers.any? do |handler|
20
+ handler.klass == Middlewares::Old::TracerMiddleware
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
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 Faraday
10
+ module Patches
11
+ module Stable
12
+ # Module to be prepended to force Faraday to use the middleware by
13
+ # default so the user doesn't have to call `use` for every connection.
14
+ module Connection
15
+ # Wraps Faraday::Connection#initialize:
16
+ # https://github.com/lostisland/faraday/blob/ff9dc1d1219a1bbdba95a9a4cf5d135b97247ee2/lib/faraday/connection.rb#L62-L92
17
+ def initialize(...)
18
+ super.tap do
19
+ use(:open_telemetry) unless builder.handlers.any? do |handler|
20
+ handler.klass == Middlewares::Stable::TracerMiddleware
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -7,7 +7,7 @@
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
9
  module Faraday
10
- VERSION = '0.24.6'
10
+ VERSION = '0.28.0'
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-faraday
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.24.6
4
+ version: 0.28.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-24 00:00:00.000000000 Z
11
+ date: 2025-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -30,154 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.22.1
33
+ version: 0.23.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.22.1
41
- - !ruby/object:Gem::Dependency
42
- name: appraisal
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '2.5'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '2.5'
55
- - !ruby/object:Gem::Dependency
56
- name: bundler
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '2.4'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '2.4'
69
- - !ruby/object:Gem::Dependency
70
- name: minitest
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '5.0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '5.0'
83
- - !ruby/object:Gem::Dependency
84
- name: opentelemetry-sdk
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.1'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '1.1'
97
- - !ruby/object:Gem::Dependency
98
- name: opentelemetry-test-helpers
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '0.3'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '0.3'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: 1.65.0
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: 1.65.0
125
- - !ruby/object:Gem::Dependency
126
- name: rubocop-performance
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '1.20'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '1.20'
139
- - !ruby/object:Gem::Dependency
140
- name: simplecov
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: 0.17.1
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: 0.17.1
153
- - !ruby/object:Gem::Dependency
154
- name: webmock
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: '3.19'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: '3.19'
167
- - !ruby/object:Gem::Dependency
168
- name: yard
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: '0.9'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - "~>"
179
- - !ruby/object:Gem::Version
180
- version: '0.9'
40
+ version: 0.23.0
181
41
  description: Faraday instrumentation for the OpenTelemetry framework
182
42
  email:
183
43
  - cncf-opentelemetry-contributors@lists.cncf.io
@@ -193,19 +53,22 @@ files:
193
53
  - lib/opentelemetry/instrumentation.rb
194
54
  - lib/opentelemetry/instrumentation/faraday.rb
195
55
  - lib/opentelemetry/instrumentation/faraday/instrumentation.rb
196
- - lib/opentelemetry/instrumentation/faraday/middlewares/tracer_middleware.rb
197
- - lib/opentelemetry/instrumentation/faraday/patches/connection.rb
198
- - lib/opentelemetry/instrumentation/faraday/patches/rack_builder.rb
56
+ - lib/opentelemetry/instrumentation/faraday/middlewares/dup/tracer_middleware.rb
57
+ - lib/opentelemetry/instrumentation/faraday/middlewares/old/tracer_middleware.rb
58
+ - lib/opentelemetry/instrumentation/faraday/middlewares/stable/tracer_middleware.rb
59
+ - lib/opentelemetry/instrumentation/faraday/patches/dup/connection.rb
60
+ - lib/opentelemetry/instrumentation/faraday/patches/old/connection.rb
61
+ - lib/opentelemetry/instrumentation/faraday/patches/stable/connection.rb
199
62
  - lib/opentelemetry/instrumentation/faraday/version.rb
200
63
  homepage: https://github.com/open-telemetry/opentelemetry-ruby-contrib
201
64
  licenses:
202
65
  - Apache-2.0
203
66
  metadata:
204
- changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-faraday/0.24.6/file/CHANGELOG.md
67
+ changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-faraday/0.28.0/file/CHANGELOG.md
205
68
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/tree/main/instrumentation/faraday
206
69
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/issues
207
- documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-faraday/0.24.6
208
- post_install_message:
70
+ documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-faraday/0.28.0
71
+ post_install_message:
209
72
  rdoc_options: []
210
73
  require_paths:
211
74
  - lib
@@ -213,15 +76,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
213
76
  requirements:
214
77
  - - ">="
215
78
  - !ruby/object:Gem::Version
216
- version: '3.0'
79
+ version: '3.1'
217
80
  required_rubygems_version: !ruby/object:Gem::Requirement
218
81
  requirements:
219
82
  - - ">="
220
83
  - !ruby/object:Gem::Version
221
84
  version: '0'
222
85
  requirements: []
223
- rubygems_version: 3.2.33
224
- signing_key:
86
+ rubygems_version: 3.3.27
87
+ signing_key:
225
88
  specification_version: 4
226
89
  summary: Faraday instrumentation for the OpenTelemetry framework
227
90
  test_files: []
@@ -1,77 +0,0 @@
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 Faraday
10
- module Middlewares
11
- # TracerMiddleware propagates context and instruments Faraday requests
12
- # by way of its middlware system
13
- class TracerMiddleware < ::Faraday::Middleware
14
- HTTP_METHODS_SYMBOL_TO_STRING = {
15
- connect: 'CONNECT',
16
- delete: 'DELETE',
17
- get: 'GET',
18
- head: 'HEAD',
19
- options: 'OPTIONS',
20
- patch: 'PATCH',
21
- post: 'POST',
22
- put: 'PUT',
23
- trace: 'TRACE'
24
- }.freeze
25
-
26
- def call(env)
27
- http_method = HTTP_METHODS_SYMBOL_TO_STRING[env.method]
28
- config = Faraday::Instrumentation.instance.config
29
-
30
- attributes = span_creation_attributes(
31
- http_method: http_method, url: env.url, config: config
32
- )
33
- tracer.in_span(
34
- "HTTP #{http_method}", attributes: attributes, kind: config.fetch(:span_kind)
35
- ) do |span|
36
- OpenTelemetry.propagation.inject(env.request_headers)
37
-
38
- app.call(env).on_complete { |resp| trace_response(span, resp.status) }
39
- rescue ::Faraday::Error => e
40
- trace_response(span, e.response[:status]) if e.response
41
-
42
- raise
43
- end
44
- end
45
-
46
- private
47
-
48
- def span_creation_attributes(http_method:, url:, config:)
49
- instrumentation_attrs = {
50
- 'http.method' => http_method,
51
- 'http.url' => OpenTelemetry::Common::Utilities.cleanse_url(url.to_s),
52
- 'faraday.adapter.name' => app.class.name
53
- }
54
- instrumentation_attrs['net.peer.name'] = url.host if url.host
55
- instrumentation_attrs['peer.service'] = config[:peer_service] if config[:peer_service]
56
-
57
- instrumentation_attrs.merge!(
58
- OpenTelemetry::Common::HTTP::ClientContext.attributes
59
- )
60
- end
61
-
62
- # Versions prior to 1.0 do not define an accessor for app
63
- attr_reader :app if Gem::Version.new(Faraday::VERSION) < Gem::Version.new('1.0.0')
64
-
65
- def tracer
66
- Faraday::Instrumentation.instance.tracer
67
- end
68
-
69
- def trace_response(span, status)
70
- span.set_attribute('http.status_code', status)
71
- span.status = OpenTelemetry::Trace::Status.error unless (100..399).cover?(status.to_i)
72
- end
73
- end
74
- end
75
- end
76
- end
77
- end
@@ -1,27 +0,0 @@
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 Faraday
10
- module Patches
11
- # Module to be prepended to force Faraday to use the middleware by
12
- # default so the user doesn't have to call `use` for every connection.
13
- module Connection
14
- # Wraps Faraday::Connection#initialize:
15
- # https://github.com/lostisland/faraday/blob/ff9dc1d1219a1bbdba95a9a4cf5d135b97247ee2/lib/faraday/connection.rb#L62-L92
16
- def initialize(*args)
17
- super.tap do
18
- use(:open_telemetry) unless builder.handlers.any? do |handler|
19
- handler.klass == Middlewares::TracerMiddleware
20
- end
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,25 +0,0 @@
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 Faraday
10
- module Patches
11
- # Module to be prepended to force Faraday to use the middleware by
12
- # default so the user doesn't have to call `use` for every connection.
13
- module RackBuilder
14
- def adapter(*args)
15
- use(:open_telemetry) unless @handlers.any? do |handler|
16
- handler.klass == Faraday::Middlewares::TracerMiddleware
17
- end
18
-
19
- super
20
- end
21
- end
22
- end
23
- end
24
- end
25
- end