httpx 0.19.5 → 0.19.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/doc/release_notes/0_19_6.md +5 -0
- data/doc/release_notes/0_19_7.md +5 -0
- data/doc/release_notes/0_19_8.md +5 -0
- data/lib/httpx/adapters/datadog.rb +112 -58
- data/lib/httpx/adapters/faraday.rb +24 -25
- data/lib/httpx/plugins/proxy.rb +5 -1
- data/lib/httpx/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05a379db82c9c86f84a847680f4a784ed62a4cbcb8ce8d09a3d3c29abeb7d5d1
|
4
|
+
data.tar.gz: 5046f5d1e86f7d5c523a171b23fd5fb8126b63636a021c204a7c33a4ebf5e319
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d62d606f0688c485f79a38feed6b94841005fb6a70c5ab934c7b70cb7a7958066b85a496405959a7660da3f12f194d844f10660621ce6fb98c7aa898c38d855c
|
7
|
+
data.tar.gz: 42b46c44c4c864222f14235534be31db4eb5155716c542457178be010b227fdb391c095b009759e9c237d6320da7133123334cfc4b3d4dd6940ff58aa6df9f0e
|
@@ -1,12 +1,52 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require "
|
5
|
-
require "
|
3
|
+
if defined?(::DDTrace) && ::DDTrace::VERSION::STRING >= "1.0.0"
|
4
|
+
require "datadog/tracing/contrib/integration"
|
5
|
+
require "datadog/tracing/contrib/configuration/settings"
|
6
|
+
require "datadog/tracing/contrib/patcher"
|
6
7
|
|
7
|
-
|
8
|
+
TRACING_MODULE = Datadog::Tracing
|
9
|
+
else
|
10
|
+
|
11
|
+
require "ddtrace/contrib/integration"
|
12
|
+
require "ddtrace/contrib/configuration/settings"
|
13
|
+
require "ddtrace/contrib/patcher"
|
14
|
+
|
15
|
+
TRACING_MODULE = Datadog
|
16
|
+
end
|
17
|
+
|
18
|
+
module TRACING_MODULE # rubocop:disable Naming/ClassAndModuleCamelCase
|
8
19
|
module Contrib
|
9
20
|
module HTTPX
|
21
|
+
if defined?(::DDTrace) && ::DDTrace::VERSION::STRING >= "1.0.0"
|
22
|
+
METADATA_MODULE = TRACING_MODULE::Metadata
|
23
|
+
|
24
|
+
TYPE_OUTBOUND = TRACING_MODULE::Metadata::Ext::HTTP::TYPE_OUTBOUND
|
25
|
+
|
26
|
+
TAG_PEER_SERVICE = TRACING_MODULE::Metadata::Ext::TAG_PEER_SERVICE
|
27
|
+
|
28
|
+
TAG_URL = TRACING_MODULE::Metadata::Ext::HTTP::TAG_URL
|
29
|
+
TAG_METHOD = TRACING_MODULE::Metadata::Ext::HTTP::TAG_METHOD
|
30
|
+
TAG_TARGET_HOST = TRACING_MODULE::Metadata::Ext::NET::TAG_TARGET_HOST
|
31
|
+
TAG_TARGET_PORT = TRACING_MODULE::Metadata::Ext::NET::TAG_TARGET_PORT
|
32
|
+
|
33
|
+
TAG_STATUS_CODE = TRACING_MODULE::Metadata::Ext::HTTP::TAG_STATUS_CODE
|
34
|
+
|
35
|
+
else
|
36
|
+
|
37
|
+
METADATA_MODULE = Datadog
|
38
|
+
|
39
|
+
TYPE_OUTBOUND = TRACING_MODULE::Ext::HTTP::TYPE_OUTBOUND
|
40
|
+
TAG_PEER_SERVICE = TRACING_MODULE::Ext::Integration::TAG_PEER_SERVICE
|
41
|
+
TAG_URL = TRACING_MODULE::Ext::HTTP::URL
|
42
|
+
TAG_METHOD = TRACING_MODULE::Ext::HTTP::METHOD
|
43
|
+
TAG_TARGET_HOST = TRACING_MODULE::Ext::NET::TARGET_HOST
|
44
|
+
TAG_TARGET_PORT = TRACING_MODULE::Ext::NET::TARGET_PORT
|
45
|
+
TAG_STATUS_CODE = Datadog::Ext::HTTP::STATUS_CODE
|
46
|
+
PROPAGATOR = TRACING_MODULE::HTTPPropagator
|
47
|
+
|
48
|
+
end
|
49
|
+
|
10
50
|
# HTTPX Datadog Plugin
|
11
51
|
#
|
12
52
|
# Enables tracing for httpx requests. A span will be created for each individual requests,
|
@@ -15,6 +55,8 @@ module Datadog
|
|
15
55
|
#
|
16
56
|
module Plugin
|
17
57
|
class RequestTracer
|
58
|
+
include Contrib::HttpAnnotationHelper
|
59
|
+
|
18
60
|
SPAN_REQUEST = "httpx.request"
|
19
61
|
|
20
62
|
def initialize(request)
|
@@ -22,43 +64,37 @@ module Datadog
|
|
22
64
|
end
|
23
65
|
|
24
66
|
def call
|
25
|
-
return
|
67
|
+
return unless tracing_enabled?
|
26
68
|
|
27
69
|
@request.on(:response, &method(:finish))
|
28
70
|
|
29
71
|
verb = @request.verb.to_s.upcase
|
30
72
|
uri = @request.uri
|
31
73
|
|
32
|
-
@span =
|
33
|
-
service_name = datadog_config[:split_by_domain] ? uri.host : datadog_pin.service_name
|
74
|
+
@span = build_span
|
34
75
|
|
35
|
-
|
36
|
-
@span.service = service_name
|
37
|
-
@span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
|
38
|
-
@span.resource = verb
|
76
|
+
@span.resource = verb
|
39
77
|
|
40
|
-
|
78
|
+
# Add additional request specific tags to the span.
|
41
79
|
|
42
|
-
|
80
|
+
@span.set_tag(TAG_URL, @request.path)
|
81
|
+
@span.set_tag(TAG_METHOD, verb)
|
43
82
|
|
44
|
-
|
45
|
-
|
83
|
+
@span.set_tag(TAG_TARGET_HOST, uri.host)
|
84
|
+
@span.set_tag(TAG_TARGET_PORT, uri.port.to_s)
|
46
85
|
|
47
|
-
|
48
|
-
|
86
|
+
# Tag as an external peer service
|
87
|
+
@span.set_tag(TAG_PEER_SERVICE, @span.service)
|
49
88
|
|
50
|
-
|
51
|
-
@span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, @span.service)
|
89
|
+
propagate_headers if @configuration[:distributed_tracing]
|
52
90
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
57
|
-
rescue StandardError => e
|
58
|
-
Datadog.logger.error("error preparing span for http request: #{e}")
|
91
|
+
# Set analytics sample rate
|
92
|
+
if Contrib::Analytics.enabled?(@configuration[:analytics_enabled])
|
93
|
+
Contrib::Analytics.set_sample_rate(@span, @configuration[:analytics_sample_rate])
|
59
94
|
end
|
60
95
|
rescue StandardError => e
|
61
|
-
Datadog.logger.
|
96
|
+
Datadog.logger.error("error preparing span for http request: #{e}")
|
97
|
+
Datadog.logger.error(e.backtrace)
|
62
98
|
end
|
63
99
|
|
64
100
|
def finish(response)
|
@@ -67,7 +103,7 @@ module Datadog
|
|
67
103
|
if response.is_a?(::HTTPX::ErrorResponse)
|
68
104
|
@span.set_error(response.error)
|
69
105
|
else
|
70
|
-
@span.set_tag(
|
106
|
+
@span.set_tag(TAG_STATUS_CODE, response.status.to_s)
|
71
107
|
|
72
108
|
@span.set_error(::HTTPX::HTTPError.new(response)) if response.status >= 400 && response.status <= 599
|
73
109
|
end
|
@@ -77,40 +113,48 @@ module Datadog
|
|
77
113
|
|
78
114
|
private
|
79
115
|
|
80
|
-
|
81
|
-
return true if @request.headers.key?(Datadog::Ext::Transport::HTTP::HEADER_META_TRACER_VERSION)
|
82
|
-
|
83
|
-
return false unless @datadog_pin
|
84
|
-
|
85
|
-
span = @datadog_pin.tracer.active_span
|
116
|
+
if defined?(::DDTrace) && ::DDTrace::VERSION::STRING >= "1.0.0"
|
86
117
|
|
87
|
-
|
118
|
+
def build_span
|
119
|
+
TRACING_MODULE.trace(
|
120
|
+
SPAN_REQUEST,
|
121
|
+
service: service_name(@request.uri.host, configuration, Datadog.configuration_for(self)),
|
122
|
+
span_type: TYPE_OUTBOUND
|
123
|
+
)
|
124
|
+
end
|
88
125
|
|
89
|
-
|
90
|
-
|
126
|
+
def propagate_headers
|
127
|
+
TRACING_MODULE::Propagation::HTTP.inject!(TRACING_MODULE.active_trace, @request.headers)
|
128
|
+
end
|
91
129
|
|
92
|
-
|
93
|
-
|
130
|
+
def configuration
|
131
|
+
@configuration ||= Datadog.configuration.tracing[:httpx, @request.uri.host]
|
132
|
+
end
|
94
133
|
|
95
|
-
|
96
|
-
|
134
|
+
def tracing_enabled?
|
135
|
+
TRACING_MODULE.enabled?
|
136
|
+
end
|
137
|
+
else
|
138
|
+
def build_span
|
139
|
+
service_name = configuration[:split_by_domain] ? @request.uri.host : configuration[:service_name]
|
140
|
+
configuration[:tracer].trace(
|
141
|
+
SPAN_REQUEST,
|
142
|
+
service: service_name,
|
143
|
+
span_type: TYPE_OUTBOUND
|
144
|
+
)
|
145
|
+
end
|
97
146
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
tracer = datadog_config[:tracer]
|
147
|
+
def propagate_headers
|
148
|
+
Datadog::HTTPPropagator.inject!(@span.context, @request.headers)
|
149
|
+
end
|
102
150
|
|
103
|
-
|
104
|
-
|
105
|
-
app: "httpx",
|
106
|
-
app_type: Datadog::Ext::AppTypes::WEB,
|
107
|
-
tracer: -> { tracer }
|
108
|
-
)
|
151
|
+
def configuration
|
152
|
+
@configuration ||= Datadog.configuration[:httpx, @request.uri.host]
|
109
153
|
end
|
110
|
-
end
|
111
154
|
|
112
|
-
|
113
|
-
|
155
|
+
def tracing_enabled?
|
156
|
+
configuration[:tracer].enabled
|
157
|
+
end
|
114
158
|
end
|
115
159
|
end
|
116
160
|
|
@@ -125,7 +169,11 @@ module Datadog
|
|
125
169
|
module Configuration
|
126
170
|
# Default settings for httpx
|
127
171
|
#
|
128
|
-
class Settings <
|
172
|
+
class Settings < TRACING_MODULE::Contrib::Configuration::Settings
|
173
|
+
DEFAULT_ERROR_HANDLER = lambda do |response|
|
174
|
+
Datadog::Ext::HTTP::ERROR_RANGE.cover?(response.status)
|
175
|
+
end
|
176
|
+
|
129
177
|
option :service_name, default: "httpx"
|
130
178
|
option :distributed_tracing, default: true
|
131
179
|
option :split_by_domain, default: false
|
@@ -145,14 +193,14 @@ module Datadog
|
|
145
193
|
o.lazy
|
146
194
|
end
|
147
195
|
|
148
|
-
option :error_handler, default:
|
196
|
+
option :error_handler, default: DEFAULT_ERROR_HANDLER
|
149
197
|
end
|
150
198
|
end
|
151
199
|
|
152
200
|
# Patcher enables patching of 'httpx' with datadog components.
|
153
201
|
#
|
154
202
|
module Patcher
|
155
|
-
include
|
203
|
+
include TRACING_MODULE::Contrib::Patcher
|
156
204
|
|
157
205
|
module_function
|
158
206
|
|
@@ -192,8 +240,14 @@ module Datadog
|
|
192
240
|
super && version >= MINIMUM_VERSION
|
193
241
|
end
|
194
242
|
|
195
|
-
|
196
|
-
|
243
|
+
if defined?(::DDTrace) && ::DDTrace::VERSION::STRING >= "1.0.0"
|
244
|
+
def new_configuration
|
245
|
+
Configuration::Settings.new
|
246
|
+
end
|
247
|
+
else
|
248
|
+
def default_configuration
|
249
|
+
Configuration::Settings.new
|
250
|
+
end
|
197
251
|
end
|
198
252
|
|
199
253
|
def patcher
|
@@ -99,33 +99,31 @@ module Faraday
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
102
|
+
module ReasonPlugin
|
103
|
+
if RUBY_VERSION < "2.5"
|
104
|
+
def self.load_dependencies(*)
|
105
|
+
require "webrick"
|
106
|
+
end
|
107
|
+
else
|
108
|
+
def self.load_dependencies(*)
|
109
|
+
require "net/http/status"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
module ResponseMethods
|
107
113
|
if RUBY_VERSION < "2.5"
|
108
|
-
def
|
109
|
-
|
114
|
+
def reason
|
115
|
+
WEBrick::HTTPStatus::StatusMessage.fetch(@status)
|
110
116
|
end
|
111
117
|
else
|
112
|
-
def
|
113
|
-
|
114
|
-
end
|
115
|
-
end
|
116
|
-
module ResponseMethods
|
117
|
-
if RUBY_VERSION < "2.5"
|
118
|
-
def reason
|
119
|
-
WEBrick::HTTPStatus::StatusMessage.fetch(@status)
|
120
|
-
end
|
121
|
-
else
|
122
|
-
def reason
|
123
|
-
Net::HTTP::STATUS_CODES.fetch(@status)
|
124
|
-
end
|
118
|
+
def reason
|
119
|
+
Net::HTTP::STATUS_CODES.fetch(@status)
|
125
120
|
end
|
126
121
|
end
|
127
122
|
end
|
128
|
-
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.session
|
126
|
+
@session ||= ::HTTPX.plugin(:compression).plugin(:persistent).plugin(ReasonPlugin)
|
129
127
|
end
|
130
128
|
|
131
129
|
class ParallelManager
|
@@ -161,7 +159,6 @@ module Faraday
|
|
161
159
|
include RequestMixin
|
162
160
|
|
163
161
|
def initialize
|
164
|
-
@session = Session.new
|
165
162
|
@handlers = []
|
166
163
|
end
|
167
164
|
|
@@ -174,7 +171,7 @@ module Faraday
|
|
174
171
|
def run
|
175
172
|
env = @handlers.last.env
|
176
173
|
|
177
|
-
session =
|
174
|
+
session = HTTPX.session.with(options_from_env(env))
|
178
175
|
session = session.plugin(:proxy).with(proxy: { uri: env.request.proxy }) if env.request.proxy
|
179
176
|
session = session.plugin(OnDataPlugin) if env.request.stream_response?
|
180
177
|
|
@@ -205,7 +202,7 @@ module Faraday
|
|
205
202
|
|
206
203
|
def initialize(app, options = {})
|
207
204
|
super(app)
|
208
|
-
@
|
205
|
+
@session_options = options
|
209
206
|
end
|
210
207
|
|
211
208
|
def call(env)
|
@@ -221,7 +218,9 @@ module Faraday
|
|
221
218
|
return handler
|
222
219
|
end
|
223
220
|
|
224
|
-
session =
|
221
|
+
session = HTTPX.session
|
222
|
+
session = session.with(@session_options) unless @session_options.empty?
|
223
|
+
session = session.with(options_from_env(env))
|
225
224
|
session = session.plugin(:proxy).with(proxy: { uri: env.request.proxy }) if env.request.proxy
|
226
225
|
session = session.plugin(OnDataPlugin) if env.request.stream_response?
|
227
226
|
|
data/lib/httpx/plugins/proxy.rb
CHANGED
@@ -81,7 +81,11 @@ module HTTPX
|
|
81
81
|
end
|
82
82
|
uris
|
83
83
|
end
|
84
|
-
|
84
|
+
return if @_proxy_uris.empty?
|
85
|
+
|
86
|
+
proxy_opts = { uri: @_proxy_uris.first }
|
87
|
+
proxy_opts = options.proxy.merge(proxy_opts) if options.proxy
|
88
|
+
proxy_opts
|
85
89
|
end
|
86
90
|
|
87
91
|
def find_connection(request, connections, options)
|
data/lib/httpx/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: httpx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.19.
|
4
|
+
version: 0.19.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tiago Cardoso
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http-2-next
|
@@ -76,6 +76,9 @@ extra_rdoc_files:
|
|
76
76
|
- doc/release_notes/0_19_3.md
|
77
77
|
- doc/release_notes/0_19_4.md
|
78
78
|
- doc/release_notes/0_19_5.md
|
79
|
+
- doc/release_notes/0_19_6.md
|
80
|
+
- doc/release_notes/0_19_7.md
|
81
|
+
- doc/release_notes/0_19_8.md
|
79
82
|
- doc/release_notes/0_1_0.md
|
80
83
|
- doc/release_notes/0_2_0.md
|
81
84
|
- doc/release_notes/0_2_1.md
|
@@ -145,6 +148,9 @@ files:
|
|
145
148
|
- doc/release_notes/0_19_3.md
|
146
149
|
- doc/release_notes/0_19_4.md
|
147
150
|
- doc/release_notes/0_19_5.md
|
151
|
+
- doc/release_notes/0_19_6.md
|
152
|
+
- doc/release_notes/0_19_7.md
|
153
|
+
- doc/release_notes/0_19_8.md
|
148
154
|
- doc/release_notes/0_1_0.md
|
149
155
|
- doc/release_notes/0_2_0.md
|
150
156
|
- doc/release_notes/0_2_1.md
|