gitlab-exporter 16.4.0 → 16.5.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: 1825ce6b93a9f8c4717470772eee4e887519a735209c2575c1768302fc7390be
4
- data.tar.gz: 2ba4a913855b75c73ba9c79a9d2332148835bec68931d5382375d8feef571f47
3
+ metadata.gz: 2ccb9b4710efb99847099a897fd1b8459c0d3e8d835b6f2ab4e8569d0a565242
4
+ data.tar.gz: c04beba06c2aa5866f5c09faf93f44cd14d01a0e5e174004ccaf81f8f9ba1171
5
5
  SHA512:
6
- metadata.gz: 2e38f6f12cae4a6e1bbda9f567788523e865d2dbd5609b3f37823269352f0c3cc31e12bc16ec79e43c745cd10d3e388bcef71d4f29e2ea41e1b09a3d02023e63
7
- data.tar.gz: 2d1ea6f2a7f12249d15de2edddc21a45967daa61cbf44b708b4bdb283d05ae0cc90c71372550a7798d782fab0f61c59bf13e2c7730eaeaf79a2776b082c14968
6
+ metadata.gz: ff2ca3937e3b3beebfdc5bf60cb967e16384ed50de585610aec8a86c5e2f985b35eba1f8108d99fad7fb7972b4683496e1cc70f17a791ec9847977f41613fe7e
7
+ data.tar.gz: 55d3cb8d8b971124f8f170a061efa23348f506477829cd59f2f7d9a7fc3902a04fc297b06c6638818b7283121106ab8e53bdfea75be00c05773f9a597ce7d1e5
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-exporter (16.4.0)
4
+ gitlab-exporter (16.5.0)
5
5
  connection_pool (= 2.5.5)
6
6
  deep_merge (~> 1.2.2)
7
7
  faraday (= 2.14.0)
8
8
  pg (= 1.6.3)
9
- puma (= 7.1.0)
9
+ puma (= 7.2.0)
10
10
  quantile (= 0.2.1)
11
11
  redis (= 4.8.1)
12
12
  redis-namespace (= 1.11.0)
@@ -39,8 +39,8 @@ GEM
39
39
  ast (~> 2.4.1)
40
40
  racc
41
41
  pg (1.6.3)
42
- prism (1.4.0)
43
- puma (7.1.0)
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.82.1)
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.48.0, < 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.48.0)
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)
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.add_runtime_dependency "deep_merge", "~> 1.2.2"
27
27
  s.add_runtime_dependency "faraday", "2.14.0"
28
28
  s.add_runtime_dependency "pg", "1.6.3"
29
- s.add_runtime_dependency "puma", "7.1.0"
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
@@ -63,13 +62,23 @@ module GitLab
63
62
  LIMIT 1
64
63
  SQL
65
64
 
65
+ ZOEKT_NODE_STORAGE_QUERY = <<~SQL.freeze
66
+ SELECT
67
+ id,
68
+ metadata ->> 'name' AS node_name,
69
+ unclaimed_storage_bytes,
70
+ storage_percent_used
71
+ FROM zoekt_nodes
72
+ SQL
73
+
66
74
  def run
67
75
  return {} unless zoekt_indexing_enabled?
68
76
 
69
77
  {
70
78
  task_processing_query_result: execute(ZOEKT_TASKS_PROCESSING_QUERY, [Time.now.utc]),
71
79
  repositories_schema_version_query_result: repositories_schema_version_query_result,
72
- zoekt_nodes_status_query_result: execute(ZOEKT_NODES_STATUS_QUERY)
80
+ zoekt_nodes_status_query_result: execute(ZOEKT_NODES_STATUS_QUERY),
81
+ node_storage_query_result: execute(ZOEKT_NODE_STORAGE_QUERY)
73
82
  }.compact
74
83
  end
75
84
 
@@ -88,22 +97,25 @@ module GitLab
88
97
 
89
98
  hash = {}
90
99
  zoekt_nodes.each do |row|
91
- hash[row["id"]] = row["schema_version"]
100
+ hash[row["id"]] = [row["schema_version"], row["node_name"]]
92
101
  end
93
102
  hash
94
103
  end
95
104
 
96
105
  def zoekt_repository_schema_version_result(hash)
97
106
  result = Set.new
98
- hash.each do |id, schema_version|
99
- query_result = execute(ZOEKT_REPOSITORY_SCHEMA_VERSION_QUERY, [id, schema_version])
107
+ hash.each do |id, schema_version_name_arr|
108
+ query_result = execute(ZOEKT_REPOSITORY_SCHEMA_VERSION_QUERY, [id, schema_version_name_arr[0]])
100
109
  if query_result.nil?
101
110
  result = nil
102
111
  break
103
112
  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 })
113
+ result.add(
114
+ {
115
+ target_schema_version: schema_version_name_arr[0], zoekt_node_id: id,
116
+ zoekt_node_name: schema_version_name_arr[1], unfinished_repository_count: query_result[0]["count"].to_i
117
+ }
118
+ )
107
119
  end
108
120
  result
109
121
  end
@@ -148,6 +160,18 @@ module GitLab
148
160
  "gauge"
149
161
  )
150
162
 
163
+ PrometheusMetrics.describe(
164
+ "search_zoekt_node_unclaimed_storage_bytes",
165
+ "Unclaimed storage bytes for Zoekt node",
166
+ "gauge"
167
+ )
168
+
169
+ PrometheusMetrics.describe(
170
+ "search_zoekt_node_storage_percent_used",
171
+ "Fraction of storage used on Zoekt node (0..1)",
172
+ "gauge"
173
+ )
174
+
151
175
  def initialize(metrics: PrometheusMetrics.new, **opts)
152
176
  @metrics = metrics
153
177
  @collector = opts[:collector] || ZoektCollector.new(**opts)
@@ -155,27 +179,48 @@ module GitLab
155
179
 
156
180
  def probe_db
157
181
  results = @collector.run
158
- results[:task_processing_query_result].to_a.each do |row|
159
- add_processing_zoekt_tasks_to_metric(row)
160
- end
161
- results[:repositories_schema_version_query_result]&.each do |row|
162
- add_zoekt_repositories_by_schema_version_to_metric(row)
163
- end
164
- results[:zoekt_nodes_status_query_result]&.each do |row|
165
- add_zoekt_nodes_status_to_metric(row)
166
- end
167
-
182
+ process_results(results)
168
183
  self
169
184
  rescue PG::ConnectionBad
170
185
  self
171
186
  end
172
187
 
188
+ private
189
+
190
+ def process_results(results)
191
+ process_task_results(results[:task_processing_query_result])
192
+ process_repository_results(results[:repositories_schema_version_query_result])
193
+ process_node_status_results(results[:zoekt_nodes_status_query_result])
194
+ process_node_storage_results(results[:node_storage_query_result])
195
+ end
196
+
197
+ def process_task_results(results)
198
+ results.to_a.each { |row| add_processing_zoekt_tasks_to_metric(row) }
199
+ end
200
+
201
+ def process_repository_results(results)
202
+ results&.each { |row| add_zoekt_repositories_by_schema_version_to_metric(row) }
203
+ end
204
+
205
+ def process_node_status_results(results)
206
+ results&.each { |row| add_zoekt_nodes_status_to_metric(row) }
207
+ end
208
+
209
+ def process_node_storage_results(results)
210
+ results&.each do |row|
211
+ add_zoekt_node_unclaimed_storage_to_metric(row)
212
+ add_zoekt_node_storage_percent_used_to_metric(row)
213
+ end
214
+ end
215
+
173
216
  def add_processing_zoekt_tasks_to_metric(row)
174
217
  @metrics.add(
175
218
  "search_zoekt_task_processing_queue_size",
176
219
  row["task_count"].to_i,
177
- node_name: row["node_name"],
178
- node_id: row["node_id"]
220
+ **{
221
+ node_name: row["node_name"],
222
+ node_id: row["node_id"]
223
+ }.compact
179
224
  )
180
225
  end
181
226
 
@@ -183,8 +228,11 @@ module GitLab
183
228
  @metrics.add(
184
229
  "search_zoekt_repositories_schema_version_count",
185
230
  row[:unfinished_repository_count].to_i,
186
- target_schema_version: row[:target_schema_version],
187
- zoekt_node_id: row[:zoekt_node_id]
231
+ **{
232
+ target_schema_version: row[:target_schema_version],
233
+ zoekt_node_id: row[:zoekt_node_id],
234
+ zoekt_node_name: row[:zoekt_node_name]
235
+ }.compact
188
236
  )
189
237
  end
190
238
 
@@ -192,7 +240,32 @@ module GitLab
192
240
  @metrics.add(
193
241
  "search_zoekt_nodes_status",
194
242
  row["status"].to_i,
195
- zoekt_node_id: row["id"]
243
+ **{
244
+ zoekt_node_id: row["id"],
245
+ zoekt_node_name: row["node_name"]
246
+ }.compact
247
+ )
248
+ end
249
+
250
+ def add_zoekt_node_unclaimed_storage_to_metric(row)
251
+ @metrics.add(
252
+ "search_zoekt_node_unclaimed_storage_bytes",
253
+ row["unclaimed_storage_bytes"].to_i,
254
+ **{
255
+ zoekt_node_id: row["id"],
256
+ zoekt_node_name: row["node_name"]
257
+ }.compact
258
+ )
259
+ end
260
+
261
+ def add_zoekt_node_storage_percent_used_to_metric(row)
262
+ @metrics.add(
263
+ "search_zoekt_node_storage_percent_used",
264
+ row["storage_percent_used"].to_f,
265
+ **{
266
+ zoekt_node_id: row["id"],
267
+ zoekt_node_name: row["node_name"]
268
+ }.compact
196
269
  )
197
270
  end
198
271
 
@@ -1,5 +1,5 @@
1
1
  module GitLab
2
2
  module Exporter
3
- VERSION = "16.4.0".freeze
3
+ VERSION = "16.5.0".freeze
4
4
  end
5
5
  end
@@ -6,11 +6,15 @@ 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
+ let(:zoekt_node_storage_query) { described_class::ZOEKT_NODE_STORAGE_QUERY }
15
+ let(:zoekt_node_storage_query_results) do
16
+ [{ "id" => "1", "node_name" => "foo", "unclaimed_storage_bytes" => "1000000", "storage_percent_used" => "0.75" }]
17
+ end
14
18
 
15
19
  let(:zoekt_repository_schema_version_query_results) { [{ "count" => "1" }] }
16
20
 
@@ -41,14 +45,17 @@ describe GitLab::Exporter::Database::ZoektCollector do
41
45
  end
42
46
 
43
47
  let(:zoekt_repositories_schema_version_query_results) do
44
- Set.new([{ target_schema_version: "2302", zoekt_node_id: "1", unfinished_repository_count: 1 }])
48
+ Set.new(
49
+ [{ target_schema_version: "2302", zoekt_node_id: "1", zoekt_node_name: "foo", unfinished_repository_count: 1 }]
50
+ )
45
51
  end
46
52
 
47
53
  let(:result) do
48
54
  {
49
55
  repositories_schema_version_query_result: zoekt_repositories_schema_version_query_results,
50
56
  task_processing_query_result: zoekt_tasks_processing_query_results,
51
- zoekt_nodes_status_query_result: zoekt_nodes_status_query_results
57
+ zoekt_nodes_status_query_result: zoekt_nodes_status_query_results,
58
+ node_storage_query_result: zoekt_node_storage_query_results
52
59
  }
53
60
  end
54
61
 
@@ -80,6 +87,8 @@ describe GitLab::Exporter::Database::ZoektCollector do
80
87
  .and_return(zoekt_repository_schema_version_query_results)
81
88
  expect(connection).to receive(:exec_params).with(zoekt_nodes_status_query, [])
82
89
  .and_return(zoekt_nodes_status_query_results)
90
+ expect(connection).to receive(:exec_params).with(zoekt_node_storage_query, [])
91
+ .and_return(zoekt_node_storage_query_results)
83
92
 
84
93
  expect(collector.run).to eq(result)
85
94
  end
@@ -92,6 +101,8 @@ describe GitLab::Exporter::Database::ZoektCollector do
92
101
  .and_raise(PG::UndefinedTable)
93
102
  allow(connection).to receive(:exec_params).with(zoekt_nodes_status_query, [])
94
103
  .and_raise(PG::UndefinedTable)
104
+ allow(connection).to receive(:exec_params).with(zoekt_node_storage_query, [])
105
+ .and_raise(PG::UndefinedTable)
95
106
 
96
107
  expect(collector.run).to eq({})
97
108
  end
@@ -106,6 +117,7 @@ describe GitLab::Exporter::Database::ZoektCollector do
106
117
  expect(connection).to receive(:exec_params).with(zoekt_repository_schema_version_query, %w[1 2302])
107
118
  .and_raise(PG::UndefinedTable)
108
119
  expect(connection).to receive(:exec_params).with(zoekt_nodes_status_query, []).and_raise(PG::UndefinedTable)
120
+ expect(connection).to receive(:exec_params).with(zoekt_node_storage_query, []).and_raise(PG::UndefinedColumn)
109
121
 
110
122
  expect(collector.run).to eq({ task_processing_query_result: zoekt_tasks_processing_query_results })
111
123
  end
@@ -136,11 +148,21 @@ describe GitLab::Exporter::Database::ZoektProber do
136
148
  let(:data) do
137
149
  {
138
150
  repositories_schema_version_query_result: Set.new(
139
- [{ target_schema_version: "2302", zoekt_node_id: "1", unfinished_repository_count: 1 }]
151
+ [{ target_schema_version: "2302", zoekt_node_id: "1", unfinished_repository_count: 1, zoekt_node_name: "foo" }]
140
152
  ),
141
153
  task_processing_query_result: [
142
154
  { "node_id" => "1", "node_name" => "zoekt-1", "task_count" => "5" },
143
155
  { "node_id" => "2", "node_name" => "zoekt-2", "task_count" => "10" }
156
+ ],
157
+ node_storage_query_result: [
158
+ {
159
+ "id" => "1", "node_name" => "zoekt-1", "unclaimed_storage_bytes" => "1000000",
160
+ "storage_percent_used" => "0.75"
161
+ },
162
+ {
163
+ "id" => "2", "node_name" => "zoekt-2", "unclaimed_storage_bytes" => "2000000",
164
+ "storage_percent_used" => "0.50"
165
+ }
144
166
  ]
145
167
  }
146
168
  end
@@ -165,10 +187,12 @@ describe GitLab::Exporter::Database::ZoektProber do
165
187
 
166
188
  data[:task_processing_query_result].each do |node_data|
167
189
  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"])
190
+ .with(
191
+ "search_zoekt_task_processing_queue_size",
192
+ node_data["task_count"].to_i,
193
+ node_name: node_data["node_name"],
194
+ node_id: node_data["node_id"]
195
+ )
172
196
  end
173
197
 
174
198
  data[:repositories_schema_version_query_result].each do |node_data|
@@ -177,7 +201,25 @@ describe GitLab::Exporter::Database::ZoektProber do
177
201
  "search_zoekt_repositories_schema_version_count",
178
202
  node_data[:unfinished_repository_count].to_i,
179
203
  target_schema_version: node_data[:target_schema_version],
180
- zoekt_node_id: node_data[:zoekt_node_id]
204
+ zoekt_node_id: node_data[:zoekt_node_id],
205
+ zoekt_node_name: node_data[:zoekt_node_name]
206
+ )
207
+ end
208
+
209
+ data[:node_storage_query_result].each do |node_data|
210
+ expect(metrics).to receive(:add)
211
+ .with(
212
+ "search_zoekt_node_unclaimed_storage_bytes",
213
+ node_data["unclaimed_storage_bytes"].to_i,
214
+ zoekt_node_id: node_data["id"],
215
+ zoekt_node_name: node_data["node_name"]
216
+ )
217
+ expect(metrics).to receive(:add)
218
+ .with(
219
+ "search_zoekt_node_storage_percent_used",
220
+ node_data["storage_percent_used"].to_f,
221
+ zoekt_node_id: node_data["id"],
222
+ zoekt_node_name: node_data["node_name"]
181
223
  )
182
224
  end
183
225
 
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.4.0
4
+ version: 16.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Carranza
@@ -72,14 +72,14 @@ dependencies:
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