diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-13 15:09:18 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-13 15:09:18 +0300 |
commit | ce34395e91c28f282eeff3792caee84438ebb8a0 (patch) | |
tree | d350d2bf057e6707d11727701312580b8389bfed /lib/gitlab/instrumentation | |
parent | 778ea71394b9bc20b614f766fbb90ddd7ef0cfe9 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/instrumentation')
-rw-r--r-- | lib/gitlab/instrumentation/redis_base.rb | 15 | ||||
-rw-r--r-- | lib/gitlab/instrumentation/redis_interceptor.rb | 21 |
2 files changed, 30 insertions, 6 deletions
diff --git a/lib/gitlab/instrumentation/redis_base.rb b/lib/gitlab/instrumentation/redis_base.rb index 52817bde97e..7c08d5e8461 100644 --- a/lib/gitlab/instrumentation/redis_base.rb +++ b/lib/gitlab/instrumentation/redis_base.rb @@ -81,12 +81,12 @@ module Gitlab self end - def count_request + def instance_count_request @request_counter ||= Gitlab::Metrics.counter(:gitlab_redis_client_requests_total, 'Client side Redis request count, per Redis server') @request_counter.increment({ storage: storage_key }) end - def count_exception(ex) + def instance_count_exception(ex) # This metric is meant to give a client side view of how the Redis # server is doing. Redis itself does not expose error counts. This # metric can be used for Redis alerting and service health monitoring. @@ -94,6 +94,17 @@ module Gitlab @exception_counter.increment({ storage: storage_key, exception: ex.class.to_s }) end + def instance_observe_duration(duration) + @request_latency_histogram ||= Gitlab::Metrics.histogram( + :gitlab_redis_client_requests_duration_seconds, + 'Client side Redis request latency, per Redis server, excluding blocking commands', + {}, + [0.001, 0.005, 0.01] + ) + + @request_latency_histogram.observe({ storage: storage_key }, duration) + end + private def request_count_key diff --git a/lib/gitlab/instrumentation/redis_interceptor.rb b/lib/gitlab/instrumentation/redis_interceptor.rb index 6847e8aa65c..b5a5f8fd984 100644 --- a/lib/gitlab/instrumentation/redis_interceptor.rb +++ b/lib/gitlab/instrumentation/redis_interceptor.rb @@ -5,19 +5,26 @@ require 'redis' module Gitlab module Instrumentation module RedisInterceptor + APDEX_EXCLUDE = %w[brpop blpop brpoplpush bzpopmin bzpopmax xread xreadgroup].freeze + def call(*args, &block) - instrumentation_class.count_request + start = Time.now # must come first so that 'start' is always defined + instrumentation_class.instance_count_request instrumentation_class.redis_cluster_validate!(args.first) - start = Time.now super(*args, &block) rescue ::Redis::BaseError => ex - instrumentation_class.count_exception(ex) + instrumentation_class.instance_count_exception(ex) raise ex ensure - duration = (Time.now - start) + duration = Time.now - start + + unless APDEX_EXCLUDE.include?(command_from_args(args)) + instrumentation_class.instance_observe_duration(duration) + end if ::RequestStore.active? + # These metrics measure total Redis usage per Rails request / job. instrumentation_class.increment_request_count instrumentation_class.add_duration(duration) instrumentation_class.add_call_details(duration, args) @@ -83,6 +90,12 @@ module Gitlab def instrumentation_class @options[:instrumentation_class] # rubocop:disable Gitlab/ModuleWithInstanceVariables end + + def command_from_args(args) + command = args[0] + command = command[0] if command.is_a?(Array) + command.to_s.downcase + end end end end |