Skip to content

Commit fc38eab

Browse files
authored
Sidekiq jobs support (silva96#50)
* - Add logger for better development debug - Take care of orphan logs (before their parent request exist, or after) - Add sidekiq jobs support * Fix standard
1 parent 45076a8 commit fc38eab

7 files changed

Lines changed: 58 additions & 16 deletions

File tree

‎lib/log_bench.rb‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,22 @@ def setup
2020
yield(configuration) if block_given?
2121
configuration
2222
end
23+
24+
def logger
25+
@logger ||= create_debug_logger
26+
end
27+
28+
private
29+
30+
def create_debug_logger
31+
require "logger"
32+
logger = Logger.new("logbench_log.log")
33+
logger.level = Logger::DEBUG
34+
logger.formatter = proc do |severity, datetime, _progname, msg|
35+
"[#{datetime.strftime("%Y-%m-%d %H:%M:%S")}] #{severity}: #{msg}\n"
36+
end
37+
logger
38+
end
2339
end
2440
end
2541

‎lib/log_bench/app/monitor.rb‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def monitor_loop
3232
begin
3333
log_file.watch do |new_collection|
3434
add_new_requests(new_collection.requests)
35+
add_orphan_requests(new_collection.orphan_requests)
3536
end
3637
rescue
3738
sleep 1
@@ -46,6 +47,23 @@ def add_new_requests(new_requests)
4647
keep_recent_requests
4748
end
4849

50+
def add_orphan_requests(orphan_requests)
51+
state.orphan_requests.concat(orphan_requests)
52+
return if state.orphan_requests.empty?
53+
54+
# Try to attach orphaned logs to existing requests and remove them if successful
55+
state.orphan_requests.reject! do |orphan_request|
56+
request = state.requests.find { |req| req.request_id == orphan_request.request_id }
57+
58+
if request
59+
orphan_request.related_logs.each { |log| request.add_related_log(log) }
60+
true # Remove this orphan request from the list
61+
else
62+
false # Keep this orphan request for later
63+
end
64+
end
65+
end
66+
4967
def keep_recent_requests
5068
# Keep only the last 1000 requests to prevent memory issues
5169
state.requests = state.requests.last(1000) if state.requests.size > 1000

‎lib/log_bench/app/state.rb‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ module LogBench
44
module App
55
class State
66
attr_reader :main_filter, :sort, :detail_filter, :cleared_requests
7-
attr_accessor :requests, :auto_scroll, :scroll_offset, :selected, :detail_scroll_offset, :detail_selected_entry, :text_selection_mode, :update_available, :update_version
7+
attr_accessor :requests, :orphan_requests, :auto_scroll, :scroll_offset, :selected, :detail_scroll_offset, :detail_selected_entry, :text_selection_mode, :update_available, :update_version
88

99
def initialize
1010
self.requests = []
11+
self.orphan_requests = []
1112
self.selected = 0
1213
self.scroll_offset = 0
1314
self.auto_scroll = true

‎lib/log_bench/log/collection.rb‎

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ def initialize(input)
1111
self.entries = parse_input(input)
1212
end
1313

14-
def each(&block)
15-
entries.each(&block)
16-
end
17-
1814
def size
1915
entries.size
2016
end
@@ -24,7 +20,11 @@ def empty?
2420
end
2521

2622
def requests
27-
entries.select { |entry| entry.is_a?(Request) }
23+
entries.select { |entry| entry.is_a?(Request) && !entry.orphan }
24+
end
25+
26+
def orphan_requests
27+
entries.select { |entry| entry.is_a?(Request) && entry.orphan }
2828
end
2929

3030
def filter_by_method(method)
@@ -57,10 +57,6 @@ def sort_by_timestamp
5757
create_collection_from_requests(sorted_requests)
5858
end
5959

60-
def to_a
61-
entries
62-
end
63-
6460
private
6561

6662
def create_collection_from_requests(requests)

‎lib/log_bench/log/parser.rb‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ def self.build_requests_from_groups(grouped)
4343
grouped.each do |request_id, entries|
4444
next unless request_id
4545

46-
request = find_request_entry(entries)
47-
next unless request
46+
request = find_request_entry(entries) || Request.new_orphan(request_id)
4847

4948
related_logs = find_related_logs(entries)
5049
related_logs.each { |log| request.add_related_log(log) }

‎lib/log_bench/log/request.rb‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
module LogBench
44
module Log
55
class Request < Entry
6-
attr_reader :method, :path, :status, :duration, :controller, :action, :params, :related_logs
6+
attr_reader :method, :path, :status, :duration, :controller, :action, :params, :related_logs, :orphan
77

8-
def initialize(json_data)
9-
super
8+
def initialize(json_data, orphan: false)
9+
super(json_data)
1010
self.type = :http_request
1111
self.related_logs = []
1212
self.method = json_data["method"]
@@ -16,6 +16,11 @@ def initialize(json_data)
1616
self.controller = json_data["controller"]
1717
self.action = json_data["action"]
1818
self.params = parse_params(json_data["params"])
19+
self.orphan = orphan
20+
end
21+
22+
def self.new_orphan(request_id)
23+
new({"request_id" => request_id}, orphan: true)
1924
end
2025

2126
def add_related_log(log_entry)
@@ -63,7 +68,7 @@ def server_error?
6368

6469
private
6570

66-
attr_writer :method, :path, :status, :duration, :controller, :action, :params
71+
attr_writer :method, :path, :status, :duration, :controller, :action, :params, :orphan
6772

6873
def related_logs=(value)
6974
@related_logs = value

‎lib/log_bench/railtie.rb‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class Railtie < Rails::Railtie
4848
if LogBench.configuration.enabled
4949
LogBench::Railtie.setup_rails_logger_final
5050
LogBench::Railtie.setup_current_attributes
51+
LogBench::Railtie.setup_sidekiq_middleware
5152
LogBench::Railtie.validate_configuration!
5253
end
5354
end
@@ -96,6 +97,12 @@ def set_current_request_id
9697
end
9798
end
9899

100+
def setup_sidekiq_middleware
101+
# Use Sidekiq's built-in CurrentAttributes middleware
102+
require "sidekiq/middleware/current_attributes"
103+
Sidekiq::CurrentAttributes.persist("LogBench::Current")
104+
end
105+
99106
# Validate that LogBench setup worked correctly
100107
def validate_configuration!
101108
ConfigurationValidator.validate_rails_config!

0 commit comments

Comments
 (0)