From cdcbeaccbec09fefe81b7b90badacf5308751ce9 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Thu, 23 Nov 2017 00:26:50 +0100 Subject: Move prometheus middle ware to prometheus initialized. --- Gemfile | 2 +- Gemfile.lock | 4 ++-- app/views/admin/application_settings/_form.html.haml | 8 ++++++++ config/initializers/7_prometheus_metrics.rb | 6 +++++- config/initializers/8_metrics.rb | 5 ----- ...prometheus_instrumentation_to_application_settings.rb | 16 ++++++++++++++++ lib/api/settings.rb | 3 +++ lib/gitlab/metrics/method_call.rb | 10 ++++++++-- 8 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 db/migrate/20171122211913_add_prometheus_instrumentation_to_application_settings.rb diff --git a/Gemfile b/Gemfile index af8b7287627..53820459a16 100644 --- a/Gemfile +++ b/Gemfile @@ -283,7 +283,7 @@ group :metrics do gem 'influxdb', '~> 0.2', require: false # Prometheus - gem 'prometheus-client-mmap', '~> 0.7.0.beta33' + gem 'prometheus-client-mmap', '~> 0.7.0.beta36' gem 'raindrops', '~> 0.18' end diff --git a/Gemfile.lock b/Gemfile.lock index 3d18ee1ba44..69d20bdbbb3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -625,7 +625,7 @@ GEM parser unparser procto (0.0.3) - prometheus-client-mmap (0.7.0.beta33) + prometheus-client-mmap (0.7.0.beta36) mmap2 (~> 2.2, >= 2.2.9) pry (0.10.4) coderay (~> 1.1.0) @@ -1111,7 +1111,7 @@ DEPENDENCIES peek-sidekiq (~> 1.0.3) pg (~> 0.18.2) premailer-rails (~> 1.9.7) - prometheus-client-mmap (~> 0.7.0.beta33) + prometheus-client-mmap (~> 0.7.0.beta36) pry-byebug (~> 3.4.1) pry-rails (~> 0.3.4) rack-attack (~> 4.4.1) diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 12658dddc06..0037d547855 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -361,6 +361,14 @@ %code prometheus_multiproc_dir does not exist or is not pointing to a valid directory. = link_to icon('question-circle'), help_page_path('administration/monitoring/prometheus/gitlab_metrics', anchor: 'metrics-shared-directory') + .form-group + .col-sm-offset-2.col-sm-10 + .checkbox + = f.label :prometheus_metrics_method_instrumentation_enabled do + = f.check_box :prometheus_metrics_method_instrumentation_enabled + Track method execution time. + .help-block + Provides method execution metrics. Can adversely impact GitLab's responsiveness. %fieldset %legend Profiling - Performance Bar diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb index e8f33593fe0..a9138db585f 100644 --- a/config/initializers/7_prometheus_metrics.rb +++ b/config/initializers/7_prometheus_metrics.rb @@ -13,7 +13,6 @@ Prometheus::Client.configure do |config| config.pid_provider = -> do wid = Prometheus::Client::Support::Unicorn.worker_id - wid = Process.pid if wid.nil? if wid.nil? "process_pid_#{Process.pid}" else @@ -22,6 +21,11 @@ Prometheus::Client.configure do |config| end end +Gitlab::Application.configure do |config| + # 0 should be Sentry to catch errors in this middleware + config.middleware.insert(1, Gitlab::Metrics::RequestsRackMiddleware) +end + Sidekiq.configure_server do |config| config.on(:startup) do Gitlab::Metrics::SidekiqMetricsExporter.instance.start diff --git a/config/initializers/8_metrics.rb b/config/initializers/8_metrics.rb index 7ef594836d6..45b39b2a38d 100644 --- a/config/initializers/8_metrics.rb +++ b/config/initializers/8_metrics.rb @@ -118,11 +118,6 @@ def instrument_classes(instrumentation) end # rubocop:enable Metrics/AbcSize -Gitlab::Application.configure do |config| - # 0 should be Sentry to catch errors in this middleware - config.middleware.insert(1, Gitlab::Metrics::RequestsRackMiddleware) -end - if Gitlab::Metrics.enabled? require 'pathname' require 'influxdb' diff --git a/db/migrate/20171122211913_add_prometheus_instrumentation_to_application_settings.rb b/db/migrate/20171122211913_add_prometheus_instrumentation_to_application_settings.rb new file mode 100644 index 00000000000..9a07d1b281c --- /dev/null +++ b/db/migrate/20171122211913_add_prometheus_instrumentation_to_application_settings.rb @@ -0,0 +1,16 @@ +class AddPrometheusInstrumentationToApplicationSettings < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + disable_ddl_transaction! + + def up + add_column_with_default(:application_settings, :prometheus_metrics_method_instrumentation_enabled, :boolean, + default: false, allow_null: false) + end + + def down + remove_column(:application_settings, :prometheus_metrics_method_instrumentation_enabled) + end +end + diff --git a/lib/api/settings.rb b/lib/api/settings.rb index 851b226e9e5..a43f8d0497c 100644 --- a/lib/api/settings.rb +++ b/lib/api/settings.rb @@ -66,6 +66,9 @@ module API optional :max_pages_size, type: Integer, desc: 'Maximum size of pages in MB' optional :container_registry_token_expire_delay, type: Integer, desc: 'Authorization token duration (minutes)' optional :prometheus_metrics_enabled, type: Boolean, desc: 'Enable Prometheus metrics' + given prometheus_metrics_enabled: ->(val) { val } do + requires :prometheus_metrics_method_instrumentation_enabled, type: Boolean, desc: 'Enable method call instrumentation' + end optional :metrics_enabled, type: Boolean, desc: 'Enable the InfluxDB metrics' given metrics_enabled: ->(val) { val } do requires :metrics_host, type: String, desc: 'The InfluxDB host' diff --git a/lib/gitlab/metrics/method_call.rb b/lib/gitlab/metrics/method_call.rb index 90235095306..5177d953795 100644 --- a/lib/gitlab/metrics/method_call.rb +++ b/lib/gitlab/metrics/method_call.rb @@ -59,8 +59,10 @@ module Gitlab @cpu_time += cpu_time @call_count += 1 - self.class.call_real_duration_histogram.observe(@transaction.labels.merge(labels), real_time / 1000.0) - self.class.call_cpu_duration_histogram.observe(@transaction.labels.merge(labels), cpu_time / 1000.0) + if prometheus_enabled? + self.class.call_real_duration_histogram.observe(@transaction.labels.merge(labels), real_time / 1000.0) + self.class.call_cpu_duration_histogram.observe(@transaction.labels.merge(labels), cpu_time / 1000.0) + end retval end @@ -83,6 +85,10 @@ module Gitlab def above_threshold? real_time >= Metrics.method_call_threshold end + + def prometheus_enabled? + @prometheus_enabled ||= current_application_settings(:prometheus_metrics_method_instrumentation_enabled) + end end end end -- cgit v1.2.1