lex-telemetry 0.1.2 → 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 +4 -4
- data/CHANGELOG.md +19 -0
- data/Gemfile +2 -0
- data/lex-telemetry.gemspec +2 -0
- data/lib/legion/extensions/telemetry/actors/region_reporter.rb +39 -0
- data/lib/legion/extensions/telemetry/runners/telemetry.rb +67 -0
- data/lib/legion/extensions/telemetry/version.rb +1 -1
- metadata +16 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 783eceb3850cecfce20c43c308552378cf9c974c41c00ef9c977c55bd0f878fd
|
|
4
|
+
data.tar.gz: 06ac5a8ea95873f8936e0e8155f0563e622bbff9d21053bab0d8dada2aedb0b5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f35fe3b501776e7fa383bb4cff16b06a17ef388ba3d0dafddb6e1ffcc7c62d98d2376d3a87e55fe93d344739ed3860cbbb34e9bdb61ae2126f47c5d69a923d81
|
|
7
|
+
data.tar.gz: f98c67177e37a991164b2e583b5cf36ef66dbfc851485c1fbb700924c4e256acd72649e4a72ffe2356965df50f64115ceb4d3e9a69c79567f08bd8ea78bcbe01
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.1.4] - 2026-03-21
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- `record_cross_region(from_region:, to_region:)`: thread-safe atomic counter for cross-region message routing
|
|
7
|
+
- `record_replication_lag(region:, lag_seconds:)`: stores latest replication lag sample per region
|
|
8
|
+
- `region_stats`: returns cross-region counters and replication lag samples
|
|
9
|
+
- `concurrent-ruby` runtime dependency for `Concurrent::AtomicFixnum` and `Concurrent::Hash`
|
|
10
|
+
- Subscription actor now records cross-region metrics when lex-telemetry is loaded
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- `RegionReporter` actor interval reduced from 120s to 60s
|
|
14
|
+
- `RegionReporter` now calls `region_stats` instead of `region_metrics`
|
|
15
|
+
|
|
16
|
+
## [0.1.3] - 2026-03-21
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- `region_metrics` runner method: reports current region, primary, failover, peers, affinity, and is_primary status
|
|
20
|
+
- `RegionReporter` actor: publishes region metrics every 120 seconds
|
|
21
|
+
|
|
3
22
|
## [0.1.2] - 2026-03-20
|
|
4
23
|
|
|
5
24
|
### Added
|
data/Gemfile
CHANGED
data/lex-telemetry.gemspec
CHANGED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Telemetry
|
|
6
|
+
module Actor
|
|
7
|
+
class RegionReporter < Legion::Extensions::Actors::Every
|
|
8
|
+
def runner_class
|
|
9
|
+
'Legion::Extensions::Telemetry::Runners::Telemetry'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def runner_function
|
|
13
|
+
'region_stats'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def time
|
|
17
|
+
60
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def run_now?
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def use_runner?
|
|
25
|
+
false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def check_subtask?
|
|
29
|
+
false
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def generate_task?
|
|
33
|
+
false
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'concurrent'
|
|
4
|
+
|
|
3
5
|
module Legion
|
|
4
6
|
module Extensions
|
|
5
7
|
module Telemetry
|
|
@@ -7,6 +9,34 @@ module Legion
|
|
|
7
9
|
module Telemetry
|
|
8
10
|
module_function
|
|
9
11
|
|
|
12
|
+
def cross_region_counters
|
|
13
|
+
@cross_region_counters ||= Concurrent::Hash.new { |h, k| h[k] = Concurrent::AtomicFixnum.new(0) }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def replication_lag_samples
|
|
17
|
+
@replication_lag_samples ||= Concurrent::Hash.new
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def record_cross_region(from_region:, to_region:, **_opts)
|
|
21
|
+
key = "#{from_region}->#{to_region}"
|
|
22
|
+
cross_region_counters[key].increment
|
|
23
|
+
{ success: true, key: key, count: cross_region_counters[key].value }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def record_replication_lag(region:, lag_seconds:, **_opts)
|
|
27
|
+
replication_lag_samples[region] = { lag_seconds: lag_seconds, recorded_at: Time.now.to_i }
|
|
28
|
+
{ success: true, region: region, lag_seconds: lag_seconds }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def region_stats(**_opts)
|
|
32
|
+
{
|
|
33
|
+
success: true,
|
|
34
|
+
cross_region: cross_region_counters.transform_values(&:value),
|
|
35
|
+
replication_lag: replication_lag_samples.dup,
|
|
36
|
+
timestamp: Time.now.to_i
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
|
|
10
40
|
SCAN_DIRS = [
|
|
11
41
|
File.expand_path('~/.claude/projects')
|
|
12
42
|
].freeze
|
|
@@ -129,6 +159,41 @@ module Legion
|
|
|
129
159
|
{ success: false, error: e.message }
|
|
130
160
|
end
|
|
131
161
|
|
|
162
|
+
def region_metrics(**_opts)
|
|
163
|
+
region_info = if defined?(Legion::Region)
|
|
164
|
+
{
|
|
165
|
+
current: Legion::Region.current,
|
|
166
|
+
primary: Legion::Region.primary,
|
|
167
|
+
failover: Legion::Region.failover,
|
|
168
|
+
peers: Legion::Region.peers
|
|
169
|
+
}
|
|
170
|
+
else
|
|
171
|
+
{ current: nil, primary: nil, failover: nil, peers: [] }
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
affinity = if defined?(Legion::Settings)
|
|
175
|
+
begin
|
|
176
|
+
Legion::Settings.dig(:region, :default_affinity)
|
|
177
|
+
rescue StandardError
|
|
178
|
+
'prefer_local'
|
|
179
|
+
end
|
|
180
|
+
else
|
|
181
|
+
'prefer_local'
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
is_primary = region_info[:current] && region_info[:current] == region_info[:primary]
|
|
185
|
+
|
|
186
|
+
{
|
|
187
|
+
success: true,
|
|
188
|
+
region: region_info,
|
|
189
|
+
default_affinity: affinity,
|
|
190
|
+
is_primary: is_primary,
|
|
191
|
+
timestamp: Time.now.to_i
|
|
192
|
+
}
|
|
193
|
+
rescue StandardError => e
|
|
194
|
+
{ success: false, error: e.message }
|
|
195
|
+
end
|
|
196
|
+
|
|
132
197
|
def privacy_mode?
|
|
133
198
|
if defined?(Legion::Settings) && Legion::Settings.respond_to?(:enterprise_privacy?)
|
|
134
199
|
Legion::Settings.enterprise_privacy?
|
|
@@ -141,6 +206,8 @@ module Legion
|
|
|
141
206
|
@event_store = nil
|
|
142
207
|
@parsers = nil
|
|
143
208
|
@high_water_mark = nil
|
|
209
|
+
@cross_region_counters = nil
|
|
210
|
+
@replication_lag_samples = nil
|
|
144
211
|
end
|
|
145
212
|
end
|
|
146
213
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-telemetry
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Esity
|
|
@@ -9,6 +9,20 @@ bindir: bin
|
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: concurrent-ruby
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '1.2'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '1.2'
|
|
12
26
|
- !ruby/object:Gem::Dependency
|
|
13
27
|
name: rake
|
|
14
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -100,6 +114,7 @@ files:
|
|
|
100
114
|
- lib/legion/extensions/telemetry.rb
|
|
101
115
|
- lib/legion/extensions/telemetry/actors/collector.rb
|
|
102
116
|
- lib/legion/extensions/telemetry/actors/publisher.rb
|
|
117
|
+
- lib/legion/extensions/telemetry/actors/region_reporter.rb
|
|
103
118
|
- lib/legion/extensions/telemetry/helpers/event_store.rb
|
|
104
119
|
- lib/legion/extensions/telemetry/helpers/high_water_mark.rb
|
|
105
120
|
- lib/legion/extensions/telemetry/helpers/scrubber.rb
|