From aee0a117a889461ce8ced6fcf73207fe017f1d99 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 20 Dec 2021 13:37:47 +0000 Subject: Add latest changes from gitlab-org/gitlab@14-6-stable-ee --- metrics_server/dependencies.rb | 27 ++++++++++++++ metrics_server/metrics_server.rb | 59 ++++++++++++++++++++++++++++++ metrics_server/override_rails_constants.rb | 20 ++++++++++ metrics_server/settings_overrides.rb | 14 +++++++ 4 files changed, 120 insertions(+) create mode 100644 metrics_server/dependencies.rb create mode 100644 metrics_server/metrics_server.rb create mode 100644 metrics_server/override_rails_constants.rb create mode 100644 metrics_server/settings_overrides.rb (limited to 'metrics_server') diff --git a/metrics_server/dependencies.rb b/metrics_server/dependencies.rb new file mode 100644 index 00000000000..a459efef1ad --- /dev/null +++ b/metrics_server/dependencies.rb @@ -0,0 +1,27 @@ +# rubocop:disable Naming/FileName +# frozen_string_literal: true + +require 'shellwords' +require 'fileutils' + +require 'active_support/concern' +require 'active_support/inflector' + +require 'prometheus/client' +require 'rack' + +require_relative 'settings_overrides' + +require_relative '../lib/gitlab/daemon' +require_relative '../lib/gitlab/utils' +require_relative '../lib/gitlab/utils/strong_memoize' +require_relative '../lib/prometheus/cleanup_multiproc_dir_service' +require_relative '../lib/gitlab/metrics/prometheus' +require_relative '../lib/gitlab/metrics' +require_relative '../lib/gitlab/metrics/exporter/base_exporter' +require_relative '../lib/gitlab/metrics/exporter/sidekiq_exporter' +require_relative '../lib/gitlab/health_checks/probes/collection' +require_relative '../lib/gitlab/health_checks/probes/status' +require_relative '../lib/gitlab/process_management' + +# rubocop:enable Naming/FileName diff --git a/metrics_server/metrics_server.rb b/metrics_server/metrics_server.rb new file mode 100644 index 00000000000..56fc20dcc9d --- /dev/null +++ b/metrics_server/metrics_server.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +require_relative '../config/boot' + +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' + + pid = Process.fork + + if pid.nil? # nil means we're inside the fork + # 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') + + server = MetricsServer.new(target, metrics_dir, wipe_metrics_dir) + # This rewrites /proc/cmdline, since otherwise tools like `top` will show the + # parent process `cmdline` which is really confusing. + $0 = server.name + + server.start + else + Process.detach(pid) + end + + pid + end + end + + def initialize(target, metrics_dir, wipe_metrics_dir) + @target = target + @metrics_dir = metrics_dir + @wipe_metrics_dir = wipe_metrics_dir + end + + def start + ::Prometheus::Client.configure do |config| + config.multiprocess_files_dir = @metrics_dir + end + + FileUtils.mkdir_p(@metrics_dir, mode: 0700) + ::Prometheus::CleanupMultiprocDirService.new.execute if @wipe_metrics_dir + + settings = Settings.new(Settings.monitoring[name]) + + exporter_class = "Gitlab::Metrics::Exporter::#{@target.camelize}Exporter".constantize + server = exporter_class.instance(settings, synchronous: true) + + server.start + end + + def name + "#{@target}_exporter" + end +end diff --git a/metrics_server/override_rails_constants.rb b/metrics_server/override_rails_constants.rb new file mode 100644 index 00000000000..76e49edfbb0 --- /dev/null +++ b/metrics_server/override_rails_constants.rb @@ -0,0 +1,20 @@ +# rubocop:disable Naming/FileName +# frozen_string_literal: true + +require 'active_support/environment_inquirer' + +module Rails + extend self + + def env + @env ||= ActiveSupport::EnvironmentInquirer.new( + ENV["RAILS_ENV"].presence || ENV["RACK_ENV"].presence || "development" + ) + end + + def root + Pathname.new(File.expand_path('..', __dir__)) + end +end + +# rubocop:enable Naming/FileName diff --git a/metrics_server/settings_overrides.rb b/metrics_server/settings_overrides.rb new file mode 100644 index 00000000000..8572b4f86b0 --- /dev/null +++ b/metrics_server/settings_overrides.rb @@ -0,0 +1,14 @@ +# rubocop:disable Naming/FileName +# frozen_string_literal: true + +# Sidekiq-cluster code is loaded both inside a Rails/Rspec +# context as well as outside of it via CLI invocation. When it +# is loaded outside of a Rails/Rspec context we do not have access +# to all necessary constants. For example, we need Rails.root to +# determine the location of bin/metrics-server. +# Here we make the necessary constants available conditionally. +require_relative 'override_rails_constants' unless Object.const_defined?('Rails') + +require_relative '../config/settings' + +# rubocop:enable Naming/FileName -- cgit v1.2.3