diff options
Diffstat (limited to 'lib/gitlab/metrics.rb')
-rw-r--r-- | lib/gitlab/metrics.rb | 93 |
1 files changed, 91 insertions, 2 deletions
diff --git a/lib/gitlab/metrics.rb b/lib/gitlab/metrics.rb index d759ae24051..5fed3d38d7c 100644 --- a/lib/gitlab/metrics.rb +++ b/lib/gitlab/metrics.rb @@ -2,17 +2,106 @@ module Gitlab module Metrics - include Gitlab::Metrics::InfluxDb include Gitlab::Metrics::Prometheus + include Gitlab::Metrics::Methods + + EXECUTION_MEASUREMENT_BUCKETS = [0.001, 0.01, 0.1, 1].freeze @error = false def self.enabled? - influx_metrics_enabled? || prometheus_metrics_enabled? + prometheus_metrics_enabled? end def self.error? @error end + + # Tracks an event. + # + # See `Gitlab::Metrics::Transaction#add_event` for more details. + def self.add_event(*args) + current_transaction&.add_event(*args) + end + + # Allow access from other metrics related middlewares + def self.current_transaction + Transaction.current + end + + # Returns the prefix to use for the name of a series. + def self.series_prefix + @series_prefix ||= Gitlab::Runtime.sidekiq? ? 'sidekiq_' : 'rails_' + end + + def self.settings + @settings ||= begin + current_settings = Gitlab::CurrentSettings.current_application_settings + + { + + method_call_threshold: current_settings[:metrics_method_call_threshold] + + } + end + end + + def self.method_call_threshold + # This is memoized since this method is called for every instrumented + # method. Loading data from an external cache on every method call slows + # things down too much. + # in milliseconds + @method_call_threshold ||= settings[:method_call_threshold] + end + + # Measures the execution time of a block. + # + # Example: + # + # Gitlab::Metrics.measure(:find_by_username_duration) do + # UserFinder.new(some_username).find_by_username + # end + # + # name - The name of the field to store the execution time in. + # + # Returns the value yielded by the supplied block. + def self.measure(name) + trans = current_transaction + + return yield unless trans + + real_start = System.monotonic_time + cpu_start = System.cpu_time + + retval = yield + + cpu_stop = System.cpu_time + real_stop = System.monotonic_time + + real_time = (real_stop - real_start) + cpu_time = cpu_stop - cpu_start + + real_duration_seconds = fetch_histogram("gitlab_#{name}_real_duration_seconds".to_sym) do + docstring "Measure #{name}" + base_labels Transaction::BASE_LABELS + buckets EXECUTION_MEASUREMENT_BUCKETS + end + + real_duration_seconds.observe(trans.labels, real_time) + + cpu_duration_seconds = fetch_histogram("gitlab_#{name}_cpu_duration_seconds".to_sym) do + docstring "Measure #{name}" + base_labels Transaction::BASE_LABELS + buckets EXECUTION_MEASUREMENT_BUCKETS + with_feature "prometheus_metrics_measure_#{name}_cpu_duration" + end + cpu_duration_seconds.observe(trans.labels, cpu_time) + + trans.increment("#{name}_real_time", real_time.in_milliseconds, false) + trans.increment("#{name}_cpu_time", cpu_time.in_milliseconds, false) + trans.increment("#{name}_call_count", 1, false) + + retval + end end end |