gitlab-exporter 16.3.1 → 16.4.1

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: dfb5ffd66eceaaada65415073b18a42568888669d775689fbf2aaf3e58b02d7f
4
- data.tar.gz: 2cda7d12814c7164425331e2be436000dc91ea8551387ce207bfafe49bcc69aa
3
+ metadata.gz: ddf051049df2fc97f6075da3453f40c99dbd5924613e52f7613f68f4061369d1
4
+ data.tar.gz: 2e5d19430d6de12d9ef679a74719e0047671955edf2a7a5cfbfa16128920493e
5
5
  SHA512:
6
- metadata.gz: 0f91104bdeb03655fff74687478fcd81d1ffc03ac6f4be391c4bb9ff93e6b0171a57471aee54947b2536fe6cbdfd561ef0150fd7e306e3533ba3a2ea830b5d42
7
- data.tar.gz: 195a6184776a297eadf4fa74883ff3780cd23f33a8d93fb67f19fcf79a202e818f88ac830656fb5d8fc9f64fd7378d6d4db6ae565b15866ad274d9fe7ccc2443
6
+ metadata.gz: 62fe67971ee82117f04fa6189867450469f67ba2818719ec4f0bec39a601cce5a47bfcecbaab02ce22c4f07fd16094a8e12d6fee258611555fd6f2605ae3f209
7
+ data.tar.gz: 706d36baae273e77e2211ade5dec5848316f1d5a473c33aa89e7e11ce20814bc5ffbd83735f3f20c1090c072b4fed5f4f056ab2472c2bd1ef2096b08f018151c
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-exporter (16.3.1)
4
+ gitlab-exporter (16.4.1)
5
5
  connection_pool (= 2.5.5)
6
6
  deep_merge (~> 1.2.2)
7
7
  faraday (= 2.14.0)
8
- pg (= 1.6.2)
9
- puma (= 7.1.0)
8
+ pg (= 1.6.3)
9
+ puma (= 7.2.0)
10
10
  quantile (= 0.2.1)
11
11
  redis (= 4.8.1)
12
12
  redis-namespace (= 1.11.0)
@@ -38,9 +38,9 @@ GEM
38
38
  parser (3.3.9.0)
39
39
  ast (~> 2.4.1)
40
40
  racc
41
- pg (1.6.2)
42
- prism (1.4.0)
43
- puma (7.1.0)
41
+ pg (1.6.3)
42
+ prism (1.9.0)
43
+ puma (7.2.0)
44
44
  nio4r (~> 2.0)
45
45
  quantile (0.2.1)
46
46
  racc (1.8.1)
@@ -66,7 +66,7 @@ GEM
66
66
  diff-lcs (>= 1.2.0, < 2.0)
67
67
  rspec-support (~> 3.12.0)
68
68
  rspec-support (3.12.0)
69
- rubocop (1.81.7)
69
+ rubocop (1.84.1)
70
70
  json (~> 2.3)
71
71
  language_server-protocol (~> 3.17.0.2)
72
72
  lint_roller (~> 1.1.0)
@@ -74,12 +74,12 @@ GEM
74
74
  parser (>= 3.3.0.2)
75
75
  rainbow (>= 2.2.2, < 4.0)
76
76
  regexp_parser (>= 2.9.3, < 3.0)
77
- rubocop-ast (>= 1.47.1, < 2.0)
77
+ rubocop-ast (>= 1.49.0, < 2.0)
78
78
  ruby-progressbar (~> 1.7)
79
79
  unicode-display_width (>= 2.4.0, < 4.0)
80
- rubocop-ast (1.47.1)
80
+ rubocop-ast (1.49.0)
81
81
  parser (>= 3.3.7.2)
82
- prism (~> 1.4)
82
+ prism (~> 1.7)
83
83
  ruby-progressbar (1.13.0)
84
84
  ruby2_keywords (0.0.5)
85
85
  sidekiq (6.5.12)
@@ -113,6 +113,11 @@ probes:
113
113
  # port: 26381
114
114
  # redis_sentinel_username: 'redis-sentinel-username'
115
115
  # redis_sentinel_password: 'redis-sentinel-password'
116
+ # Uncomment if SSL parameters are needed
117
+ # redis_ssl_params:
118
+ # ca_file: '/path/to/ca.crt'
119
+ # cert: '/path/to/client.crt'
120
+ # key: '/path/to/client.key'
116
121
 
117
122
  ruby: &ruby
118
123
  class_name: RubyProber
@@ -25,8 +25,8 @@ Gem::Specification.new do |s|
25
25
  s.add_runtime_dependency "connection_pool", "2.5.5"
26
26
  s.add_runtime_dependency "deep_merge", "~> 1.2.2"
27
27
  s.add_runtime_dependency "faraday", "2.14.0"
28
- s.add_runtime_dependency "pg", "1.6.2"
29
- s.add_runtime_dependency "puma", "7.1.0"
28
+ s.add_runtime_dependency "pg", "1.6.3"
29
+ s.add_runtime_dependency "puma", "7.2.0"
30
30
  s.add_runtime_dependency "quantile", "0.2.1"
31
31
  s.add_runtime_dependency "redis", "4.8.1"
32
32
  s.add_runtime_dependency "redis-namespace", "1.11.0"
@@ -28,12 +28,11 @@ module GitLab
28
28
  SQL
29
29
 
30
30
  ZOEKT_NODES_QUERY = <<~SQL.freeze
31
- SELECT schema_version, id FROM zoekt_nodes
31
+ SELECT schema_version, id, metadata ->> 'name' AS node_name FROM zoekt_nodes
32
32
  SQL
33
33
 
34
34
  ZOEKT_NODES_STATUS_QUERY = <<~SQL.freeze
35
- SELECT
36
- id,
35
+ SELECT id, metadata ->> 'name' AS node_name,
37
36
  CASE
38
37
  WHEN last_seen_at < NOW() - INTERVAL '2 minute' THEN 0
39
38
  ELSE 1
@@ -88,22 +87,25 @@ module GitLab
88
87
 
89
88
  hash = {}
90
89
  zoekt_nodes.each do |row|
91
- hash[row["id"]] = row["schema_version"]
90
+ hash[row["id"]] = [row["schema_version"], row["node_name"]]
92
91
  end
93
92
  hash
94
93
  end
95
94
 
96
95
  def zoekt_repository_schema_version_result(hash)
97
96
  result = Set.new
98
- hash.each do |id, schema_version|
99
- query_result = execute(ZOEKT_REPOSITORY_SCHEMA_VERSION_QUERY, [id, schema_version])
97
+ hash.each do |id, schema_version_name_arr|
98
+ query_result = execute(ZOEKT_REPOSITORY_SCHEMA_VERSION_QUERY, [id, schema_version_name_arr[0]])
100
99
  if query_result.nil?
101
100
  result = nil
102
101
  break
103
102
  end
104
-
105
- count = query_result[0]["count"].to_i
106
- result.add({ target_schema_version: schema_version, zoekt_node_id: id, unfinished_repository_count: count })
103
+ result.add(
104
+ {
105
+ target_schema_version: schema_version_name_arr[0], zoekt_node_id: id,
106
+ zoekt_node_name: schema_version_name_arr[1], unfinished_repository_count: query_result[0]["count"].to_i
107
+ }
108
+ )
107
109
  end
108
110
  result
109
111
  end
@@ -174,8 +176,10 @@ module GitLab
174
176
  @metrics.add(
175
177
  "search_zoekt_task_processing_queue_size",
176
178
  row["task_count"].to_i,
177
- node_name: row["node_name"],
178
- node_id: row["node_id"]
179
+ **{
180
+ node_name: row["node_name"],
181
+ node_id: row["node_id"]
182
+ }.compact
179
183
  )
180
184
  end
181
185
 
@@ -183,8 +187,11 @@ module GitLab
183
187
  @metrics.add(
184
188
  "search_zoekt_repositories_schema_version_count",
185
189
  row[:unfinished_repository_count].to_i,
186
- target_schema_version: row[:target_schema_version],
187
- zoekt_node_id: row[:zoekt_node_id]
190
+ **{
191
+ target_schema_version: row[:target_schema_version],
192
+ zoekt_node_id: row[:zoekt_node_id],
193
+ zoekt_node_name: row[:zoekt_node_name]
194
+ }.compact
188
195
  )
189
196
  end
190
197
 
@@ -192,7 +199,10 @@ module GitLab
192
199
  @metrics.add(
193
200
  "search_zoekt_nodes_status",
194
201
  row["status"].to_i,
195
- zoekt_node_id: row["id"]
202
+ **{
203
+ zoekt_node_id: row["id"],
204
+ zoekt_node_name: row["node_name"]
205
+ }.compact
196
206
  )
197
207
  end
198
208
 
@@ -1,3 +1,4 @@
1
+ require "openssl"
1
2
  require "sidekiq/api"
2
3
  require "sidekiq/scheduled"
3
4
  require "digest"
@@ -204,6 +205,7 @@ module GitLab
204
205
  options[credential] = @opts[:"redis_#{credential}"] if @opts.key?(:"redis_#{credential}")
205
206
  end
206
207
 
208
+ options[:ssl_params] = parse_ssl_params(@opts[:redis_ssl_params]) if @opts.key?(:redis_ssl_params)
207
209
  options[:id] = nil unless redis_enable_client?
208
210
  options
209
211
  end
@@ -216,6 +218,9 @@ module GitLab
216
218
  sentinels.each do |sentinel_config|
217
219
  sentinel_config[:username] = @opts[:redis_sentinel_username] if @opts.key?(:redis_sentinel_username)
218
220
  sentinel_config[:password] = @opts[:redis_sentinel_password] if @opts.key?(:redis_sentinel_password)
221
+ if sentinel_config.key?(:ssl_params)
222
+ sentinel_config[:ssl_params] = parse_ssl_params(sentinel_config[:ssl_params])
223
+ end
219
224
  end
220
225
 
221
226
  sentinels
@@ -227,6 +232,27 @@ module GitLab
227
232
  @opts[:redis_enable_client]
228
233
  end
229
234
 
235
+ # redis v4.5 needs OpenSSL objects for the SSL parameters.
236
+ # redis v5 does not need to do this because is uses redis-client, which
237
+ # already does this: https://github.com/redis-rb/redis-client/blob/2b044dbf6266cbc0b0e52b4b9d6940dacb25ccf3/lib/redis_client/ruby_connection.rb#L14-L39
238
+ def parse_ssl_params(ssl_params)
239
+ params = ssl_params&.dup || {}
240
+
241
+ cert = params[:cert]
242
+ if cert.is_a?(String)
243
+ cert = File.read(cert) if File.exist?(cert)
244
+ params[:cert] = OpenSSL::X509::Certificate.new(cert)
245
+ end
246
+
247
+ key = params[:key]
248
+ if key.is_a?(String)
249
+ key = File.read(key) if File.exist?(key)
250
+ params[:key] = OpenSSL::PKey.read(key)
251
+ end
252
+
253
+ params
254
+ end
255
+
230
256
  def connected?
231
257
  return @connected unless @connected.nil?
232
258
 
@@ -1,5 +1,5 @@
1
1
  module GitLab
2
2
  module Exporter
3
- VERSION = "16.3.1".freeze
3
+ VERSION = "16.4.1".freeze
4
4
  end
5
5
  end
@@ -6,11 +6,11 @@ describe GitLab::Exporter::Database::ZoektCollector do
6
6
  let(:connection) { double("connection") }
7
7
  let(:zoekt_tasks_processing_query) { described_class::ZOEKT_TASKS_PROCESSING_QUERY }
8
8
  let(:zoekt_nodes_query) { described_class::ZOEKT_NODES_QUERY }
9
- let(:zoekt_nodes_query_results) { [{ "id" => "1", "schema_version" => "2302" }] }
9
+ let(:zoekt_nodes_query_results) { [{ "id" => "1", "schema_version" => "2302", "node_name" => "foo" }] }
10
10
  let(:zoekt_enabled_query) { described_class::ZOEKT_ENABLED_QUERY }
11
11
  let(:zoekt_repository_schema_version_query) { described_class::ZOEKT_REPOSITORY_SCHEMA_VERSION_QUERY }
12
12
  let(:zoekt_nodes_status_query) { described_class::ZOEKT_NODES_STATUS_QUERY }
13
- let(:zoekt_nodes_status_query_results) { [{ "id" => "1", "status" => "1" }] }
13
+ let(:zoekt_nodes_status_query_results) { [{ "id" => "1", "name" => "foo", "status" => "1" }] }
14
14
 
15
15
  let(:zoekt_repository_schema_version_query_results) { [{ "count" => "1" }] }
16
16
 
@@ -41,7 +41,9 @@ describe GitLab::Exporter::Database::ZoektCollector do
41
41
  end
42
42
 
43
43
  let(:zoekt_repositories_schema_version_query_results) do
44
- Set.new([{ target_schema_version: "2302", zoekt_node_id: "1", unfinished_repository_count: 1 }])
44
+ Set.new(
45
+ [{ target_schema_version: "2302", zoekt_node_id: "1", zoekt_node_name: "foo", unfinished_repository_count: 1 }]
46
+ )
45
47
  end
46
48
 
47
49
  let(:result) do
@@ -136,7 +138,7 @@ describe GitLab::Exporter::Database::ZoektProber do
136
138
  let(:data) do
137
139
  {
138
140
  repositories_schema_version_query_result: Set.new(
139
- [{ target_schema_version: "2302", zoekt_node_id: "1", unfinished_repository_count: 1 }]
141
+ [{ target_schema_version: "2302", zoekt_node_id: "1", unfinished_repository_count: 1, zoekt_node_name: "foo" }]
140
142
  ),
141
143
  task_processing_query_result: [
142
144
  { "node_id" => "1", "node_name" => "zoekt-1", "task_count" => "5" },
@@ -165,10 +167,12 @@ describe GitLab::Exporter::Database::ZoektProber do
165
167
 
166
168
  data[:task_processing_query_result].each do |node_data|
167
169
  expect(metrics).to receive(:add)
168
- .with("search_zoekt_task_processing_queue_size",
169
- node_data["task_count"].to_i,
170
- node_name: node_data["node_name"],
171
- node_id: node_data["node_id"])
170
+ .with(
171
+ "search_zoekt_task_processing_queue_size",
172
+ node_data["task_count"].to_i,
173
+ node_name: node_data["node_name"],
174
+ node_id: node_data["node_id"]
175
+ )
172
176
  end
173
177
 
174
178
  data[:repositories_schema_version_query_result].each do |node_data|
@@ -177,7 +181,8 @@ describe GitLab::Exporter::Database::ZoektProber do
177
181
  "search_zoekt_repositories_schema_version_count",
178
182
  node_data[:unfinished_repository_count].to_i,
179
183
  target_schema_version: node_data[:target_schema_version],
180
- zoekt_node_id: node_data[:zoekt_node_id]
184
+ zoekt_node_id: node_data[:zoekt_node_id],
185
+ zoekt_node_name: node_data[:zoekt_node_name]
181
186
  )
182
187
  end
183
188
 
@@ -0,0 +1,94 @@
1
+ require "spec_helper"
2
+ require "gitlab_exporter/sidekiq"
3
+ require "tempfile"
4
+ require "openssl"
5
+
6
+ describe GitLab::Exporter::SidekiqProber do
7
+ let(:metrics) { GitLab::Exporter::PrometheusMetrics.new }
8
+
9
+ def create_test_certificate_and_key
10
+ key = OpenSSL::PKey::RSA.new(2048)
11
+ cert = OpenSSL::X509::Certificate.new
12
+ cert.version = 2
13
+ cert.serial = 1
14
+ cert.subject = OpenSSL::X509::Name.parse("CN=localhost")
15
+ cert.issuer = cert.subject
16
+ cert.public_key = key.public_key
17
+ cert.not_before = Time.now
18
+ cert.not_after = Time.now + 365 * 24 * 60 * 60
19
+ cert.sign(key, OpenSSL::Digest.new("SHA256"))
20
+ [cert, key]
21
+ end
22
+
23
+ describe "#redis_options" do
24
+ it "includes ssl_params from file paths" do
25
+ cert, key = create_test_certificate_and_key
26
+
27
+ cert_file = Tempfile.new("cert.crt")
28
+ key_file = Tempfile.new("key.key")
29
+
30
+ cert_file.write(cert.to_pem)
31
+ cert_file.rewind
32
+ key_file.write(key.to_pem)
33
+ key_file.rewind
34
+
35
+ prober = described_class.new(
36
+ metrics: metrics,
37
+ redis_url: "rediss://localhost:6380",
38
+ redis_ssl_params: { cert: cert_file.path, key: key_file.path }
39
+ )
40
+
41
+ options = prober.send(:redis_options)
42
+
43
+ expect(options[:url]).to eq("rediss://localhost:6380")
44
+ expect(options[:ssl_params]).to be_a(Hash)
45
+ expect(options[:ssl_params][:cert]).to be_a(OpenSSL::X509::Certificate)
46
+ expect(options[:ssl_params][:key]).to be_a(OpenSSL::PKey::RSA)
47
+
48
+ cert_file.close
49
+ key_file.close
50
+ end
51
+
52
+ it "includes ssl_params when already parsed" do
53
+ cert, key = create_test_certificate_and_key
54
+
55
+ prober = described_class.new(
56
+ metrics: metrics,
57
+ redis_url: "rediss://localhost:6380",
58
+ redis_ssl_params: { cert: cert, key: key }
59
+ )
60
+
61
+ options = prober.send(:redis_options)
62
+
63
+ expect(options[:url]).to eq("rediss://localhost:6380")
64
+ expect(options[:ssl_params][:cert]).to equal(cert)
65
+ expect(options[:ssl_params][:key]).to equal(key)
66
+ end
67
+
68
+ it "excludes ssl_params when not provided" do
69
+ prober = described_class.new(
70
+ metrics: metrics,
71
+ redis_url: "redis://localhost:6379"
72
+ )
73
+
74
+ options = prober.send(:redis_options)
75
+
76
+ expect(options[:url]).to eq("redis://localhost:6379")
77
+ expect(options).not_to have_key(:ssl_params)
78
+ end
79
+
80
+ it "includes credentials when provided" do
81
+ prober = described_class.new(
82
+ metrics: metrics,
83
+ redis_url: "redis://localhost:6379",
84
+ redis_username: "user",
85
+ redis_password: "pass"
86
+ )
87
+
88
+ options = prober.send(:redis_options)
89
+
90
+ expect(options[:username]).to eq("user")
91
+ expect(options[:password]).to eq("pass")
92
+ end
93
+ end
94
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-exporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 16.3.1
4
+ version: 16.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Carranza
@@ -58,28 +58,28 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.6.2
61
+ version: 1.6.3
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.6.2
68
+ version: 1.6.3
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: puma
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: 7.1.0
75
+ version: 7.2.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: 7.1.0
82
+ version: 7.2.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: quantile
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -255,6 +255,7 @@ files:
255
255
  - spec/memstats_spec.rb
256
256
  - spec/prometheus_metrics_spec.rb
257
257
  - spec/ruby_spec.rb
258
+ - spec/sidekiq_spec.rb
258
259
  - spec/spec_helper.rb
259
260
  - spec/util_spec.rb
260
261
  homepage: https://gitlab.com/gitlab-org/ruby/gems/gitlab-exporter
@@ -296,5 +297,6 @@ test_files:
296
297
  - spec/memstats_spec.rb
297
298
  - spec/prometheus_metrics_spec.rb
298
299
  - spec/ruby_spec.rb
300
+ - spec/sidekiq_spec.rb
299
301
  - spec/spec_helper.rb
300
302
  - spec/util_spec.rb