influxdb_data_harvester 0.2.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 +7 -0
- data/Gemfile +3 -0
- data/Rakefile +0 -0
- data/VERSION +1 -0
- data/lib/influxdb_data_harvester.rb +52 -0
- data/spec/influxdb_data_harvester_spec.rb +78 -0
- metadata +176 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b359dcd1335973eb36a54826e14e9a675e5aaf31
|
4
|
+
data.tar.gz: ab055deb8fe63127cd4756bdf20c6f460e20dba9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 520357f4eb4749663cdf6fcdf0ff8fa64d1c7800f9a1d69fe6070cb421a1a8d264ea208cd8da56c70048092d1ca1b0dc487b6585d474661038c0e59e143cad0a
|
7
|
+
data.tar.gz: 42983fc0327640d488925c1ad7821368f4afaca1ca7fafd9a8d140a01fc5b30cc94d4da0cef3ce60159ea4c5b28ee95d07677222ff7020ae883c7db77f38da9f
|
data/Gemfile
ADDED
data/Rakefile
ADDED
File without changes
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.0
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'influxdb'
|
4
|
+
require 'concurrent/promise'
|
5
|
+
|
6
|
+
# InfluxdbDataHarvester sends rspec result data to a database (InfluxDB)
|
7
|
+
# Allows aggregating the results of Rspec tests in one location.
|
8
|
+
class InfluxDBDataHarvester
|
9
|
+
attr_reader :database_client
|
10
|
+
|
11
|
+
def initialize(database: 'master', host: '127.0.0.1')
|
12
|
+
@database_client = InfluxDB::Client.new database: database,
|
13
|
+
host: host,
|
14
|
+
time_precision: 'u'
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_payload(example, extra_data: nil, tags: nil)
|
18
|
+
# Rspec status is populated when the rspec after hooks complete, wait until then
|
19
|
+
Timeout.timeout(5) { sleep 0.0001 while example.execution_result.status.nil? }
|
20
|
+
|
21
|
+
data = default_data(example)
|
22
|
+
data[:values].merge! extra_data if extra_data
|
23
|
+
data[:tags] = tags if tags
|
24
|
+
data
|
25
|
+
end
|
26
|
+
|
27
|
+
def queue_send_data(example, series: 'test_results', extra_data: nil, tags: nil)
|
28
|
+
Concurrent::Promise.execute { send_data(example, series, extra_data: extra_data, tags: tags) }
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def default_data(example)
|
34
|
+
{
|
35
|
+
values: { duration: example.execution_result.run_time,
|
36
|
+
result: example.execution_result.status.to_s,
|
37
|
+
name: example.metadata[:full_description],
|
38
|
+
source_environment: source_environment }
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def send_data(example, series, extra_data: nil, tags: nil)
|
43
|
+
return if source_environment == 'bitbucket'
|
44
|
+
|
45
|
+
data = generate_payload(example, extra_data: extra_data, tags: tags)
|
46
|
+
@database_client.write_point(series, data)
|
47
|
+
end
|
48
|
+
|
49
|
+
def source_environment
|
50
|
+
ENV['source_environment'] ||= 'local'
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'influxdb_data_harvester'
|
4
|
+
require 'rspec/eventually'
|
5
|
+
require 'webmock/rspec'
|
6
|
+
|
7
|
+
describe InfluxDBDataHarvester do
|
8
|
+
subject(:harvester) { described_class.new }
|
9
|
+
|
10
|
+
let(:current_example) do
|
11
|
+
metadata = {
|
12
|
+
description: 'can send test data',
|
13
|
+
full_description: 'InfluxdbDataHarvester can send test data',
|
14
|
+
file_path: './spec/data_harvester_spec.rb',
|
15
|
+
line_number: 26,
|
16
|
+
location: './spec/data_harvester_spec.rb:26',
|
17
|
+
absolute_file_path: '/Development/spec/data_harvester_spec.rb',
|
18
|
+
rerun_file_path: './spec/data_harvester_spec.rb',
|
19
|
+
last_run_status: 'passed'
|
20
|
+
}
|
21
|
+
current_example = RSpec.current_example
|
22
|
+
metadata.each do |key, value|
|
23
|
+
current_example.metadata[key] = value
|
24
|
+
end
|
25
|
+
current_example.execution_result.status = 'passed'
|
26
|
+
current_example
|
27
|
+
end
|
28
|
+
|
29
|
+
before do
|
30
|
+
stub_request(:any, '127.0.0.1')
|
31
|
+
query = { db: 'master', p: 'root', precision: 'u', u: 'root' }
|
32
|
+
body = 'test_results duration=,result="passed",'
|
33
|
+
body += 'name="InfluxdbDataHarvester can send test data",source_environment="local"'
|
34
|
+
@request = a_request(:post, '127.0.0.1:8086/write').with(body: body, query: query)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'can send test data' do
|
38
|
+
harvester.queue_send_data(current_example)
|
39
|
+
# Need to find out what expectation to check here
|
40
|
+
expect { @request }.to eventually(have_been_made.once).within 2
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'can be customized' do
|
44
|
+
subject(:custom_database_harvester) { described_class.new database: 'test_run_results' }
|
45
|
+
|
46
|
+
before do
|
47
|
+
query = { db: 'test_run_results', p: 'root', precision: 'u', u: 'root' }
|
48
|
+
body = 'test_results duration=,result="passed",'
|
49
|
+
body += 'name="InfluxdbDataHarvester can send test data",source_environment="local"'
|
50
|
+
@request = a_request(:post, '127.0.0.1:8086/write').with(body: body, query: query)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'to use a different database' do
|
54
|
+
custom_database_harvester.queue_send_data(current_example)
|
55
|
+
expect { @request }.to eventually(have_been_made.once).within 2
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'generates payload that includes full description' do
|
60
|
+
data = harvester.generate_payload(current_example)
|
61
|
+
expect(data[:values][:name]).to eq 'InfluxdbDataHarvester can send test data'
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'supports custom data in the payload' do
|
65
|
+
query = { db: 'master', p: 'root', precision: 'u', u: 'root' }
|
66
|
+
body = 'test_results duration=,result="passed",'
|
67
|
+
body += 'name="InfluxdbDataHarvester can send test data",source_environment="local"'
|
68
|
+
body += ',custom_field="custom_data"'
|
69
|
+
request = a_request(:post, '127.0.0.1:8086/write').with(body: body, query: query)
|
70
|
+
|
71
|
+
custom_data = {
|
72
|
+
custom_field: 'custom_data'
|
73
|
+
}
|
74
|
+
|
75
|
+
harvester.queue_send_data(current_example, extra_data: custom_data)
|
76
|
+
expect { request }.to eventually(have_been_made.once).within 2
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: influxdb_data_harvester
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Felix Barros
|
8
|
+
- Tom Mason
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2018-08-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
name: bundler
|
21
|
+
prerelease: false
|
22
|
+
type: :development
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.3'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '12.3'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 12.3.1
|
37
|
+
name: rake
|
38
|
+
prerelease: false
|
39
|
+
type: :development
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - "~>"
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '12.3'
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 12.3.1
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3.6'
|
54
|
+
name: rspec
|
55
|
+
prerelease: false
|
56
|
+
type: :development
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.6'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0.49'
|
68
|
+
name: rubocop
|
69
|
+
prerelease: false
|
70
|
+
type: :development
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.49'
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '3.0'
|
82
|
+
name: webmock
|
83
|
+
prerelease: false
|
84
|
+
type: :development
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '1.0'
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 1.0.5
|
99
|
+
name: concurrent-ruby
|
100
|
+
prerelease: false
|
101
|
+
type: :runtime
|
102
|
+
version_requirements: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - "~>"
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '1.0'
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.0.5
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 0.6.0
|
116
|
+
name: influxdb
|
117
|
+
prerelease: false
|
118
|
+
type: :runtime
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 0.6.0
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: 0.2.2
|
130
|
+
name: rspec-eventually
|
131
|
+
prerelease: false
|
132
|
+
type: :runtime
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - "~>"
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: 0.2.2
|
138
|
+
description:
|
139
|
+
email:
|
140
|
+
- felix.barros@finalsite.com
|
141
|
+
- tom.mason@finalsite.com
|
142
|
+
executables: []
|
143
|
+
extensions: []
|
144
|
+
extra_rdoc_files: []
|
145
|
+
files:
|
146
|
+
- Gemfile
|
147
|
+
- Rakefile
|
148
|
+
- VERSION
|
149
|
+
- lib/influxdb_data_harvester.rb
|
150
|
+
- spec/influxdb_data_harvester_spec.rb
|
151
|
+
homepage: https://finalsite.com/
|
152
|
+
licenses:
|
153
|
+
- MIT
|
154
|
+
metadata: {}
|
155
|
+
post_install_message:
|
156
|
+
rdoc_options: []
|
157
|
+
require_paths:
|
158
|
+
- lib
|
159
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: 2.2.0
|
164
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0'
|
169
|
+
requirements: []
|
170
|
+
rubyforge_project:
|
171
|
+
rubygems_version: 2.6.14.1
|
172
|
+
signing_key:
|
173
|
+
specification_version: 4
|
174
|
+
summary: Allows aggregating results of Rspec tests into InfluxDB
|
175
|
+
test_files:
|
176
|
+
- spec/influxdb_data_harvester_spec.rb
|