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



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/new_relic/agent/beacon_configuration.rb', line 26

def initialize
  @browser_timing_header = build_browser_timing_header
  NewRelic::Control.instance.log.debug("Browser timing header: #{@browser_timing_header.inspect}")
  @browser_timing_static_footer = build_load_file_js
  NewRelic::Control.instance.log.debug("Browser timing static footer: #{@browser_timing_static_footer.inspect}")
  if Agent.config[:'rum.jsonp']
    NewRelic::Control.instance.log.debug("Real User Monitoring is using JSONP protocol")
    @finish_command = 'nrfj'
  else
    @finish_command = 'nrf2'
  end

  if !Agent.config[:'rum.enabled']
    NewRelic::Control.instance.log.warn("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



10
11
12
# File 'lib/new_relic/agent/beacon_configuration.rb', line 10

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



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

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’



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

def finish_command
  @finish_command
end

Instance Method Details

#build_browser_timing_headerObject

Returns the header string, properly html-safed if needed



94
95
96
97
98
99
100
101
102
103
104
# File 'lib/new_relic/agent/beacon_configuration.rb', line 94

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)



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/new_relic/agent/beacon_configuration.rb', line 61

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)


43
44
45
# File 'lib/new_relic/agent/beacon_configuration.rb', line 43

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



89
90
91
# File 'lib/new_relic/agent/beacon_configuration.rb', line 89

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



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

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