gitlab_quality-test_tooling 1.36.0 → 1.37.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 25fe4fd0cb49b8e51816f2da8c88e0722e81c4bd1b71e6ba3f980a8a1ca0e255
4
- data.tar.gz: 679100eddc3bcce725465a9e4c71808fde8917c9014d149639081c22daf95e03
3
+ metadata.gz: 6cad17948e73dda3f8281aaedb34969d1178904f4951e54034b38438c473baa8
4
+ data.tar.gz: 49d38db27d6617815fcec94ebce2610f6ac47faec14f622cf58f2baaae6add55
5
5
  SHA512:
6
- metadata.gz: db8f81ef6632edf827cce50997a2318f5d82c17a1714b3bf4cf6e0407aca5ad47bc34de92a49b3d45c3ad764a585085ff93baa1ce3da5da286dc5015ad61e113
7
- data.tar.gz: 157ac822424ad6cf581ac9cd1993071474e5238d61b44f093080358f1829f95505488d9382819173c632e27f3cc9fff5bd8c3aee3efae51b84bc87ef0373b70d
6
+ metadata.gz: 22e114b48a3260dc61887d5bea9efd7574e4584d0a85fa452574ff89eab73ab26b287c83303997c8696331a11748a80d58e51ade1729fd646aa8a32ff69909b3
7
+ data.tar.gz: 5937ae1ed046b9cc123e5d7c2157cc809bb4edffd35189a89aec90bd95f947bc9026960c806783c9f809918f469fb27961ac938bb46a2a73e94d0341a726986a
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab_quality-test_tooling (1.36.0)
4
+ gitlab_quality-test_tooling (1.37.0)
5
5
  activesupport (>= 7.0, < 7.2)
6
6
  amatch (~> 0.4.1)
7
+ fog-google (~> 1.24, >= 1.24.1)
7
8
  gitlab (~> 4.19)
8
9
  http (~> 5.0)
9
10
  influxdb-client (~> 3.1)
@@ -39,6 +40,7 @@ GEM
39
40
  bigdecimal (3.1.8)
40
41
  binding_of_caller (1.0.0)
41
42
  debug_inspector (>= 0.0.1)
43
+ builder (3.3.0)
42
44
  byebug (11.1.3)
43
45
  claide (1.1.0)
44
46
  claide-plugins (0.9.2)
@@ -71,11 +73,13 @@ GEM
71
73
  danger
72
74
  gitlab (~> 4.2, >= 4.2.0)
73
75
  debug_inspector (1.2.0)
76
+ declarative (0.0.20)
74
77
  diff-lcs (1.5.0)
75
78
  docile (1.4.0)
76
79
  domain_name (0.6.20240107)
77
80
  drb (2.2.1)
78
81
  e2mmap (0.1.0)
82
+ excon (0.111.0)
79
83
  faraday (2.9.0)
80
84
  faraday-net_http (>= 2.0, < 3.2)
81
85
  faraday-http-cache (2.5.1)
@@ -86,6 +90,30 @@ GEM
86
90
  ffi-compiler (1.0.1)
87
91
  ffi (>= 1.0.0)
88
92
  rake
93
+ fog-core (2.4.0)
94
+ builder
95
+ excon (~> 0.71)
96
+ formatador (>= 0.2, < 2.0)
97
+ mime-types
98
+ fog-google (1.24.1)
99
+ addressable (>= 2.7.0)
100
+ fog-core (< 2.5)
101
+ fog-json (~> 1.2)
102
+ fog-xml (~> 0.1.0)
103
+ google-apis-compute_v1 (~> 0.53)
104
+ google-apis-dns_v1 (~> 0.28)
105
+ google-apis-iamcredentials_v1 (~> 0.15)
106
+ google-apis-monitoring_v3 (~> 0.37)
107
+ google-apis-pubsub_v1 (~> 0.30)
108
+ google-apis-sqladmin_v1beta4 (~> 0.38)
109
+ google-apis-storage_v1 (>= 0.19, < 1)
110
+ google-cloud-env (>= 1.2, < 3.0)
111
+ fog-json (1.2.0)
112
+ fog-core
113
+ multi_json (~> 1.10)
114
+ fog-xml (0.1.4)
115
+ fog-core
116
+ nokogiri (>= 1.5.11, < 2.0.0)
89
117
  formatador (1.1.0)
90
118
  git (1.19.1)
91
119
  addressable (~> 2.8)
@@ -103,6 +131,37 @@ GEM
103
131
  rubocop-performance (~> 1.15)
104
132
  rubocop-rails (~> 2.17)
105
133
  rubocop-rspec (~> 2.22)
134
+ google-apis-compute_v1 (0.102.0)
135
+ google-apis-core (>= 0.15.0, < 2.a)
136
+ google-apis-core (0.15.0)
137
+ addressable (~> 2.5, >= 2.5.1)
138
+ googleauth (~> 1.9)
139
+ httpclient (>= 2.8.1, < 3.a)
140
+ mini_mime (~> 1.0)
141
+ representable (~> 3.0)
142
+ retriable (>= 2.0, < 4.a)
143
+ rexml
144
+ google-apis-dns_v1 (0.44.0)
145
+ google-apis-core (>= 0.15.0, < 2.a)
146
+ google-apis-iamcredentials_v1 (0.21.0)
147
+ google-apis-core (>= 0.15.0, < 2.a)
148
+ google-apis-monitoring_v3 (0.65.0)
149
+ google-apis-core (>= 0.15.0, < 2.a)
150
+ google-apis-pubsub_v1 (0.54.0)
151
+ google-apis-core (>= 0.15.0, < 2.a)
152
+ google-apis-sqladmin_v1beta4 (0.74.0)
153
+ google-apis-core (>= 0.15.0, < 2.a)
154
+ google-apis-storage_v1 (0.41.0)
155
+ google-apis-core (>= 0.15.0, < 2.a)
156
+ google-cloud-env (2.1.1)
157
+ faraday (>= 1.0, < 3.a)
158
+ googleauth (1.11.0)
159
+ faraday (>= 1.0, < 3.a)
160
+ google-cloud-env (~> 2.1)
161
+ jwt (>= 1.4, < 3.0)
162
+ multi_json (~> 1.11)
163
+ os (>= 0.9, < 2.0)
164
+ signet (>= 0.16, < 2.a)
106
165
  guard (2.18.1)
107
166
  formatador (>= 0.2.4)
108
167
  listen (>= 2.7, < 4.0)
@@ -129,11 +188,14 @@ GEM
129
188
  httparty (0.21.0)
130
189
  mini_mime (>= 1.0.0)
131
190
  multi_xml (>= 0.5.2)
191
+ httpclient (2.8.3)
132
192
  i18n (1.14.5)
133
193
  concurrent-ruby (~> 1.0)
134
194
  influxdb-client (3.1.0)
135
195
  jaro_winkler (1.5.6)
136
196
  json (2.7.1)
197
+ jwt (2.8.2)
198
+ base64
137
199
  kramdown (2.4.0)
138
200
  rexml
139
201
  kramdown-parser-gfm (1.1.0)
@@ -147,11 +209,15 @@ GEM
147
209
  rake (~> 13.0)
148
210
  lumberjack (1.2.10)
149
211
  method_source (1.0.0)
212
+ mime-types (3.5.2)
213
+ mime-types-data (~> 3.2015)
214
+ mime-types-data (3.2024.0702)
150
215
  mini_mime (1.1.5)
151
216
  mini_portile2 (2.8.5)
152
217
  minitest (5.23.0)
153
218
  mize (0.4.1)
154
219
  protocol (~> 2.0)
220
+ multi_json (1.15.0)
155
221
  multi_xml (0.6.0)
156
222
  mutex_m (0.2.0)
157
223
  nap (1.1.0)
@@ -169,6 +235,7 @@ GEM
169
235
  faraday (>= 1, < 3)
170
236
  sawyer (~> 0.9)
171
237
  open4 (1.3.4)
238
+ os (1.1.4)
172
239
  parallel (1.24.0)
173
240
  parser (3.3.0.5)
174
241
  ast (~> 2.4.1)
@@ -196,6 +263,11 @@ GEM
196
263
  rbs (2.8.4)
197
264
  rchardet (1.8.0)
198
265
  regexp_parser (2.9.0)
266
+ representable (3.2.0)
267
+ declarative (< 0.1.0)
268
+ trailblazer-option (>= 0.1.1, < 0.2.0)
269
+ uber (< 0.2.0)
270
+ retriable (3.1.2)
199
271
  reverse_markdown (2.1.1)
200
272
  nokogiri
201
273
  rexml (3.2.6)
@@ -262,6 +334,11 @@ GEM
262
334
  faraday (>= 0.17.3, < 3)
263
335
  sexp_processor (4.17.1)
264
336
  shellany (0.0.1)
337
+ signet (0.19.0)
338
+ addressable (~> 2.8)
339
+ faraday (>= 0.17.5, < 3.a)
340
+ jwt (>= 1.5, < 3.0)
341
+ multi_json (~> 1.10)
265
342
  simplecov (0.22.0)
266
343
  docile (~> 1.1)
267
344
  simplecov-html (~> 0.11)
@@ -296,8 +373,10 @@ GEM
296
373
  timecop (0.9.8)
297
374
  tins (1.32.1)
298
375
  sync
376
+ trailblazer-option (0.1.2)
299
377
  tzinfo (2.0.6)
300
378
  concurrent-ruby (~> 1.0)
379
+ uber (0.1.0)
301
380
  unicode-display_width (2.5.0)
302
381
  unparser (0.6.12)
303
382
  diff-lcs (~> 1.3)
@@ -330,4 +409,4 @@ DEPENDENCIES
330
409
  webmock (= 3.7.0)
331
410
 
332
411
  BUNDLED WITH
333
- 2.5.13
412
+ 2.5.15
@@ -21,11 +21,15 @@ module GitlabQuality
21
21
  attr_accessor :influxdb_url,
22
22
  :influxdb_token,
23
23
  :influxdb_bucket,
24
+ :gcs_bucket,
25
+ :gcs_project_id,
26
+ :gcs_credentials,
27
+ :gcs_metrics_file_name,
28
+ :test_metric_file_name,
24
29
  :run_type
25
30
 
26
31
  attr_writer :custom_keys_tags,
27
- :custom_keys_fields,
28
- :test_metric_file_name
32
+ :custom_keys_fields
29
33
 
30
34
  def custom_keys_tags
31
35
  @custom_keys_tags || []
@@ -34,10 +38,6 @@ module GitlabQuality
34
38
  def custom_keys_fields
35
39
  @custom_keys_fields || []
36
40
  end
37
-
38
- def test_metric_file_name
39
- @test_metric_file_name || "test_metrics.json"
40
- end
41
41
  end
42
42
  end
43
43
  end
@@ -29,15 +29,27 @@ module GitlabQuality
29
29
  Config.configuration
30
30
  end
31
31
 
32
+ # rubocop:disable Metrics/AbcSize
32
33
  def setup_test_metrics_exporter(examples)
33
34
  @log_test_metrics = LogTestMetrics.new(
34
35
  examples: examples,
36
+ run_type: config.run_type
37
+ )
38
+
39
+ @log_test_metrics.configure_influxdb_client(
35
40
  influxdb_url: config.influxdb_url,
36
41
  influxdb_token: config.influxdb_token,
37
- influxdb_bucket: config.influxdb_bucket,
38
- run_type: config.run_type
42
+ influxdb_bucket: config.influxdb_bucket
43
+ )
44
+
45
+ @log_test_metrics.configure_gcs_client(
46
+ gcs_bucket: config.gcs_bucket,
47
+ gcs_project_id: config.gcs_project_id,
48
+ gcs_credentials: config.gcs_credentials,
49
+ gcs_metrics_file_name: config.gcs_metrics_file_name
39
50
  )
40
51
  end
52
+ # rubocop:enable Metrics/AbcSize
41
53
  end
42
54
  end
43
55
  end
@@ -5,19 +5,33 @@ module GitlabQuality
5
5
  module TestMetricsExporter
6
6
  class LogTestMetrics
7
7
  include TestMetrics
8
- include InfluxdbTools
8
+ include Support::InfluxdbTools
9
+ include Support::GcsTools
9
10
 
10
11
  CUSTOM_METRICS_KEY = :custom_test_metrics
11
12
 
12
- def initialize(examples:, influxdb_url: nil, influxdb_token: nil, influxdb_bucket: nil, run_type: nil)
13
+ def initialize(
14
+ examples:,
15
+ run_type: nil
16
+ )
13
17
  @examples = examples
18
+ @run_type = run_type
19
+ end
20
+
21
+ def configure_influxdb_client(influxdb_url: nil, influxdb_token: nil, influxdb_bucket: nil)
14
22
  @influxdb_url = influxdb_url
15
23
  @influxdb_token = influxdb_token
16
24
  @influxdb_bucket = influxdb_bucket
17
- @run_type = run_type
18
25
  end
19
26
 
20
- # Push test execution metrics to influxdb
27
+ def configure_gcs_client(gcs_bucket: nil, gcs_project_id: nil, gcs_credentials: nil, gcs_metrics_file_name: nil)
28
+ @gcs_bucket = gcs_bucket
29
+ @gcs_project_id = gcs_project_id
30
+ @gcs_credentials = gcs_credentials
31
+ @gcs_metrics_file_name = gcs_metrics_file_name
32
+ end
33
+
34
+ # Push test execution metrics
21
35
  #
22
36
  # @param [Array<String>] custom_keys_tags
23
37
  # @param [Array<String>] custom_keys_fields
@@ -25,10 +39,8 @@ module GitlabQuality
25
39
  def push_test_metrics(custom_keys_tags: nil, custom_keys_fields: nil)
26
40
  @test_metrics ||= examples.filter_map { |example| parse_test_results(example, custom_keys_tags, custom_keys_fields) }
27
41
 
28
- write_api(url: influxdb_url, token: influxdb_token, bucket: influxdb_bucket).write(data: test_metrics)
29
- Runtime::Logger.debug("Pushed #{test_metrics.length} test execution entries to influxdb")
30
- rescue StandardError => e
31
- Runtime::Logger.error("Failed to push test execution metrics to influxdb, error: #{e}")
42
+ push_test_metrics_to_influxdb
43
+ push_test_metrics_to_gcs
32
44
  end
33
45
 
34
46
  # Save metrics in json file
@@ -43,14 +55,43 @@ module GitlabQuality
43
55
  @test_metrics ||= examples.filter_map { |example| parse_test_results(example, custom_keys_tags, custom_keys_fields) }
44
56
  file = "tmp/#{file_name}"
45
57
 
46
- File.write(file, test_metrics.to_json) && Runtime::Logger.debug("Saved test metrics to #{file}")
58
+ File.write(file, test_metrics.to_json) && Runtime::Logger.info("Saved test metrics to #{file}")
47
59
  rescue StandardError => e
48
60
  Runtime::Logger.error("Failed to save test execution metrics, error: #{e}")
49
61
  end
50
62
 
51
63
  private
52
64
 
53
- attr_reader :examples, :test_metrics, :influxdb_url, :influxdb_token, :influxdb_bucket, :run_type
65
+ attr_reader :examples, :test_metrics, :influxdb_url, :influxdb_token, :influxdb_bucket, :run_type, :gcs_bucket,
66
+ :gcs_project_id, :gcs_credentials, :gcs_metrics_file_name
67
+
68
+ # Push test execution metrics to Influxdb
69
+ #
70
+ # @return [nil]
71
+ def push_test_metrics_to_influxdb
72
+ write_api(url: influxdb_url, token: influxdb_token, bucket: influxdb_bucket).write(data: test_metrics)
73
+ Runtime::Logger.info("Pushed #{test_metrics.length} test execution entries to Influxdb")
74
+ rescue StandardError => e
75
+ Runtime::Logger.error("Failed to push test execution metrics to Influxdb, error: #{e}")
76
+ end
77
+
78
+ # Push test execution metrics to GCS
79
+ #
80
+ # @return [nil]
81
+ def push_test_metrics_to_gcs
82
+ gcs_client(project_id: gcs_project_id, credentials: gcs_credentials)
83
+ .put_object(
84
+ gcs_bucket || raise("Missing GCS bucket name"),
85
+ gcs_metrics_file_name,
86
+ test_metrics.to_json,
87
+ force: true,
88
+ content_type: 'application/json'
89
+ )
90
+
91
+ Runtime::Logger.info("Pushed #{test_metrics.length} test execution entries to GCS")
92
+ rescue StandardError => e
93
+ Runtime::Logger.error("Failed to push test execution metrics to GCS, error: #{e}")
94
+ end
54
95
 
55
96
  # Transform example to influxdb compatible metrics data
56
97
  # https://github.com/influxdata/influxdb-client-ruby#data-format
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fog/google'
4
+
5
+ module GitlabQuality
6
+ module TestTooling
7
+ module TestMetricsExporter
8
+ module Support
9
+ module GcsTools
10
+ # GCS Client
11
+ #
12
+ # @param project_id [String]
13
+ # @param credentials [String]
14
+ # @return [Fog::Storage::Google]
15
+ def gcs_client(project_id:, credentials:)
16
+ Fog::Storage::Google.new(
17
+ google_project: project_id || raise("Missing Google project_id"),
18
+ **gcs_creds(credentials)
19
+ )
20
+ end
21
+
22
+ # GCS Credentials
23
+ #
24
+ # @param credentials [String]
25
+ # @return [Hash]
26
+ def gcs_creds(credentials)
27
+ json_key = credentials || raise('Missing Google credentials')
28
+ return { google_json_key_location: json_key } if File.exist?(json_key)
29
+
30
+ { google_json_key_string: json_key }
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'influxdb-client'
4
+
5
+ module GitlabQuality
6
+ module TestTooling
7
+ module TestMetricsExporter
8
+ module Support
9
+ module InfluxdbTools
10
+ # InfluxDb client
11
+ #
12
+ # @return [InfluxDB2::Client]
13
+ def influx_client(url:, token:, bucket:)
14
+ @influx_client ||= InfluxDB2::Client.new(
15
+ url || raise('Missing influxdb_url'),
16
+ token || raise('Missing influxdb_token'),
17
+ bucket: bucket || raise('Missing influxdb_bucket'),
18
+ org: "gitlab-qa",
19
+ precision: InfluxDB2::WritePrecision::NANOSECOND
20
+ )
21
+ end
22
+
23
+ # Write client
24
+ #
25
+ # @return [WriteApi]
26
+ def write_api(url:, token:, bucket:)
27
+ @write_api ||= influx_client(url: url, token: token, bucket: bucket).create_write_api
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GitlabQuality
4
4
  module TestTooling
5
- VERSION = "1.36.0"
5
+ VERSION = "1.37.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab_quality-test_tooling
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.36.0
4
+ version: 1.37.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab Quality
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-28 00:00:00.000000000 Z
11
+ date: 2024-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -268,6 +268,26 @@ dependencies:
268
268
  - - "~>"
269
269
  - !ruby/object:Gem::Version
270
270
  version: '3.1'
271
+ - !ruby/object:Gem::Dependency
272
+ name: fog-google
273
+ requirement: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - "~>"
276
+ - !ruby/object:Gem::Version
277
+ version: '1.24'
278
+ - - ">="
279
+ - !ruby/object:Gem::Version
280
+ version: 1.24.1
281
+ type: :runtime
282
+ prerelease: false
283
+ version_requirements: !ruby/object:Gem::Requirement
284
+ requirements:
285
+ - - "~>"
286
+ - !ruby/object:Gem::Version
287
+ version: '1.24'
288
+ - - ">="
289
+ - !ruby/object:Gem::Version
290
+ version: 1.24.1
271
291
  - !ruby/object:Gem::Dependency
272
292
  name: nokogiri
273
293
  requirement: !ruby/object:Gem::Requirement
@@ -479,8 +499,9 @@ files:
479
499
  - lib/gitlab_quality/test_tooling/test_metrics/json_test_metric_collection.rb
480
500
  - lib/gitlab_quality/test_tooling/test_metrics_exporter/config.rb
481
501
  - lib/gitlab_quality/test_tooling/test_metrics_exporter/formatter.rb
482
- - lib/gitlab_quality/test_tooling/test_metrics_exporter/influxdb_tools.rb
483
502
  - lib/gitlab_quality/test_tooling/test_metrics_exporter/log_test_metrics.rb
503
+ - lib/gitlab_quality/test_tooling/test_metrics_exporter/support/gcs_tools.rb
504
+ - lib/gitlab_quality/test_tooling/test_metrics_exporter/support/influxdb_tools.rb
484
505
  - lib/gitlab_quality/test_tooling/test_metrics_exporter/test_metrics.rb
485
506
  - lib/gitlab_quality/test_tooling/test_result/base_test_result.rb
486
507
  - lib/gitlab_quality/test_tooling/test_result/j_unit_test_result.rb
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'influxdb-client'
4
-
5
- module GitlabQuality
6
- module TestTooling
7
- module TestMetricsExporter
8
- module InfluxdbTools
9
- # InfluxDb client
10
- #
11
- # @return [InfluxDB2::Client]
12
- def influx_client(url:, token:, bucket:)
13
- @influx_client ||= InfluxDB2::Client.new(
14
- url || raise('Missing influxdb_url'),
15
- token || raise('Missing influxdb_token'),
16
- bucket: bucket || raise('Missing influxdb_bucket'),
17
- org: "gitlab-qa",
18
- precision: InfluxDB2::WritePrecision::NANOSECOND
19
- )
20
- end
21
-
22
- # Write client
23
- #
24
- # @return [WriteApi]
25
- def write_api(url:, token:, bucket:)
26
- @write_api ||= influx_client(url: url, token: token, bucket: bucket).create_write_api
27
- end
28
- end
29
- end
30
- end
31
- end