summaryrefslogtreecommitdiff
path: root/config
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-12-28 13:42:15 +0000
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-12-28 13:42:15 +0000
commit540eb0a9affef14329418b32be0dcd60f2b66e29 (patch)
treef2562ea6c206c46aedc534497a55fe93f55e97cd /config
parentc08cb923ec4af9cfb70031259051d5c0c70cad21 (diff)
parent1be5668ae0e663015d384ea7d8b404f9eeb5b478 (diff)
downloadgitlab-ce-540eb0a9affef14329418b32be0dcd60f2b66e29.tar.gz
Merge branch 'influxdb' into 'master'
Storing of application metrics in InfluxDB This adds support for tracking metrics in InfluxDB, which in turn can be visualized using Grafana. For more information see #2936. See merge request !2042
Diffstat (limited to 'config')
-rw-r--r--config/gitlab.yml.example21
-rw-r--r--config/initializers/metrics.rb57
2 files changed, 78 insertions, 0 deletions
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index 79fc7423b31..da6d4005da6 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -449,9 +449,26 @@ production: &base
#
# Ban an IP for one hour (3600s) after too many auth attempts
# bantime: 3600
+ metrics:
+ host: localhost
+ enabled: false
+ # The name of the InfluxDB database to store metrics in.
+ database: gitlab
+ # Credentials to use for logging in to InfluxDB.
+ # username:
+ # password:
+ # The amount of InfluxDB connections to open.
+ # pool_size: 16
+ # The timeout of a connection in seconds.
+ # timeout: 10
+ # The minimum amount of milliseconds a method call has to take before it's
+ # tracked. Defaults to 10.
+ # method_call_threshold: 10
development:
<<: *base
+ metrics:
+ enabled: false
test:
<<: *base
@@ -494,6 +511,10 @@ test:
user_filter: ''
group_base: 'ou=groups,dc=example,dc=com'
admin_group: ''
+ metrics:
+ enabled: false
staging:
<<: *base
+ metrics:
+ enabled: false
diff --git a/config/initializers/metrics.rb b/config/initializers/metrics.rb
new file mode 100644
index 00000000000..a47d2bf59a6
--- /dev/null
+++ b/config/initializers/metrics.rb
@@ -0,0 +1,57 @@
+if Gitlab::Metrics.enabled?
+ require 'influxdb'
+ require 'socket'
+ require 'connection_pool'
+ require 'method_source'
+
+ # These are manually require'd so the classes are registered properly with
+ # ActiveSupport.
+ require 'gitlab/metrics/subscribers/action_view'
+ require 'gitlab/metrics/subscribers/active_record'
+
+ Gitlab::Application.configure do |config|
+ config.middleware.use(Gitlab::Metrics::RackMiddleware)
+ end
+
+ Sidekiq.configure_server do |config|
+ config.server_middleware do |chain|
+ chain.add Gitlab::Metrics::SidekiqMiddleware
+ end
+ end
+
+ # This instruments all methods residing in app/models that (appear to) use any
+ # of the ActiveRecord methods. This has to take place _after_ initializing as
+ # for some unknown reason calling eager_load! earlier breaks Devise.
+ Gitlab::Application.config.after_initialize do
+ Rails.application.eager_load!
+
+ models = Rails.root.join('app', 'models').to_s
+
+ regex = Regexp.union(
+ ActiveRecord::Querying.public_instance_methods(false).map(&:to_s)
+ )
+
+ Gitlab::Metrics::Instrumentation.
+ instrument_class_hierarchy(ActiveRecord::Base) do |_, method|
+ loc = method.source_location
+
+ loc && loc[0].start_with?(models) && method.source =~ regex
+ end
+ end
+
+ Gitlab::Metrics::Instrumentation.configure do |config|
+ config.instrument_instance_methods(Gitlab::Shell)
+
+ config.instrument_methods(Gitlab::Git)
+
+ Gitlab::Git.constants.each do |name|
+ const = Gitlab::Git.const_get(name)
+
+ config.instrument_methods(const) if const.is_a?(Module)
+ end
+ end
+
+ GC::Profiler.enable
+
+ Gitlab::Metrics::Sampler.new.start
+end