diff options
Diffstat (limited to 'lib/gitlab/utils/measuring.rb')
-rw-r--r-- | lib/gitlab/utils/measuring.rb | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/lib/gitlab/utils/measuring.rb b/lib/gitlab/utils/measuring.rb index 0680cefd249..febe489f1f8 100644 --- a/lib/gitlab/utils/measuring.rb +++ b/lib/gitlab/utils/measuring.rb @@ -5,38 +5,51 @@ require 'prometheus/pid_provider' module Gitlab module Utils class Measuring - def initialize(logger: Logger.new($stdout)) - @logger = logger + class << self + attr_writer :logger + + def logger + @logger ||= Logger.new(STDOUT) + end + end + + def initialize(base_log_data = {}) + @base_log_data = base_log_data end def with_measuring - logger.info "Measuring enabled..." + result = nil with_gc_stats do with_count_queries do with_measure_time do - yield + result = yield end end end - logger.info "Memory usage: #{Gitlab::Metrics::System.memory_usage.to_f / 1024 / 1024} MiB" - logger.info "Label: #{::Prometheus::PidProvider.worker_id}" + log_info( + gc_stats: gc_stats, + time_to_finish: time_to_finish, + number_of_sql_calls: sql_calls_count, + memory_usage: "#{Gitlab::Metrics::System.memory_usage_rss.to_f / 1024 / 1024} MiB", + label: ::Prometheus::PidProvider.worker_id + ) + + result end private - attr_reader :logger + attr_reader :gc_stats, :time_to_finish, :sql_calls_count, :base_log_data def with_count_queries(&block) - count = 0 + @sql_calls_count = 0 counter_f = ->(_name, _started, _finished, _unique_id, payload) { - count += 1 unless payload[:name].in? %w[CACHE SCHEMA] + @sql_calls_count += 1 unless payload[:name].in? %w[CACHE SCHEMA] } ActiveSupport::Notifications.subscribed(counter_f, "sql.active_record", &block) - - logger.info "Number of sql calls: #{count}" end def with_gc_stats @@ -44,33 +57,22 @@ module Gitlab stats_before = GC.stat yield stats_after = GC.stat - stats_diff = stats_after.map do |key, after_value| + @gc_stats = stats_after.map do |key, after_value| before_value = stats_before[key] [key, before: before_value, after: after_value, diff: after_value - before_value] end.to_h - logger.info "GC stats:" - logger.info JSON.pretty_generate(stats_diff) end def with_measure_time - timing = Benchmark.realtime do + @time_to_finish = Benchmark.realtime do yield end - - logger.info "Time to finish: #{duration_in_numbers(timing)}" end - def duration_in_numbers(duration_in_seconds) - milliseconds = duration_in_seconds.in_milliseconds % 1.second.in_milliseconds - seconds = duration_in_seconds % 1.minute - minutes = (duration_in_seconds / 1.minute) % (1.hour / 1.minute) - hours = duration_in_seconds / 1.hour - - if hours == 0 - "%02d:%02d:%03d" % [minutes, seconds, milliseconds] - else - "%02d:%02d:%02d:%03d" % [hours, minutes, seconds, milliseconds] - end + def log_info(details) + details = base_log_data.merge(details) + details = details.to_yaml if ActiveSupport::Logger.logger_outputs_to?(Measuring.logger, STDOUT) + Measuring.logger.info(details) end end end |