railscope 0.1.8 → 0.1.9
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 +4 -4
- data/lib/railscope/flush_service.rb +35 -1
- data/lib/railscope/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 259570e86e958b91b577337b9b1dd6f57f667f72999589a3976b9a86a3450c78
|
|
4
|
+
data.tar.gz: bbf6d0de9fdce6901383c8d60c39c07310a3da0d64593904d55a85412deba2b1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2d358d6d57809e3b6d30bebfab973060d8c3086a929c8d47dd3fc230be5ad72f0cca7ed84f0431466b80f3b5d863e8f1d37c0d26eb6df14301d7ef307fcc05a5
|
|
7
|
+
data.tar.gz: 41b79ac66a21145f5ca9fe18a07a6706bf06751a87eb26bd1739a816526d7e851c43d784146cb2bf6391ce47e7e73bbfe91443e883e8f868d45a039e30b66dec
|
|
@@ -4,7 +4,8 @@ module Railscope
|
|
|
4
4
|
class FlushService
|
|
5
5
|
BUFFER_KEY = "railscope:buffer"
|
|
6
6
|
UPDATES_KEY = "railscope:buffer:updates"
|
|
7
|
-
BATCH_SIZE =
|
|
7
|
+
BATCH_SIZE = 100
|
|
8
|
+
MAX_RETRIES = 3
|
|
8
9
|
|
|
9
10
|
def self.call
|
|
10
11
|
new.call
|
|
@@ -20,6 +21,7 @@ module Railscope
|
|
|
20
21
|
|
|
21
22
|
def flush_entries
|
|
22
23
|
total = 0
|
|
24
|
+
retries = 0
|
|
23
25
|
|
|
24
26
|
loop do
|
|
25
27
|
batch = pop_batch(BUFFER_KEY)
|
|
@@ -28,12 +30,25 @@ module Railscope
|
|
|
28
30
|
entries = batch.map { |json| JSON.parse(json, symbolize_names: true) }
|
|
29
31
|
batch_insert_to_database(entries)
|
|
30
32
|
total += entries.size
|
|
33
|
+
retries = 0
|
|
34
|
+
rescue Redis::BaseError => e
|
|
35
|
+
retries += 1
|
|
36
|
+
if retries <= MAX_RETRIES
|
|
37
|
+
Rails.logger.warn("[Railscope] Redis connection lost during flush, reconnecting (attempt #{retries}/#{MAX_RETRIES})...")
|
|
38
|
+
reconnect_redis!
|
|
39
|
+
retry
|
|
40
|
+
else
|
|
41
|
+
Rails.logger.error("[Railscope] Redis flush failed after #{MAX_RETRIES} retries (flushed #{total} entries): #{e.message}")
|
|
42
|
+
break
|
|
43
|
+
end
|
|
31
44
|
end
|
|
32
45
|
|
|
33
46
|
total
|
|
34
47
|
end
|
|
35
48
|
|
|
36
49
|
def apply_pending_updates
|
|
50
|
+
retries = 0
|
|
51
|
+
|
|
37
52
|
loop do
|
|
38
53
|
batch = pop_batch(UPDATES_KEY)
|
|
39
54
|
break if batch.empty?
|
|
@@ -42,6 +57,17 @@ module Railscope
|
|
|
42
57
|
update = JSON.parse(json, symbolize_names: true)
|
|
43
58
|
apply_update(update)
|
|
44
59
|
end
|
|
60
|
+
retries = 0
|
|
61
|
+
rescue Redis::BaseError => e
|
|
62
|
+
retries += 1
|
|
63
|
+
if retries <= MAX_RETRIES
|
|
64
|
+
Rails.logger.warn("[Railscope] Redis connection lost during updates, reconnecting (attempt #{retries}/#{MAX_RETRIES})...")
|
|
65
|
+
reconnect_redis!
|
|
66
|
+
retry
|
|
67
|
+
else
|
|
68
|
+
Rails.logger.error("[Railscope] Redis updates failed after #{MAX_RETRIES} retries: #{e.message}")
|
|
69
|
+
break
|
|
70
|
+
end
|
|
45
71
|
end
|
|
46
72
|
end
|
|
47
73
|
|
|
@@ -85,6 +111,14 @@ module Railscope
|
|
|
85
111
|
redis.lpop(key, BATCH_SIZE) || []
|
|
86
112
|
end
|
|
87
113
|
|
|
114
|
+
def reconnect_redis!
|
|
115
|
+
Railscope.redis&.close
|
|
116
|
+
rescue StandardError
|
|
117
|
+
# ignore
|
|
118
|
+
ensure
|
|
119
|
+
Railscope.instance_variable_set(:@redis, nil)
|
|
120
|
+
end
|
|
121
|
+
|
|
88
122
|
def redis
|
|
89
123
|
Railscope.redis
|
|
90
124
|
end
|
data/lib/railscope/version.rb
CHANGED