influxdb_data_harvester 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
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