coverband-service-client 0.0.12.rc → 0.0.12
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/Gemfile.lock +1 -1
- data/bin/stats +42 -0
- data/coverband-service-client.gemspec +8 -0
- data/lib/coverband-service-client.rb +78 -11
- data/lib/coverband/service/client/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6391e88b97c48592f2adcaa31d2870589fc5a370e23a9fa12dba5d9c5344016a
|
4
|
+
data.tar.gz: cabef455a4fbe75afa34d28a6f24686cd536bb1fded5745fd35987425a925512
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d2e149104351ff97918e921875044d6d05cf1ce5d0fd5ca7456a09892d65b659c0d771b7a5d61353aa5985e78c6bb96b0af8bbe8d77781a640586a1873d9e3c
|
7
|
+
data.tar.gz: 8a44da13a736a3f47935b38d3a59591a62b31471559842bc6ac9cfab2fa2d6b5d3019a5fbb173bd3bced1c387c92d79588bb57b447a5c0fd986a442c0f79b6db
|
data/Gemfile.lock
CHANGED
data/bin/stats
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
|
5
|
+
ENV['COVERBAND_ENABLE_DEV_MODE'] = 'true'
|
6
|
+
ENV['COVERBAND_ENABLE_TEST_MODE'] = 'true'
|
7
|
+
ENV['PROCESS_TYPE'] = 'debug'
|
8
|
+
ENV['COVERBAND_REPORT_PERIOD'] = '30'
|
9
|
+
ENV['COVERBAND_API_KEY'] ||= 'set this'
|
10
|
+
ENV['COVERBAND_STATS_KEY'] ||='set this'
|
11
|
+
|
12
|
+
require "pry-byebug";
|
13
|
+
require "dogapi";
|
14
|
+
require "net/http/persistent";
|
15
|
+
# require "httplog";
|
16
|
+
require 'benchmark'
|
17
|
+
|
18
|
+
require_relative "../lib/coverband-service-client"
|
19
|
+
|
20
|
+
# HttpLog.configure do |config|
|
21
|
+
# config.url_SAFElist_pattern = /coverband/
|
22
|
+
# end
|
23
|
+
|
24
|
+
data = {
|
25
|
+
'app/helpers/posts_helper.rb' => [1, nil]
|
26
|
+
}
|
27
|
+
|
28
|
+
collector = Coverband::Collectors::Coverage.instance
|
29
|
+
store = Coverband.configuration.store
|
30
|
+
|
31
|
+
# What is the recommended timeout against the target, from the lib
|
32
|
+
# puts store.recommended_timeout
|
33
|
+
|
34
|
+
Benchmark.bmbm do |x|
|
35
|
+
x.report("connection") do
|
36
|
+
30.times do
|
37
|
+
store.save_report(data)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
puts "done"
|
@@ -28,6 +28,14 @@ Gem::Specification.new do |spec|
|
|
28
28
|
|
29
29
|
spec.add_development_dependency "bundler", "~> 2.0"
|
30
30
|
spec.add_development_dependency "rake", "~> 13.0"
|
31
|
+
|
32
|
+
# For benchmarking stats
|
33
|
+
# spec.add_development_dependency "pry-byebug"
|
34
|
+
# spec.add_development_dependency "dogapi"
|
35
|
+
# spec.add_development_dependency "httplog"
|
36
|
+
# # to benchmark persistent connections
|
37
|
+
# spec.add_development_dependency "net-http-persistent"
|
38
|
+
|
31
39
|
spec.add_development_dependency "minitest", "~> 5.0"
|
32
40
|
spec.add_runtime_dependency "coverband", "~> 4.2.4"
|
33
41
|
end
|
@@ -10,11 +10,12 @@ require 'securerandom'
|
|
10
10
|
module Coverband
|
11
11
|
COVERBAND_ENV = ENV['RACK_ENV'] || ENV['RAILS_ENV'] || (defined?(Rails) ? Rails.env : 'unknown')
|
12
12
|
COVERBAND_SERVICE_URL = ENV['COVERBAND_URL'] || 'https://coverband.io'
|
13
|
-
COVERBAND_TIMEOUT = (COVERBAND_ENV == 'development') ? 5 :
|
13
|
+
COVERBAND_TIMEOUT = (COVERBAND_ENV == 'development') ? 5 : 2
|
14
14
|
COVERBAND_ENABLE_DEV_MODE = ENV['COVERBAND_ENABLE_DEV_MODE'] || false
|
15
15
|
COVERBAND_ENABLE_TEST_MODE = ENV['COVERBAND_ENABLE_TEST_MODE'] || false
|
16
16
|
COVERBAND_PROCESS_TYPE = ENV['PROCESS_TYPE'] || 'unknown'
|
17
17
|
COVERBAND_REPORT_PERIOD = (ENV['COVERBAND_REPORT_PERIOD'] || 600).to_i
|
18
|
+
COVERBAND_PERSISTENT_HTTP = ENV['COVERBAND_PERSISTENT_HTTP'] || false
|
18
19
|
|
19
20
|
def self.service_disabled_dev_test_env?
|
20
21
|
(COVERBAND_ENV == 'test' && !COVERBAND_ENABLE_TEST_MODE) ||
|
@@ -39,14 +40,36 @@ module Coverband
|
|
39
40
|
# * currently JSON, but likely better to move to something faster
|
40
41
|
###
|
41
42
|
class Service < Base
|
42
|
-
attr_reader :coverband_url, :process_type, :runtime_env, :hostname, :pid
|
43
|
+
attr_reader :coverband_url, :process_type, :runtime_env, :hostname, :pid, :stats
|
43
44
|
|
44
45
|
def initialize(coverband_url, opts = {})
|
45
46
|
super()
|
46
47
|
@coverband_url = coverband_url
|
47
48
|
@process_type = opts.fetch(:process_type) { $PROGRAM_NAME&.split('/')&.last || COVERBAND_PROCESS_TYPE }
|
48
49
|
@hostname = opts.fetch(:hostname) { ENV["DYNO"] || Socket.gethostname.force_encoding('utf-8').encode }
|
50
|
+
@hostname = @hostname.gsub("'",'').gsub("’",'')
|
49
51
|
@runtime_env = opts.fetch(:runtime_env) { COVERBAND_ENV }
|
52
|
+
@failed_coverage_reports = []
|
53
|
+
initialize_stats
|
54
|
+
end
|
55
|
+
|
56
|
+
def initialize_stats
|
57
|
+
return unless ENV['COVERBAND_STATS_KEY']
|
58
|
+
return unless defined?(Dogapi::Client)
|
59
|
+
|
60
|
+
@stats = Dogapi::Client.new(ENV['COVERBAND_STATS_KEY'])
|
61
|
+
@app_name = defined?(Rails) ? Rails.application.class.module_parent.to_s : "unknown"
|
62
|
+
end
|
63
|
+
|
64
|
+
def report_timing(timing)
|
65
|
+
return unless @stats
|
66
|
+
|
67
|
+
@stats.emit_point(
|
68
|
+
'coverband.save.time',
|
69
|
+
timing,
|
70
|
+
host: hostname,
|
71
|
+
device: "coverband_#{self.class.name.split("::").last}",
|
72
|
+
options: {tags: [runtime_env]})
|
50
73
|
end
|
51
74
|
|
52
75
|
def logger
|
@@ -110,7 +133,12 @@ module Coverband
|
|
110
133
|
file_coverage: data
|
111
134
|
}
|
112
135
|
}
|
136
|
+
|
137
|
+
starting = Process.clock_gettime(Process::CLOCK_MONOTONIC) if @stats
|
113
138
|
save_coverage(full_package)
|
139
|
+
ending = Process.clock_gettime(Process::CLOCK_MONOTONIC) if @stats
|
140
|
+
report_timing((ending - starting)) if @stats
|
141
|
+
retry_failed_reports
|
114
142
|
end&.join
|
115
143
|
end
|
116
144
|
|
@@ -120,20 +148,48 @@ module Coverband
|
|
120
148
|
|
121
149
|
private
|
122
150
|
|
151
|
+
def retry_failed_reports
|
152
|
+
retries = []
|
153
|
+
@failed_coverage_reports.any? do
|
154
|
+
report_body = arr.pop
|
155
|
+
send_report_body(report_body)
|
156
|
+
rescue StandardError
|
157
|
+
retries << report_body
|
158
|
+
end
|
159
|
+
retries.each do |report_body|
|
160
|
+
add_retry_message(report_body)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def add_retry_message(report_body)
|
165
|
+
if @failed_coverage_reports.length > 5
|
166
|
+
logger&.info "Coverband: The errored reporting queue has reached 5. Subsequent reports will not be transmitted"
|
167
|
+
else
|
168
|
+
@failed_coverage_reports << report_body
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
123
172
|
def save_coverage(data)
|
124
173
|
if api_key.nil?
|
125
174
|
puts "Coverband: Error: no Coverband API key was found!"
|
126
175
|
return
|
127
176
|
end
|
128
177
|
|
178
|
+
coverage_body = { remote_uuid: SecureRandom.uuid, data: data }.to_json
|
179
|
+
send_report_body(coverage_body)
|
180
|
+
rescue StandardError => e
|
181
|
+
add_retry_message(coverage_body)
|
182
|
+
logger&.info "Coverband: Error while saving coverage #{e}" if Coverband.configuration.verbose || COVERBAND_ENABLE_DEV_MODE
|
183
|
+
end
|
184
|
+
|
185
|
+
def send_report_body(coverage_body)
|
129
186
|
uri = URI("#{coverband_url}/api/collector")
|
130
|
-
req = Net::HTTP::Post.new(uri,
|
187
|
+
req = ::Net::HTTP::Post.new(uri,
|
131
188
|
'Content-Type' => 'application/json',
|
132
189
|
'Coverband-Token' => api_key)
|
133
|
-
req.body =
|
134
|
-
|
190
|
+
req.body = coverage_body
|
135
191
|
logger&.info "Coverband: saving (#{uri}) #{req.body}" if Coverband.configuration.verbose
|
136
|
-
res = Net::HTTP.start(
|
192
|
+
res = ::Net::HTTP.start(
|
137
193
|
uri.hostname,
|
138
194
|
uri.port,
|
139
195
|
open_timeout: COVERBAND_TIMEOUT,
|
@@ -143,19 +199,24 @@ module Coverband
|
|
143
199
|
) do |http|
|
144
200
|
http.request(req)
|
145
201
|
end
|
146
|
-
|
147
|
-
|
202
|
+
if res.code.to_i >= 500
|
203
|
+
add_retry_message(coverage_body)
|
204
|
+
end
|
148
205
|
end
|
149
206
|
end
|
150
207
|
|
151
208
|
class PersistentService < Service
|
152
|
-
attr_reader :http
|
209
|
+
attr_reader :http, :stats
|
153
210
|
|
154
211
|
def initialize(coverband_url, opts = {})
|
155
212
|
super
|
156
213
|
initiate_http
|
157
214
|
end
|
158
215
|
|
216
|
+
def recommended_timeout
|
217
|
+
puts Net::HTTP::Persistent.detect_idle_timeout URI("#{coverband_url}/api/collector")
|
218
|
+
end
|
219
|
+
|
159
220
|
private
|
160
221
|
|
161
222
|
def initiate_http
|
@@ -164,7 +225,13 @@ module Coverband
|
|
164
225
|
@http.headers['Coverband-Token'] = api_key
|
165
226
|
@http.open_timeout = COVERBAND_TIMEOUT
|
166
227
|
@http.read_timeout = COVERBAND_TIMEOUT
|
167
|
-
|
228
|
+
# the two below seem inconsistent in terms of how they are set
|
229
|
+
# leaving off for now
|
230
|
+
# @http.ssl_timeout = COVERBAND_TIMEOUT
|
231
|
+
# @http.write_timeout = COVERBAND_TIMEOUT
|
232
|
+
# default is 5-10 seconds but we report ever few min, heroku kills them
|
233
|
+
# before our reporting period... ;(
|
234
|
+
# @http.idle_timeout = 1000
|
168
235
|
end
|
169
236
|
|
170
237
|
def save_coverage(data)
|
@@ -269,7 +336,7 @@ end
|
|
269
336
|
ENV['COVERBAND_DISABLE_AUTO_START'] = COVERBAND_ORIGINAL_START
|
270
337
|
Coverband.configure do |config|
|
271
338
|
# Use the Service Adapter
|
272
|
-
if defined?(Net::HTTP::Persistent)
|
339
|
+
if Coverband::COVERBAND_PERSISTENT_HTTP && defined?(Net::HTTP::Persistent)
|
273
340
|
config.store = Coverband::Adapters::PersistentService.new(Coverband::COVERBAND_SERVICE_URL)
|
274
341
|
else
|
275
342
|
config.store = Coverband::Adapters::Service.new(Coverband::COVERBAND_SERVICE_URL)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coverband-service-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.12
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dan Mayer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-06-
|
12
|
+
date: 2020-06-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- Rakefile
|
85
85
|
- bin/console
|
86
86
|
- bin/setup
|
87
|
+
- bin/stats
|
87
88
|
- changelog.md
|
88
89
|
- coverband-service-client.gemspec
|
89
90
|
- lib/coverband-service-client.rb
|
@@ -106,9 +107,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
107
|
version: '0'
|
107
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
109
|
requirements:
|
109
|
-
- - "
|
110
|
+
- - ">="
|
110
111
|
- !ruby/object:Gem::Version
|
111
|
-
version:
|
112
|
+
version: '0'
|
112
113
|
requirements: []
|
113
114
|
rubygems_version: 3.0.3
|
114
115
|
signing_key:
|