Module: Gitlab::Metrics

Includes:
Labkit
Defined in:
lib/gitlab/metrics.rb,
lib/gitlab/metrics/lfs.rb,
lib/gitlab/metrics/sli.rb,
lib/gitlab/metrics/delta.rb,
lib/gitlab/metrics/labkit.rb,
lib/gitlab/metrics/memory.rb,
lib/gitlab/metrics/system.rb,
lib/gitlab/metrics/methods.rb,
lib/gitlab/metrics/glql_slis.rb,
lib/gitlab/metrics/rails_slis.rb,
lib/gitlab/metrics/sli_config.rb,
lib/gitlab/metrics/environment.rb,
lib/gitlab/metrics/method_call.rb,
lib/gitlab/metrics/null_metric.rb,
lib/gitlab/metrics/transaction.rb,
lib/gitlab/metrics/sidekiq_slis.rb,
lib/gitlab/metrics/rack_middleware.rb,
lib/gitlab/metrics/runtime_limiter.rb,
lib/gitlab/metrics/web_transaction.rb,
lib/gitlab/metrics/subscribers/ldap.rb,
lib/gitlab/metrics/boot_time_tracker.rb,
lib/gitlab/metrics/global_search_slis.rb,
lib/gitlab/metrics/security_scan_slis.rb,
lib/gitlab/metrics/exporter/web_exporter.rb,
lib/gitlab/metrics/samplers/base_sampler.rb,
lib/gitlab/metrics/samplers/puma_sampler.rb,
lib/gitlab/metrics/samplers/ruby_sampler.rb,
lib/gitlab/metrics/background_transaction.rb,
lib/gitlab/metrics/exporter/base_exporter.rb,
lib/gitlab/metrics/methods/metric_options.rb,
lib/gitlab/metrics/loose_foreign_keys_slis.rb,
lib/gitlab/metrics/subscribers/action_view.rb,
lib/gitlab/metrics/subscribers/rack_attack.rb,
lib/gitlab/metrics/subscribers/rails_cache.rb,
lib/gitlab/metrics/requests_rack_middleware.rb,
lib/gitlab/metrics/samplers/threads_sampler.rb,
lib/gitlab/metrics/subscribers/action_cable.rb,
lib/gitlab/metrics/database_transaction_slis.rb,
lib/gitlab/metrics/exporter/sidekiq_exporter.rb,
lib/gitlab/metrics/samplers/database_sampler.rb,
lib/gitlab/metrics/subscribers/active_record.rb,
lib/gitlab/metrics/subscribers/external_http.rb,
lib/gitlab/metrics/subscribers/load_balancing.rb,
lib/gitlab/metrics/exporter/metrics_middleware.rb,
lib/gitlab/metrics/elasticsearch_rack_middleware.rb,
lib/gitlab/metrics/samplers/action_cable_sampler.rb,
lib/gitlab/metrics/exporter/gc_request_middleware.rb,
lib/gitlab/metrics/samplers/stat_activity_sampler.rb,
lib/gitlab/metrics/middleware/path_traversal_check.rb,
lib/gitlab/metrics/ci_deleted_object_processing_slis.rb,
lib/gitlab/metrics/samplers/concurrency_limit_sampler.rb

Defined Under Namespace

Modules: CiDeletedObjectProcessingSlis, DatabaseTransactionSlis, Environment, Exporter, GlobalSearchSlis, GlqlSlis, Labkit, Lfs, LooseForeignKeysSlis, Memory, Methods, Middleware, RailsSlis, Samplers, SecurityScanSlis, SidekiqSlis, Sli, SliConfig, Subscribers, System Classes: BackgroundTransaction, BootTimeTracker, Delta, ElasticsearchRackMiddleware, MethodCall, NullMetric, RackMiddleware, RequestsRackMiddleware, RuntimeLimiter, Transaction, WebTransaction

Constant Summary collapse

EXECUTION_MEASUREMENT_BUCKETS =
[0.001, 0.01, 0.1, 1].freeze

Class Method Summary collapse

Class Method Details

.add_event(*args) ⇒ Object

Tracks an event.

See ‘Gitlab::Metrics::Transaction#add_event` for more details.



20
21
22
# File 'lib/gitlab/metrics.rb', line 20

def self.add_event(*args)
  current_transaction&.add_event(*args)
end

.current_transactionObject

Allow access from other metrics related middlewares



25
26
27
# File 'lib/gitlab/metrics.rb', line 25

def self.current_transaction
  WebTransaction.current || BackgroundTransaction.current
end

.initialize_slis!Object



95
96
97
98
99
100
101
102
103
# File 'lib/gitlab/metrics.rb', line 95

def self.initialize_slis!
  preload_sli_modules!

  Gitlab::Metrics::SliConfig.enabled_slis.each do |sli|
    Gitlab::AppLogger.info "#{self}: enabling #{sli}, runtime=#{Gitlab::Runtime.safe_identify}"

    sli.initialize_slis!
  end
end

.measure(name) ⇒ Object

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.



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/gitlab/metrics.rb', line 65

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

  trans.observe("gitlab_#{name}_real_duration_seconds".to_sym, real_time) do
    docstring "Measure #{name}"
    buckets EXECUTION_MEASUREMENT_BUCKETS
  end

  trans.observe("gitlab_#{name}_cpu_duration_seconds".to_sym, cpu_time) do
    docstring "Measure #{name}"
    buckets EXECUTION_MEASUREMENT_BUCKETS
    with_feature "prometheus_metrics_measure_#{name}_cpu_duration"
  end

  retval
end

.method_call_thresholdObject



46
47
48
49
50
51
52
# File 'lib/gitlab/metrics.rb', line 46

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

.preload_sli_modules!Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/gitlab/metrics.rb', line 105

def self.preload_sli_modules!
  sli_paths = [
    Rails.root.join('lib/gitlab/metrics/*_slis.rb'),
    Rails.root.join('ee/lib/gitlab/metrics/*_slis.rb')
  ]
  Gitlab::AppLogger.info "#{self}: preloading path(s) #{sli_paths.join(', ')}"

  sli_paths.flat_map { |path| Dir.glob(path) }.each do |file|
    require_dependency file # rubocop:disable Rails/RequireDependency -- This is required to
    # load the SLI implementation modules, as they are not referred directly in code.
    # The alternative would be a more convoluted implementation where we camelize and
    # constantize based on filenames.
  end
end

.record_duration_for_status?(status) ⇒ Boolean

Returns:

  • (Boolean)


9
10
11
# File 'lib/gitlab/metrics.rb', line 9

def self.record_duration_for_status?(status)
  status.to_i.between?(200, 499)
end

.series_prefixObject

Returns the prefix to use for the name of a series.



30
31
32
# File 'lib/gitlab/metrics.rb', line 30

def self.series_prefix
  @series_prefix ||= Gitlab::Runtime.sidekiq? ? 'sidekiq_' : 'rails_'
end

.server_error?(status) ⇒ Boolean

Returns:

  • (Boolean)


13
14
15
# File 'lib/gitlab/metrics.rb', line 13

def self.server_error?(status)
  status.to_i >= 500
end

.settingsObject



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/gitlab/metrics.rb', line 34

def self.settings
  @settings ||= begin
    current_settings = Gitlab::CurrentSettings.current_application_settings

    {

      method_call_threshold: current_settings[:metrics_method_call_threshold]

    }
  end
end