Module: NewRelic::Agent::BrowserMonitoring

Included in:
Agent
Defined in:
lib/new_relic/agent/browser_monitoring.rb

Overview

This module contains support for Real User Monitoring - the javascript generation and configuration

Defined Under Namespace

Classes: DummyTransaction

Constant Summary collapse

@@dummy_txn =
DummyTransaction.new

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.beacon_url(request) ⇒ Object



119
120
121
# File 'lib/new_relic/agent/browser_monitoring.rb', line 119

def beacon_url(request)
  "#{request.scheme || 'http'}://#{Agent.config[:beacon]}/mobile/1/#{Agent.config[:browser_key]}"
end

.browser_monitoring_transaction_nameObject



88
89
90
# File 'lib/new_relic/agent/browser_monitoring.rb', line 88

def browser_monitoring_transaction_name
  current_timings.transaction_name || ::NewRelic::Agent::UNKNOWN_METRIC
end

.current_timingsObject



96
97
98
# File 'lib/new_relic/agent/browser_monitoring.rb', line 96

def current_timings
  NewRelic::Agent::TransactionState.get.timings
end

.current_transactionObject



92
93
94
# File 'lib/new_relic/agent/browser_monitoring.rb', line 92

def current_transaction
  NewRelic::Agent::TransactionState.get.transaction || @@dummy_txn
end

.insert_mobile_response_header(request, response) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/new_relic/agent/browser_monitoring.rb', line 100

def insert_mobile_response_header(request, response)
  if mobile_header_found_in?(request) &&
      NewRelic::Agent.instance.beacon_configuration

    config = NewRelic::Agent.instance.beacon_configuration

    response['X-NewRelic-Beacon-Url'] = beacon_url(request)

    payload = %[ ["#{Agent.config[:application_id]}","#{obfuscate(config, browser_monitoring_transaction_name)}",#{current_timings.queue_time_in_millis},#{current_timings.app_time_in_millis}] ]
    response['X-NewRelic-App-Server-Metrics'] = payload
  end
end

.mobile_header_found_in?(request) ⇒ Boolean

Returns:

  • (Boolean)


113
114
115
116
117
# File 'lib/new_relic/agent/browser_monitoring.rb', line 113

def mobile_header_found_in?(request)
  headers = ['HTTP_X_NEWRELIC_MOBILE_TRACE', 'X_NEWRELIC_MOBILE_TRACE',
             'X-NewRelic-Mobile-Trace']
  headers.inject(false){|i,m| i || (request.env[m] == 'true')}
end

.obfuscate(config, text) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/new_relic/agent/browser_monitoring.rb', line 73

def obfuscate(config, text)
  obfuscated = ""
  if defined?(::Encoding::ASCII_8BIT)
    obfuscated.force_encoding(::Encoding::ASCII_8BIT)
  end
  key_bytes = config.license_bytes
  index = 0
  text.each_byte{|byte|
    obfuscated.concat((byte ^ key_bytes[index % 13].to_i))
    index+=1
  }

  [obfuscated].pack("m0").gsub("\n", '')
end

Instance Method Details

This method returns a string suitable for inclusion in a page

  • known as ‘manual instrumentation’ for Real User

Monitoring. Can return either a script tag with associated javascript, or in the case of disabled Real User Monitoring, an empty string

This is the footer string - it should be placed as low in the page as is reasonably possible.



62
63
64
65
66
67
68
69
# File 'lib/new_relic/agent/browser_monitoring.rb', line 62

def browser_timing_footer
  if insert_js?
    NewRelic::Agent::Transaction.freeze_name
    generate_footer_js(NewRelic::Agent.instance.beacon_configuration)
  else
    ""
  end
end

#browser_timing_headerObject

This method returns a string suitable for inclusion in a page

  • known as ‘manual instrumentation’ for Real User

Monitoring. Can return either a script tag with associated javascript, or in the case of disabled Real User Monitoring, an empty string

This is the header string - it should be placed as high in the page as is reasonably possible - that is, before any style or javascript inclusions, but after any header-related meta tags



50
51
52
# File 'lib/new_relic/agent/browser_monitoring.rb', line 50

def browser_timing_header
  insert_js? ? header_js_string : ""
end