gitlab-exporter 15.0.0 → 15.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa3c6ff71709207bbbe1c85dea19eab223c678c721baf437eed2275ad73816b9
4
- data.tar.gz: f263b55d0e45ece0a7d3124511c684eacbe78532eae81e2f4c11f3ec4279af9b
3
+ metadata.gz: ce8ca39488a8899bf54a56909d58d146630d65b42e15125abe04b71b195184a0
4
+ data.tar.gz: 964aa5174ccc4741d8aec5d4f04113fe3300308be52df082b7d3822a3b9486a3
5
5
  SHA512:
6
- metadata.gz: 8db3f5dd5db87f02d7a85fb58c13e8a48df40726c5718fd82d5b7ae792675948bd43664da3f94075527e5242c0dcf8bc5e150f8606611097677a812981d73354
7
- data.tar.gz: 9411698d4c809eba8997bd8fc0f9cc4295dac625daa35a8faf37604909a20fde621afb161534bd82fa912087cf50de45e5e192186627cb95f5c8b5643de1742e
6
+ metadata.gz: cbade2952b3dcec413afad922cd0d092e8a37be8096f520ef3d46a94d129a76e9d2d3e48f5ba97c8c9fb855fe0f707c5ea0ec4c18cb2a9aa2059c069d1e24598
7
+ data.tar.gz: bbc7876726057eff433549331304a604160f5a377f7e4185d91b7d1c066196ac14791a24cf67e203e7cfd87b6cda4e70da5264c27b14d82ef356d1b1fa03510b
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-exporter (15.0.0)
4
+ gitlab-exporter (15.2.0)
5
5
  connection_pool (= 2.2.5)
6
6
  deep_merge (~> 1.2.2)
7
7
  faraday (>= 1.8.0, <= 2.8.1)
data/README.md CHANGED
@@ -19,6 +19,8 @@ metrics.
19
19
  1. Database
20
20
  * [Per-table tuple stats](lib/gitlab_exporter/database/tuple_stats.rb) --
21
21
  `gitlab_database_stat_table_*`
22
+ * [Per-sequence stats](lib/gitlab_exporter/database/pg_sequences.rb) --
23
+ `gitlab_pg_sequences_min_value`, `gitlab_pg_sequences_max_value`, `gitlab_pg_sequences_current_value`
22
24
  * [Row count queries](lib/gitlab_exporter/database/row_count.rb) --
23
25
  `gitlab_database_rows`
24
26
  * [CI builds](lib/gitlab_exporter/database/ci_builds.rb) --
@@ -41,6 +41,10 @@ probes:
41
41
  class_name: Database::BloatProber
42
42
  <<: *db_common
43
43
 
44
+ pg_sequences:
45
+ class_name: Database::PgSequencesProber
46
+ <<: *db_common
47
+
44
48
  # We can group multiple probes under a single endpoint by setting the `multiple` key to `true`, followed
45
49
  # by probe definitions as usual.
46
50
  database:
@@ -0,0 +1,60 @@
1
+ module GitLab
2
+ module Exporter
3
+ module Database
4
+ # A helper class to collect sequences metrics. Mainly used to monitor Cells sequences.
5
+ class PgSequencesCollector < Base
6
+ QUERY = <<~SQL.freeze
7
+ SELECT
8
+ schemaname,
9
+ sequencename,
10
+ CONCAT(schemaname, '.', sequencename) AS fully_qualified_sequencename,
11
+ start_value,
12
+ min_value,
13
+ max_value,
14
+ last_value AS current_value
15
+ FROM pg_catalog.pg_sequences;
16
+ SQL
17
+
18
+ def run
19
+ with_connection_pool do |conn|
20
+ conn.exec(QUERY).each.with_object({}) do |row, stats|
21
+ stats[row.delete("fully_qualified_sequencename")] = row
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ # The prober which is called when gathering metrics
28
+ class PgSequencesProber
29
+ METRIC_NAME = "gitlab_pg_sequences".freeze
30
+ METRIC_KEYS = %w[min_value max_value current_value].freeze
31
+
32
+ def initialize(metrics: PrometheusMetrics.new, **opts)
33
+ @metrics = metrics
34
+ @collector = PgSequencesCollector.new(**opts)
35
+ end
36
+
37
+ def probe_db
38
+ result = @collector.run
39
+
40
+ result.each do |fully_qualified_sequencename, sequence_info|
41
+ METRIC_KEYS.each do |key|
42
+ value = sequence_info.fetch(key).to_f
43
+ tags = {
44
+ schemaname: sequence_info.fetch("schemaname"),
45
+ sequencename: sequence_info.fetch("sequencename"),
46
+ fully_qualified_sequencename: fully_qualified_sequencename
47
+ }
48
+
49
+ @metrics.add("#{METRIC_NAME}_#{key}", value, **tags)
50
+ end
51
+ end
52
+
53
+ self
54
+ rescue PG::ConnectionBad
55
+ self
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -104,7 +104,7 @@ module GitLab
104
104
  GROUP BY members.user_id
105
105
  ) AS u
106
106
  ON users.id = u.user_id",
107
- where: "user_type IS NULL",
107
+ where: "user_type = 0",
108
108
  fields: {
109
109
  admin: {},
110
110
  external: {},
@@ -8,6 +8,7 @@ module GitLab
8
8
  autoload :RowCountProber, "gitlab_exporter/database/row_count"
9
9
  autoload :BloatProber, "gitlab_exporter/database/bloat"
10
10
  autoload :RemoteMirrorsProber, "gitlab_exporter/database/remote_mirrors"
11
+ autoload :PgSequencesProber, "gitlab_exporter/database/pg_sequences"
11
12
  end
12
13
  end
13
14
  end
@@ -1,5 +1,5 @@
1
1
  module GitLab
2
2
  module Exporter
3
- VERSION = "15.0.0".freeze
3
+ VERSION = "15.2.0".freeze
4
4
  end
5
5
  end
@@ -133,7 +133,7 @@ module GitLab
133
133
  end
134
134
 
135
135
  get "/#{probe_name}" do
136
- content_type "text/plain; version=0.0.4"
136
+ content_type "text/plain; version=0.0.4; charset=utf-8"
137
137
  prober = Prober.new(metrics: PrometheusMetrics.new(include_timestamp: false), logger: logger, **opts)
138
138
 
139
139
  prober.probe_all
@@ -0,0 +1,128 @@
1
+ require "spec_helper"
2
+ require "gitlab_exporter/database/pg_sequences"
3
+
4
+ describe GitLab::Exporter::Database::PgSequencesCollector do
5
+ subject { described_class.new(connection_string: "") }
6
+
7
+ let(:connection_pool) { double("connection pool") }
8
+ let(:connection) { double("connection", exec: query_result) }
9
+ let(:type) { :btree }
10
+ let(:query_result) do
11
+ [
12
+ {
13
+ "schemaname" => "public",
14
+ "sequencename" => "seq_one",
15
+ "fully_qualified_sequencename" => "public.seq_one",
16
+ "min_value" => 1,
17
+ "max_value" => 9_223_372_036_854_775_807,
18
+ "current_value" => 6_223_372_036_854_745_121
19
+ },
20
+ {
21
+ "schemaname" => "public",
22
+ "sequencename" => "seq_two",
23
+ "fully_qualified_sequencename" => "public.seq_two",
24
+ "min_value" => 1,
25
+ "max_value" => 9_223_372_036_854_775_807,
26
+ "current_value" => nil
27
+ }
28
+ ]
29
+ end
30
+
31
+ before do
32
+ allow_any_instance_of(described_class).to receive(:connection_pool).and_return(connection_pool)
33
+ allow(connection_pool).to receive(:with).and_yield(connection)
34
+ end
35
+
36
+ it "converts query results into a hash" do
37
+ expect(subject.run).to(
38
+ eq(
39
+ "public.seq_one" => {
40
+ "schemaname" => "public",
41
+ "sequencename" => "seq_one",
42
+ "min_value" => 1,
43
+ "max_value" => 9_223_372_036_854_775_807,
44
+ "current_value" => 6_223_372_036_854_745_121
45
+ },
46
+ "public.seq_two" => {
47
+ "schemaname" => "public",
48
+ "sequencename" => "seq_two",
49
+ "min_value" => 1,
50
+ "max_value" => 9_223_372_036_854_775_807,
51
+ "current_value" => nil
52
+ }
53
+ )
54
+ )
55
+ end
56
+ end
57
+
58
+ describe GitLab::Exporter::Database::PgSequencesProber do
59
+ subject(:prober) { described_class.new(metrics: metrics, connection_string: "") }
60
+
61
+ let(:metrics) { double("PrometheusMetrics", add: nil) }
62
+ let(:collector) { double("PgSequencesCollector", run: data) }
63
+ let(:data) do
64
+ {
65
+ "public.seq_one" => {
66
+ "schemaname" => "public",
67
+ "sequencename" => "seq_one",
68
+ "min_value" => 1,
69
+ "max_value" => 10,
70
+ "current_value" => 2
71
+ }
72
+ }
73
+ end
74
+
75
+ describe "#probe_db" do
76
+ before do
77
+ allow(GitLab::Exporter::Database::PgSequencesCollector).to receive(:new).and_return(collector)
78
+ end
79
+
80
+ it "properly invokes the collector" do
81
+ expect(collector).to receive(:run)
82
+
83
+ prober.probe_db
84
+ end
85
+
86
+ it "adds min_value metric" do
87
+ expect(metrics).to(
88
+ receive(:add).with(
89
+ "gitlab_pg_sequences_min_value",
90
+ 1.0,
91
+ schemaname: "public",
92
+ sequencename: "seq_one",
93
+ fully_qualified_sequencename: "public.seq_one"
94
+ )
95
+ )
96
+
97
+ prober.probe_db
98
+ end
99
+
100
+ it "adds max_value metric" do
101
+ expect(metrics).to(
102
+ receive(:add).with(
103
+ "gitlab_pg_sequences_max_value",
104
+ 10.0,
105
+ schemaname: "public",
106
+ sequencename: "seq_one",
107
+ fully_qualified_sequencename: "public.seq_one"
108
+ )
109
+ )
110
+
111
+ prober.probe_db
112
+ end
113
+
114
+ it "adds current_value metric" do
115
+ expect(metrics).to(
116
+ receive(:add).with(
117
+ "gitlab_pg_sequences_current_value",
118
+ 2.0,
119
+ schemaname: "public",
120
+ sequencename: "seq_one",
121
+ fully_qualified_sequencename: "public.seq_one"
122
+ )
123
+ )
124
+
125
+ prober.probe_db
126
+ end
127
+ end
128
+ 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: 15.0.0
4
+ version: 15.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Carranza
@@ -227,6 +227,7 @@ files:
227
227
  - lib/gitlab_exporter/database/bloat_btree.sql
228
228
  - lib/gitlab_exporter/database/bloat_table.sql
229
229
  - lib/gitlab_exporter/database/ci_builds.rb
230
+ - lib/gitlab_exporter/database/pg_sequences.rb
230
231
  - lib/gitlab_exporter/database/remote_mirrors.rb
231
232
  - lib/gitlab_exporter/database/row_count.rb
232
233
  - lib/gitlab_exporter/database/tuple_stats.rb
@@ -247,6 +248,7 @@ files:
247
248
  - spec/cli_spec.rb
248
249
  - spec/database/bloat_spec.rb
249
250
  - spec/database/ci_builds_spec.rb
251
+ - spec/database/pg_sequences_spec.rb
250
252
  - spec/database/row_count_spec.rb
251
253
  - spec/elasticsearch_spec.rb
252
254
  - spec/fixtures/config.yml
@@ -286,6 +288,7 @@ test_files:
286
288
  - spec/cli_spec.rb
287
289
  - spec/database/bloat_spec.rb
288
290
  - spec/database/ci_builds_spec.rb
291
+ - spec/database/pg_sequences_spec.rb
289
292
  - spec/database/row_count_spec.rb
290
293
  - spec/elasticsearch_spec.rb
291
294
  - spec/fixtures/config.yml