class JSONAPI::Support::ProsopiteInstrumentationLogger
def build_payload(env, n1_details)
def build_payload(env, n1_details) base = { n1_details: n1_details, n1_query: extract_first_query(n1_details) } result = if env.nil? base else request_payload(ActionDispatch::Request.new(env), n1_details).merge(n1_query: base[:n1_query]) end result.merge(correlation_id: JSONAPI::Support::CorrelationId.resolve) end
def extract_first_query(n1_details)
def extract_first_query(n1_details) return nil if n1_details.nil? || n1_details.empty? parts = n1_details.split("Call stack:") return nil if parts.size < 2 query_section = parts[0].sub(/\AN\+1 queries detected:\n?/, "") first_line = query_section.each_line.map(&:strip).reject(&:empty?).first first_line.presence end
def request_payload(req, n1_details)
def request_payload(req, n1_details) params = req.params { path: req.path, method: req.request_method, include: params[:include], resource_type: params[:resource_type], resource_id: params[:id], n1_details: n1_details, } end
def warn(progname = nil, &)
def warn(progname = nil, &) n1_details = block_given? ? yield : progname.to_s return if n1_details.nil? || n1_details.empty? env = Thread.current[:jpie_request_env] payload = build_payload(env, n1_details) return unless defined?(Rails) && Rails.respond_to?(:event) Rails.event.tagged("jsonapi", "n1") do Rails.event.notify("jpie.n1_detected", payload) end end