├── test ├── helpers │ └── .keep ├── mailers │ └── .keep ├── models │ ├── .keep │ └── eyeloupe │ │ ├── out_request_test.rb │ │ ├── in_request_test.rb │ │ ├── job_test.rb │ │ └── exception_test.rb ├── controllers │ ├── .keep │ └── eyeloupe │ │ ├── jobs_controller_test.rb │ │ ├── exceptions_controller_test.rb │ │ ├── out_requests_controller_test.rb │ │ └── in_requests_controller_test.rb ├── dummy │ ├── log │ │ └── .keep │ ├── lib │ │ └── assets │ │ │ └── .keep │ ├── public │ │ ├── favicon.ico │ │ ├── apple-touch-icon.png │ │ ├── apple-touch-icon-precomposed.png │ │ ├── 500.html │ │ ├── 422.html │ │ └── 404.html │ ├── app │ │ ├── assets │ │ │ ├── images │ │ │ │ └── .keep │ │ │ ├── config │ │ │ │ └── manifest.js │ │ │ └── stylesheets │ │ │ │ └── application.css │ │ ├── models │ │ │ ├── concerns │ │ │ │ └── .keep │ │ │ └── application_record.rb │ │ ├── controllers │ │ │ ├── concerns │ │ │ │ └── .keep │ │ │ └── application_controller.rb │ │ ├── views │ │ │ └── layouts │ │ │ │ ├── mailer.text.erb │ │ │ │ ├── mailer.html.erb │ │ │ │ └── application.html.erb │ │ ├── helpers │ │ │ └── application_helper.rb │ │ ├── channels │ │ │ └── application_cable │ │ │ │ ├── channel.rb │ │ │ │ └── connection.rb │ │ ├── mailers │ │ │ └── application_mailer.rb │ │ └── jobs │ │ │ └── application_job.rb │ ├── config │ │ ├── routes.rb │ │ ├── initializers │ │ │ ├── eyeloupe.rb │ │ │ ├── filter_parameter_logging.rb │ │ │ ├── permissions_policy.rb │ │ │ ├── assets.rb │ │ │ ├── inflections.rb │ │ │ └── content_security_policy.rb │ │ ├── environment.rb │ │ ├── cable.yml │ │ ├── boot.rb │ │ ├── database.yml │ │ ├── application.rb │ │ ├── locales │ │ │ └── en.yml │ │ ├── storage.yml │ │ ├── puma.rb │ │ └── environments │ │ │ ├── test.rb │ │ │ ├── development.rb │ │ │ └── production.rb │ ├── bin │ │ ├── rake │ │ ├── rails │ │ └── setup │ ├── config.ru │ ├── Rakefile │ └── db │ │ └── schema.rb ├── integration │ ├── .keep │ └── navigation_test.rb ├── fixtures │ ├── files │ │ └── .keep │ └── eyeloupe │ │ ├── out_requests.yml │ │ ├── in_requests.yml │ │ ├── jobs.yml │ │ └── exceptions.yml ├── eyeloupe_test.rb ├── lib │ ├── request_middleware_test.rb │ └── processors │ │ ├── out_request_processor_test.rb │ │ ├── job_processor_test.rb │ │ ├── exception_processor_test.rb │ │ └── in_request_processor_test.rb └── test_helper.rb ├── app ├── models │ ├── concerns │ │ └── .keep │ └── eyeloupe │ │ ├── in_request.rb │ │ ├── out_request.rb │ │ ├── job.rb │ │ ├── exception.rb │ │ └── application_record.rb ├── assets │ ├── images │ │ └── eyeloupe │ │ │ ├── .keep │ │ │ └── logo.png │ ├── config │ │ └── eyeloupe_manifest.js │ ├── javascripts │ │ └── eyeloupe │ │ │ ├── application.js │ │ │ └── controllers │ │ │ ├── application.js │ │ │ ├── eyeloupe │ │ │ ├── nav_controller.js │ │ │ ├── search_controller.js │ │ │ ├── pause_controller.js │ │ │ ├── ai_assistant_controller.js │ │ │ └── refresh_controller.js │ │ │ └── index.js │ ├── stylesheets │ │ ├── eyeloupe │ │ │ └── application.css │ │ └── application.tailwind.css │ └── builds │ │ └── eyeloupe.css ├── controllers │ ├── concerns │ │ ├── .keep │ │ └── eyeloupe │ │ │ └── searchable.rb │ └── eyeloupe │ │ ├── data_controller.rb │ │ ├── application_controller.rb │ │ ├── configs_controller.rb │ │ ├── in_requests_controller.rb │ │ ├── jobs_controller.rb │ │ ├── out_requests_controller.rb │ │ ├── exceptions_controller.rb │ │ └── ai_assistant_responses_controller.rb ├── helpers │ └── eyeloupe │ │ ├── jobs_helper.rb │ │ ├── application_helper.rb │ │ └── request_helper.rb ├── jobs │ └── eyeloupe │ │ └── application_job.rb ├── mailers │ └── eyeloupe │ │ └── application_mailer.rb └── views │ ├── eyeloupe │ ├── exceptions │ │ ├── index.html.erb │ │ ├── _frame.html.erb │ │ └── show.html.erb │ ├── shared │ │ ├── _verb.html.erb │ │ ├── _status_code.html.erb │ │ └── _job_status.html.erb │ ├── jobs │ │ ├── index.html.erb │ │ ├── _frame.html.erb │ │ └── show.html.erb │ ├── in_requests │ │ ├── index.html.erb │ │ ├── _frame.html.erb │ │ └── show.html.erb │ └── out_requests │ │ ├── index.html.erb │ │ ├── _frame.html.erb │ │ └── show.html.erb │ └── layouts │ └── eyeloupe │ └── application.html.erb ├── doc └── img │ ├── screen.png │ └── ai-assistant.gif ├── lib ├── eyeloupe │ ├── version.rb │ ├── concerns │ │ └── rescuable.rb │ ├── configuration.rb │ ├── processors │ │ ├── out_request.rb │ │ ├── exception.rb │ │ ├── job.rb │ │ └── in_request.rb │ ├── request_middleware.rb │ └── engine.rb ├── tasks │ └── eyeloupe_tasks.rake └── eyeloupe.rb ├── Rakefile ├── .gitignore ├── Gemfile ├── config ├── importmap.rb ├── routes.rb └── tailwind.config.js ├── db └── migrate │ ├── 20230525125352_create_eyeloupe_out_requests.rb │ ├── 20230827161224_create_eyeloupe_jobs.rb │ ├── 20230518175305_create_eyeloupe_in_requests.rb │ └── 20230604190442_create_eyeloupe_exceptions.rb ├── CHANGELOG.md ├── bin └── rails ├── MIT-LICENSE ├── eyeloupe.gemspec ├── .github └── workflows │ └── ruby.yml ├── Gemfile.lock └── README.md /test/helpers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/mailers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/models/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/controllers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/log/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/integration/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/models/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/lib/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/fixtures/files/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/assets/images/eyeloupe/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/controllers/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/app/assets/images/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/app/models/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/public/apple-touch-icon.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/app/controllers/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/public/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/app/views/layouts/mailer.text.erb: -------------------------------------------------------------------------------- 1 | <%= yield %> 2 | -------------------------------------------------------------------------------- /test/dummy/app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | module ApplicationHelper 2 | end -------------------------------------------------------------------------------- /doc/img/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alxlion/eyeloupe/HEAD/doc/img/screen.png -------------------------------------------------------------------------------- /app/helpers/eyeloupe/jobs_helper.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | module JobsHelper 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /doc/img/ai-assistant.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alxlion/eyeloupe/HEAD/doc/img/ai-assistant.gif -------------------------------------------------------------------------------- /lib/eyeloupe/version.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | # @return [String] 3 | VERSION = "0.4.0" 4 | end 5 | -------------------------------------------------------------------------------- /test/dummy/app/controllers/application_controller.rb: -------------------------------------------------------------------------------- 1 | class ApplicationController < ActionController::Base 2 | end 3 | -------------------------------------------------------------------------------- /test/dummy/config/routes.rb: -------------------------------------------------------------------------------- 1 | Rails.application.routes.draw do 2 | mount Eyeloupe::Engine => "/eyeloupe" 3 | end 4 | -------------------------------------------------------------------------------- /app/assets/images/eyeloupe/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alxlion/eyeloupe/HEAD/app/assets/images/eyeloupe/logo.png -------------------------------------------------------------------------------- /app/jobs/eyeloupe/application_job.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | class ApplicationJob < ActiveJob::Base 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /test/dummy/bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require_relative "../config/boot" 3 | require "rake" 4 | Rake.application.run 5 | -------------------------------------------------------------------------------- /app/assets/config/eyeloupe_manifest.js: -------------------------------------------------------------------------------- 1 | //= link_tree ../builds/ .css 2 | //= link_tree ../images 3 | //= link_tree ../javascripts .js -------------------------------------------------------------------------------- /test/dummy/app/models/application_record.rb: -------------------------------------------------------------------------------- 1 | class ApplicationRecord < ActiveRecord::Base 2 | primary_abstract_class 3 | end 4 | -------------------------------------------------------------------------------- /app/helpers/eyeloupe/application_helper.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | module ApplicationHelper 3 | include Pagy::Frontend 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /test/dummy/app/assets/config/manifest.js: -------------------------------------------------------------------------------- 1 | //= link_tree ../images 2 | //= link_directory ../stylesheets .css 3 | //= link eyeloupe_manifest.js 4 | -------------------------------------------------------------------------------- /test/dummy/app/channels/application_cable/channel.rb: -------------------------------------------------------------------------------- 1 | module ApplicationCable 2 | class Channel < ActionCable::Channel::Base 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /test/dummy/app/channels/application_cable/connection.rb: -------------------------------------------------------------------------------- 1 | module ApplicationCable 2 | class Connection < ActionCable::Connection::Base 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /test/dummy/app/mailers/application_mailer.rb: -------------------------------------------------------------------------------- 1 | class ApplicationMailer < ActionMailer::Base 2 | default from: "from@example.com" 3 | layout "mailer" 4 | end 5 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/eyeloupe.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | Eyeloupe.configure do |config| 4 | config.excluded_paths = %w[assets] 5 | end -------------------------------------------------------------------------------- /test/models/eyeloupe/out_request_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | module Eyeloupe 4 | class OutRequestTest < ActiveSupport::TestCase 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /test/models/eyeloupe/in_request_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | module Eyeloupe 4 | class InRequestTest < ActiveSupport::TestCase 5 | 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/models/eyeloupe/in_request.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | class InRequest < ApplicationRecord 3 | has_one :exception, class_name: "Eyeloupe::Exception" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/models/eyeloupe/out_request.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | class OutRequest < ApplicationRecord 3 | has_one :exception, class_name: "Eyeloupe::Exception" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /test/dummy/bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_PATH = File.expand_path("../config/application", __dir__) 3 | require_relative "../config/boot" 4 | require "rails/commands" 5 | -------------------------------------------------------------------------------- /test/dummy/config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require_relative "application" 3 | 4 | # Initialize the Rails application. 5 | Rails.application.initialize! 6 | -------------------------------------------------------------------------------- /app/assets/javascripts/eyeloupe/application.js: -------------------------------------------------------------------------------- 1 | import "@hotwired/turbo-rails" 2 | import "eyeloupe/controllers" 3 | 4 | import { Turbo } from "@hotwired/turbo-rails" 5 | window.Turbo = Turbo -------------------------------------------------------------------------------- /app/mailers/eyeloupe/application_mailer.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | class ApplicationMailer < ActionMailer::Base 3 | default from: "from@example.com" 4 | layout "mailer" 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /test/integration/navigation_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | class NavigationTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/dummy/config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require_relative "config/environment" 4 | 5 | run Rails.application 6 | Rails.application.load_server 7 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/setup" 2 | 3 | APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__) 4 | load "rails/tasks/engine.rake" 5 | 6 | load "rails/tasks/statistics.rake" 7 | 8 | require "bundler/gem_tasks" -------------------------------------------------------------------------------- /app/models/eyeloupe/job.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | class Job < ApplicationRecord 3 | validates :job_id, uniqueness: true 4 | 5 | enum status: [:enqueued, :running, :completed, :failed, :discarded] 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /test/models/eyeloupe/job_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | module Eyeloupe 4 | class JobTest < ActiveSupport::TestCase 5 | # test "the truth" do 6 | # assert true 7 | # end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /test/models/eyeloupe/exception_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | module Eyeloupe 4 | class ExceptionTest < ActiveSupport::TestCase 5 | # test "the truth" do 6 | # assert true 7 | # end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/models/eyeloupe/exception.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | class Exception < ApplicationRecord 3 | has_one :in_request, class_name: "Eyeloupe::InRequest" 4 | has_one :out_request, class_name: "Eyeloupe::OutRequest" 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /log/*.log 3 | /pkg/ 4 | /tmp/ 5 | /test/dummy/db/*.sqlite3 6 | /test/dummy/db/*.sqlite3-* 7 | /test/dummy/log/*.log 8 | /test/dummy/storage/ 9 | /test/dummy/tmp/ 10 | /.gem_rbs_collection/ 11 | .DS_Store 12 | .idea/ 13 | -------------------------------------------------------------------------------- /test/dummy/config/cable.yml: -------------------------------------------------------------------------------- 1 | development: 2 | adapter: async 3 | 4 | test: 5 | adapter: test 6 | 7 | production: 8 | adapter: redis 9 | url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> 10 | channel_prefix: dummy_production 11 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | git_source(:github) { |repo| "https://github.com/#{repo}.git" } 3 | 4 | gem 'rubocop', group: 'development', require: false 5 | gem "sqlite3" 6 | gem "sprockets-rails" 7 | gem "pagy" 8 | gem "turbo-rails" 9 | 10 | gemspec -------------------------------------------------------------------------------- /test/dummy/Rakefile: -------------------------------------------------------------------------------- 1 | # Add your own tasks in files placed in lib/tasks ending in .rake, 2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 3 | 4 | require_relative "config/application" 5 | 6 | Rails.application.load_tasks 7 | -------------------------------------------------------------------------------- /test/dummy/config/boot.rb: -------------------------------------------------------------------------------- 1 | # Set up gems listed in the Gemfile. 2 | ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile", __dir__) 3 | 4 | require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"]) 5 | $LOAD_PATH.unshift File.expand_path("../../../lib", __dir__) 6 | -------------------------------------------------------------------------------- /app/assets/javascripts/eyeloupe/controllers/application.js: -------------------------------------------------------------------------------- 1 | import { Application } from "@hotwired/stimulus" 2 | 3 | const application = Application.start() 4 | 5 | // Configure Stimulus development experience 6 | application.debug = false 7 | window.Stimulus = application 8 | 9 | export { application } 10 | -------------------------------------------------------------------------------- /test/dummy/app/jobs/application_job.rb: -------------------------------------------------------------------------------- 1 | class ApplicationJob < ActiveJob::Base 2 | # Automatically retry jobs that encountered a deadlock 3 | # retry_on ActiveRecord::Deadlocked 4 | 5 | # Most jobs are safe to ignore if the underlying records are no longer available 6 | # discard_on ActiveJob::DeserializationError 7 | end 8 | -------------------------------------------------------------------------------- /test/dummy/app/views/layouts/mailer.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 8 | 9 | 10 | 11 | <%= yield %> 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/models/eyeloupe/application_record.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | class ApplicationRecord < ActiveRecord::Base 3 | self.abstract_class = true 4 | 5 | if Eyeloupe.configuration.database 6 | connects_to database: { writing: Eyeloupe.configuration.database.to_sym, reading: Eyeloupe.configuration.database.to_sym } 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /lib/eyeloupe/concerns/rescuable.rb: -------------------------------------------------------------------------------- 1 | module Eyeloupe 2 | module Concerns 3 | module Rescuable 4 | extend ActiveSupport::Concern 5 | 6 | included do 7 | rescue_from(StandardError) do |exception| 8 | Eyeloupe::Processors::Exception.instance.process(nil, exception) 9 | end 10 | end 11 | 12 | end 13 | end 14 | end -------------------------------------------------------------------------------- /app/assets/javascripts/eyeloupe/controllers/eyeloupe/nav_controller.js: -------------------------------------------------------------------------------- 1 | import { Controller } from "@hotwired/stimulus" 2 | 3 | export default class extends Controller { 4 | static targets = ["content"] 5 | 6 | close() { 7 | this.contentTarget.classList.add("hidden") 8 | } 9 | 10 | open() { 11 | this.contentTarget.classList.remove("hidden") 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/dummy/app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |All exceptions that have been raised in the application.
6 |All jobs running in your application
6 |All incoming request to your application
6 |All outbound HTTP requests made by your application
6 |If you are the application owner check the logs for more information.
64 |Maybe you tried to change something you didn't have access to.
63 |If you are the application owner check the logs for more information.
65 |You may have mistyped the address or the page may have moved.
63 |If you are the application owner check the logs for more information.
65 || Kind | 9 |Count | 10 |Occured | 11 |12 | Details 13 | | 14 |
|---|---|---|---|
|
20 | <%= ex.kind %>
21 | <%= ex.message.truncate(100) %> 22 | |
23 | <%= ex.count %> | 24 |<%= distance_of_time_in_words(ex.updated_at, DateTime.now) %> | 25 |26 | <%= link_to "Details", exception_path(ex), class: "text-gray-600 hover:text-gray-900", data: {"turbo_frame": "_top"} %> 27 | | 28 |
| Verb | 9 |Path | 10 |Status | 11 |Duration | 12 |Occurred | 13 |14 | Details 15 | | 16 |
|---|---|---|---|---|---|
| 22 | <%= render "eyeloupe/shared/verb", verb: request.verb %> 23 | | 24 |<%= request.path.truncate(100) %> | 25 |26 | <%= render "eyeloupe/shared/status_code", code: request.status %> 27 | | 28 |<%= request.duration %> ms | 29 |<%= distance_of_time_in_words(request.created_at, DateTime.now) %> | 30 |31 | <%= link_to "Details", in_request_path(request), class: "text-gray-600 hover:text-gray-900", data: {"turbo_frame": "_top"} %> 32 | | 33 |
| Name | 9 |Queue | 10 |Adapter | 11 |Status | 12 |Retry | 13 |Enqueued at | 14 |15 | Details 16 | | 17 |
|---|---|---|---|---|---|---|
| 23 | <%= job.classname %> 24 | | 25 |<%= job.queue_name %> | 26 |<%= job.adapter %> | 27 |28 | <%= render "eyeloupe/shared/job_status", job: job %> 29 | | 30 |<%= job.retry %> | 31 |<%= distance_of_time_in_words(job.created_at, DateTime.now) %> | 32 |33 | <%= link_to "Details", job_path(job), class: "text-gray-600 hover:text-gray-900", data: {"turbo_frame": "_top"} %> 34 | | 35 |
| Verb | 9 |Host | 10 |Path | 11 |Status | 12 |Duration | 13 |Occurred | 14 |15 | Details 16 | | 17 |
|---|---|---|---|---|---|---|
| 23 | <%= render "eyeloupe/shared/verb", verb: request.verb %> 24 | | 25 |<%= request.hostname %> | 26 |<%= request.path.truncate(100) %> | 27 |28 | <%= render "eyeloupe/shared/status_code", code: request.status %> 29 | | 30 |<%= request.duration %> ms | 31 |<%= distance_of_time_in_words(request.created_at, DateTime.now) %> | 32 |33 | <%= link_to "Details", out_request_path(request), class: "text-gray-600 hover:text-gray-900", data: {"turbo_frame": "_top"} %> 34 | | 35 |
<%= JSON.pretty_generate(JSON.parse(@job.args || "{}")) %>
56 | <% else %>
57 | No args
58 | <% end %> 59 |<%= format_payload @request %>44 | <% else %> 45 |
No payload
46 | <% end %> 47 |<%= JSON.pretty_generate(JSON.parse(@request.req_headers || "{}")) %>
53 | <%= JSON.pretty_generate(JSON.parse(@request.res_headers || "{}")) %>
59 | <%= format_response @request %>65 |
<%= @request.exception.message %>
80 |<%= format_payload @request %>57 | <% else %> 58 |
No payload
59 | <% end %> 60 |<%= JSON.pretty_generate(JSON.parse(@request.headers || "{}")) %>
66 | <%= JSON.pretty_generate(JSON.parse(@request.session || "{}")) %>
72 | <%= format_response @request %>78 |
<%= @request.exception.message %>
93 |<%= @exception.message %>49 |
<%= JSON.parse(@exception.stacktrace).join("\n") %>
55 | <%= @exception.file %>
61 | <% JSON.parse(@exception.location).each_with_index do |line, i| %> 62 |<%= line %>
65 |
15 |
16 |
17 |
20 | The elegant Rails debug assistant. AI powered.
21 |
22 | Report Bug
23 | ·
24 | Request Feature
25 |