From 2c3d52161af2f170bdb644b96b6ffe5da0c1df10 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20Chojnacki?= <pawel@chojnacki.ws>
Date: Wed, 19 Jul 2017 08:54:39 +0000
Subject: [PATCH] Update Prometheus gem to version that explicitly calls
 `munmap`

---
 Gemfile                                     |  2 +-
 Gemfile.lock                                |  4 ++--
 app/services/metrics_service.rb             |  2 +-
 config/boot.rb                              |  5 -----
 config/initializers/7_prometheus_metrics.rb | 12 ++++++++++++
 lib/gitlab/metrics/prometheus.rb            |  8 +++++---
 spec/controllers/metrics_controller_spec.rb |  2 +-
 spec/spec_helper.rb                         |  1 -
 8 files changed, 22 insertions(+), 14 deletions(-)
 create mode 100644 config/initializers/7_prometheus_metrics.rb

diff --git a/Gemfile b/Gemfile
index b9c37e2b3fa..0d6b38897ef 100644
--- a/Gemfile
+++ b/Gemfile
@@ -281,7 +281,7 @@ group :metrics do
   gem 'influxdb', '~> 0.2', require: false
 
   # Prometheus
-  gem 'prometheus-client-mmap', '~>0.7.0.beta5'
+  gem 'prometheus-client-mmap', '~>0.7.0.beta9'
   gem 'raindrops', '~> 0.18'
 end
 
diff --git a/Gemfile.lock b/Gemfile.lock
index 63eb0712ef3..69e4c4416ba 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -592,7 +592,7 @@ GEM
     premailer-rails (1.9.7)
       actionmailer (>= 3, < 6)
       premailer (~> 1.7, >= 1.7.9)
-    prometheus-client-mmap (0.7.0.beta8)
+    prometheus-client-mmap (0.7.0.beta9)
       mmap2 (~> 2.2, >= 2.2.7)
     pry (0.10.4)
       coderay (~> 1.1.0)
@@ -1042,7 +1042,7 @@ DEPENDENCIES
   pg (~> 0.18.2)
   poltergeist (~> 1.9.0)
   premailer-rails (~> 1.9.7)
-  prometheus-client-mmap (~> 0.7.0.beta5)
+  prometheus-client-mmap (~> 0.7.0.beta9)
   pry-byebug (~> 3.4.1)
   pry-rails (~> 0.3.4)
   rack-attack (~> 4.4.1)
diff --git a/app/services/metrics_service.rb b/app/services/metrics_service.rb
index c92f070601c..a02eee4961b 100644
--- a/app/services/metrics_service.rb
+++ b/app/services/metrics_service.rb
@@ -31,6 +31,6 @@ class MetricsService
   end
 
   def multiprocess_metrics_path
-    @multiprocess_metrics_path ||= Rails.root.join(ENV['prometheus_multiproc_dir']).freeze
+    ::Prometheus::Client.configuration.multiprocess_files_dir
   end
 end
diff --git a/config/boot.rb b/config/boot.rb
index 2d01092acd5..f2830ae3166 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -4,8 +4,3 @@ require 'rubygems'
 ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
 
 require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
-
-# set default directory for multiproces metrics gathering
-if ENV['RAILS_ENV'] == 'development' || ENV['RAILS_ENV'] == 'test'
-  ENV['prometheus_multiproc_dir'] ||= 'tmp/prometheus_multiproc_dir'
-end
diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb
new file mode 100644
index 00000000000..987324a86c9
--- /dev/null
+++ b/config/initializers/7_prometheus_metrics.rb
@@ -0,0 +1,12 @@
+require 'prometheus/client'
+
+Prometheus::Client.configure do |config|
+  config.logger = Rails.logger
+
+  config.initial_mmap_file_size = 4 * 1024
+  config.multiprocess_files_dir = ENV['prometheus_multiproc_dir']
+
+  if Rails.env.development? && Rails.env.test?
+    config.multiprocess_files_dir ||= Rails.root.join('tmp/prometheus_multiproc_dir')
+  end
+end
diff --git a/lib/gitlab/metrics/prometheus.rb b/lib/gitlab/metrics/prometheus.rb
index fb7bbc7cfc7..460dab47276 100644
--- a/lib/gitlab/metrics/prometheus.rb
+++ b/lib/gitlab/metrics/prometheus.rb
@@ -6,9 +6,11 @@ module Gitlab
       include Gitlab::CurrentSettings
 
       def metrics_folder_present?
-        ENV.has_key?('prometheus_multiproc_dir') &&
-          ::Dir.exist?(ENV['prometheus_multiproc_dir']) &&
-          ::File.writable?(ENV['prometheus_multiproc_dir'])
+        multiprocess_files_dir = ::Prometheus::Client.configuration.multiprocess_files_dir
+
+        multiprocess_files_dir &&
+          ::Dir.exist?(multiprocess_files_dir) &&
+          ::File.writable?(multiprocess_files_dir)
       end
 
       def prometheus_metrics_enabled?
diff --git a/spec/controllers/metrics_controller_spec.rb b/spec/controllers/metrics_controller_spec.rb
index 8964d89b438..7b0976e3e67 100644
--- a/spec/controllers/metrics_controller_spec.rb
+++ b/spec/controllers/metrics_controller_spec.rb
@@ -12,7 +12,7 @@ describe MetricsController do
 
   before do
     stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
-    stub_env('prometheus_multiproc_dir', metrics_multiproc_dir)
+    allow(Prometheus::Client.configuration).to receive(:multiprocess_files_dir).and_return(metrics_multiproc_dir)
     allow(Gitlab::Metrics).to receive(:prometheus_metrics_enabled?).and_return(true)
     allow(Settings.monitoring).to receive(:ip_whitelist).and_return([whitelisted_ip, whitelisted_ip_range])
   end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index b8ed1e18de0..5d5715b10ff 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -3,7 +3,6 @@ SimpleCovEnv.start!
 
 ENV["RAILS_ENV"] ||= 'test'
 ENV["IN_MEMORY_APPLICATION_SETTINGS"] = 'true'
-# ENV['prometheus_multiproc_dir'] = 'tmp/prometheus_multiproc_dir_test'
 
 require File.expand_path("../../config/environment", __FILE__)
 require 'rspec/rails'
-- 
GitLab