diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 09:45:46 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 09:45:46 +0000 |
commit | a7b3560714b4d9cc4ab32dffcd1f74a284b93580 (patch) | |
tree | 7452bd5c3545c2fa67a28aa013835fb4fa071baf /metrics_server | |
parent | ee9173579ae56a3dbfe5afe9f9410c65bb327ca7 (diff) | |
download | gitlab-ce-a7b3560714b4d9cc4ab32dffcd1f74a284b93580.tar.gz |
Add latest changes from gitlab-org/gitlab@14-8-stable-eev14.8.0-rc42
Diffstat (limited to 'metrics_server')
-rw-r--r-- | metrics_server/dependencies.rb | 1 | ||||
-rw-r--r-- | metrics_server/metrics_server.rb | 50 |
2 files changed, 41 insertions, 10 deletions
diff --git a/metrics_server/dependencies.rb b/metrics_server/dependencies.rb index 5615cef42ce..02cec1173e0 100644 --- a/metrics_server/dependencies.rb +++ b/metrics_server/dependencies.rb @@ -23,6 +23,7 @@ require_relative '../lib/gitlab/metrics/system' require_relative '../lib/gitlab/metrics/samplers/base_sampler' require_relative '../lib/gitlab/metrics/samplers/ruby_sampler' require_relative '../lib/gitlab/metrics/exporter/base_exporter' +require_relative '../lib/gitlab/metrics/exporter/web_exporter' require_relative '../lib/gitlab/metrics/exporter/sidekiq_exporter' require_relative '../lib/gitlab/metrics/exporter/metrics_middleware' require_relative '../lib/gitlab/metrics/exporter/health_checks_middleware' diff --git a/metrics_server/metrics_server.rb b/metrics_server/metrics_server.rb index 122a4e4fc1e..70769459019 100644 --- a/metrics_server/metrics_server.rb +++ b/metrics_server/metrics_server.rb @@ -6,8 +6,23 @@ require_relative 'dependencies' class MetricsServer # rubocop:disable Gitlab/NamespacedClass class << self - def spawn(target, metrics_dir:, wipe_metrics_dir: false, trapped_signals: []) - raise "The only valid target is 'sidekiq' currently" unless target == 'sidekiq' + def spawn(target, metrics_dir:, gitlab_config: nil, wipe_metrics_dir: false) + ensure_valid_target!(target) + + cmd = "#{Rails.root}/bin/metrics-server" + env = { + 'METRICS_SERVER_TARGET' => target, + 'WIPE_METRICS_DIR' => wipe_metrics_dir ? '1' : '0' + } + env['GITLAB_CONFIG'] = gitlab_config if gitlab_config + + Process.spawn(env, cmd, err: $stderr, out: $stdout, pgroup: true).tap do |pid| + Process.detach(pid) + end + end + + def fork(target, metrics_dir:, wipe_metrics_dir: false, reset_signals: []) + ensure_valid_target!(target) pid = Process.fork @@ -15,7 +30,7 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass # Remove any custom signal handlers the parent process had registered, since we do # not want to inherit them, and Ruby forks with a `clone` that has the `CLONE_SIGHAND` # flag set. - Gitlab::ProcessManagement.modify_signals(trapped_signals, 'DEFAULT') + Gitlab::ProcessManagement.modify_signals(reset_signals, 'DEFAULT') server = MetricsServer.new(target, metrics_dir, wipe_metrics_dir) # This rewrites /proc/cmdline, since otherwise tools like `top` will show the @@ -29,6 +44,12 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass pid end + + private + + def ensure_valid_target!(target) + raise "Target must be one of [puma,sidekiq]" unless %w(puma sidekiq).include?(target) + end end def initialize(target, metrics_dir, wipe_metrics_dir) @@ -40,7 +61,7 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass def start ::Prometheus::Client.configure do |config| config.multiprocess_files_dir = @metrics_dir - config.pid_provider = proc { "#{@target}_exporter" } + config.pid_provider = proc { name } end FileUtils.mkdir_p(@metrics_dir, mode: 0700) @@ -50,16 +71,25 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass # a race where not all Prometheus db files will be visible to the exporter, resulting # in missing metrics. # Warming up ensures that these files exist prior to the exporter starting up. - Gitlab::Metrics::Samplers::RubySampler.initialize_instance(warmup: true).start + Gitlab::Metrics::Samplers::RubySampler.initialize_instance(prefix: name, warmup: true).start - exporter_class = "Gitlab::Metrics::Exporter::#{@target.camelize}Exporter".constantize - settings = Settings.new(Settings.monitoring[name]) - server = exporter_class.instance(settings, gc_requests: true, synchronous: true) + default_opts = { gc_requests: true, synchronous: true } + exporter = + case @target + when 'puma' + Gitlab::Metrics::Exporter::WebExporter.instance(**default_opts) + when 'sidekiq' + settings = Settings.new(Settings.monitoring[name]) + Gitlab::Metrics::Exporter::SidekiqExporter.instance(settings, **default_opts) + end - server.start + exporter.start end def name - "#{@target}_exporter" + case @target + when 'puma' then 'web_exporter' + when 'sidekiq' then 'sidekiq_exporter' + end end end |