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 +4 -4
- data/CHANGELOG.md +26 -0
- data/README.md +28 -4
- data/lib/opentelemetry/instrumentation/faraday/instrumentation.rb +65 -15
- data/lib/opentelemetry/instrumentation/faraday/middlewares/dup/tracer_middleware.rb +98 -0
- data/lib/opentelemetry/instrumentation/faraday/middlewares/old/tracer_middleware.rb +91 -0
- data/lib/opentelemetry/instrumentation/faraday/middlewares/stable/tracer_middleware.rb +91 -0
- data/lib/opentelemetry/instrumentation/faraday/patches/dup/connection.rb +29 -0
- data/lib/opentelemetry/instrumentation/faraday/patches/old/connection.rb +29 -0
- data/lib/opentelemetry/instrumentation/faraday/patches/stable/connection.rb +29 -0
- data/lib/opentelemetry/instrumentation/faraday/version.rb +1 -1
- metadata +17 -154
- data/lib/opentelemetry/instrumentation/faraday/middlewares/tracer_middleware.rb +0 -77
- data/lib/opentelemetry/instrumentation/faraday/patches/connection.rb +0 -27
- data/lib/opentelemetry/instrumentation/faraday/patches/rack_builder.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b79cd4f94a4533971dc6e87e0b7b385be4905ba2fd29ff28483184929c680c03
|
4
|
+
data.tar.gz: 5cf513bb53039de6901d33d7327c97b4b539cea350e557da09bafa74a5684af3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
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
|
-
|
15
|
-
|
16
|
-
|
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
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
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
|
41
|
-
|
42
|
-
::
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
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.
|
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:
|
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.
|
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.
|
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/
|
198
|
-
- lib/opentelemetry/instrumentation/faraday/
|
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.
|
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.
|
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.
|
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.
|
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
|