gitlab-exporter 7.1.2 → 10.0.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 +4 -4
- data/.gitlab-ci.yml +1 -1
- data/.rubocop.yml +7 -5
- data/.rubocop_todo.yml +64 -0
- data/.ruby-version +1 -0
- data/Gemfile.lock +26 -15
- data/bin/gitlab-exporter +3 -1
- data/config/gitlab-exporter.yml.example +10 -0
- data/gitlab-exporter.gemspec +5 -4
- data/lib/gitlab_exporter.rb +1 -0
- data/lib/gitlab_exporter/cli.rb +1 -2
- data/lib/gitlab_exporter/database/base.rb +33 -10
- data/lib/gitlab_exporter/database/bloat.rb +2 -2
- data/lib/gitlab_exporter/database/bloat_btree.sql +84 -67
- data/lib/gitlab_exporter/database/bloat_table.sql +13 -12
- data/lib/gitlab_exporter/database/ci_builds.rb +4 -3
- data/lib/gitlab_exporter/database/row_count.rb +7 -25
- data/lib/gitlab_exporter/database/tuple_stats.rb +4 -2
- data/lib/gitlab_exporter/git.rb +8 -1
- data/lib/gitlab_exporter/memstats.rb +1 -1
- data/lib/gitlab_exporter/memstats/mapping.rb +1 -1
- data/lib/gitlab_exporter/process.rb +13 -3
- data/lib/gitlab_exporter/ruby.rb +21 -0
- data/lib/gitlab_exporter/sidekiq.rb +83 -69
- data/lib/gitlab_exporter/util.rb +1 -1
- data/lib/gitlab_exporter/version.rb +1 -1
- data/lib/gitlab_exporter/web_exporter.rb +23 -1
- data/spec/database/bloat_spec.rb +1 -1
- data/spec/database/ci_builds_spec.rb +23 -23
- data/spec/git_process_proper_spec.rb +1 -1
- data/spec/memstats_spec.rb +3 -3
- data/spec/ruby_spec.rb +25 -0
- data/spec/spec_helper.rb +2 -4
- metadata +36 -17
data/lib/gitlab_exporter/util.rb
CHANGED
@@ -24,7 +24,7 @@ module GitLab
|
|
24
24
|
# Helper methods, some stuff was copied from ActiveSupport
|
25
25
|
module Utils
|
26
26
|
def camel_case_string(str)
|
27
|
-
str.gsub(/(?:_|^)([a-z\d]*)/i) { $1.capitalize } # rubocop:disable PerlBackrefs
|
27
|
+
str.gsub(/(?:_|^)([a-z\d]*)/i) { $1.capitalize } # rubocop:disable Style/PerlBackrefs
|
28
28
|
end
|
29
29
|
module_function :camel_case_string
|
30
30
|
|
@@ -24,7 +24,7 @@ module GitLab
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def memory_usage
|
27
|
-
io = IO.popen(%W
|
27
|
+
io = IO.popen(%W[ps -o rss= -p #{$PID}])
|
28
28
|
|
29
29
|
mem = io.read
|
30
30
|
io.close
|
@@ -35,7 +35,24 @@ module GitLab
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
# Performs a major GC after each request. We found that this helps to free up
|
39
|
+
# several MB of memory in conjunction with sricter malloc config.
|
40
|
+
# See https://gitlab.com/gitlab-org/gitlab/-/issues/297241
|
41
|
+
class RunGC
|
42
|
+
def initialize(app)
|
43
|
+
@app = app
|
44
|
+
end
|
45
|
+
|
46
|
+
def call(env)
|
47
|
+
@app.call(env).tap do
|
48
|
+
GC.start
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
38
53
|
class << self
|
54
|
+
DEFAULT_WEB_SERVER = "webrick".freeze
|
55
|
+
|
39
56
|
def setup(config)
|
40
57
|
setup_server(config[:server])
|
41
58
|
setup_probes(config[:probes])
|
@@ -43,6 +60,10 @@ module GitLab
|
|
43
60
|
memory_threshold = (config[:server] && config[:server][:memory_threshold]) || 1024
|
44
61
|
use MemoryKillerMiddleware, memory_threshold
|
45
62
|
use Rack::Logger
|
63
|
+
use RunGC
|
64
|
+
|
65
|
+
# Defrag heap after everything is loaded into memory.
|
66
|
+
GC.compact
|
46
67
|
end
|
47
68
|
|
48
69
|
def logger
|
@@ -52,6 +73,7 @@ module GitLab
|
|
52
73
|
def setup_server(config)
|
53
74
|
config ||= {}
|
54
75
|
|
76
|
+
set(:server, config.fetch(:name, DEFAULT_WEB_SERVER))
|
55
77
|
set(:bind, config.fetch(:listen_address, "0.0.0.0"))
|
56
78
|
set(:port, config.fetch(:listen_port, 9168))
|
57
79
|
end
|
data/spec/database/bloat_spec.rb
CHANGED
@@ -26,7 +26,7 @@ describe GitLab::Exporter::Database::BloatCollector do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
describe GitLab::Exporter::Database::BloatProber do
|
29
|
-
let(:opts) { { bloat_types: %i
|
29
|
+
let(:opts) { { bloat_types: %i[btree table] } }
|
30
30
|
let(:metrics) { double("PrometheusMetrics", add: nil) }
|
31
31
|
let(:collector) { double("BloatCollector", run: data) }
|
32
32
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "gitlab_exporter/database/ci_builds"
|
3
3
|
|
4
|
-
# rubocop:disable
|
4
|
+
# rubocop:disable Layout/LineLength
|
5
5
|
describe GitLab::Exporter::Database do
|
6
6
|
let(:set_random_page_cost_query) { "SET random_page_cost" }
|
7
7
|
let(:builds_query_ee) { "SELECT BUILDS EE" }
|
@@ -100,35 +100,35 @@ describe GitLab::Exporter::Database do
|
|
100
100
|
allow(Time).to receive(:now).and_return(time_now)
|
101
101
|
|
102
102
|
allow(connection).to receive(:exec).with(builds_query_ee)
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
103
|
+
.and_return([builds_query_row_ee("f", "created", "1", "f", 10),
|
104
|
+
builds_query_row_ee("t", "pending", "1", "t", 30),
|
105
|
+
builds_query_row_ee("f", "created", "2", "f", 20),
|
106
|
+
builds_query_row_ee("t", "pending", "2", "t", 50),
|
107
|
+
builds_query_row_ee("t", "pending", "3", "f", 1),
|
108
|
+
builds_query_row_ee("t", "pending", "4", "t", 2),
|
109
|
+
builds_query_row_ee("f", "pending", "5", "f", 2)])
|
110
110
|
allow(connection).to receive(:exec).with(builds_query_ce)
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
111
|
+
.and_return([builds_query_row_ce("f", "created", "1", 10),
|
112
|
+
builds_query_row_ce("t", "pending", "1", 30),
|
113
|
+
builds_query_row_ce("f", "created", "2", 20),
|
114
|
+
builds_query_row_ce("t", "pending", "2", 50),
|
115
|
+
builds_query_row_ce("t", "pending", "3", 1),
|
116
|
+
builds_query_row_ce("t", "pending", "4", 2),
|
117
|
+
builds_query_row_ce("f", "pending", "5", 2)])
|
118
118
|
|
119
119
|
allow(connection).to receive(:exec).with(stale_builds_query).and_return([{ "count" => 2 }])
|
120
120
|
|
121
121
|
allow(connection).to receive(:exec).with(per_runner_query_ee)
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
122
|
+
.and_return([per_runner_query_row_ee(1, "instance_type", 1, "f", "f", 1, nil, "t", 15),
|
123
|
+
per_runner_query_row_ee(2, "project_type", 2, "t", "t", nil, 3, "f", 5),
|
124
|
+
per_runner_query_row_ee(2, "project_type", 3, "t", "t", nil, 3, "t", 5),
|
125
|
+
per_runner_query_row_ee(3, "project_type", 4, "t", "t", nil, 3, "f", 5)])
|
126
126
|
|
127
127
|
allow(connection).to receive(:exec).with(per_runner_query_ce)
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
128
|
+
.and_return([per_runner_query_row_ce(1, "instance_type", 1, 1, nil, 15),
|
129
|
+
per_runner_query_row_ce(2, "project_type", 2, nil, 3, 5),
|
130
|
+
per_runner_query_row_ce(2, "project_type", 3, nil, 3, 5),
|
131
|
+
per_runner_query_row_ce(3, "project_type", 4, nil, 3, 5)])
|
132
132
|
|
133
133
|
# rubocop:disable Style/FormatString
|
134
134
|
repeated_commands_query_ee_with_limit = repeated_commands_query_ee % [allowed_repeated_commands_count]
|
data/spec/memstats_spec.rb
CHANGED
@@ -14,11 +14,11 @@ describe GitLab::Exporter::MemStats do
|
|
14
14
|
it "parses the data properly" do
|
15
15
|
expect(subject.valid?).to be_truthy
|
16
16
|
|
17
|
-
nonzero_fields = %w
|
18
|
-
zero_fields = %w
|
17
|
+
nonzero_fields = %w[size rss shared_clean shared_dirty private_dirty pss]
|
18
|
+
zero_fields = %w[private_clean swap]
|
19
19
|
|
20
20
|
nonzero_fields.each do |field|
|
21
|
-
expect(subject.totals[field]).to be > 0
|
21
|
+
expect(subject.totals[field]).to be > 0
|
22
22
|
end
|
23
23
|
|
24
24
|
zero_fields.each do |field|
|
data/spec/ruby_spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "gitlab_exporter/ruby"
|
3
|
+
require "gitlab_exporter/prober"
|
4
|
+
|
5
|
+
describe GitLab::Exporter::RubyProber do
|
6
|
+
let(:prober) { GitLab::Exporter::Prober.new(options) }
|
7
|
+
|
8
|
+
let(:options) do
|
9
|
+
{
|
10
|
+
ruby: {
|
11
|
+
class_name: described_class.to_s,
|
12
|
+
methods: %w[probe_gc],
|
13
|
+
opts: { quantiles: false }
|
14
|
+
}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
it "probes and returns GC stats" do
|
19
|
+
prober.probe_all
|
20
|
+
|
21
|
+
output = StringIO.new
|
22
|
+
prober.write_to(output)
|
23
|
+
expect(output.string).to match(/ruby_gc_stat_count \d+ \d+/)
|
24
|
+
end
|
25
|
+
end
|
data/spec/spec_helper.rb
CHANGED
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:
|
4
|
+
version: 10.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pablo Carranza
|
@@ -11,61 +11,61 @@ cert_chain: []
|
|
11
11
|
date: 2016-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: connection_pool
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.2.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.2.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: pg
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '1.1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '1.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: puma
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 5.1.1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 5.1.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: quantile
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.2.0
|
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:
|
68
|
+
version: 0.2.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: redis
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,19 +95,33 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 1.6.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: sidekiq
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 5.2.1
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: 5.2.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: sinatra
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.0.4
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.0.4
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rspec
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,6 +160,8 @@ files:
|
|
146
160
|
- ".gitignore"
|
147
161
|
- ".gitlab-ci.yml"
|
148
162
|
- ".rubocop.yml"
|
163
|
+
- ".rubocop_todo.yml"
|
164
|
+
- ".ruby-version"
|
149
165
|
- CONTRIBUTING.md
|
150
166
|
- Gemfile
|
151
167
|
- Gemfile.lock
|
@@ -171,6 +187,7 @@ files:
|
|
171
187
|
- lib/gitlab_exporter/prober.rb
|
172
188
|
- lib/gitlab_exporter/process.rb
|
173
189
|
- lib/gitlab_exporter/prometheus.rb
|
190
|
+
- lib/gitlab_exporter/ruby.rb
|
174
191
|
- lib/gitlab_exporter/sidekiq.rb
|
175
192
|
- lib/gitlab_exporter/sidekiq_queue_job_stats.lua
|
176
193
|
- lib/gitlab_exporter/util.rb
|
@@ -185,6 +202,7 @@ files:
|
|
185
202
|
- spec/git_spec.rb
|
186
203
|
- spec/memstats_spec.rb
|
187
204
|
- spec/prometheus_metrics_spec.rb
|
205
|
+
- spec/ruby_spec.rb
|
188
206
|
- spec/spec_helper.rb
|
189
207
|
- spec/util_spec.rb
|
190
208
|
homepage: http://gitlab.com
|
@@ -206,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
224
|
- !ruby/object:Gem::Version
|
207
225
|
version: '0'
|
208
226
|
requirements: []
|
209
|
-
rubygems_version: 3.
|
227
|
+
rubygems_version: 3.1.4
|
210
228
|
signing_key:
|
211
229
|
specification_version: 4
|
212
230
|
summary: GitLab metrics exporter
|
@@ -220,5 +238,6 @@ test_files:
|
|
220
238
|
- spec/git_spec.rb
|
221
239
|
- spec/memstats_spec.rb
|
222
240
|
- spec/prometheus_metrics_spec.rb
|
241
|
+
- spec/ruby_spec.rb
|
223
242
|
- spec/spec_helper.rb
|
224
243
|
- spec/util_spec.rb
|