summaryrefslogtreecommitdiff
path: root/lib/peek/views/redis_detailed.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/peek/views/redis_detailed.rb')
-rw-r--r--lib/peek/views/redis_detailed.rb73
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/peek/views/redis_detailed.rb b/lib/peek/views/redis_detailed.rb
new file mode 100644
index 00000000000..f36f581d5e9
--- /dev/null
+++ b/lib/peek/views/redis_detailed.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'redis'
+
+module Gitlab
+ module Peek
+ module RedisInstrumented
+ def call(*args, &block)
+ start = Time.now
+ super(*args, &block)
+ ensure
+ duration = (Time.now - start)
+ add_call_details(duration, args)
+ end
+
+ private
+
+ def add_call_details(duration, args)
+ return unless peek_enabled?
+ # redis-rb passes an array (e.g. [:get, key])
+ return unless args.length == 1
+
+ detail_store << {
+ cmd: args.first,
+ duration: duration,
+ backtrace: ::Gitlab::Profiler.clean_backtrace(caller)
+ }
+ end
+
+ def peek_enabled?
+ Gitlab::SafeRequestStore.store[:peek_enabled]
+ end
+
+ def detail_store
+ ::Gitlab::SafeRequestStore['redis_call_details'] ||= []
+ end
+ end
+ end
+end
+
+module Peek
+ module Views
+ class RedisDetailed < DetailedView
+ REDACTED_MARKER = "<redacted>"
+
+ def key
+ 'redis'
+ end
+
+ private
+
+ def format_call_details(call)
+ super.merge(cmd: format_command(call[:cmd]))
+ end
+
+ def format_command(cmd)
+ if cmd.length >= 2 && cmd.first =~ /^auth$/i
+ cmd[-1] = REDACTED_MARKER
+ # Scrub out the value of the SET calls to avoid binary
+ # data or large data from spilling into the view
+ elsif cmd.length >= 3 && cmd.first =~ /set/i
+ cmd[2..-1] = REDACTED_MARKER
+ end
+
+ cmd.join(' ')
+ end
+ end
+ end
+end
+
+class Redis::Client
+ prepend Gitlab::Peek::RedisInstrumented
+end