Skip to content
代码片段 群组 项目
提交 e3cc1791 编辑于 作者: Matthias Kaeppler's avatar Matthias Kaeppler
浏览文件

Remove support for gitlab-metrics-exporter

This system was never in productive use and not
officially supported. We are retiring it now.

See https://gitlab.com/gitlab-org/gitlab-metrics-exporter/-/issues/31
上级 5f926ee0
No related branches found
No related tags found
无相关合并请求
# frozen_string_literal: true
namespace :gitlab do
require_relative Rails.root.join('metrics_server', 'dependencies')
require_relative Rails.root.join('metrics_server', 'metrics_server')
namespace :metrics_exporter do
REPO = 'https://gitlab.com/gitlab-org/gitlab-metrics-exporter.git'
desc "GitLab | Metrics Exporter | Install or upgrade gitlab-metrics-exporter"
task :install, [:dir] => :gitlab_environment do |t, args|
unless args.dir.present?
abort %(Please specify the directory where you want to install the exporter
Usage: rake "gitlab:metrics_exporter:install[/installation/dir]")
end
version = ENV['GITLAB_METRICS_EXPORTER_VERSION'] || MetricsServer.version
make = Gitlab::Utils.which('gmake') || Gitlab::Utils.which('make')
abort "Couldn't find a 'make' binary" unless make
checkout_or_clone_version(version: version, repo: REPO, target_dir: args.dir, clone_opts: %w[--depth 1])
Dir.chdir(args.dir) { run_command!([make]) }
end
end
end
...@@ -7,10 +7,6 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass ...@@ -7,10 +7,6 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
PumaProcessSupervisor = Class.new(Gitlab::ProcessSupervisor) PumaProcessSupervisor = Class.new(Gitlab::ProcessSupervisor)
class << self class << self
def version
Rails.root.join('GITLAB_METRICS_EXPORTER_VERSION').read.chomp
end
def start_for_puma def start_for_puma
metrics_dir = ::Prometheus::Client.configuration.multiprocess_files_dir metrics_dir = ::Prometheus::Client.configuration.multiprocess_files_dir
...@@ -28,45 +24,10 @@ def start_for_puma ...@@ -28,45 +24,10 @@ def start_for_puma
end end
def start_for_sidekiq(**options) def start_for_sidekiq(**options)
if new_metrics_server? self.fork('sidekiq', **options)
self.spawn('sidekiq', **options)
else
self.fork('sidekiq', **options)
end
end
def spawn(target, metrics_dir:, **options)
return spawn_ruby_server(target, metrics_dir: metrics_dir, **options) unless new_metrics_server?
settings = settings_value(target)
path = options[:path]&.then { |p| Pathname.new(p) } || Pathname.new('')
cmd = path.join('gitlab-metrics-exporter').to_path
env = {
'GOGC' => '10', # Set Go GC heap goal to 10% to curb memory growth.
'GME_MMAP_METRICS_DIR' => metrics_dir.to_s,
'GME_PROBES' => 'self,mmap,mmap_stats',
'GME_SERVER_HOST' => settings['address'],
'GME_SERVER_PORT' => settings['port'].to_s
}
if settings['log_enabled']
env['GME_LOG_FILE'] = File.join(Rails.root, 'log', "#{name(target)}.log")
env['GME_LOG_LEVEL'] = 'info'
else
env['GME_LOG_LEVEL'] = 'quiet'
end
if settings['tls_enabled']
env['GME_CERT_FILE'] = settings['tls_cert_path']
env['GME_CERT_KEY'] = settings['tls_key_path']
end
Process.spawn(env, cmd, err: $stderr, out: $stdout, pgroup: true).tap do |pid|
Process.detach(pid)
end
end end
def spawn_ruby_server(target, metrics_dir:, wipe_metrics_dir: false, **options) def spawn(target, metrics_dir:, wipe_metrics_dir: false)
ensure_valid_target!(target) ensure_valid_target!(target)
cmd = "#{Rails.root}/bin/metrics-server" cmd = "#{Rails.root}/bin/metrics-server"
...@@ -126,10 +87,6 @@ def settings_value(target) ...@@ -126,10 +87,6 @@ def settings_value(target)
end end
end end
def new_metrics_server?
Gitlab::Utils.to_boolean(ENV['GITLAB_GOLANG_METRICS_SERVER'])
end
def ensure_valid_target!(target) def ensure_valid_target!(target)
raise "Target must be one of [puma,sidekiq]" unless %w(puma sidekiq).include?(target) raise "Target must be one of [puma,sidekiq]" unless %w(puma sidekiq).include?(target)
end end
......
...@@ -88,13 +88,6 @@ RUN set -eux; \ ...@@ -88,13 +88,6 @@ RUN set -eux; \
rm -rf ${GEM_HOME}/cache \ rm -rf ${GEM_HOME}/cache \
&& go clean -cache && go clean -cache
# Build metrics-exporter
#
COPY --chown=gdk:gdk GITLAB_METRICS_EXPORTER_VERSION ./gitlab/
RUN set -eux; \
make gitlab-metrics-exporter-setup; \
go clean -cache
# Install gitlab gem dependencies # Install gitlab gem dependencies
# #
COPY --chown=gdk:gdk Gemfile Gemfile.lock ./gitlab/ COPY --chown=gdk:gdk Gemfile Gemfile.lock ./gitlab/
......
...@@ -30,18 +30,6 @@ ...@@ -30,18 +30,6 @@
} }
end end
before(:all) do
Rake.application.rake_require 'tasks/gitlab/metrics_exporter'
@exporter_path = Rails.root.join('tmp', 'test', 'gme')
run_rake_task('gitlab:metrics_exporter:install', @exporter_path)
end
after(:all) do
FileUtils.rm_rf(@exporter_path)
end
shared_examples 'serves metrics endpoint' do shared_examples 'serves metrics endpoint' do
it 'serves /metrics endpoint' do it 'serves /metrics endpoint' do
start_server! start_server!
...@@ -59,24 +47,18 @@ ...@@ -59,24 +47,18 @@
end end
end end
shared_examples 'spawns a server' do |target, use_golang_server| shared_examples 'spawns a server' do |target|
context "targeting #{target} when using Golang server is #{use_golang_server}" do context "targeting #{target}" do
let(:metrics_dir) { Dir.mktmpdir } let(:metrics_dir) { Dir.mktmpdir }
subject(:start_server!) do subject(:start_server!) do
@pid = MetricsServer.spawn(target, metrics_dir: metrics_dir, path: @exporter_path.join('bin')) @pid = MetricsServer.spawn(target, metrics_dir: metrics_dir)
end end
before do before do
if use_golang_server config_file.write(YAML.dump(config))
stub_env('GITLAB_GOLANG_METRICS_SERVER', '1') config_file.close
allow(Settings).to receive(:monitoring).and_return( stub_env('GITLAB_CONFIG', config_file.path)
GitlabSettings::Options.build(config.dig('test', 'monitoring')))
else
config_file.write(YAML.dump(config))
config_file.close
stub_env('GITLAB_CONFIG', config_file.path)
end
# We need to send a request to localhost # We need to send a request to localhost
WebMock.allow_net_connect! WebMock.allow_net_connect!
end end
...@@ -111,8 +93,6 @@ ...@@ -111,8 +93,6 @@
end end
end end
it_behaves_like 'spawns a server', 'puma', true it_behaves_like 'spawns a server', 'puma'
it_behaves_like 'spawns a server', 'puma', false it_behaves_like 'spawns a server', 'sidekiq'
it_behaves_like 'spawns a server', 'sidekiq', true
it_behaves_like 'spawns a server', 'sidekiq', false
end end
...@@ -69,136 +69,29 @@ ...@@ -69,136 +69,29 @@
end end
describe '.spawn' do describe '.spawn' do
context 'for legacy Ruby server' do let(:expected_env) do
let(:expected_env) do {
{ 'METRICS_SERVER_TARGET' => target,
'METRICS_SERVER_TARGET' => target, 'WIPE_METRICS_DIR' => '0',
'WIPE_METRICS_DIR' => '0', 'GITLAB_CONFIG' => 'path/to/config/gitlab.yml'
'GITLAB_CONFIG' => 'path/to/config/gitlab.yml' }
}
end
before do
stub_env('GITLAB_CONFIG', 'path/to/config/gitlab.yml')
end
it 'spawns a new server process and returns its PID' do
expect(Process).to receive(:spawn).with(
expected_env,
end_with('bin/metrics-server'),
hash_including(pgroup: true)
).and_return(99)
expect(Process).to receive(:detach).with(99)
pid = described_class.spawn(target, metrics_dir: metrics_dir)
expect(pid).to eq(99)
end
end end
context 'for Golang server' do before do
let(:log_enabled) { false } stub_env('GITLAB_CONFIG', 'path/to/config/gitlab.yml')
let(:settings) do end
GitlabSettings::Options.build(
{
'web_exporter' => {
'enabled' => true,
'address' => 'localhost',
'port' => '8083',
'log_enabled' => log_enabled
},
'sidekiq_exporter' => {
'enabled' => true,
'address' => 'localhost',
'port' => '8082',
'log_enabled' => log_enabled
}
}
)
end
let(:expected_port) { target == 'puma' ? '8083' : '8082' }
let(:expected_env) do
{
'GOGC' => '10',
'GME_MMAP_METRICS_DIR' => metrics_dir,
'GME_PROBES' => 'self,mmap,mmap_stats',
'GME_SERVER_HOST' => 'localhost',
'GME_SERVER_PORT' => expected_port,
'GME_LOG_LEVEL' => 'quiet'
}
end
before do
stub_env('GITLAB_GOLANG_METRICS_SERVER', '1')
allow(::Settings).to receive(:monitoring).and_return(settings)
end
it 'spawns a new server process and returns its PID' do
expect(Process).to receive(:spawn).with(
expected_env,
'gitlab-metrics-exporter',
hash_including(pgroup: true)
).and_return(99)
expect(Process).to receive(:detach).with(99)
pid = described_class.spawn(target, metrics_dir: metrics_dir)
expect(pid).to eq(99)
end
it 'can launch from explicit path instead of PATH' do
expect(Process).to receive(:spawn).with(
expected_env,
'/path/to/gme/gitlab-metrics-exporter',
hash_including(pgroup: true)
).and_return(99)
described_class.spawn(target, metrics_dir: metrics_dir, path: '/path/to/gme/')
end
context 'when logs are enabled' do it 'spawns a new server process and returns its PID' do
let(:log_enabled) { true } expect(Process).to receive(:spawn).with(
let(:expected_log_file) { target == 'puma' ? 'web_exporter.log' : 'sidekiq_exporter.log' } expected_env,
end_with('bin/metrics-server'),
it 'sets log related environment variables' do hash_including(pgroup: true)
expect(Process).to receive(:spawn).with( ).and_return(99)
expected_env.merge( expect(Process).to receive(:detach).with(99)
'GME_LOG_LEVEL' => 'info',
'GME_LOG_FILE' => File.join(Rails.root, 'log', expected_log_file)
),
'gitlab-metrics-exporter',
hash_including(pgroup: true)
).and_return(99)
described_class.spawn(target, metrics_dir: metrics_dir)
end
end
context 'when TLS settings are present' do pid = described_class.spawn(target, metrics_dir: metrics_dir)
before do
settings.web_exporter['tls_enabled'] = true
settings.web_exporter['tls_cert_path'] = '/path/to/cert.pem'
settings.web_exporter['tls_key_path'] = '/path/to/key.pem'
settings.sidekiq_exporter['tls_enabled'] = true expect(pid).to eq(99)
settings.sidekiq_exporter['tls_cert_path'] = '/path/to/cert.pem'
settings.sidekiq_exporter['tls_key_path'] = '/path/to/key.pem'
end
it 'sets the correct environment variables' do
expect(Process).to receive(:spawn).with(
expected_env.merge(
'GME_CERT_FILE' => '/path/to/cert.pem',
'GME_CERT_KEY' => '/path/to/key.pem'
),
'/path/to/gme/gitlab-metrics-exporter',
hash_including(pgroup: true)
).and_return(99)
described_class.spawn(target, metrics_dir: metrics_dir, path: '/path/to/gme/')
end
end
end end
end end
end end
...@@ -214,21 +107,10 @@ ...@@ -214,21 +107,10 @@
end end
describe '.spawn' do describe '.spawn' do
context 'for legacy Ruby server' do it 'raises an error' do
it 'raises an error' do expect { described_class.spawn('unsupported', metrics_dir: metrics_dir) }.to(
expect { described_class.spawn('unsupported', metrics_dir: metrics_dir) }.to( raise_error('Target must be one of [puma,sidekiq]')
raise_error('Target must be one of [puma,sidekiq]') )
)
end
end
context 'for Golang server' do
it 'raises an error' do
stub_env('GITLAB_GOLANG_METRICS_SERVER', '1')
expect { described_class.spawn('unsupported', metrics_dir: metrics_dir) }.to(
raise_error('Target must be one of [puma,sidekiq]')
)
end
end end
end end
end end
...@@ -345,21 +227,10 @@ ...@@ -345,21 +227,10 @@
end end
describe '.start_for_sidekiq' do describe '.start_for_sidekiq' do
context 'for legacy Ruby server' do it 'forks the parent process' do
it 'forks the parent process' do expect(Process).to receive(:fork).and_return(42)
expect(Process).to receive(:fork).and_return(42)
described_class.start_for_sidekiq(metrics_dir: '/path/to/metrics') described_class.start_for_sidekiq(metrics_dir: '/path/to/metrics')
end
end
context 'for Golang server' do
it 'spawns the server process' do
stub_env('GITLAB_GOLANG_METRICS_SERVER', '1')
expect(Process).to receive(:spawn).and_return(42)
described_class.start_for_sidekiq(metrics_dir: '/path/to/metrics')
end
end end
end end
......
# frozen_string_literal: true
require 'rake_helper'
require_relative '../../support/helpers/next_instance_of'
RSpec.describe 'gitlab:metrics_exporter:install', feature_category: :metrics do
before do
Rake.application.rake_require 'tasks/gitlab/metrics_exporter'
end
subject(:task) do
Rake::Task['gitlab:metrics_exporter:install']
end
context 'when no target directory is specified' do
it 'aborts with an error message' do
expect do
expect { task.execute }.to output(/Please specify the directory/).to_stdout
end.to raise_error(SystemExit)
end
end
context 'when target directory is specified' do
let(:args) { Rake::TaskArguments.new(%w[dir], %w[path/to/exporter]) }
let(:context) { TOPLEVEL_BINDING.eval('self') }
let(:expected_clone_params) do
{
repo: 'https://gitlab.com/gitlab-org/gitlab-metrics-exporter.git',
version: an_instance_of(String),
target_dir: 'path/to/exporter'
}
end
context 'when dependencies are missing' do
it 'aborts with an error message' do
expect(Gitlab::Utils).to receive(:which).with('gmake').ordered
expect(Gitlab::Utils).to receive(:which).with('make').ordered
expect do
expect { task.execute(args) }.to output(/Couldn't find a 'make' binary/).to_stdout
end.to raise_error(SystemExit)
end
end
it 'installs the exporter with gmake' do
expect(Gitlab::Utils).to receive(:which).with('gmake').and_return('path/to/gmake').ordered
expect(context).to receive(:checkout_or_clone_version).with(hash_including(expected_clone_params)).ordered
expect(Dir).to receive(:chdir).with('path/to/exporter').and_yield.ordered
expect(context).to receive(:run_command!).with(['path/to/gmake']).ordered
task.execute(args)
end
it 'installs the exporter with make' do
expect(Gitlab::Utils).to receive(:which).with('gmake').ordered
expect(Gitlab::Utils).to receive(:which).with('make').and_return('path/to/make').ordered
expect(context).to receive(:checkout_or_clone_version).with(hash_including(expected_clone_params)).ordered
expect(Dir).to receive(:chdir).with('path/to/exporter').and_yield.ordered
expect(context).to receive(:run_command!).with(['path/to/make']).ordered
task.execute(args)
end
context 'when overriding version via environment variable' do
before do
stub_env('GITLAB_METRICS_EXPORTER_VERSION', '1.0')
end
it 'clones from repository with that version instead' do
expect(Gitlab::Utils).to receive(:which).with('gmake').and_return('path/to/gmake').ordered
expect(context).to receive(:checkout_or_clone_version).with(
hash_including(expected_clone_params.merge(version: '1.0'))
).ordered
expect(Dir).to receive(:chdir).with('path/to/exporter').and_yield.ordered
expect(context).to receive(:run_command!).with(['path/to/gmake']).ordered
task.execute(args)
end
end
end
end
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册