class Mmtrix::Agent::JavascriptInstrumentor
Constants
- AGENT_KEY
- APPLICATIONID_KEY
- APPLICATION_TIME_KEY
- ATTS_AGENT_SUBKEY
- ATTS_KEY
- ATTS_USER_SUBKEY
- BEACON_KEY
- ERROR_BEACON_KEY
- LICENSE_KEY_KEY
- QUEUE_TIME_KEY
- RUM_KEY_LENGTH
- SSL_FOR_HTTP_KEY
- TRANSACTION_NAME_KEY
Public Class Methods
new(event_listener)
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 16 def initialize(event_listener) event_listener.subscribe(:finished_configuring, &method(:log_configuration)) end
Public Instance Methods
add_attributes(data, txn)
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 163 def add_attributes(data, txn) return unless txn atts = {} append_custom_attributes!(txn, atts) append_agent_attributes!(txn, atts) unless atts.empty? json = Mmtrix::JSONWrapper.dump(atts) data[ATTS_KEY] = obfuscator.obfuscate(json) end end
add_ssl_for_http(data)
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 156 def add_ssl_for_http(data) ssl_for_http = Mmtrix::Agent.config[:'browser_monitoring.ssl_for_http'] unless ssl_for_http.nil? data[SSL_FOR_HTTP_KEY] = ssl_for_http end end
append_agent_attributes!(txn, atts)
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 183 def append_agent_attributes!(txn, atts) agent_attributes = txn.attributes.agent_attributes_for(Mmtrix::Agent::AttributeFilter::DST_BROWSER_MONITORING) unless agent_attributes.empty? atts[ATTS_AGENT_SUBKEY] = agent_attributes end end
append_custom_attributes!(txn, atts)
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 176 def append_custom_attributes!(txn, atts) custom_attributes = txn.attributes.custom_attributes_for(Mmtrix::Agent::AttributeFilter::DST_BROWSER_MONITORING) unless custom_attributes.empty? atts[ATTS_USER_SUBKEY] = custom_attributes end end
browser_timing_config(state)
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 109 def browser_timing_config(state) txn = state.current_transaction return '' if txn.nil? txn.freeze_name_and_execute_if_not_ignored do data = data_for_js_agent(state) json = Mmtrix::JSONWrapper.dump(data) return html_safe_if_needed("\n<script type=\"text/javascript\">window.NREUM||(NREUM={});NREUM.info=#{json}</script>") end '' end
browser_timing_header()
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 89 def browser_timing_header #THREAD_LOCAL_ACCESS return '' unless js_enabled_and_ready? # fast exit state = Mmtrix::Agent::TransactionState.tl_get return '' unless insert_js?(state) # slower exit bt_config = browser_timing_config(state) return '' if bt_config.empty? bt_config + browser_timing_loader rescue => e ::Mmtrix::Agent.logger.debug "Failure during RUM browser_timing_header construction", e '' end
browser_timing_loader()
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 105 def browser_timing_loader html_safe_if_needed("\n<script type=\"text/javascript\">#{Agent.config[:js_agent_loader]}</script>") end
data_for_js_agent(state)
click to toggle source
NOTE: Internal prototyping may override this, so leave name stable!
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 136 def data_for_js_agent(state) timings = state.timings data = { BEACON_KEY => Mmtrix::Agent.config[:beacon], ERROR_BEACON_KEY => Mmtrix::Agent.config[:error_beacon], LICENSE_KEY_KEY => Mmtrix::Agent.config[:browser_key], APPLICATIONID_KEY => Mmtrix::Agent.config[:application_id], TRANSACTION_NAME_KEY => obfuscator.obfuscate(timings.transaction_name_or_unknown), QUEUE_TIME_KEY => timings.queue_time_in_millis, APPLICATION_TIME_KEY => timings.app_time_in_millis, AGENT_KEY => Mmtrix::Agent.config[:js_agent_file] } add_ssl_for_http(data) add_attributes(data, state.current_transaction) data end
enabled?()
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 30 def enabled? Agent.config[:'rum.enabled'] && !!Agent.config[:beacon] end
html_safe_if_needed(string)
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 190 def html_safe_if_needed(string) string = string.html_safe if string.respond_to?(:html_safe) string end
insert_js?(state)
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 63 def insert_js?(state) if !state.current_transaction ::Mmtrix::Agent.logger.debug "Not in transaction. Skipping browser instrumentation." false elsif !state.is_transaction_traced? ::Mmtrix::Agent.logger.debug "Transaction is not traced. Skipping browser instrumentation." false elsif !state.is_execution_traced? ::Mmtrix::Agent.logger.debug "Execution is not traced. Skipping browser instrumentation." false elsif state.current_transaction.ignore_enduser? ::Mmtrix::Agent.logger.debug "Ignore end user for this transaction is set. Skipping browser instrumentation." false else true end rescue => e ::Mmtrix::Agent.logger.debug "Failure during insert_js", e false end
js_enabled_and_ready?()
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 38 def js_enabled_and_ready? if !enabled? ::Mmtrix::Agent.logger.log_once(:debug, :js_agent_disabled, "JS agent instrumentation is disabled.") false elsif missing_config?(:js_agent_loader) ::Mmtrix::Agent.logger.log_once(:debug, :missing_js_agent_loader, "Missing :js_agent_loader. Skipping browser instrumentation.") false elsif missing_config?(:beacon) ::Mmtrix::Agent.logger.log_once(:debug, :missing_beacon, "Beacon configuration not received (yet?). Skipping browser instrumentation.") false elsif missing_config?(:browser_key) ::Mmtrix::Agent.logger.log_once(:debug, :missing_browser_key, "Browser key is not set. Skipping browser instrumentation.") false else true end rescue => e ::Mmtrix::Agent.logger.debug "Failure during 'js_enabled_and_ready?'", e false end
log_configuration()
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 20 def log_configuration Mmtrix::Agent.logger.debug("JS agent loader requested: #{Mmtrix::Agent.config[:'browser_monitoring.loader']}", "JS agent loader debug: #{Mmtrix::Agent.config[:'browser_monitoring.debug']}", "JS agent loader version: #{Mmtrix::Agent.config[:'browser_monitoring.loader_version']}") if !Mmtrix::Agent.config[:'rum.enabled'] Mmtrix::Agent.logger.debug("Real User Monitoring is disabled for this agent. Edit your configuration to change this.") end end
missing_config?(key)
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 84 def missing_config?(key) value = Mmtrix::Agent.config[key] value.nil? || value.empty? end
obfuscator()
click to toggle source
# File lib/mmtrix/agent/javascript_instrumentor.rb, line 34 def obfuscator @obfuscator ||= Mmtrix::Agent::Obfuscator.new(Mmtrix::Agent.config[:license_key], RUM_KEY_LENGTH) end