opentelemetry-instrumentation-restclient 0.23.0 → 0.24.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 +4 -0
- data/README.md +16 -0
- data/lib/opentelemetry/instrumentation/restclient/instrumentation.rb +36 -6
- data/lib/opentelemetry/instrumentation/restclient/patches/dup/request.rb +79 -0
- data/lib/opentelemetry/instrumentation/restclient/patches/old/request.rb +75 -0
- data/lib/opentelemetry/instrumentation/restclient/patches/stable/request.rb +75 -0
- data/lib/opentelemetry/instrumentation/restclient/version.rb +1 -1
- metadata +7 -145
- data/lib/opentelemetry/instrumentation/restclient/patches/request.rb +0 -73
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77f13b11d744dff44b6318f31d9050257a8370795de144109f56920d758a9390
|
4
|
+
data.tar.gz: 11aac6fc8d85c10dd73363dd639e43db7036fffb768d6f65a2f05e99114f66b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 870e801a2f6be4feabcff349b1847e4182412ab678b43ced933ce68d52dc5fd399dd415a931b2d25a948523110c6c7b85283ca4b540e84a90fb8868b7be05c35
|
7
|
+
data.tar.gz: 86f78f016494e2bd5d588e730056c44071fda4c37f775d4bcfafbc5d4a6c38b28293fc75f13f383cf2b69ef0e186bbf4119d00a51ad3cba458c03f20540ac432
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Release History: opentelemetry-instrumentation-restclient
|
2
2
|
|
3
|
+
### v0.24.0 / 2025-07-29
|
4
|
+
|
5
|
+
* ADDED: Add REST Client `OTEL_SEMCONV_STABILITY_OPT_IN` environment variable [#1568](https://github.com/open-telemetry/opentelemetry-ruby-contrib/pull/1568)
|
6
|
+
|
3
7
|
### v0.23.0 / 2025-01-16
|
4
8
|
|
5
9
|
* BREAKING CHANGE: Set minimum supported version to Ruby 3.1
|
data/README.md
CHANGED
@@ -48,3 +48,19 @@ Apache 2.0 license. See [LICENSE][license-github] for more information.
|
|
48
48
|
[community-meetings]: https://github.com/open-telemetry/community#community-meetings
|
49
49
|
[slack-channel]: https://cloud-native.slack.com/archives/C01NWKKMKMY
|
50
50
|
[discussions-url]: https://github.com/open-telemetry/opentelemetry-ruby/discussions
|
51
|
+
|
52
|
+
## HTTP semantic convention stability
|
53
|
+
|
54
|
+
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.
|
55
|
+
|
56
|
+
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.
|
57
|
+
|
58
|
+
When setting the value for `OTEL_SEMCONV_STABILITY_OPT_IN`, you can specify which conventions you wish to adopt:
|
59
|
+
|
60
|
+
- `http` - Emits the stable HTTP and networking conventions and ceases emitting the old conventions previously emitted by the instrumentation.
|
61
|
+
- `http/dup` - Emits both the old and stable HTTP and networking conventions, enabling a phased rollout of the stable semantic conventions.
|
62
|
+
- Default behavior (in the absence of either value) is to continue emitting the old HTTP and networking conventions the instrumentation previously emitted.
|
63
|
+
|
64
|
+
During the transition from old to stable conventions, RestClient instrumentation code comes in three patch versions: `dup`, `old`, and `stable`. These versions are identical except for the attributes they send. Any changes to RestClient instrumentation should consider all three patches.
|
65
|
+
|
66
|
+
For additional information on migration, please refer to our [documentation](https://opentelemetry.io/docs/specs/semconv/non-normative/http-migration/).
|
@@ -11,8 +11,9 @@ module OpenTelemetry
|
|
11
11
|
# instrumentation
|
12
12
|
class Instrumentation < OpenTelemetry::Instrumentation::Base
|
13
13
|
install do |_config|
|
14
|
-
|
15
|
-
|
14
|
+
patch_type = determine_semconv
|
15
|
+
send(:"require_dependencies_#{patch_type}")
|
16
|
+
send(:"patch_request_#{patch_type}")
|
16
17
|
end
|
17
18
|
|
18
19
|
present do
|
@@ -23,12 +24,41 @@ module OpenTelemetry
|
|
23
24
|
|
24
25
|
private
|
25
26
|
|
26
|
-
def
|
27
|
-
|
27
|
+
def determine_semconv
|
28
|
+
stability_opt_in = ENV.fetch('OTEL_SEMCONV_STABILITY_OPT_IN', '')
|
29
|
+
values = stability_opt_in.split(',').map(&:strip)
|
30
|
+
|
31
|
+
if values.include?('http/dup')
|
32
|
+
'dup'
|
33
|
+
elsif values.include?('http')
|
34
|
+
'stable'
|
35
|
+
else
|
36
|
+
'old'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def require_dependencies_dup
|
41
|
+
require_relative 'patches/dup/request'
|
42
|
+
end
|
43
|
+
|
44
|
+
def require_dependencies_stable
|
45
|
+
require_relative 'patches/stable/request'
|
46
|
+
end
|
47
|
+
|
48
|
+
def require_dependencies_old
|
49
|
+
require_relative 'patches/old/request'
|
50
|
+
end
|
51
|
+
|
52
|
+
def patch_request_dup
|
53
|
+
::RestClient::Request.prepend(Patches::Dup::Request)
|
54
|
+
end
|
55
|
+
|
56
|
+
def patch_request_stable
|
57
|
+
::RestClient::Request.prepend(Patches::Stable::Request)
|
28
58
|
end
|
29
59
|
|
30
|
-
def
|
31
|
-
::RestClient::Request.prepend(Patches::Request)
|
60
|
+
def patch_request_old
|
61
|
+
::RestClient::Request.prepend(Patches::Old::Request)
|
32
62
|
end
|
33
63
|
end
|
34
64
|
end
|
@@ -0,0 +1,79 @@
|
|
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 RestClient
|
10
|
+
module Patches
|
11
|
+
module Dup
|
12
|
+
# Module to prepend to RestClient::Request for instrumentation
|
13
|
+
module Request
|
14
|
+
# Constant for the HTTP status range
|
15
|
+
HTTP_STATUS_SUCCESS_RANGE = (100..399)
|
16
|
+
|
17
|
+
def execute(&)
|
18
|
+
trace_request do |_span|
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def create_request_span
|
26
|
+
http_method = method.upcase
|
27
|
+
instrumentation_attrs = {
|
28
|
+
'http.method' => http_method.to_s,
|
29
|
+
'http.request.method' => http_method.to_s,
|
30
|
+
'http.url' => OpenTelemetry::Common::Utilities.cleanse_url(url),
|
31
|
+
'url.full' => OpenTelemetry::Common::Utilities.cleanse_url(url)
|
32
|
+
}
|
33
|
+
instrumentation_config = RestClient::Instrumentation.instance.config
|
34
|
+
instrumentation_attrs['peer.service'] = instrumentation_config[:peer_service] if instrumentation_config[:peer_service]
|
35
|
+
span = tracer.start_span(
|
36
|
+
http_method.to_s,
|
37
|
+
attributes: instrumentation_attrs.merge(
|
38
|
+
OpenTelemetry::Common::HTTP::ClientContext.attributes
|
39
|
+
),
|
40
|
+
kind: :client
|
41
|
+
)
|
42
|
+
|
43
|
+
OpenTelemetry::Trace.with_span(span) do
|
44
|
+
OpenTelemetry.propagation.inject(processed_headers)
|
45
|
+
end
|
46
|
+
|
47
|
+
span
|
48
|
+
end
|
49
|
+
|
50
|
+
def trace_request
|
51
|
+
span = create_request_span
|
52
|
+
|
53
|
+
yield(span).tap do |response|
|
54
|
+
# Verify return value is a response.
|
55
|
+
# If so, add additional attributes.
|
56
|
+
if response.is_a?(::RestClient::Response)
|
57
|
+
span.set_attribute('http.status_code', response.code)
|
58
|
+
span.set_attribute('http.response.status_code', response.code)
|
59
|
+
span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(response.code.to_i)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
rescue ::RestClient::ExceptionWithResponse => e
|
63
|
+
span.set_attribute('http.status_code', e.http_code)
|
64
|
+
span.set_attribute('http.response.status_code', e.http_code)
|
65
|
+
span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(e.http_code.to_i)
|
66
|
+
raise e
|
67
|
+
ensure
|
68
|
+
span.finish
|
69
|
+
end
|
70
|
+
|
71
|
+
def tracer
|
72
|
+
RestClient::Instrumentation.instance.tracer
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,75 @@
|
|
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 RestClient
|
10
|
+
module Patches
|
11
|
+
module Old
|
12
|
+
# Module to prepend to RestClient::Request for instrumentation
|
13
|
+
module Request
|
14
|
+
# Constant for the HTTP status range
|
15
|
+
HTTP_STATUS_SUCCESS_RANGE = (100..399)
|
16
|
+
|
17
|
+
def execute(&)
|
18
|
+
trace_request do |_span|
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def create_request_span
|
26
|
+
http_method = method.upcase
|
27
|
+
instrumentation_attrs = {
|
28
|
+
'http.method' => http_method.to_s,
|
29
|
+
'http.url' => OpenTelemetry::Common::Utilities.cleanse_url(url)
|
30
|
+
}
|
31
|
+
instrumentation_config = RestClient::Instrumentation.instance.config
|
32
|
+
instrumentation_attrs['peer.service'] = instrumentation_config[:peer_service] if instrumentation_config[:peer_service]
|
33
|
+
span = tracer.start_span(
|
34
|
+
"HTTP #{http_method}",
|
35
|
+
attributes: instrumentation_attrs.merge(
|
36
|
+
OpenTelemetry::Common::HTTP::ClientContext.attributes
|
37
|
+
),
|
38
|
+
kind: :client
|
39
|
+
)
|
40
|
+
|
41
|
+
OpenTelemetry::Trace.with_span(span) do
|
42
|
+
OpenTelemetry.propagation.inject(processed_headers)
|
43
|
+
end
|
44
|
+
|
45
|
+
span
|
46
|
+
end
|
47
|
+
|
48
|
+
def trace_request
|
49
|
+
span = create_request_span
|
50
|
+
|
51
|
+
yield(span).tap do |response|
|
52
|
+
# Verify return value is a response.
|
53
|
+
# If so, add additional attributes.
|
54
|
+
if response.is_a?(::RestClient::Response)
|
55
|
+
span.set_attribute('http.status_code', response.code)
|
56
|
+
span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(response.code.to_i)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
rescue ::RestClient::ExceptionWithResponse => e
|
60
|
+
span.set_attribute('http.status_code', e.http_code)
|
61
|
+
span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(e.http_code.to_i)
|
62
|
+
raise e
|
63
|
+
ensure
|
64
|
+
span.finish
|
65
|
+
end
|
66
|
+
|
67
|
+
def tracer
|
68
|
+
RestClient::Instrumentation.instance.tracer
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,75 @@
|
|
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 RestClient
|
10
|
+
module Patches
|
11
|
+
module Stable
|
12
|
+
# Module to prepend to RestClient::Request for instrumentation
|
13
|
+
module Request
|
14
|
+
# Constant for the HTTP status range
|
15
|
+
HTTP_STATUS_SUCCESS_RANGE = (100..399)
|
16
|
+
|
17
|
+
def execute(&)
|
18
|
+
trace_request do |_span|
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def create_request_span
|
26
|
+
http_method = method.upcase
|
27
|
+
instrumentation_attrs = {
|
28
|
+
'http.request.method' => http_method.to_s,
|
29
|
+
'url.full' => OpenTelemetry::Common::Utilities.cleanse_url(url)
|
30
|
+
}
|
31
|
+
instrumentation_config = RestClient::Instrumentation.instance.config
|
32
|
+
instrumentation_attrs['peer.service'] = instrumentation_config[:peer_service] if instrumentation_config[:peer_service]
|
33
|
+
span = tracer.start_span(
|
34
|
+
http_method.to_s,
|
35
|
+
attributes: instrumentation_attrs.merge(
|
36
|
+
OpenTelemetry::Common::HTTP::ClientContext.attributes
|
37
|
+
),
|
38
|
+
kind: :client
|
39
|
+
)
|
40
|
+
|
41
|
+
OpenTelemetry::Trace.with_span(span) do
|
42
|
+
OpenTelemetry.propagation.inject(processed_headers)
|
43
|
+
end
|
44
|
+
|
45
|
+
span
|
46
|
+
end
|
47
|
+
|
48
|
+
def trace_request
|
49
|
+
span = create_request_span
|
50
|
+
|
51
|
+
yield(span).tap do |response|
|
52
|
+
# Verify return value is a response.
|
53
|
+
# If so, add additional attributes.
|
54
|
+
if response.is_a?(::RestClient::Response)
|
55
|
+
span.set_attribute('http.response.status_code', response.code)
|
56
|
+
span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(response.code.to_i)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
rescue ::RestClient::ExceptionWithResponse => e
|
60
|
+
span.set_attribute('http.response.status_code', e.http_code)
|
61
|
+
span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(e.http_code.to_i)
|
62
|
+
raise e
|
63
|
+
ensure
|
64
|
+
span.finish
|
65
|
+
end
|
66
|
+
|
67
|
+
def tracer
|
68
|
+
RestClient::Instrumentation.instance.tracer
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opentelemetry-instrumentation-restclient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.24.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenTelemetry Authors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opentelemetry-api
|
@@ -38,146 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.23.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.69.1
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: 1.69.1
|
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.23.0
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: 1.23.0
|
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.24.0
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - "~>"
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 3.24.0
|
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'
|
181
41
|
description: REST Client instrumentation for the OpenTelemetry framework
|
182
42
|
email:
|
183
43
|
- cncf-opentelemetry-contributors@lists.cncf.io
|
@@ -193,16 +53,18 @@ files:
|
|
193
53
|
- lib/opentelemetry/instrumentation.rb
|
194
54
|
- lib/opentelemetry/instrumentation/restclient.rb
|
195
55
|
- lib/opentelemetry/instrumentation/restclient/instrumentation.rb
|
196
|
-
- lib/opentelemetry/instrumentation/restclient/patches/request.rb
|
56
|
+
- lib/opentelemetry/instrumentation/restclient/patches/dup/request.rb
|
57
|
+
- lib/opentelemetry/instrumentation/restclient/patches/old/request.rb
|
58
|
+
- lib/opentelemetry/instrumentation/restclient/patches/stable/request.rb
|
197
59
|
- lib/opentelemetry/instrumentation/restclient/version.rb
|
198
60
|
homepage: https://github.com/open-telemetry/opentelemetry-ruby-contrib
|
199
61
|
licenses:
|
200
62
|
- Apache-2.0
|
201
63
|
metadata:
|
202
|
-
changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-restclient/0.
|
64
|
+
changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-restclient/0.24.0/file/CHANGELOG.md
|
203
65
|
source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/tree/main/instrumentation/restclient
|
204
66
|
bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/issues
|
205
|
-
documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-restclient/0.
|
67
|
+
documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-restclient/0.24.0
|
206
68
|
post_install_message:
|
207
69
|
rdoc_options: []
|
208
70
|
require_paths:
|
@@ -1,73 +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 RestClient
|
10
|
-
module Patches
|
11
|
-
# Module to prepend to RestClient::Request for instrumentation
|
12
|
-
module Request
|
13
|
-
# Constant for the HTTP status range
|
14
|
-
HTTP_STATUS_SUCCESS_RANGE = (100..399)
|
15
|
-
|
16
|
-
def execute(&block)
|
17
|
-
trace_request do |_span|
|
18
|
-
super
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def create_request_span
|
25
|
-
http_method = method.upcase
|
26
|
-
instrumentation_attrs = {
|
27
|
-
'http.method' => http_method.to_s,
|
28
|
-
'http.url' => OpenTelemetry::Common::Utilities.cleanse_url(url)
|
29
|
-
}
|
30
|
-
instrumentation_config = RestClient::Instrumentation.instance.config
|
31
|
-
instrumentation_attrs['peer.service'] = instrumentation_config[:peer_service] if instrumentation_config[:peer_service]
|
32
|
-
span = tracer.start_span(
|
33
|
-
"HTTP #{http_method}",
|
34
|
-
attributes: instrumentation_attrs.merge(
|
35
|
-
OpenTelemetry::Common::HTTP::ClientContext.attributes
|
36
|
-
),
|
37
|
-
kind: :client
|
38
|
-
)
|
39
|
-
|
40
|
-
OpenTelemetry::Trace.with_span(span) do
|
41
|
-
OpenTelemetry.propagation.inject(processed_headers)
|
42
|
-
end
|
43
|
-
|
44
|
-
span
|
45
|
-
end
|
46
|
-
|
47
|
-
def trace_request
|
48
|
-
span = create_request_span
|
49
|
-
|
50
|
-
yield(span).tap do |response|
|
51
|
-
# Verify return value is a response.
|
52
|
-
# If so, add additional attributes.
|
53
|
-
if response.is_a?(::RestClient::Response)
|
54
|
-
span.set_attribute('http.status_code', response.code)
|
55
|
-
span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(response.code.to_i)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
rescue ::RestClient::ExceptionWithResponse => e
|
59
|
-
span.set_attribute('http.status_code', e.http_code)
|
60
|
-
span.status = OpenTelemetry::Trace::Status.error unless HTTP_STATUS_SUCCESS_RANGE.cover?(e.http_code.to_i)
|
61
|
-
raise e
|
62
|
-
ensure
|
63
|
-
span.finish
|
64
|
-
end
|
65
|
-
|
66
|
-
def tracer
|
67
|
-
RestClient::Instrumentation.instance.tracer
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|