diff --git a/lib/gitlab/metrics/exporter/base_exporter.rb b/lib/gitlab/metrics/exporter/base_exporter.rb index 66041badf01189455c2eb6dce04db8d7a3c6e360..190d3d3fd2fc595c8cbd7b83fa44608e220c035f 100644 --- a/lib/gitlab/metrics/exporter/base_exporter.rb +++ b/lib/gitlab/metrics/exporter/base_exporter.rb @@ -11,10 +11,11 @@ class BaseExporter < Daemon attr_accessor :readiness_checks - def initialize(settings, log_enabled:, log_file:, **options) + def initialize(settings, log_enabled:, log_file:, gc_requests: false, **options) super(**options) @settings = settings + @gc_requests = gc_requests # log_enabled does not exist for all exporters log_sink = log_enabled ? File.join(Rails.root, 'log', log_file) : File::NULL @@ -71,11 +72,13 @@ def rack_app readiness = readiness_probe liveness = liveness_probe pid = thread_name + gc_requests = @gc_requests Rack::Builder.app do use Rack::Deflater use Gitlab::Metrics::Exporter::MetricsMiddleware, pid use Gitlab::Metrics::Exporter::HealthChecksMiddleware, readiness, liveness + use Gitlab::Metrics::Exporter::GcRequestMiddleware if gc_requests use ::Prometheus::Client::Rack::Exporter if ::Gitlab::Metrics.metrics_folder_present? run -> (env) { [404, {}, ['']] } end diff --git a/lib/gitlab/metrics/exporter/gc_request_middleware.rb b/lib/gitlab/metrics/exporter/gc_request_middleware.rb new file mode 100644 index 0000000000000000000000000000000000000000..3806b0e2bd1b2224c5df33416116dcceab4360e8 --- /dev/null +++ b/lib/gitlab/metrics/exporter/gc_request_middleware.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Gitlab + module Metrics + module Exporter + class GcRequestMiddleware + def initialize(app) + @app = app + end + + def call(env) + @app.call(env).tap do + GC.start + end + end + end + end + end +end diff --git a/metrics_server/dependencies.rb b/metrics_server/dependencies.rb index 36d61a633598198d88c061238ab573041ea9b870..5615cef42cebfd65cf3e1e363a771294f932d9ab 100644 --- a/metrics_server/dependencies.rb +++ b/metrics_server/dependencies.rb @@ -26,6 +26,7 @@ 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' +require_relative '../lib/gitlab/metrics/exporter/gc_request_middleware' require_relative '../lib/gitlab/health_checks/probes/collection' require_relative '../lib/gitlab/health_checks/probes/status' require_relative '../lib/gitlab/process_management' diff --git a/metrics_server/metrics_server.rb b/metrics_server/metrics_server.rb index 33b31326d2ad421bedd5d04238be2390353f85f6..122a4e4fc1e78c179b32c337029d0403686891d8 100644 --- a/metrics_server/metrics_server.rb +++ b/metrics_server/metrics_server.rb @@ -54,7 +54,7 @@ def start exporter_class = "Gitlab::Metrics::Exporter::#{@target.camelize}Exporter".constantize settings = Settings.new(Settings.monitoring[name]) - server = exporter_class.instance(settings, synchronous: true) + server = exporter_class.instance(settings, gc_requests: true, synchronous: true) server.start end diff --git a/spec/lib/gitlab/metrics/exporter/gc_request_middleware_spec.rb b/spec/lib/gitlab/metrics/exporter/gc_request_middleware_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..0c70a5de70120450eb5e295528be699a91684ade --- /dev/null +++ b/spec/lib/gitlab/metrics/exporter/gc_request_middleware_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'fast_spec_helper' + +RSpec.describe Gitlab::Metrics::Exporter::GcRequestMiddleware do + let(:app) { double(:app) } + let(:env) { {} } + + subject(:middleware) { described_class.new(app) } + + describe '#call' do + it 'runs a major GC after the next middleware is called' do + expect(app).to receive(:call).with(env).ordered.and_return([200, {}, []]) + expect(GC).to receive(:start).ordered + + response = middleware.call(env) + + expect(response).to eq([200, {}, []]) + end + end +end diff --git a/spec/metrics_server/metrics_server_spec.rb b/spec/metrics_server/metrics_server_spec.rb index 1120fab2de3075050ca2938563f20baa1f59eee3..fc18df9b5cda65dcbfc51066b09d305549357d30 100644 --- a/spec/metrics_server/metrics_server_spec.rb +++ b/spec/metrics_server/metrics_server_spec.rb @@ -70,7 +70,9 @@ before do stub_const('Gitlab::Metrics::Exporter::FakeExporter', exporter_class) - expect(exporter_class).to receive(:instance).with(settings['fake_exporter'], synchronous: true).and_return(exporter_double) + expect(exporter_class).to receive(:instance).with( + settings['fake_exporter'], gc_requests: true, synchronous: true + ).and_return(exporter_double) expect(Settings).to receive(:monitoring).and_return(settings) allow(Gitlab::Metrics::Samplers::RubySampler).to receive(:initialize_instance).and_return(ruby_sampler_double)