diff options
author | Kamil Trzciński <ayufan@ayufan.eu> | 2019-07-11 10:20:35 +0200 |
---|---|---|
committer | Kamil Trzciński <ayufan@ayufan.eu> | 2019-07-11 11:06:01 +0200 |
commit | bf997d79d1eec1415671028e0c51da62e6819212 (patch) | |
tree | 53bb545de6629c92ba3872869acc2dec29a2a145 | |
parent | 62dbf56b0b78b01a391447c9fc40fddcb3bba579 (diff) | |
download | gitlab-ce-web-metrics-exporter.tar.gz |
Add WebMetricsExporterweb-metrics-exporter
-rw-r--r-- | config/gitlab.yml.example | 7 | ||||
-rw-r--r-- | config/initializers/1_settings.rb | 8 | ||||
-rw-r--r-- | config/initializers/7_prometheus_metrics.rb | 8 | ||||
-rw-r--r-- | lib/gitlab/daemon.rb | 1 | ||||
-rw-r--r-- | lib/gitlab/metrics/metrics_exporter.rb | 51 | ||||
-rw-r--r-- | lib/gitlab/metrics/sidekiq_metrics_exporter.rb | 38 | ||||
-rw-r--r-- | lib/gitlab/metrics/web_metrics_exporter.rb | 42 | ||||
-rw-r--r-- | spec/lib/gitlab/metrics/metrics_exporter_spec.rb (renamed from spec/lib/gitlab/metrics/sidekiq_metrics_exporter_spec.rb) | 16 |
8 files changed, 86 insertions, 85 deletions
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index 334c241bcaa..f03fe61ead4 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -952,6 +952,13 @@ production: &base # address: localhost # port: 3807 + # Web exporter is webserver built in to Unicorn/Puma to expose Prometheus metrics + # It runs alongside the `/metrics` endpoints to ease the publish of metrics + web_exporter: + # enabled: true + # address: localhost + # port: 3808 + # # 5. Extra customization # ========================== diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 1b447744032..091b130cfa3 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -643,14 +643,14 @@ Settings.monitoring['ip_whitelist'] ||= ['127.0.0.1/8'] Settings.monitoring['unicorn_sampler_interval'] ||= 10 Settings.monitoring['puma_sampler_interval'] ||= 5 Settings.monitoring['ruby_sampler_interval'] ||= 60 -Settings.monitoring['web_exporter'] ||= Settingslogic.new({}) -Settings.monitoring.web_exporter['enabled'] ||= true -Settings.monitoring.web_exporter['address'] ||= '0.0.0.0' -Settings.monitoring.web_exporter['port'] ||= 3808 Settings.monitoring['sidekiq_exporter'] ||= Settingslogic.new({}) Settings.monitoring.sidekiq_exporter['enabled'] ||= false Settings.monitoring.sidekiq_exporter['address'] ||= 'localhost' Settings.monitoring.sidekiq_exporter['port'] ||= 3807 +Settings.monitoring['web_exporter'] ||= Settingslogic.new({}) +Settings.monitoring.web_exporter['enabled'] ||= false +Settings.monitoring.web_exporter['address'] ||= 'localhost' +Settings.monitoring.web_exporter['port'] ||= 3808 # # Testing settings diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb index 13dcc585fcb..b8507f89c44 100644 --- a/config/initializers/7_prometheus_metrics.rb +++ b/config/initializers/7_prometheus_metrics.rb @@ -67,11 +67,15 @@ end Gitlab::Cluster::LifecycleEvents.on_master_start do cleanup_prometheus_multiproc_dir - Gitlab::Metrics::WebMetricsExporter.instance.start + if defined?(::Unicorn) || defined?(::Puma) + Gitlab::Metrics::WebMetricsExporter.instance.start + end end Gitlab::Cluster::LifecycleEvents.on_master_restart do cleanup_prometheus_multiproc_dir - Gitlab::Metrics::WebMetricsExporter.instance.start + if defined?(::Unicorn) || defined?(::Puma) + Gitlab::Metrics::WebMetricsExporter.instance.start + end end diff --git a/lib/gitlab/daemon.rb b/lib/gitlab/daemon.rb index 6d5fc4219fb..52784966c03 100644 --- a/lib/gitlab/daemon.rb +++ b/lib/gitlab/daemon.rb @@ -55,6 +55,7 @@ module Gitlab private def start_working + puts "FAILURE: #{self.class}" raise NotImplementedError end diff --git a/lib/gitlab/metrics/metrics_exporter.rb b/lib/gitlab/metrics/metrics_exporter.rb new file mode 100644 index 00000000000..2598e5225f8 --- /dev/null +++ b/lib/gitlab/metrics/metrics_exporter.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require 'webrick' +require 'prometheus/client/rack/exporter' + +module Gitlab + module Metrics + class MetricsExporter < Daemon + def enabled? + ::Gitlab::Metrics.metrics_folder_present? && settings.enabled + end + + def settings + throw NotImplementedError + end + + def log_filename + throw NotImplementedError + end + + private + + attr_reader :server + + def start_working + logger = WEBrick::Log.new(log_filename) + access_log = [ + [logger, WEBrick::AccessLog::COMBINED_LOG_FORMAT] + ] + + @server = ::WEBrick::HTTPServer.new(Port: settings.port, BindAddress: settings.address, + Logger: logger, AccessLog: access_log) + server.mount "/", Rack::Handler::WEBrick, rack_app + server.start + end + + def stop_working + server.shutdown if server + @server = nil + end + + def rack_app + Rack::Builder.app do + use Rack::Deflater + use ::Prometheus::Client::Rack::Exporter + run -> (env) { [404, {}, ['']] } + end + end + end + end +end diff --git a/lib/gitlab/metrics/sidekiq_metrics_exporter.rb b/lib/gitlab/metrics/sidekiq_metrics_exporter.rb index 71a5406815f..898cb5a483c 100644 --- a/lib/gitlab/metrics/sidekiq_metrics_exporter.rb +++ b/lib/gitlab/metrics/sidekiq_metrics_exporter.rb @@ -1,48 +1,14 @@ -# frozen_string_literal: true - -require 'webrick' -require 'prometheus/client/rack/exporter' - module Gitlab module Metrics class SidekiqMetricsExporter < Daemon LOG_FILENAME = File.join(Rails.root, 'log', 'sidekiq_exporter.log') - def enabled? - ::Gitlab::Metrics.metrics_folder_present? && settings.enabled - end - def settings Settings.monitoring.sidekiq_exporter end - private - - attr_reader :server - - def start_working - logger = WEBrick::Log.new(LOG_FILENAME) - access_log = [ - [logger, WEBrick::AccessLog::COMBINED_LOG_FORMAT] - ] - - @server = ::WEBrick::HTTPServer.new(Port: settings.port, BindAddress: settings.address, - Logger: logger, AccessLog: access_log) - server.mount "/", Rack::Handler::WEBrick, rack_app - server.start - end - - def stop_working - server.shutdown if server - @server = nil - end - - def rack_app - Rack::Builder.app do - use Rack::Deflater - use ::Prometheus::Client::Rack::Exporter - run -> (env) { [404, {}, ['']] } - end + def log_filename + LOG_FILENAME end end end diff --git a/lib/gitlab/metrics/web_metrics_exporter.rb b/lib/gitlab/metrics/web_metrics_exporter.rb index 328bd07abda..275734a351e 100644 --- a/lib/gitlab/metrics/web_metrics_exporter.rb +++ b/lib/gitlab/metrics/web_metrics_exporter.rb @@ -1,48 +1,14 @@ -# frozen_string_literal: true - -require 'webrick' -require 'prometheus/client/rack/exporter' - module Gitlab module Metrics - class WebMetricsExporter < Daemon - LOG_FILENAME = File.join(Rails.root, 'log', 'sidekiq_exporter.log') - - def enabled? - ::Gitlab::Metrics.metrics_folder_present? && settings.enabled - end + class WebMetricsExporter < MetricsExporter + LOG_FILENAME = File.join(Rails.root, 'log', 'web_exporter.log') def settings Settings.monitoring.web_exporter end - private - - attr_reader :server - - def start_working - logger = WEBrick::Log.new(LOG_FILENAME) - access_log = [ - [logger, WEBrick::AccessLog::COMBINED_LOG_FORMAT] - ] - - @server = ::WEBrick::HTTPServer.new(Port: settings.port, BindAddress: settings.address, - Logger: logger, AccessLog: access_log) - server.mount "/", Rack::Handler::WEBrick, rack_app - server.start - end - - def stop_working - server.shutdown if server - @server = nil - end - - def rack_app - Rack::Builder.app do - use Rack::Deflater - use ::Prometheus::Client::Rack::Exporter - run -> (env) { [404, {}, ['']] } - end + def log_filename + LOG_FILENAME end end end diff --git a/spec/lib/gitlab/metrics/sidekiq_metrics_exporter_spec.rb b/spec/lib/gitlab/metrics/metrics_exporter_spec.rb index 61eb059a731..b03f918afaf 100644 --- a/spec/lib/gitlab/metrics/sidekiq_metrics_exporter_spec.rb +++ b/spec/lib/gitlab/metrics/metrics_exporter_spec.rb @@ -1,19 +1,25 @@ require 'spec_helper' -describe Gitlab::Metrics::SidekiqMetricsExporter do +describe Gitlab::Metrics::MetricsExporter do let(:exporter) { described_class.new } let(:server) { double('server') } + let(:log_filename) { File.join(Rails.root, 'log', 'sidekiq_exporter.log') } + let(:settings) { double('settings') } before do allow(::WEBrick::HTTPServer).to receive(:new).and_return(server) allow(server).to receive(:mount) allow(server).to receive(:start) allow(server).to receive(:shutdown) + allow_any_instance_of(described_class).to receive(:log_filename).and_return(log_filename) + allow_any_instance_of(described_class).to receive(:settings).and_return(settings) end describe 'when exporter is enabled' do before do - allow(Settings.monitoring.sidekiq_exporter).to receive(:enabled).and_return(true) + allow(settings).to receive(:enabled).and_return(true) + allow(settings).to receive(:port).and_return(3707) + allow(settings).to receive(:address).and_return('localhost') end describe 'when exporter is stopped' do @@ -29,8 +35,8 @@ describe Gitlab::Metrics::SidekiqMetricsExporter do let(:address) { 'sidekiq_exporter_address' } before do - allow(Settings.monitoring.sidekiq_exporter).to receive(:port).and_return(port) - allow(Settings.monitoring.sidekiq_exporter).to receive(:address).and_return(address) + allow(settings).to receive(:port).and_return(port) + allow(settings).to receive(:address).and_return(address) end it 'starts server with port and address from settings' do @@ -80,7 +86,7 @@ describe Gitlab::Metrics::SidekiqMetricsExporter do describe 'when exporter is disabled' do before do - allow(Settings.monitoring.sidekiq_exporter).to receive(:enabled).and_return(false) + allow(settings).to receive(:enabled).and_return(false) end describe '#start' do |