diff options
Diffstat (limited to 'config/initializers')
-rw-r--r-- | config/initializers/0_marginalia.rb | 18 | ||||
-rw-r--r-- | config/initializers/1_settings.rb | 12 | ||||
-rw-r--r-- | config/initializers/7_prometheus_metrics.rb | 11 | ||||
-rw-r--r-- | config/initializers/devise_dynamic_password_length_validation.rb | 39 | ||||
-rw-r--r-- | config/initializers/direct_upload_support.rb | 28 | ||||
-rw-r--r-- | config/initializers/elastic_client_setup.rb | 22 | ||||
-rw-r--r-- | config/initializers/forbid_sidekiq_in_transactions.rb | 2 | ||||
-rw-r--r-- | config/initializers/hamlit.rb | 16 | ||||
-rw-r--r-- | config/initializers/rack_attack_git_basic_auth.rb | 14 | ||||
-rw-r--r-- | config/initializers/rack_attack_new.rb | 27 | ||||
-rw-r--r-- | config/initializers/sentry.rb | 33 | ||||
-rw-r--r-- | config/initializers/sidekiq.rb | 28 | ||||
-rw-r--r-- | config/initializers/snowplow_tracker.rb | 23 | ||||
-rw-r--r-- | config/initializers/zz_metrics.rb | 6 |
14 files changed, 166 insertions, 113 deletions
diff --git a/config/initializers/0_marginalia.rb b/config/initializers/0_marginalia.rb new file mode 100644 index 00000000000..f88a90854e3 --- /dev/null +++ b/config/initializers/0_marginalia.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'marginalia' + +::Marginalia::Comment.extend(::Gitlab::Marginalia::Comment) + +# Patch to modify 'Marginalia::ActiveRecordInstrumentation.annotate_sql' method with feature check. +# Orignal Marginalia::ActiveRecordInstrumentation is included to ActiveRecord::ConnectionAdapters::PostgreSQLAdapter in the Marginalia Railtie. +# Refer: https://github.com/basecamp/marginalia/blob/v1.8.0/lib/marginalia/railtie.rb#L67 +ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Gitlab::Marginalia::ActiveRecordInstrumentation) + +Marginalia::Comment.components = [:application, :controller, :action, :correlation_id, :jid, :job_class, :line] + +Gitlab::Marginalia.set_application_name + +Gitlab::Marginalia.enable_sidekiq_instrumentation + +Gitlab::Marginalia.set_feature_cache diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index df4f49524bc..691e4339bf0 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -291,7 +291,7 @@ Settings.pages['url'] ||= Settings.__send__(:build_pages_url) Settings.pages['external_http'] ||= false unless Settings.pages['external_http'].present? Settings.pages['external_https'] ||= false unless Settings.pages['external_https'].present? Settings.pages['artifacts_server'] ||= Settings.pages['enabled'] if Settings.pages['artifacts_server'].nil? -Settings.pages['secret_file'] ||= Rails.root.join('.gitlab_pages_shared_secret') +Settings.pages['secret_file'] ||= Rails.root.join('.gitlab_pages_secret') # # Geo @@ -407,6 +407,9 @@ Settings.cron_jobs['repository_check_worker']['job_class'] = 'RepositoryCheck::D Settings.cron_jobs['admin_email_worker'] ||= Settingslogic.new({}) Settings.cron_jobs['admin_email_worker']['cron'] ||= '0 0 * * 0' Settings.cron_jobs['admin_email_worker']['job_class'] = 'AdminEmailWorker' +Settings.cron_jobs['personal_access_tokens_expiring_worker'] ||= Settingslogic.new({}) +Settings.cron_jobs['personal_access_tokens_expiring_worker']['cron'] ||= '0 1 * * *' +Settings.cron_jobs['personal_access_tokens_expiring_worker']['job_class'] = 'PersonalAccessTokens::ExpiringWorker' Settings.cron_jobs['repository_archive_cache_worker'] ||= Settingslogic.new({}) Settings.cron_jobs['repository_archive_cache_worker']['cron'] ||= '0 * * * *' Settings.cron_jobs['repository_archive_cache_worker']['job_class'] = 'RepositoryArchiveCacheWorker' @@ -466,9 +469,15 @@ Settings.cron_jobs['namespaces_prune_aggregation_schedules_worker']['cron'] ||= Settings.cron_jobs['namespaces_prune_aggregation_schedules_worker']['job_class'] = 'Namespaces::PruneAggregationSchedulesWorker' Gitlab.ee do + Settings.cron_jobs['adjourned_group_deletion_worker'] ||= Settingslogic.new({}) + Settings.cron_jobs['adjourned_group_deletion_worker']['cron'] ||= '0 3 * * *' + Settings.cron_jobs['adjourned_group_deletion_worker']['job_class'] = 'AdjournedGroupDeletionWorker' Settings.cron_jobs['clear_shared_runners_minutes_worker'] ||= Settingslogic.new({}) Settings.cron_jobs['clear_shared_runners_minutes_worker']['cron'] ||= '0 0 1 * *' Settings.cron_jobs['clear_shared_runners_minutes_worker']['job_class'] = 'ClearSharedRunnersMinutesWorker' + Settings.cron_jobs['adjourned_projects_deletion_cron_worker'] ||= Settingslogic.new({}) + Settings.cron_jobs['adjourned_projects_deletion_cron_worker']['cron'] ||= '0 4 * * *' + Settings.cron_jobs['adjourned_projects_deletion_cron_worker']['job_class'] = 'AdjournedProjectsDeletionCronWorker' Settings.cron_jobs['geo_file_download_dispatch_worker'] ||= Settingslogic.new({}) Settings.cron_jobs['geo_file_download_dispatch_worker']['cron'] ||= '*/1 * * * *' Settings.cron_jobs['geo_file_download_dispatch_worker']['job_class'] ||= 'Geo::FileDownloadDispatchWorker' @@ -645,6 +654,7 @@ Settings.rack_attack.git_basic_auth['ip_whitelist'] ||= %w{127.0.0.1} Settings.rack_attack.git_basic_auth['maxretry'] ||= 10 Settings.rack_attack.git_basic_auth['findtime'] ||= 1.minute Settings.rack_attack.git_basic_auth['bantime'] ||= 1.hour +Settings.rack_attack['admin_area_protected_paths_enabled'] ||= false # # Gitaly diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb index d40049970c1..c14ee1458bc 100644 --- a/config/initializers/7_prometheus_metrics.rb +++ b/config/initializers/7_prometheus_metrics.rb @@ -32,15 +32,8 @@ end Sidekiq.configure_server do |config| config.on(:startup) do - # webserver metrics are cleaned up in config.ru: `warmup` block - Prometheus::CleanupMultiprocDirService.new.execute - # In production, sidekiq is run in a multi-process setup where processes might interfere - # with each other cleaning up and reinitializing prometheus database files, which is why - # we're re-doing the work every time here. - # A cleaner solution would be to run the cleanup pre-fork, and the initialization once - # after all workers have forked, but I don't know how at this point. - ::Prometheus::Client.reinitialize_on_pid_change(force: true) - + # Do not clean the metrics directory here - the supervisor script should + # have already taken care of that Gitlab::Metrics::Exporter::SidekiqExporter.instance.start end end diff --git a/config/initializers/devise_dynamic_password_length_validation.rb b/config/initializers/devise_dynamic_password_length_validation.rb new file mode 100644 index 00000000000..03d613da929 --- /dev/null +++ b/config/initializers/devise_dynamic_password_length_validation.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +# Discard the default Devise length validation from the `User` model. + +# This needs to be discarded because the length validation provided by Devise does not +# support dynamically checking for min and max lengths. + +# A new length validation has been added to the User model instead, to keep supporting +# dynamic password length validations, like: + +# validates :password, length: { maximum: proc { password_length.max }, minimum: proc { password_length.min } }, allow_blank: true + +def length_validator_supports_dynamic_length_checks?(validator) + validator.options[:minimum].is_a?(Proc) && + validator.options[:maximum].is_a?(Proc) +end + +# Get the in-built Devise validator on password length. +password_length_validator = User.validators_on(:password).find do |validator| + validator.kind == :length +end + +# This initializer can be removed as soon as https://github.com/plataformatec/devise/pull/5166 +# is merged into Devise. + +# TODO: Update Devise. Issue: https://gitlab.com/gitlab-org/gitlab/issues/118450 +if length_validator_supports_dynamic_length_checks?(password_length_validator) + raise "Devise now supports dynamic length checks, please remove the monkey patch in #{__FILE__}" +else + # discard the in-built length validator by always returning true + def password_length_validator.validate(*_) + true + end + + # add a custom password length validator with support for dynamic length validation. + User.class_eval do + validates :password, length: { maximum: proc { password_length.max }, minimum: proc { password_length.min } }, allow_blank: true + end +end diff --git a/config/initializers/direct_upload_support.rb b/config/initializers/direct_upload_support.rb index 32fc8c8bc69..0fc6e82207e 100644 --- a/config/initializers/direct_upload_support.rb +++ b/config/initializers/direct_upload_support.rb @@ -3,17 +3,35 @@ class DirectUploadsValidator ValidationError = Class.new(StandardError) - def verify!(object_store) + def verify!(uploader_type, object_store) return unless object_store.enabled return unless object_store.direct_upload - return if SUPPORTED_DIRECT_UPLOAD_PROVIDERS.include?(object_store.connection&.provider.to_s) - raise ValidationError, "Only #{SUPPORTED_DIRECT_UPLOAD_PROVIDERS.join(',')} are supported as a object storage provider when 'direct_upload' is used" + raise ValidationError, "Object storage is configured for '#{uploader_type}', but the 'connection' section is missing" unless object_store.key?('connection') + + provider = object_store.connection&.provider.to_s + + raise ValidationError, "No provider configured for '#{uploader_type}'. #{supported_provider_text}" if provider.blank? + + return if SUPPORTED_DIRECT_UPLOAD_PROVIDERS.include?(provider) + + raise ValidationError, "Object storage provider '#{provider}' is not supported " \ + "when 'direct_upload' is used for '#{uploader_type}'. #{supported_provider_text}" + end + + def supported_provider_text + "Only #{SUPPORTED_DIRECT_UPLOAD_PROVIDERS.join(', ')} are supported." end end DirectUploadsValidator.new.tap do |validator| - [Gitlab.config.artifacts, Gitlab.config.uploads, Gitlab.config.lfs].each do |uploader| - validator.verify!(uploader.object_store) + CONFIGS = { + artifacts: Gitlab.config.artifacts, + uploads: Gitlab.config.uploads, + lfs: Gitlab.config.lfs + }.freeze + + CONFIGS.each do |uploader_type, uploader| + validator.verify!(uploader_type, uploader.object_store) end end diff --git a/config/initializers/elastic_client_setup.rb b/config/initializers/elastic_client_setup.rb index a1abb29838b..f38b606b3a8 100644 --- a/config/initializers/elastic_client_setup.rb +++ b/config/initializers/elastic_client_setup.rb @@ -7,6 +7,17 @@ require 'gitlab/current_settings' Gitlab.ee do require 'elasticsearch/model' + ### Monkey patches + + Elasticsearch::Model::Response::Records.prepend GemExtensions::Elasticsearch::Model::Response::Records + Elasticsearch::Model::Adapter::Multiple::Records.prepend GemExtensions::Elasticsearch::Model::Adapter::Multiple::Records + Elasticsearch::Model::Indexing::InstanceMethods.prepend GemExtensions::Elasticsearch::Model::Indexing::InstanceMethods + Elasticsearch::Model::Adapter::ActiveRecord::Importing.prepend GemExtensions::Elasticsearch::Model::Adapter::ActiveRecord::Importing + Elasticsearch::Model::Client::InstanceMethods.prepend GemExtensions::Elasticsearch::Model::Client + Elasticsearch::Model::Client::ClassMethods.prepend GemExtensions::Elasticsearch::Model::Client + Elasticsearch::Model::ClassMethods.prepend GemExtensions::Elasticsearch::Model::Client + Elasticsearch::Model.singleton_class.prepend GemExtensions::Elasticsearch::Model::Client + ### Modified from elasticsearch-model/lib/elasticsearch/model.rb [ @@ -32,15 +43,4 @@ Gitlab.ee do target.respond_to?(:as_indexed_json) ? target.__send__(:as_indexed_json, options) : super end CODE - - ### Monkey patches - - Elasticsearch::Model::Response::Records.prepend GemExtensions::Elasticsearch::Model::Response::Records - Elasticsearch::Model::Adapter::Multiple::Records.prepend GemExtensions::Elasticsearch::Model::Adapter::Multiple::Records - Elasticsearch::Model::Indexing::InstanceMethods.prepend GemExtensions::Elasticsearch::Model::Indexing::InstanceMethods - Elasticsearch::Model::Adapter::ActiveRecord::Importing.prepend GemExtensions::Elasticsearch::Model::Adapter::ActiveRecord::Importing - Elasticsearch::Model::Client::InstanceMethods.prepend GemExtensions::Elasticsearch::Model::Client - Elasticsearch::Model::Client::ClassMethods.prepend GemExtensions::Elasticsearch::Model::Client - Elasticsearch::Model::ClassMethods.prepend GemExtensions::Elasticsearch::Model::Client - Elasticsearch::Model.singleton_class.prepend GemExtensions::Elasticsearch::Model::Client end diff --git a/config/initializers/forbid_sidekiq_in_transactions.rb b/config/initializers/forbid_sidekiq_in_transactions.rb index bb190af60b5..9bade443aae 100644 --- a/config/initializers/forbid_sidekiq_in_transactions.rb +++ b/config/initializers/forbid_sidekiq_in_transactions.rb @@ -29,7 +29,7 @@ module Sidekiq MSG rescue Sidekiq::Worker::EnqueueFromTransactionError => e ::Rails.logger.error(e.message) if ::Rails.env.production? - Gitlab::Sentry.track_exception(e) + Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e) end end diff --git a/config/initializers/hamlit.rb b/config/initializers/hamlit.rb index 51dbffeda05..b5bcae4bbfc 100644 --- a/config/initializers/hamlit.rb +++ b/config/initializers/hamlit.rb @@ -1,18 +1,4 @@ -module Hamlit - class TemplateHandler - def call(template) - Engine.new( - generator: Temple::Generators::RailsOutputBuffer, - attr_quote: '"' - ).call(template.source) - end - end -end - -ActionView::Template.register_template_handler( - :haml, - Hamlit::TemplateHandler.new -) +Hamlit::RailsTemplate.set_options(attr_quote: '"') Hamlit::Filters.remove_filter('coffee') Hamlit::Filters.remove_filter('coffeescript') diff --git a/config/initializers/rack_attack_git_basic_auth.rb b/config/initializers/rack_attack_git_basic_auth.rb deleted file mode 100644 index 71e5e2969ce..00000000000 --- a/config/initializers/rack_attack_git_basic_auth.rb +++ /dev/null @@ -1,14 +0,0 @@ -# Tell the Rack::Attack Rack middleware to maintain an IP blacklist. -# We update the blacklist in Gitlab::Auth::IpRateLimiter. -Rack::Attack.blocklist('Git HTTP Basic Auth') do |req| - rate_limiter = Gitlab::Auth::IpRateLimiter.new(req.ip) - - next false if !rate_limiter.enabled? || rate_limiter.trusted_ip? - - Rack::Attack::Allow2Ban.filter(req.ip, Gitlab.config.rack_attack.git_basic_auth) do - # This block only gets run if the IP was not already banned. - # Return false, meaning that we do not see anything wrong with the - # request at this time - false - end -end diff --git a/config/initializers/rack_attack_new.rb b/config/initializers/rack_attack_new.rb index 92a8bf79432..267d4c1eda9 100644 --- a/config/initializers/rack_attack_new.rb +++ b/config/initializers/rack_attack_new.rb @@ -1,11 +1,22 @@ +# Specs for this file can be found on: +# * spec/lib/gitlab/throttle_spec.rb +# * spec/requests/rack_attack_global_spec.rb module Gitlab::Throttle def self.settings Gitlab::CurrentSettings.current_application_settings end + # Returns true if we should use the Admin Area protected paths throttle def self.protected_paths_enabled? - !self.omnibus_protected_paths_present? && - self.settings.throttle_protected_paths_enabled? + return false if should_use_omnibus_protected_paths? + + self.settings.throttle_protected_paths_enabled? + end + + # To be removed in 13.0: https://gitlab.com/gitlab-org/gitlab/issues/29952 + def self.should_use_omnibus_protected_paths? + !Settings.rack_attack.admin_area_protected_paths_enabled && + self.omnibus_protected_paths_present? end def self.omnibus_protected_paths_present? @@ -102,11 +113,15 @@ class Rack::Attack class Request def unauthenticated? - !authenticated_user_id([:api, :rss, :ics]) + !(authenticated_user_id([:api, :rss, :ics]) || authenticated_runner_id) end def authenticated_user_id(request_formats) - Gitlab::Auth::RequestAuthenticator.new(self).user(request_formats)&.id + request_authenticator.user(request_formats)&.id + end + + def authenticated_runner_id + request_authenticator.runner&.id end def api_request? @@ -139,6 +154,10 @@ class Rack::Attack private + def request_authenticator + @request_authenticator ||= Gitlab::Auth::RequestAuthenticator.new(self) + end + def protected_paths Gitlab::CurrentSettings.current_application_settings.protected_paths end diff --git a/config/initializers/sentry.rb b/config/initializers/sentry.rb index 48daca3d254..a1eddd6a2c2 100644 --- a/config/initializers/sentry.rb +++ b/config/initializers/sentry.rb @@ -2,35 +2,4 @@ require 'gitlab/current_settings' -def configure_sentry - if Gitlab::Sentry.enabled? - Raven.configure do |config| - config.dsn = Gitlab.config.sentry.dsn - config.release = Gitlab.revision - config.current_environment = Gitlab.config.sentry.environment - - # Sanitize fields based on those sanitized from Rails. - config.sanitize_fields = Rails.application.config.filter_parameters.map(&:to_s) - # Sanitize authentication headers - config.sanitize_http_headers = %w[Authorization Private-Token] - config.tags = { program: Gitlab.process_name } - # Debugging for https://gitlab.com/gitlab-org/gitlab-foss/issues/57727 - config.before_send = lambda do |event, hint| - if ActiveModel::MissingAttributeError === hint[:exception] - columns_hash = ActiveRecord::Base - .connection - .schema_cache - .instance_variable_get(:@columns_hash) - .map { |k, v| [k, v.map(&:first)] } - .to_h - - event.extra.merge!(columns_hash) - end - - event - end - end - end -end - -configure_sentry if Rails.env.production? || Rails.env.development? +Gitlab::ErrorTracking.configure diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index b5d98399015..b4a1e0da41a 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -31,21 +31,17 @@ enable_json_logs = Gitlab.config.sidekiq.log_format == 'json' enable_sidekiq_memory_killer = ENV['SIDEKIQ_MEMORY_KILLER_MAX_RSS'].to_i.nonzero? use_sidekiq_daemon_memory_killer = ENV["SIDEKIQ_DAEMON_MEMORY_KILLER"].to_i.nonzero? use_sidekiq_legacy_memory_killer = !use_sidekiq_daemon_memory_killer +use_request_store = ENV.fetch('SIDEKIQ_REQUEST_STORE', 1).to_i.nonzero? Sidekiq.configure_server do |config| config.redis = queues_config_hash - config.server_middleware do |chain| - chain.add Gitlab::SidekiqMiddleware::Monitor - chain.add Gitlab::SidekiqMiddleware::Metrics if Settings.monitoring.sidekiq_exporter - chain.add Gitlab::SidekiqMiddleware::ArgumentsLogger if ENV['SIDEKIQ_LOG_ARGUMENTS'] && !enable_json_logs - chain.add Gitlab::SidekiqMiddleware::MemoryKiller if enable_sidekiq_memory_killer && use_sidekiq_legacy_memory_killer - chain.add Gitlab::SidekiqMiddleware::RequestStoreMiddleware unless ENV['SIDEKIQ_REQUEST_STORE'] == '0' - chain.add Gitlab::SidekiqMiddleware::BatchLoader - chain.add Gitlab::SidekiqMiddleware::CorrelationLogger - chain.add Gitlab::SidekiqMiddleware::InstrumentationLogger - chain.add Gitlab::SidekiqStatus::ServerMiddleware - end + config.server_middleware(&Gitlab::SidekiqMiddleware.server_configurator({ + metrics: Settings.monitoring.sidekiq_exporter, + arguments_logger: ENV['SIDEKIQ_LOG_ARGUMENTS'] && !enable_json_logs, + memory_killer: enable_sidekiq_memory_killer && use_sidekiq_legacy_memory_killer, + request_store: use_request_store + })) if enable_json_logs Sidekiq.logger.formatter = Gitlab::SidekiqLogging::JSONFormatter.new @@ -56,10 +52,7 @@ Sidekiq.configure_server do |config| config.error_handlers << Gitlab::SidekiqLogging::ExceptionHandler.new end - config.client_middleware do |chain| - chain.add Gitlab::SidekiqStatus::ClientMiddleware - chain.add Gitlab::SidekiqMiddleware::CorrelationInjector - end + config.client_middleware(&Gitlab::SidekiqMiddleware.client_configurator) config.on :startup do # Clear any connections that might have been obtained before starting @@ -125,8 +118,5 @@ end Sidekiq.configure_client do |config| config.redis = queues_config_hash - config.client_middleware do |chain| - chain.add Gitlab::SidekiqMiddleware::CorrelationInjector - chain.add Gitlab::SidekiqStatus::ClientMiddleware - end + config.client_middleware(&Gitlab::SidekiqMiddleware.client_configurator) end diff --git a/config/initializers/snowplow_tracker.rb b/config/initializers/snowplow_tracker.rb new file mode 100644 index 00000000000..3c730e03738 --- /dev/null +++ b/config/initializers/snowplow_tracker.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +# Gitlab.com uses Snowplow for identifying users and events. +# https://gitlab.com/gitlab-org/gitlab/issues/6329 +# +# SnowplowTracker write log into STDERR +# https://github.com/snowplow/snowplow-ruby-tracker/blob/39fcfa2be793f2e25e73087a9700abc93f43b5e8/lib/snowplow-tracker/emitters.rb#L23 +# `LOGGER = Logger.new(STDERR)` +# +# In puma.rb, if `stdout_redirect` specify stderr, Puma will overwrite STDERR in: +# https://github.com/puma/puma/blob/b41205f5cacbc2ad0060472bdce68ba636f42175/lib/puma/runner.rb#L134 +# `STDERR.reopen stderr, (append ? "a" : "w")` +# As a result, SnowplowTracker will log into Puma stderr, when Puma enabled. +# +# By default, SnowplowTracker uses default log formatter. +# When enable Puma, SnowplowTracker log is expected to be JSON format, as part of puma_stderr.log. +# Hence overwrite ::SnowplowTracker::LOGGER.formatter to JSON formatter + +if defined?(::Puma) && defined?(::SnowplowTracker::LOGGER) + ::SnowplowTracker::LOGGER.formatter = proc do |severity, datetime, progname, msg| + { severity: severity, timestamp: datetime.utc.iso8601(3), pid: $$, progname: progname, message: msg }.to_json << "\n" + end +end diff --git a/config/initializers/zz_metrics.rb b/config/initializers/zz_metrics.rb index bc28780cc77..5bbfb97277c 100644 --- a/config/initializers/zz_metrics.rb +++ b/config/initializers/zz_metrics.rb @@ -8,6 +8,8 @@ # # rubocop:disable Metrics/AbcSize def instrument_classes(instrumentation) + return if ENV['STATIC_VERIFICATION'] + instrumentation.instrument_instance_methods(Gitlab::Shell) instrumentation.instrument_methods(Gitlab::Git) @@ -88,8 +90,8 @@ def instrument_classes(instrumentation) instrumentation.instrument_instance_methods(Gitlab::Highlight) Gitlab.ee do - instrumentation.instrument_methods(Elasticsearch::Git::Repository) - instrumentation.instrument_instance_methods(Elasticsearch::Git::Repository) + instrumentation.instrument_instance_methods(Elastic::Latest::GitInstanceProxy) + instrumentation.instrument_instance_methods(Elastic::Latest::GitClassProxy) instrumentation.instrument_instance_methods(Search::GlobalService) instrumentation.instrument_instance_methods(Search::ProjectService) |