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
-
.add_event(*args) ⇒ Object
Tracks an event.
-
.current_transaction ⇒ Object
Allow access from other metrics related middlewares.
- .initialize_slis! ⇒ Object
-
.measure(name) ⇒ Object
Measures the execution time of a block.
- .method_call_threshold ⇒ Object
- .preload_sli_modules! ⇒ Object
- .record_duration_for_status?(status) ⇒ Boolean
-
.series_prefix ⇒ Object
Returns the prefix to use for the name of a series.
- .server_error?(status) ⇒ Boolean
- .settings ⇒ Object
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_transaction ⇒ Object
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_threshold ⇒ Object
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
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_prefix ⇒ Object
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
13 14 15 |
# File 'lib/gitlab/metrics.rb', line 13 def self.server_error?(status) status.to_i >= 500 end |
.settings ⇒ Object
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 |