Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/utils/measuring.rb')
-rw-r--r--lib/gitlab/utils/measuring.rb58
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