Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,70 +6,72 @@

module OpenTelemetry
module Instrumentation
# Utility functions
module Utils
extend self
module Dalli
# Utility functions
module Utils
extend self

STRING_PLACEHOLDER = ''.encode(::Encoding::UTF_8).freeze
CMD_MAX_LEN = 500
STRING_PLACEHOLDER = ''.encode(::Encoding::UTF_8).freeze
CMD_MAX_LEN = 500

OPNAME_MAPPING = {
'get' => 'get',
'cas' => 'get',
'set' => 'set',
'add' => 'add',
'replace' => 'replace',
'delete' => 'delete',
'incr' => 'incr',
'decr' => 'decr',
'flush' => 'flush',
'write_noop' => 'noop',
'version' => 'version',
'send_multiget' => 'getkq',
# TODO: add better support for PipelinedGetter
# In dalli 3.1, multiget has been refactored to use a more robust PipelinedGetter class.
# The `pipelined_get` method has been introduced to the Dalli::Server to support this new class.
# If PipelinedGetter makes instrumentation of multi operations easier, we should then migrate
# instrumentation to Dalli::Client, since it seems to be a more stable chokepoint.
# For now we're just ensuring we support this new Dalli::Server method.
'pipelined_get' => 'getkq',
'append' => 'append',
'prepend' => 'prepend',
'stats' => 'stat',
'reset_stats' => 'stat',
'multi_set' => 'setq',
'multi_add' => 'addq',
'multi_replace' => 'replaceq',
'multi_delete' => 'deleteq',
'touch' => 'touch',
'gat' => 'gat'
# 'sasl_authentication' => 'auth_negotiation',
# 'sasl_authentication' => 'auth_request',
}.freeze
OPNAME_MAPPING = {
'get' => 'get',
'cas' => 'get',
'set' => 'set',
'add' => 'add',
'replace' => 'replace',
'delete' => 'delete',
'incr' => 'incr',
'decr' => 'decr',
'flush' => 'flush',
'write_noop' => 'noop',
'version' => 'version',
'send_multiget' => 'getkq',
# TODO: add better support for PipelinedGetter
# In dalli 3.1, multiget has been refactored to use a more robust PipelinedGetter class.
# The `pipelined_get` method has been introduced to the Dalli::Server to support this new class.
# If PipelinedGetter makes instrumentation of multi operations easier, we should then migrate
# instrumentation to Dalli::Client, since it seems to be a more stable chokepoint.
# For now we're just ensuring we support this new Dalli::Server method.
'pipelined_get' => 'getkq',
'append' => 'append',
'prepend' => 'prepend',
'stats' => 'stat',
'reset_stats' => 'stat',
'multi_set' => 'setq',
'multi_add' => 'addq',
'multi_replace' => 'replaceq',
'multi_delete' => 'deleteq',
'touch' => 'touch',
'gat' => 'gat'
# 'sasl_authentication' => 'auth_negotiation',
# 'sasl_authentication' => 'auth_request',
}.freeze

def opname(operation, multi)
lookup_name = multi ? "multi_#{operation}" : operation.to_s
OPNAME_MAPPING[lookup_name] || operation.to_s
end
def opname(operation, multi)
lookup_name = multi ? "multi_#{operation}" : operation.to_s
OPNAME_MAPPING[lookup_name] || operation.to_s
end

def format_command(operation, args)
placeholder = "#{operation} BLOB (OMITTED)"
def format_command(operation, args)
placeholder = "#{operation} BLOB (OMITTED)"

command = +operation.to_s
args.flatten.each do |arg|
str = arg.to_s
if str.bytesize >= CMD_MAX_LEN
command << ' BLOB (OMITTED)'
elsif !str.empty?
command << ' ' << str
command = +operation.to_s
args.flatten.each do |arg|
str = arg.to_s
if str.bytesize >= CMD_MAX_LEN
command << ' BLOB (OMITTED)'
elsif !str.empty?
command << ' ' << str
end
end
end

command = OpenTelemetry::Common::Utilities.utf8_encode(command, binary: true, placeholder: placeholder)
OpenTelemetry::Common::Utilities.truncate(command, CMD_MAX_LEN)
rescue StandardError => e
OpenTelemetry.logger.debug("Error sanitizing Dalli operation: #{e}")
placeholder
command = OpenTelemetry::Common::Utilities.utf8_encode(command, binary: true, placeholder: placeholder)
OpenTelemetry::Common::Utilities.truncate(command, CMD_MAX_LEN)
rescue StandardError => e
OpenTelemetry.logger.debug("Error sanitizing Dalli operation: #{e}")
placeholder
end
end
end
end
Expand Down
Loading