Class: NewRelic::Agent::SyntheticsMonitor

Inherits:
InboundRequestMonitor show all
Defined in:
lib/new_relic/agent/monitors/synthetics_monitor.rb

Constant Summary collapse

SYNTHETICS_HEADER_KEY =
'HTTP_X_NEWRELIC_SYNTHETICS'
SYNTHETICS_INFO_HEADER_KEY =
'HTTP_X_NEWRELIC_SYNTHETICS_INFO'
SUPPORTED_VERSION =
1
EXPECTED_PAYLOAD_LENGTH =
5

Instance Attribute Summary

Attributes inherited from InboundRequestMonitor

#obfuscator

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from InboundRequestMonitor

#deserialize_header, #initialize, #setup_obfuscator

Constructor Details

This class inherits a constructor from NewRelic::Agent::InboundRequestMonitor

Class Method Details

.is_supported_version?(incoming_payload) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/new_relic/agent/monitors/synthetics_monitor.rb', line 45

def is_supported_version?(incoming_payload)
  incoming_payload.first == SUPPORTED_VERSION
end

.is_trusted?(incoming_payload) ⇒ Boolean

Returns:

  • (Boolean)


49
50
51
52
# File 'lib/new_relic/agent/monitors/synthetics_monitor.rb', line 49

def is_trusted?(incoming_payload)
   = incoming_payload[1]
  Agent.config[:trusted_account_ids].include?()
end

.is_valid_payload?(incoming_payload) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/new_relic/agent/monitors/synthetics_monitor.rb', line 54

def is_valid_payload?(incoming_payload)
  incoming_payload.length == EXPECTED_PAYLOAD_LENGTH
end

.reject_messaging_synthetics_header(headers) ⇒ Object



58
59
60
# File 'lib/new_relic/agent/monitors/synthetics_monitor.rb', line 58

def reject_messaging_synthetics_header(headers)
  headers.reject { |k, _| k == CrossAppTracing::NR_MESSAGE_BROKER_SYNTHETICS_HEADER }
end

Instance Method Details

#load_json(header, key) ⇒ Object



37
38
39
40
41
42
# File 'lib/new_relic/agent/monitors/synthetics_monitor.rb', line 37

def load_json(header, key)
  ::JSON.load(header)
rescue => err
  NewRelic::Agent.logger.debug("Failure loading json header '#{key}' in #{self.class}, #{err.class}, #{err.message}")
  nil
end

#on_before_call(request) ⇒ Object

THREAD_LOCAL_ACCESS



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/new_relic/agent/monitors/synthetics_monitor.rb', line 18

def on_before_call(request) # THREAD_LOCAL_ACCESS
  encoded_header = request[SYNTHETICS_HEADER_KEY]
  info_header = request[SYNTHETICS_INFO_HEADER_KEY]
  return unless encoded_header

  incoming_payload = deserialize_header(encoded_header, SYNTHETICS_HEADER_KEY)

  return unless incoming_payload &&
    SyntheticsMonitor.is_valid_payload?(incoming_payload) &&
    SyntheticsMonitor.is_supported_version?(incoming_payload) &&
    SyntheticsMonitor.is_trusted?(incoming_payload)

  txn = Tracer.current_transaction
  txn.raw_synthetics_header = encoded_header
  txn.raw_synthetics_info_header = info_header
  txn.synthetics_payload = incoming_payload
  txn.synthetics_info_payload = load_json(info_header, SYNTHETICS_INFO_HEADER_KEY)
end

#on_finished_configuring(events) ⇒ Object



14
15
16
# File 'lib/new_relic/agent/monitors/synthetics_monitor.rb', line 14

def on_finished_configuring(events)
  events.subscribe(:before_call, &method(:on_before_call))
end