datadog-ci 1.0.1 → 1.1.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 +9 -2
- data/lib/datadog/ci/configuration/components.rb +1 -1
- data/lib/datadog/ci/contrib/rspec/example.rb +1 -1
- data/lib/datadog/ci/contrib/rspec/patcher.rb +3 -3
- data/lib/datadog/ci/transport/adapters/net.rb +138 -0
- data/lib/datadog/ci/transport/api/agentless.rb +2 -2
- data/lib/datadog/ci/transport/api/evp_proxy.rb +1 -1
- data/lib/datadog/ci/transport/http.rb +7 -57
- data/lib/datadog/ci/version.rb +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61f6379b9a5ac0c29ff9ee6b1687c1c2add77d6a5031dfd5758eb34a66cc6235
|
4
|
+
data.tar.gz: a795d8d69513925ee5ea6cf113cb54cec3711fe65ae5e928fcdeb8e1454323af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ea51d0baa70ecb4e66fb49712f4f291582ecb04455b2d32ec1328bb8ea3c112c4c25d80e450db542ee4f29408786b09a82b5f94fb1c7ef8c96b98d301e61e9b
|
7
|
+
data.tar.gz: 4f066970c2d9ed93001f35f9096cefcf2a4447a86cf7c1d89435853b1da00389c587924304c7a213e56f58f64b191523d202e34f86da535ded271583881411ac
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [1.1.0] - 2024-07-01
|
4
|
+
|
5
|
+
### Added
|
6
|
+
* Ignore Webmock automatically when making HTTP calls ([#193][])
|
7
|
+
|
3
8
|
## [1.0.1] - 2024-06-11
|
4
9
|
|
5
10
|
### Fixed
|
@@ -267,7 +272,8 @@ Currently test suite level visibility is not used by our instrumentation: it wil
|
|
267
272
|
|
268
273
|
- Ruby versions < 2.7 no longer supported ([#8][])
|
269
274
|
|
270
|
-
[Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v1.0
|
275
|
+
[Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v1.1.0...main
|
276
|
+
[1.1.0]: https://github.com/DataDog/datadog-ci-rb/compare/v1.0.1...v1.1.0
|
271
277
|
[1.0.1]: https://github.com/DataDog/datadog-ci-rb/compare/v1.0.0...v1.0.1
|
272
278
|
[1.0.0]: https://github.com/DataDog/datadog-ci-rb/compare/v1.0.0.beta6...v1.0.0
|
273
279
|
[1.0.0.beta6]: https://github.com/DataDog/datadog-ci-rb/compare/v1.0.0.beta5...v1.0.0.beta6
|
@@ -377,4 +383,5 @@ Currently test suite level visibility is not used by our instrumentation: it wil
|
|
377
383
|
[#183]: https://github.com/DataDog/datadog-ci-rb/issues/183
|
378
384
|
[#185]: https://github.com/DataDog/datadog-ci-rb/issues/185
|
379
385
|
[#189]: https://github.com/DataDog/datadog-ci-rb/issues/189
|
380
|
-
[#190]: https://github.com/DataDog/datadog-ci-rb/issues/190
|
386
|
+
[#190]: https://github.com/DataDog/datadog-ci-rb/issues/190
|
387
|
+
[#193]: https://github.com/DataDog/datadog-ci-rb/issues/193
|
@@ -42,15 +42,15 @@ module Datadog
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def ci_queue?
|
45
|
-
defined?(::RSpec::Queue::Runner)
|
45
|
+
!!defined?(::RSpec::Queue::Runner)
|
46
46
|
end
|
47
47
|
|
48
48
|
def knapsack_pro?
|
49
49
|
knapsack_version = Gem.loaded_specs["knapsack_pro"]&.version
|
50
50
|
|
51
51
|
# additional instrumentation is needed for KnapsackPro version 7 and later
|
52
|
-
defined?(::KnapsackPro) &&
|
53
|
-
knapsack_version && knapsack_version >= Gem::Version.new("7")
|
52
|
+
!!defined?(::KnapsackPro) &&
|
53
|
+
!knapsack_version.nil? && knapsack_version >= Gem::Version.new("7")
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "datadog/core/transport/response"
|
4
|
+
require "datadog/core/transport/ext"
|
5
|
+
|
6
|
+
require_relative "../gzip"
|
7
|
+
require_relative "../../ext/transport"
|
8
|
+
|
9
|
+
module Datadog
|
10
|
+
module CI
|
11
|
+
module Transport
|
12
|
+
module Adapters
|
13
|
+
# Adapter for Net::HTTP
|
14
|
+
class Net
|
15
|
+
attr_reader \
|
16
|
+
:hostname,
|
17
|
+
:port,
|
18
|
+
:timeout,
|
19
|
+
:ssl
|
20
|
+
|
21
|
+
def initialize(hostname:, port:, ssl:, timeout_seconds:)
|
22
|
+
@hostname = hostname
|
23
|
+
@port = port
|
24
|
+
@timeout = timeout_seconds
|
25
|
+
@ssl = ssl
|
26
|
+
end
|
27
|
+
|
28
|
+
def open(&block)
|
29
|
+
req = net_http_client.new(hostname, port)
|
30
|
+
|
31
|
+
req.use_ssl = ssl
|
32
|
+
req.open_timeout = req.read_timeout = timeout
|
33
|
+
|
34
|
+
req.start(&block)
|
35
|
+
end
|
36
|
+
|
37
|
+
def call(path:, payload:, headers:, verb:)
|
38
|
+
headers ||= {}
|
39
|
+
# skip tracing for internal DD requests
|
40
|
+
headers[Core::Transport::Ext::HTTP::HEADER_DD_INTERNAL_UNTRACED_REQUEST] = "1"
|
41
|
+
|
42
|
+
if respond_to?(verb)
|
43
|
+
send(verb, path: path, payload: payload, headers: headers)
|
44
|
+
else
|
45
|
+
raise "Unknown HTTP method [#{verb}]"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def post(path:, payload:, headers:)
|
50
|
+
post = ::Net::HTTP::Post.new(path, headers)
|
51
|
+
post.body = payload
|
52
|
+
|
53
|
+
# Connect and send the request
|
54
|
+
http_response = open do |http|
|
55
|
+
http.request(post)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Build and return response
|
59
|
+
Response.new(http_response)
|
60
|
+
end
|
61
|
+
|
62
|
+
class Response
|
63
|
+
include Datadog::Core::Transport::Response
|
64
|
+
|
65
|
+
attr_reader :http_response
|
66
|
+
|
67
|
+
def initialize(http_response)
|
68
|
+
@http_response = http_response
|
69
|
+
end
|
70
|
+
|
71
|
+
def payload
|
72
|
+
return @decompressed_payload if defined?(@decompressed_payload)
|
73
|
+
return http_response.body unless gzipped_content?
|
74
|
+
return http_response.body unless gzipped_body?(http_response.body)
|
75
|
+
|
76
|
+
Datadog.logger.debug("Decompressing gzipped response payload")
|
77
|
+
@decompressed_payload = Gzip.decompress(http_response.body)
|
78
|
+
end
|
79
|
+
|
80
|
+
def header(name)
|
81
|
+
http_response[name]
|
82
|
+
end
|
83
|
+
|
84
|
+
def code
|
85
|
+
http_response.code.to_i
|
86
|
+
end
|
87
|
+
|
88
|
+
def ok?
|
89
|
+
code.between?(200, 299)
|
90
|
+
end
|
91
|
+
|
92
|
+
def unsupported?
|
93
|
+
code == 415
|
94
|
+
end
|
95
|
+
|
96
|
+
def not_found?
|
97
|
+
code == 404
|
98
|
+
end
|
99
|
+
|
100
|
+
def client_error?
|
101
|
+
code.between?(400, 499)
|
102
|
+
end
|
103
|
+
|
104
|
+
def server_error?
|
105
|
+
code.between?(500, 599)
|
106
|
+
end
|
107
|
+
|
108
|
+
def gzipped_content?
|
109
|
+
header(Ext::Transport::HEADER_CONTENT_ENCODING) == Ext::Transport::CONTENT_ENCODING_GZIP
|
110
|
+
end
|
111
|
+
|
112
|
+
def gzipped_body?(body)
|
113
|
+
return false if body.nil? || body.empty?
|
114
|
+
|
115
|
+
# no-dd-sa
|
116
|
+
first_bytes = body[0, 2]
|
117
|
+
return false if first_bytes.nil? || first_bytes.empty?
|
118
|
+
|
119
|
+
first_bytes.b == Ext::Transport::GZIP_MAGIC_NUMBER
|
120
|
+
end
|
121
|
+
|
122
|
+
def inspect
|
123
|
+
"#{super}, http_response:#{http_response}"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
private
|
128
|
+
|
129
|
+
def net_http_client
|
130
|
+
return ::Net::HTTP unless defined?(WebMock::HttpLibAdapters::NetHttpAdapter::OriginalNetHTTP)
|
131
|
+
|
132
|
+
WebMock::HttpLibAdapters::NetHttpAdapter::OriginalNetHTTP
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -37,7 +37,7 @@ module Datadog
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def citestcov_request(path:, payload:, headers: {}, verb: "post")
|
40
|
-
super
|
40
|
+
super
|
41
41
|
|
42
42
|
perform_request(@citestcov_http, path: path, payload: @citestcov_payload, headers: headers, verb: verb)
|
43
43
|
end
|
@@ -60,7 +60,7 @@ module Datadog
|
|
60
60
|
|
61
61
|
Datadog::CI::Transport::HTTP.new(
|
62
62
|
host: uri.host,
|
63
|
-
port: uri.port,
|
63
|
+
port: uri.port || 80,
|
64
64
|
ssl: uri.scheme == "https" || uri.port == 443,
|
65
65
|
compress: compress
|
66
66
|
)
|
@@ -39,7 +39,7 @@ module Datadog
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def citestcov_request(path:, payload:, headers: {}, verb: "post")
|
42
|
-
super
|
42
|
+
super
|
43
43
|
|
44
44
|
headers[Ext::Transport::HEADER_EVP_SUBDOMAIN] = Ext::Transport::TEST_COVERAGE_INTAKE_HOST_PREFIX
|
45
45
|
|
@@ -1,12 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "delegate"
|
4
|
-
require "datadog/core/transport/http/adapters/net"
|
5
|
-
require "datadog/core/transport/http/env"
|
6
|
-
require "datadog/core/transport/request"
|
7
4
|
require "socket"
|
8
5
|
|
9
6
|
require_relative "gzip"
|
7
|
+
require_relative "adapters/net"
|
10
8
|
require_relative "../ext/transport"
|
11
9
|
|
12
10
|
module Datadog
|
@@ -24,7 +22,7 @@ module Datadog
|
|
24
22
|
MAX_RETRIES = 3
|
25
23
|
INITIAL_BACKOFF = 1
|
26
24
|
|
27
|
-
def initialize(host:, timeout: DEFAULT_TIMEOUT,
|
25
|
+
def initialize(host:, port:, timeout: DEFAULT_TIMEOUT, ssl: true, compress: false)
|
28
26
|
@host = host
|
29
27
|
@port = port
|
30
28
|
@timeout = timeout
|
@@ -70,7 +68,7 @@ module Datadog
|
|
70
68
|
|
71
69
|
def perform_http_call(path:, payload:, headers:, verb:, retries: MAX_RETRIES, backoff: INITIAL_BACKOFF)
|
72
70
|
adapter.call(
|
73
|
-
|
71
|
+
path: path, payload: payload, headers: headers, verb: verb
|
74
72
|
)
|
75
73
|
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, SocketError, Net::HTTPBadResponse => e
|
76
74
|
Datadog.logger.debug("Failed to send request with #{e} (#{e.message})")
|
@@ -87,65 +85,17 @@ module Datadog
|
|
87
85
|
end
|
88
86
|
end
|
89
87
|
|
90
|
-
def build_env(path:, payload:, headers:, verb:)
|
91
|
-
env = Datadog::Core::Transport::HTTP::Env.new(
|
92
|
-
Datadog::Core::Transport::Request.new
|
93
|
-
)
|
94
|
-
env.body = payload
|
95
|
-
env.path = path
|
96
|
-
env.headers = headers
|
97
|
-
env.verb = verb
|
98
|
-
env
|
99
|
-
end
|
100
|
-
|
101
88
|
def adapter
|
102
|
-
|
103
|
-
|
89
|
+
@adapter ||= Datadog::CI::Transport::Adapters::Net.new(
|
90
|
+
hostname: host, port: port, ssl: ssl, timeout_seconds: timeout
|
91
|
+
)
|
104
92
|
end
|
105
93
|
|
106
|
-
# adds compatibility with Datadog::Tracing transport
|
107
|
-
# provides ungzipping capabilities
|
94
|
+
# adds compatibility with Datadog::Tracing transport
|
108
95
|
class ResponseDecorator < ::SimpleDelegator
|
109
|
-
def payload
|
110
|
-
return @decompressed_payload if defined?(@decompressed_payload)
|
111
|
-
|
112
|
-
if gzipped?(__getobj__.payload)
|
113
|
-
Datadog.logger.debug("Decompressing gzipped response payload")
|
114
|
-
@decompressed_payload = Gzip.decompress(__getobj__.payload)
|
115
|
-
else
|
116
|
-
__getobj__.payload
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
96
|
def trace_count
|
121
97
|
0
|
122
98
|
end
|
123
|
-
|
124
|
-
def gzipped?(payload)
|
125
|
-
return false if payload.nil? || payload.empty?
|
126
|
-
|
127
|
-
# no-dd-sa
|
128
|
-
first_bytes = payload[0, 2]
|
129
|
-
return false if first_bytes.nil? || first_bytes.empty?
|
130
|
-
|
131
|
-
first_bytes.b == Datadog::CI::Ext::Transport::GZIP_MAGIC_NUMBER
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
class AdapterSettings
|
136
|
-
attr_reader :hostname, :port, :ssl, :timeout_seconds
|
137
|
-
|
138
|
-
def initialize(hostname:, port: nil, ssl: true, timeout_seconds: nil)
|
139
|
-
@hostname = hostname
|
140
|
-
@port = port
|
141
|
-
@ssl = ssl
|
142
|
-
@timeout_seconds = timeout_seconds
|
143
|
-
end
|
144
|
-
|
145
|
-
def ==(other)
|
146
|
-
hostname == other.hostname && port == other.port && ssl == other.ssl &&
|
147
|
-
timeout_seconds == other.timeout_seconds
|
148
|
-
end
|
149
99
|
end
|
150
100
|
end
|
151
101
|
end
|
data/lib/datadog/ci/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datadog-ci
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Datadog, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: datadog
|
@@ -160,6 +160,7 @@ files:
|
|
160
160
|
- lib/datadog/ci/test_visibility/serializers/test_v1.rb
|
161
161
|
- lib/datadog/ci/test_visibility/serializers/test_v2.rb
|
162
162
|
- lib/datadog/ci/test_visibility/transport.rb
|
163
|
+
- lib/datadog/ci/transport/adapters/net.rb
|
163
164
|
- lib/datadog/ci/transport/api/agentless.rb
|
164
165
|
- lib/datadog/ci/transport/api/base.rb
|
165
166
|
- lib/datadog/ci/transport/api/builder.rb
|
@@ -201,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
201
202
|
- !ruby/object:Gem::Version
|
202
203
|
version: 2.0.0
|
203
204
|
requirements: []
|
204
|
-
rubygems_version: 3.5.
|
205
|
+
rubygems_version: 3.5.11
|
205
206
|
signing_key:
|
206
207
|
specification_version: 4
|
207
208
|
summary: Datadog CI visibility for your ruby application
|