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: DummyMetricFrame

Constant Summary collapse

@@dummy_metric_frame =
DummyMetricFrame.new

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.beacon_url(request) ⇒ Object



121
122
123
# File 'lib/new_relic/agent/browser_monitoring.rb', line 121

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

.browser_monitoring_app_timeObject



79
80
81
# File 'lib/new_relic/agent/browser_monitoring.rb', line 79

def browser_monitoring_app_time
  clamp_to_positive(((Time.now - browser_monitoring_start_time).to_f * 1000.0).round)
end

.browser_monitoring_queue_timeObject



75
76
77
# File 'lib/new_relic/agent/browser_monitoring.rb', line 75

def browser_monitoring_queue_time
  clamp_to_positive((current_metric_frame.queue_time.to_f * 1000.0).round)
end

.browser_monitoring_start_timeObject



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

def browser_monitoring_start_time
  NewRelic::Agent::TransactionInfo.get.start_time
end

.browser_monitoring_transaction_nameObject



71
72
73
# File 'lib/new_relic/agent/browser_monitoring.rb', line 71

def browser_monitoring_transaction_name
  NewRelic::Agent::TransactionInfo.get.transaction_name
end

.clamp_to_positive(value) ⇒ Object



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

def clamp_to_positive(value)
  return 0.0 if value < 0
  value
end

.current_metric_frameObject



83
84
85
# File 'lib/new_relic/agent/browser_monitoring.rb', line 83

def current_metric_frame
  Thread.current[:last_metric_frame] || @@dummy_metric_frame
end

.insert_mobile_response_header(request, response) ⇒ Object



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

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)}",#{browser_monitoring_queue_time},#{browser_monitoring_app_time}] ]
    response['X-NewRelic-App-Server-Metrics'] = payload
  end
end

.mobile_header_found_in?(request) ⇒ Boolean

Returns:

  • (Boolean)


115
116
117
118
119
# File 'lib/new_relic/agent/browser_monitoring.rb', line 115

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



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

def obfuscate(config, text)
  obfuscated = ""
  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

.timingsObject



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

def self.timings
  NewRelic::Agent::Instrumentation::BrowserMonitoringTimings.new(
    current_metric_frame.queue_time,
    NewRelic::Agent::TransactionInfo.get)
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.



49
50
51
52
53
54
55
# File 'lib/new_relic/agent/browser_monitoring.rb', line 49

def browser_timing_footer
  if insert_js?
    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



33
34
35
36
37
38
39
# File 'lib/new_relic/agent/browser_monitoring.rb', line 33

def browser_timing_header
  if insert_js?
    NewRelic::Agent.instance.beacon_configuration.browser_timing_header
  else
    ""
  end
end