Module: OpenTelemetry::Adapters::Redis::Utils

Extended by:
Utils
Included in:
Utils
Defined in:
lib/opentelemetry/adapters/redis/utils.rb

Overview

Utility functions

Constant Summary collapse

STRING_PLACEHOLDER =
''.encode(::Encoding::UTF_8).freeze
PLACEHOLDER =
'?'
VALUE_MAX_LEN =
50
CMD_MAX_LEN =
500

Instance Method Summary collapse

Instance Method Details

#auth_command?(command_args) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
50
# File 'lib/opentelemetry/adapters/redis/utils.rb', line 46

def auth_command?(command_args)
  return false unless command_args.is_a?(Array) && !command_args.empty?

  command_args.first.to_sym == :auth
end

#format_arg(arg) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/opentelemetry/adapters/redis/utils.rb', line 37

def format_arg(arg)
  str = arg.is_a?(Symbol) ? arg.to_s.upcase : arg.to_s
  str = utf8_encode(str, binary: true, placeholder: PLACEHOLDER)
  truncate(str, VALUE_MAX_LEN)
rescue StandardError => e
  OpenTelemetry.logger.debug("non formattable Redis arg #{str}: #{e}")
  PLACEHOLDER
end

#format_command(command_args) ⇒ Object



19
20
21
# File 'lib/opentelemetry/adapters/redis/utils.rb', line 19

def format_command(command_args)
  format_arg(resolve_command_args(command_args).first)
end

#format_pipeline_statement(command_args) ⇒ Object



23
24
25
26
27
# File 'lib/opentelemetry/adapters/redis/utils.rb', line 23

def format_pipeline_statement(command_args)
  command_args[0].commands.map do |args|
    format_statement(args)
  end.join("\n")
end

#format_statement(command_args) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/opentelemetry/adapters/redis/utils.rb', line 29

def format_statement(command_args)
  command_args = resolve_command_args(command_args)
  return 'AUTH ?' if auth_command?(command_args)

  cmd = command_args.map { |x| format_arg(x) }.join(' ')
  truncate(cmd, CMD_MAX_LEN)
end

#resolve_command_args(command_args) ⇒ Object

Unwraps command array when Redis is called with the following syntax:

redis.call([:cmd, 'arg1', ...])


54
55
56
57
58
# File 'lib/opentelemetry/adapters/redis/utils.rb', line 54

def resolve_command_args(command_args)
  return command_args.first if command_args.is_a?(Array) && command_args.first.is_a?(Array)

  command_args
end

#truncate(string, size) ⇒ Object



60
61
62
# File 'lib/opentelemetry/adapters/redis/utils.rb', line 60

def truncate(string, size)
  string.size > size ? "#{string[0...size - 3]}..." : string
end

#utf8_encode(str, options = {}) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/opentelemetry/adapters/redis/utils.rb', line 64

def utf8_encode(str, options = {})
  str = str.to_s

  if options[:binary]
    # This option is useful for "gracefully" displaying binary data that
    # often contains text such as marshalled objects
    str.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
  elsif str.encoding == ::Encoding::UTF_8
    str
  else
    str.encode(::Encoding::UTF_8)
  end
rescue StandardError => e
  OpenTelemetry.logger.debug("Error encoding string in UTF-8: #{e}")

  options.fetch(:placeholder, STRING_PLACEHOLDER)
end