log_bench 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c3190dc4200c7efbd8150e719d16f20cef759621301a498d943958b5b2e805f
4
- data.tar.gz: c6dc926d7593d396cc9b4eb298a81009080545fafa56a68031728970c304117d
3
+ metadata.gz: 617bb4c585973c40149ffc5f58eba322446aa997a324515517269af591e88c02
4
+ data.tar.gz: 613d94f2d455abd75a523ebbf0f3c8aeafd5993657f5f4281c8d841c9e8af097
5
5
  SHA512:
6
- metadata.gz: 205d48a20a22a4fe91aaf5b31daacc304bee3a95431c38e90db5d393fe7f7c3deeec4e3987594a62caa5f5bed5fb49e512ef454db1440561cb9d7c3a57bcf9c6
7
- data.tar.gz: 16e125666602e1eee53f84542ae82cf6da79d18dd3e03f6ee39090e999e441399c7f8ed7f7a041158c412bce38ec61dc76cdc70ee5eafbf36873f36bb050e907
6
+ metadata.gz: 57aac276e8b98a7551b2f4dfa75df88c21723eb798aeedbd338d2323346902eaef3439a9a338dd4dfd6cd528361d3ebc950f404997a7a357f2643b7f0611a3cf
7
+ data.tar.gz: e1ee5e4e719aff224c76a3485212df6a91aa1565ad192e834a92d51040a3b10a3055222fec79129c73af96d3f5692c1b8c1b7547b0cfffed54f02bffe1bc308b
data/README.md CHANGED
@@ -64,7 +64,7 @@ if defined?(LogBench)
64
64
  # config.show_init_message = :min # :full, :min, or :none (default: :full)
65
65
 
66
66
  # Specify which controllers to inject request_id tracking
67
- # config.base_controller_classes = %w[CustomBaseController] # (default: %w[ApplicationController, ActionController::Base])
67
+ # config.base_controller_classes = %w[CustomBaseController] # (default: %w[ApplicationController ActionController::Base])
68
68
  end
69
69
  end
70
70
  ```
@@ -32,6 +32,7 @@ module LogBench
32
32
  begin
33
33
  log_file.watch do |new_collection|
34
34
  add_new_requests(new_collection.requests)
35
+ add_orphan_requests(new_collection.orphan_requests)
35
36
  end
36
37
  rescue
37
38
  sleep 1
@@ -46,6 +47,23 @@ module LogBench
46
47
  keep_recent_requests
47
48
  end
48
49
 
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
+
49
67
  def keep_recent_requests
50
68
  # Keep only the last 1000 requests to prevent memory issues
51
69
  state.requests = state.requests.last(1000) if state.requests.size > 1000
@@ -4,10 +4,11 @@ module LogBench
4
4
  module App
5
5
  class State
6
6
  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
8
8
 
9
9
  def initialize
10
10
  self.requests = []
11
+ self.orphan_requests = []
11
12
  self.selected = 0
12
13
  self.scroll_offset = 0
13
14
  self.auto_scroll = true
@@ -11,10 +11,6 @@ module LogBench
11
11
  self.entries = parse_input(input)
12
12
  end
13
13
 
14
- def each(&block)
15
- entries.each(&block)
16
- end
17
-
18
14
  def size
19
15
  entries.size
20
16
  end
@@ -24,7 +20,11 @@ module LogBench
24
20
  end
25
21
 
26
22
  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 }
28
28
  end
29
29
 
30
30
  def filter_by_method(method)
@@ -57,10 +57,6 @@ module LogBench
57
57
  create_collection_from_requests(sorted_requests)
58
58
  end
59
59
 
60
- def to_a
61
- entries
62
- end
63
-
64
60
  private
65
61
 
66
62
  def create_collection_from_requests(requests)
@@ -43,8 +43,7 @@ module LogBench
43
43
  grouped.each do |request_id, entries|
44
44
  next unless request_id
45
45
 
46
- request = find_request_entry(entries)
47
- next unless request
46
+ request = find_request_entry(entries) || Request.new_orphan(request_id)
48
47
 
49
48
  related_logs = find_related_logs(entries)
50
49
  related_logs.each { |log| request.add_related_log(log) }
@@ -3,10 +3,10 @@
3
3
  module LogBench
4
4
  module Log
5
5
  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
7
7
 
8
- def initialize(json_data)
9
- super
8
+ def initialize(json_data, orphan: false)
9
+ super(json_data)
10
10
  self.type = :http_request
11
11
  self.related_logs = []
12
12
  self.method = json_data["method"]
@@ -16,6 +16,11 @@ module LogBench
16
16
  self.controller = json_data["controller"]
17
17
  self.action = json_data["action"]
18
18
  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)
19
24
  end
20
25
 
21
26
  def add_related_log(log_entry)
@@ -63,7 +68,7 @@ module LogBench
63
68
 
64
69
  private
65
70
 
66
- attr_writer :method, :path, :status, :duration, :controller, :action, :params
71
+ attr_writer :method, :path, :status, :duration, :controller, :action, :params, :orphan
67
72
 
68
73
  def related_logs=(value)
69
74
  @related_logs = value
@@ -48,6 +48,7 @@ module LogBench
48
48
  if LogBench.configuration.enabled
49
49
  LogBench::Railtie.setup_rails_logger_final
50
50
  LogBench::Railtie.setup_current_attributes
51
+ LogBench::Railtie.setup_sidekiq_middleware
51
52
  LogBench::Railtie.validate_configuration!
52
53
  end
53
54
  end
@@ -96,6 +97,13 @@ module LogBench
96
97
  end
97
98
  end
98
99
 
100
+ def setup_sidekiq_middleware
101
+ return unless defined?(Sidekiq)
102
+
103
+ require "sidekiq/middleware/current_attributes"
104
+ Sidekiq::CurrentAttributes.persist("LogBench::Current")
105
+ end
106
+
99
107
  # Validate that LogBench setup worked correctly
100
108
  def validate_configuration!
101
109
  ConfigurationValidator.validate_rails_config!
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LogBench
4
- VERSION = "0.3.1"
4
+ VERSION = "0.4.1"
5
5
  end
data/lib/log_bench.rb CHANGED
@@ -20,6 +20,22 @@ module LogBench
20
20
  yield(configuration) if block_given?
21
21
  configuration
22
22
  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
23
39
  end
24
40
  end
25
41
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: log_bench
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamín Silva
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-09-09 00:00:00.000000000 Z
10
+ date: 2025-10-07 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: zeitwerk