railswatch_gem 0.1.3 → 0.1.4

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: a4ab7fecdace81bbd2d66eb61b06026abb547c6815fc59c67fb1137bd9aea0bd
4
- data.tar.gz: 68fccbf28d63b0f133bd9a5d9ef19d93263d913686b7526726aa3b0b170f75aa
3
+ metadata.gz: b46c253056a39e43ac5a606710eba79ec8685088111637d802580d3fa9d66388
4
+ data.tar.gz: 79146492b64604e69b19909338a0bf42892b13410b7ee49f9470715c4e8f5615
5
5
  SHA512:
6
- metadata.gz: d0bb1ccbf5d4a199990f9a20bb5ebc937a3eeccef63761d54cf301b1d29977672767ee9815cb7309788cfdcf01769118cde1b2528e70f7140d7f47817545c99c
7
- data.tar.gz: a757ce0625f2a52679d44a93c5b0ee13c188b66f304a76888396ede5e1d3c42f144bd2c813eadcd8aeb7c31593034ddd74c1aad6e113ce73ac50a1d10b4e1a05
6
+ metadata.gz: cc4617eb9907496f98e26384db7477fd0a10ffab8dd29462614436e9f284d50fed7c538b7dad3c1ac08cc94be9be952275e2c8dff6129c8ee03267fac45efe32
7
+ data.tar.gz: e29e08b277c75b8512290d734eb0cd9f3e3b16b112060019b12b01592dc8067d070387636e45b99e38feaaea9b13064e5e81d053f0524eaf7ad39644e8cb61a7
@@ -13,72 +13,97 @@ module RailswatchGem
13
13
  def start
14
14
  return unless defined?(::Rails) && ::Rails.logger
15
15
 
16
- target_logger = ::Rails.logger
17
- return if target_logger.respond_to?(:_railswatch_instrumented?)
16
+ # The "Sidecar" Pattern:
17
+ # Create a dedicated logger for Railswatch and broadcast to it.
18
+ railswatch_logger = RemoteLogger.new(@client)
18
19
 
19
- interceptor = create_interceptor(@client)
20
- target_logger.extend(interceptor)
20
+ if defined?(::ActiveSupport::BroadcastLogger) && ::Rails.logger.is_a?(::ActiveSupport::BroadcastLogger)
21
+ # Rails 7.1+: Native Broadcast
22
+ ::Rails.logger.broadcast_to(railswatch_logger)
23
+ elsif defined?(::ActiveSupport::Logger) && ::ActiveSupport::Logger.respond_to?(:broadcast)
24
+ # Rails 6.0 - 7.0: ActiveSupport Broadcast
25
+ ::Rails.logger.extend(::ActiveSupport::Logger.broadcast(railswatch_logger))
26
+ else
27
+ # Fallback: Manual Interceptor (This is what your spec hits)
28
+ attach_legacy_interceptor(::Rails.logger, railswatch_logger)
29
+ end
21
30
  end
22
31
 
23
32
  private
24
33
 
25
- def create_interceptor(client)
26
- Module.new do
27
- define_method(:_railswatch_client) { client }
28
- private :_railswatch_client
34
+ def attach_legacy_interceptor(target_logger, remote_logger)
35
+ return if target_logger.respond_to?(:_railswatch_instrumented?)
29
36
 
30
- def add(severity, message = nil, progname = nil, &block)
31
- if respond_to?(:level) && severity < level
32
- return super
37
+ interceptor = Module.new do
38
+ define_method(:add) do |severity, message = nil, progname = nil, &block|
39
+ # FIX: Check the main logger's level BEFORE forwarding.
40
+ # 'level' here refers to target_logger.level
41
+ if severity < level
42
+ return super(severity, message, progname, &block)
33
43
  end
34
44
 
35
- begin
36
- log_message = message
37
- if log_message.nil?
38
- if block_given?
39
- log_message = yield
40
- else
41
- log_message = progname
42
- end
43
- end
44
-
45
- # INFINITE LOOP PROTECTION
46
- unless log_message.to_s.include?("[Railswatch]")
47
- request_id = Thread.current[:railswatch_request_id]
48
-
49
- _railswatch_client.record({
50
- event_type: "log",
51
- timestamp: Time.now.utc.iso8601(6),
52
- severity: format_severity_level(severity),
53
- message: log_message.to_s,
54
- progname: progname,
55
- request_id: request_id
56
- })
57
- end
58
-
59
- super(severity, log_message, nil)
60
- rescue => e
61
- # Fail safe: don't crash the app if logging fails
62
- $stderr.puts "RailswatchGem: LogsInstrumenter error: #{e.message}"
63
- super
64
- end
65
- end
45
+ # Forward to our remote logger logic (safe, won't crash)
46
+ remote_logger.add(severity, message, progname, &block)
66
47
 
67
- def _railswatch_instrumented?
68
- true
48
+ # Proceed with original logging
49
+ super(severity, message, progname, &block)
69
50
  end
70
51
 
71
- private
52
+ def _railswatch_instrumented?; true; end
53
+ end
72
54
 
73
- def format_severity_level(severity)
74
- case severity
75
- when 0, ::Logger::DEBUG then "DEBUG"
76
- when 1, ::Logger::INFO then "INFO"
77
- when 2, ::Logger::WARN then "WARN"
78
- when 3, ::Logger::ERROR then "ERROR"
79
- when 4, ::Logger::FATAL then "FATAL"
80
- else "UNKNOWN"
81
- end
55
+ target_logger.extend(interceptor)
56
+ end
57
+
58
+ # --- Inner Class: The Actual Logger Logic ---
59
+ class RemoteLogger < ::Logger
60
+ def initialize(client)
61
+ @client = client
62
+ super(nil) # No IO output
63
+ self.level = DEBUG # Capture everything sent to us (filtering happens upstream)
64
+ end
65
+
66
+ def add(severity, message = nil, progname = nil, &block)
67
+ # 1. Message Resolution
68
+ content = message || (block&.call) || progname
69
+
70
+ # 2. Guard Clauses
71
+ return true if content.nil?
72
+
73
+ str_message = content.to_s.strip
74
+ return true if str_message.empty?
75
+ return true if str_message.include?("[Railswatch]")
76
+
77
+ # 3. Record
78
+ record_log(severity, str_message, progname)
79
+
80
+ true
81
+ rescue => e
82
+ $stderr.puts "RailswatchGem: Logs error: #{e.message}"
83
+ true
84
+ end
85
+
86
+ private
87
+
88
+ def record_log(severity, message, progname)
89
+ @client.record({
90
+ event_type: "log",
91
+ timestamp: Time.now.utc.iso8601(6),
92
+ severity: format_severity_level(severity),
93
+ message: message,
94
+ progname: progname,
95
+ request_id: Thread.current[:railswatch_request_id]
96
+ })
97
+ end
98
+
99
+ def format_severity_level(severity)
100
+ case severity
101
+ when 0, ::Logger::DEBUG then "DEBUG"
102
+ when 1, ::Logger::INFO then "INFO"
103
+ when 2, ::Logger::WARN then "WARN"
104
+ when 3, ::Logger::ERROR then "ERROR"
105
+ when 4, ::Logger::FATAL then "FATAL"
106
+ else "UNKNOWN"
82
107
  end
83
108
  end
84
109
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailswatchGem
4
- VERSION = "0.1.3"
4
+ VERSION = "0.1.4"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: railswatch_gem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Hammett