Class: NewRelic::Agent::BeaconConfiguration

Inherits:
Object
  • Object
show all
Defined in:
lib/new_relic/agent/beacon_configuration.rb

Overview

This class contains the configuration data for setting up RUM headers and footers - acts as a cache of this data so we don’t need to look it up or reconfigure it every request

Constant Summary collapse

JS_HEADER =

A static javascript header that is identical for every account and application

"<script type=\"text/javascript\">var NREUMQ=NREUMQ||[];NREUMQ.push([\"mark\",\"firstbyte\",new Date().getTime()]);</script>"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBeaconConfiguration

Creates a new browser configuration data. Argument is a hash of configuration values from the server



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/new_relic/agent/beacon_configuration.rb', line 30

def initialize
  if Agent.config[:js_errors_beta] && Agent.config[:js_agent_loader]
    ::NewRelic::Agent.logger.debug("Beta JS errors functionality enabled")
    ::NewRelic::Agent.logger.debug("JS agent loader version: #{Agent.config[:js_agent_loader_version]}")
  else
    @browser_timing_header = build_browser_timing_header
    ::NewRelic::Agent.logger.debug("Browser timing header: #{@browser_timing_header.inspect}")
    @browser_timing_static_footer = build_load_file_js
    ::NewRelic::Agent.logger.debug("Browser timing static footer: #{@browser_timing_static_footer.inspect}")
  end

  if Agent.config[:'rum.jsonp']
    ::NewRelic::Agent.logger.debug("Real User Monitoring is using JSONP protocol")
    @finish_command = 'nrfj'
  else
    @finish_command = 'nrf2'
  end

  if !Agent.config[:'rum.enabled']
    ::NewRelic::Agent.logger.debug("Real User Monitoring is disabled for this agent. Edit your configuration to change this.")
  end
end

Instance Attribute Details

#browser_timing_headerObject (readonly)

the statically generated header - generated when the beacon configuration is created - does not vary per page



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

def browser_timing_header
  @browser_timing_header
end

the static portion of the RUM footer - this part does not vary by which request is in progress



18
19
20
# File 'lib/new_relic/agent/beacon_configuration.rb', line 18

def browser_timing_static_footer
  @browser_timing_static_footer
end

#finish_commandObject (readonly)

RUM footer command used for ‘finish’ - based on whether JSONP is being used. ‘nrfj’ for JSONP, otherwise ‘nrf2’



22
23
24
# File 'lib/new_relic/agent/beacon_configuration.rb', line 22

def finish_command
  @finish_command
end

Instance Method Details

#build_browser_timing_headerObject

Returns the header string, properly html-safed if needed



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

def build_browser_timing_header
  return "" if !enabled?
  return "" if Agent.config[:browser_key].nil?

  value = javascript_header
  if value.respond_to?(:html_safe)
    value.html_safe
  else
    value
  end
end

#build_load_file_jsObject

returns a snippet of text that does not change per-transaction. Is empty when rum is disabled, or we are not including the episodes file dynamically (i.e. the user includes it themselves)



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/new_relic/agent/beacon_configuration.rb', line 71

def build_load_file_js
  js = <<-EOS
if (!NREUMQ.f) { NREUMQ.f=function() {
NREUMQ.push(["load",new Date().getTime()]);
EOS

  if Agent.config[:'rum.load_episodes_file'] &&
    Agent.config[:'rum.load_episodes_file'] != ''
    js << <<-EOS
var e=document.createElement("script");
e.type="text/javascript";
e.src=(("http:"===document.location.protocol)?"http:":"https:") + "//" +
  "#{Agent.config[:episodes_file]}";
document.body.appendChild(e);
EOS
  end

  js << <<-EOS
if(NREUMQ.a)NREUMQ.a();
};
NREUMQ.a=window.onload;window.onload=NREUMQ.f;
};
EOS
  js
end

#enabled?Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/new_relic/agent/beacon_configuration.rb', line 53

def enabled?
  Agent.config[:'rum.enabled'] && !!Agent.config[:beacon]
end

#javascript_headerObject

returns a copy of the static javascript header, in case people are munging strings somewhere down the line



99
100
101
# File 'lib/new_relic/agent/beacon_configuration.rb', line 99

def javascript_header
  JS_HEADER.dup
end

#license_bytesObject

returns a memoized version of the bytes in the license key for obscuring transaction names in the javascript



59
60
61
62
63
64
65
# File 'lib/new_relic/agent/beacon_configuration.rb', line 59

def license_bytes
  if @license_bytes.nil?
    @license_bytes = []
    Agent.config[:license_key].each_byte {|byte| @license_bytes << byte}
  end
  @license_bytes
end