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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 297c8cd758a46a949db0cc219413fe1d3640707b88a956a8523afe530f352c15
4
- data.tar.gz: 0b8eaeb3500a514ea1e8207915b8bb6cbdfdc61a67b074820cce4ff8e47c8102
3
+ metadata.gz: 783eceb3850cecfce20c43c308552378cf9c974c41c00ef9c977c55bd0f878fd
4
+ data.tar.gz: 06ac5a8ea95873f8936e0e8155f0563e622bbff9d21053bab0d8dada2aedb0b5
5
5
  SHA512:
6
- metadata.gz: 4c79f6fe97ec74a2067e29a195bda11ba1bfa318a496407c6daeb8bc8780f10fbc52fef86663c29c4f4c32ec16b7bf74ad96c7f860dfd9c8931e47f6d4ffdb95
7
- data.tar.gz: dba3f9f4671cfe42f263ec72855de99d9ca01aa039483b504044dd00a85bb57f985939a5170e7d18537c39edc98e490021552208dfc0b735343381e8401586fb
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
@@ -2,3 +2,5 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
  gemspec
5
+
6
+ gem 'concurrent-ruby'
@@ -28,6 +28,8 @@ Gem::Specification.new do |spec|
28
28
  end
29
29
  spec.require_paths = ['lib']
30
30
 
31
+ spec.add_dependency 'concurrent-ruby', '>= 1.2'
32
+
31
33
  spec.add_development_dependency 'rake'
32
34
  spec.add_development_dependency 'rspec'
33
35
  spec.add_development_dependency 'rubocop'
@@ -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
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Telemetry
6
- VERSION = '0.1.2'
6
+ VERSION = '0.1.4'
7
7
  end
8
8
  end
9
9
  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.2
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