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:
authorGitLab Bot <gitlab-bot@gitlab.com>2019-10-28 18:05:58 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2019-10-28 18:05:58 +0300
commita77db6bc47d8cdd9edae2ec22f640821d0794404 (patch)
tree15861a5f1ec29e07c2012102e463402bb7dc8c2d /lib/gitlab/instrumentation_helper.rb
parent6cf6996f183bdff46e73431c07bfb723066a8222 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/instrumentation_helper.rb')
-rw-r--r--lib/gitlab/instrumentation_helper.rb44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/gitlab/instrumentation_helper.rb b/lib/gitlab/instrumentation_helper.rb
index e6a5facb2a5..edaa9c645b4 100644
--- a/lib/gitlab/instrumentation_helper.rb
+++ b/lib/gitlab/instrumentation_helper.rb
@@ -21,5 +21,49 @@ module Gitlab
payload[:rugged_duration_ms] = Gitlab::RuggedInstrumentation.query_time_ms
end
end
+
+ # Returns the queuing duration for a Sidekiq job in seconds, as a float, if the
+ # `enqueued_at` field or `created_at` field is available.
+ #
+ # * If the job doesn't contain sufficient information, returns nil
+ # * If the job has a start time in the future, returns 0
+ # * If the job contains an invalid start time value, returns nil
+ # @param [Hash] job a Sidekiq job, represented as a hash
+ def self.queue_duration_for_job(job)
+ # Old gitlab-shell messages don't provide enqueued_at/created_at attributes
+ enqueued_at = job['enqueued_at'] || job['created_at']
+ return unless enqueued_at
+
+ enqueued_at_time = convert_to_time(enqueued_at)
+ return unless enqueued_at_time
+
+ # Its possible that if theres clock-skew between two nodes
+ # this value may be less than zero. In that event, we record the value
+ # as zero.
+ [elapsed_by_absolute_time(enqueued_at_time), 0].max
+ end
+
+ # Calculates the time in seconds, as a float, from
+ # the provided start time until now
+ #
+ # @param [Time] start
+ def self.elapsed_by_absolute_time(start)
+ (Time.now - start).to_f.round(6)
+ end
+ private_class_method :elapsed_by_absolute_time
+
+ # Convert a representation of a time into a `Time` value
+ #
+ # @param time_value String, Float time representation, or nil
+ def self.convert_to_time(time_value)
+ return time_value if time_value.is_a?(Time)
+ return Time.iso8601(time_value) if time_value.is_a?(String)
+ return Time.at(time_value) if time_value.is_a?(Numeric) && time_value > 0
+ rescue ArgumentError
+ # Swallow invalid dates. Better to loose some observability
+ # than bring all background processing down because of a date
+ # formatting bug in a client
+ end
+ private_class_method :convert_to_time
end
end