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