class NewRelic::Agent::Utilization::Vendor

Constants

SUCCESS
VALID_CHARS

Attributes

metadata[R]

Public Class Methods

endpoint(endpoint = nil) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 16
def endpoint(endpoint = nil)
  endpoint ? @endpoint = URI(endpoint) : @endpoint
end
headers(headers = nil) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 20
def headers(headers = nil)
  headers ? @headers = headers.freeze : processed_headers
end
key_transforms(key_transforms = nil) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 28
def key_transforms(key_transforms = nil)
  key_transforms ? @key_transforms = Array(key_transforms).freeze : @key_transforms
end
keys(keys = nil) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 24
def keys(keys = nil)
  keys ? @keys = keys.freeze : @keys
end
new() click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 45
def initialize
  @metadata = {}
end
processed_headers() click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 32
def processed_headers
  return unless @headers

  @headers.each_with_object({}) do |(key, value), processed_hash|
    # Header lambdas are expected to return string values. If nil comes back, replace it with :error
    # to signify that the call failed.
    processed_hash[key] = value.class.eql?(Proc) ? value.call || :error : value
  end
end
vendor_name(vendor_name = nil) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 12
def vendor_name(vendor_name = nil)
  vendor_name ? @vendor_name = vendor_name.freeze : @vendor_name
end

Public Instance Methods

detect() click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 55
def detect
  response = request_metadata
  return false unless response

  begin
    if response.code == SUCCESS
      process_response(prepare_response(response))
    else
      false
    end
  rescue => e
    NewRelic::Agent.logger.error("Error occurred detecting: #{vendor_name}", e)
    record_supportability_metric
    false
  end
end

Private Instance Methods

normalize(value) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 106
def normalize(value)
  return if value.nil?

  value = value.to_s
  value = value.dup if value.frozen?

  value.force_encoding(Encoding::UTF_8)
  value.strip!

  return unless valid_length?(value)
  return unless valid_chars?(value)

  value
end
prepare_response(response) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 88
def prepare_response(response)
  JSON.parse(response.body)
end
process_response(response) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 92
def process_response(response)
  keys.each do |key|
    normalized = normalize(response[key])
    if normalized
      @metadata[transform_key(key)] = normalized
    else
      @metadata.clear
      record_supportability_metric
      return false
    end
  end
  true
end
record_supportability_metric() click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 151
def record_supportability_metric
  NewRelic::Agent.increment_metric("Supportability/utilization/#{vendor_name}/error")
end
request_metadata() click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 74
def request_metadata
  processed_headers = headers
  raise if processed_headers.value?(:error)

  response = nil
  Net::HTTP.start(endpoint.host, endpoint.port, open_timeout: 1, read_timeout: 1) do |http|
    req = Net::HTTP::Get.new(endpoint, processed_headers)
    response = http.request(req)
  end
  response
rescue
  NewRelic::Agent.logger.debug("#{vendor_name} environment not detected")
end
transform_key(key) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 145
def transform_key(key)
  return key unless key_transforms

  key_transforms.inject(key) { |memo, transform| memo.send(transform) }
end
valid_chars?(value) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 132
def valid_chars?(value)
  value.each_char do |ch|
    next if VALID_CHARS.match?(ch)

    code_point = ch[0].ord # this works in Ruby 1.8.7 - 2.1.2
    next if code_point >= 0x80

    NewRelic::Agent.logger.warn("Found invalid character while detecting: #{vendor_name}")
    return false # it's in neither set of valid characters
  end
  true
end
valid_length?(value) click to toggle source
# File lib/new_relic/agent/utilization/vendor.rb, line 121
def valid_length?(value)
  if value.bytesize <= 255
    true
  else
    NewRelic::Agent.logger.warn("Found invalid length value while detecting: #{vendor_name}")
    false
  end
end