class TingYun::BrowserMonitoring
Constants
- ALREADY_INSTRUMENTED_KEY
- ATTACHMENT
- CONTENT_DISPOSITION
- CONTENT_TYPE
- GT
- HEAD_END
- HEAD_END_CAPITAL
- SCAN_LIMIT
- TEXT_HTML
- TITLE_END
- TITLE_END_CAPITAL
Public Instance Methods
auto_instrument_source(response, js_to_inject)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 107 def auto_instrument_source(response, js_to_inject) source = gather_source(response) close_old_response(response) return nil unless source beginning_of_source = source[0..SCAN_LIMIT] insertion_index = find_tag_end(beginning_of_source) if insertion_index source = source[0...insertion_index] << js_to_inject << source[insertion_index..-1] else TingYun::Agent.logger.debug "Skipping RUM instrumentation. Could not properly determine location to inject script." end source rescue => e TingYun::Agent.logger.debug "Skipping RUM instrumentation on exception.", e nil end
browser_timing_config(state)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 93 def browser_timing_config(state) timings = state.timings data = { :id => TingYun::Agent.config[:idSecret], :n => state.transaction_name , :a => timings.app_time_in_millis, :q => timings.queue_time_in_millis, :tid => state.trace_id } data end
close_old_response(response)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 135 def close_old_response(response) if response.respond_to?(:close) response.close end end
find_tag_end(beginning_of_source)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 141 def find_tag_end(beginning_of_source) tag_end = beginning_of_source.index(TITLE_END) || beginning_of_source.index(HEAD_END) || beginning_of_source.index(TITLE_END_CAPITAL) || beginning_of_source.index(HEAD_END_CAPITAL) beginning_of_source.index(GT, tag_end) + 1 if tag_end end
gather_source(response)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 129 def gather_source(response) source = nil response.each {|fragment| source ? (source << fragment.to_s) : (source = fragment.to_s)} source end
is_ajax?(env)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 75 def is_ajax?(env) env["HTTP_X_REQUESTED_WITH"].nil? end
is_attachment?(headers)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 79 def is_attachment?(headers) headers[CONTENT_DISPOSITION] && headers[CONTENT_DISPOSITION].include?(ATTACHMENT) end
is_html?(headers)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 71 def is_html?(headers) headers[CONTENT_TYPE] && headers[CONTENT_TYPE].include?(TEXT_HTML) end
rum_enable?()
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 83 def rum_enable? TingYun::Agent.config[:'nbs.rum.enabled'] end
should_instrument?(env, status, headers)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 63 def should_instrument?(env, status, headers) status == 200 && is_ajax?(env) && !env[ALREADY_INSTRUMENTED_KEY] && is_html?(headers) && !is_attachment?(headers) end
traced_call(env)
click to toggle source
# File lib/ting_yun/middleware/browser_monitoring.rb, line 28 def traced_call(env) result = @app.call(env) # [status, headers, response] if should_instrument?(env, result[0], result[1]) if rum_enable? # unsupport insert script if TingYun::Agent.config[:'nbs.rum.mix_enabled'] result[1]["Set-Cookie"] = "TINGYUN_DATA=#{manufacture_cookie}" env[ALREADY_INSTRUMENTED_KEY] = true result else js_to_inject = TingYun::Instrumentation::Support::JavascriptInstrument.browser_timing_header if (js_to_inject != '') response_string = auto_instrument_source(result[2], js_to_inject) env[ALREADY_INSTRUMENTED_KEY] = true if response_string response = Rack::Response.new(response_string, result[0], result[1]) response.finish else result end else result end end else result end else result end end