gitlab-exporter 15.0.0 → 15.1.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: 73d7d8a42035a6cb634f0c234e6bcd3e723492f2903663d7ecd0ccacde53279c
4
+ data.tar.gz: 012ce7e6313ec24c72c605bf016477c75d6de08ec2c37339e0a12c09c64aaa23
5
5
  SHA512:
6
- metadata.gz: 8db3f5dd5db87f02d7a85fb58c13e8a48df40726c5718fd82d5b7ae792675948bd43664da3f94075527e5242c0dcf8bc5e150f8606611097677a812981d73354
7
- data.tar.gz: 9411698d4c809eba8997bd8fc0f9cc4295dac625daa35a8faf37604909a20fde621afb161534bd82fa912087cf50de45e5e192186627cb95f5c8b5643de1742e
6
+ metadata.gz: dc31a10b7051bb5c76667d817cdd2761cd9ce9b755949567770b390f4362b37722d5658300b63607ff8f2566e577786ddb6e5b8edf3263bbbba3c478d28e08e7
7
+ data.tar.gz: 96b24d081ca6172197f6bdf44b739b3d053f32f2944378bb09609a02e485a053251c752ad49c921202eeee165437284aea73f875cce06a85edc455fb2d4e573d
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.1.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,9 @@ 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`,
24
+ `gitlab_pg_sequences_saturation_ratio`
22
25
  * [Row count queries](lib/gitlab_exporter/database/row_count.rb) --
23
26
  `gitlab_database_rows`
24
27
  * [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
@@ -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.1.0".freeze
4
4
  end
5
5
  end
@@ -0,0 +1,133 @@
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
+ "saturation_ratio" => 0.6747e2
20
+ },
21
+ {
22
+ "schemaname" => "public",
23
+ "sequencename" => "seq_two",
24
+ "fully_qualified_sequencename" => "public.seq_two",
25
+ "min_value" => 1,
26
+ "max_value" => 9_223_372_036_854_775_807,
27
+ "current_value" => nil,
28
+ "saturation_ratio" => 0.0
29
+ }
30
+ ]
31
+ end
32
+
33
+ before do
34
+ allow_any_instance_of(described_class).to receive(:connection_pool).and_return(connection_pool)
35
+ allow(connection_pool).to receive(:with).and_yield(connection)
36
+ end
37
+
38
+ it "converts query results into a hash" do
39
+ expect(subject.run).to(
40
+ eq(
41
+ "public.seq_one" => {
42
+ "schemaname" => "public",
43
+ "sequencename" => "seq_one",
44
+ "min_value" => 1,
45
+ "max_value" => 9_223_372_036_854_775_807,
46
+ "current_value" => 6_223_372_036_854_745_121,
47
+ "saturation_ratio" => 0.6747e2
48
+ },
49
+ "public.seq_two" => {
50
+ "schemaname" => "public",
51
+ "sequencename" => "seq_two",
52
+ "min_value" => 1,
53
+ "max_value" => 9_223_372_036_854_775_807,
54
+ "current_value" => nil,
55
+ "saturation_ratio" => 0.0
56
+ }
57
+ )
58
+ )
59
+ end
60
+ end
61
+
62
+ describe GitLab::Exporter::Database::PgSequencesProber do
63
+ subject(:prober) { described_class.new(metrics: metrics, connection_string: "") }
64
+
65
+ let(:metrics) { double("PrometheusMetrics", add: nil) }
66
+ let(:collector) { double("PgSequencesCollector", run: data) }
67
+ let(:data) do
68
+ {
69
+ "public.seq_one" => {
70
+ "schemaname" => "public",
71
+ "sequencename" => "seq_one",
72
+ "min_value" => 1,
73
+ "max_value" => 10,
74
+ "current_value" => 2,
75
+ "saturation_ratio" => 0.2
76
+ }
77
+ }
78
+ end
79
+
80
+ describe "#probe_db" do
81
+ before do
82
+ allow(GitLab::Exporter::Database::PgSequencesCollector).to receive(:new).and_return(collector)
83
+ end
84
+
85
+ it "properly invokes the collector" do
86
+ expect(collector).to receive(:run)
87
+
88
+ prober.probe_db
89
+ end
90
+
91
+ it "adds min_value metric" do
92
+ expect(metrics).to(
93
+ receive(:add).with(
94
+ "gitlab_pg_sequences_min_value",
95
+ 1.0,
96
+ schemaname: "public",
97
+ sequencename: "seq_one",
98
+ fully_qualified_sequencename: "public.seq_one"
99
+ )
100
+ )
101
+
102
+ prober.probe_db
103
+ end
104
+
105
+ it "adds max_value metric" do
106
+ expect(metrics).to(
107
+ receive(:add).with(
108
+ "gitlab_pg_sequences_max_value",
109
+ 10.0,
110
+ schemaname: "public",
111
+ sequencename: "seq_one",
112
+ fully_qualified_sequencename: "public.seq_one"
113
+ )
114
+ )
115
+
116
+ prober.probe_db
117
+ end
118
+
119
+ it "adds current_value metric" do
120
+ expect(metrics).to(
121
+ receive(:add).with(
122
+ "gitlab_pg_sequences_current_value",
123
+ 2.0,
124
+ schemaname: "public",
125
+ sequencename: "seq_one",
126
+ fully_qualified_sequencename: "public.seq_one"
127
+ )
128
+ )
129
+
130
+ prober.probe_db
131
+ end
132
+ end
133
+ 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.1.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