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