module Datadog::Quantization::HTTP

Quantization for HTTP resources

Constants

PLACEHOLDER

Public Instance Methods

collect_query(query, options = {}) { |key, value, delims| ... } click to toggle source

Iterate over each key value pair, yielding to the block given. Accepts :uniq option, which keeps uniq copies of keys without values. e.g. Reduces “foo&bar=bar&bar=bar&foo” to “foo&bar=bar&bar=bar”

# File lib/ddtrace/quantization/http.rb, line 62
def collect_query(query, options = {})
  return query unless block_given?
  uniq = options[:uniq].nil? ? false : options[:uniq]
  keys = Set.new

  delims = query.scan(/(^|&|;)/).flatten
  query.split(/[&;]/).collect.with_index do |pairs, i|
    key, value = pairs.split('=', 2)
    key, value = yield(key, value, delims[i])
    if uniq && keys.include?(key)
      ''
    elsif key && value
      "#{delims[i]}#{key}=#{value}"
    elsif key
      "#{delims[i]}#{key}".tap { keys << key }
    else
      ''
    end
  end.join.sub(/^[&;]/, '')
end
query(query, options = {}) click to toggle source
# File lib/ddtrace/quantization/http.rb, line 33
def query(query, options = {})
  query!(query, options)
rescue StandardError
  options[:placeholder] || PLACEHOLDER
end
query!(query, options = {}) click to toggle source
# File lib/ddtrace/quantization/http.rb, line 39
def query!(query, options = {})
  options ||= {}
  options[:show] = options[:show] || []
  options[:exclude] = options[:exclude] || []

  # Short circuit if query string is meant to exclude everything
  # or if the query string is meant to include everything
  return '' if options[:exclude] == :all
  return query if options[:show] == :all

  collect_query(query, uniq: true) do |key, value|
    if options[:exclude].include?(key)
      [nil, nil]
    else
      value = options[:show].include?(key) ? value : nil
      [key, value]
    end
  end
end
url(url, options = {}) click to toggle source
# File lib/ddtrace/quantization/http.rb, line 12
def url(url, options = {})
  url!(url, options)
rescue StandardError
  options[:placeholder] || PLACEHOLDER
end
url!(url, options = {}) click to toggle source
# File lib/ddtrace/quantization/http.rb, line 18
def url!(url, options = {})
  options ||= {}

  URI.parse(url).tap do |uri|
    # Format the query string
    if uri.query
      query = query(uri.query, options[:query])
      uri.query = (!query.nil? && query.empty? ? nil : query)
    end

    # Remove any URI framents
    uri.fragment = nil unless options[:fragment] == :show
  end.to_s
end