gitlab-exporter 7.1.2 → 10.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
 
@@ -1,5 +1,5 @@
1
1
  module GitLab
2
2
  module Exporter
3
- VERSION = "7.1.2".freeze
3
+ VERSION = "10.0.0".freeze
4
4
  end
5
5
  end
@@ -24,7 +24,7 @@ module GitLab
24
24
  private
25
25
 
26
26
  def memory_usage
27
- io = IO.popen(%W(ps -o rss= -p #{$PID}))
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
@@ -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(btree table) } }
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 Metrics/LineLength
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
- .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)])
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
- .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)])
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
- .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)])
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
- .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)])
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]
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
  require "gitlab_exporter"
3
3
 
4
- # rubocop:disable Metrics/LineLength
4
+ # rubocop:disable Layout/LineLength
5
5
  describe GitLab::Exporter::GitProcessProber do
6
6
  describe ".extract_subcommand" do
7
7
  it "extract git subcommand" do
@@ -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(size rss shared_clean shared_dirty private_dirty pss)
18
- zero_fields = %w(private_clean swap)
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 # rubocop:disable Style/NumericPredicate
21
+ expect(subject.totals[field]).to be > 0
22
22
  end
23
23
 
24
24
  zero_fields.each do |field|
@@ -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
@@ -51,11 +51,9 @@ class CLIArgs
51
51
  yield self
52
52
  end
53
53
 
54
- def on(*args)
55
- end
54
+ def on(*args); end
56
55
 
57
- def banner=(banner)
58
- end
56
+ def banner=(banner); end
59
57
 
60
58
  def parse!
61
59
  @arguments
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: 7.1.2
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: pg
14
+ name: connection_pool
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
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: '1.1'
26
+ version: 2.2.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: sinatra
28
+ name: pg
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.4
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: 2.0.4
40
+ version: '1.1'
41
41
  - !ruby/object:Gem::Dependency
42
- name: quantile
42
+ name: puma
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.2.0
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: 0.2.0
54
+ version: 5.1.1
55
55
  - !ruby/object:Gem::Dependency
56
- name: sidekiq
56
+ name: quantile
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 5.2.1
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: 5.2.1
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: connection_pool
98
+ name: sidekiq
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 2.2.1
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: 2.2.1
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.0.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