legionio 1.4.45 → 1.4.47

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: 7915294130831737224c3d34264ee4687251f338b30ba1703ec5649cd045fff2
4
- data.tar.gz: 2561c25ca2abfd8bd8cf6a154b29122f6157b8785ed376509b23b4a3b2fc38d2
3
+ metadata.gz: 61d1b58d973cadaa88f3236a2d191452324ce20721fb6a41bf9b08488e077754
4
+ data.tar.gz: '09129066576304957d34a58a8c54731e8228b3d5a45603592ee9b9ce10f72c55'
5
5
  SHA512:
6
- metadata.gz: 2129142bd86c0a7b39686d4f4c025eda3139296d1ee3a2d44ae5c80e67aa4ef85d5cbcca8424188028136cc1438946c5c6e717cb511b90d224394d49aa88d37a
7
- data.tar.gz: e77f6aca567e9b3f6ba08509b928237771e85ff4433dc767ef24cf3f0113e8dda97d98491efab37846c5265657c5bf8071a41ec1cdbc4e791d58c88dc67b7be1
6
+ metadata.gz: 4e9bfacc58941fb83fe9725779d8a500b514e483dfd84dc759a7184e548b43379252c638007ced10de99164ee749cc9dd7a33134e31e4c0bd8605e6307648d8f
7
+ data.tar.gz: 989f282c012adb51747e8bbb143e29eabf1c213fd0ad7b531737f98cb948791a6e163c13fa5c1a73d0a5da20efa4cfabad237d90e0e3adbaa21d05c2a8cbc5dc
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Legion Changelog
2
2
 
3
+ ## [1.4.47] - 2026-03-17
4
+
5
+ ### Fixed
6
+ - `gem_load` rescue block referenced undefined `gem_path` variable, causing secondary NameError that masked original LoadError
7
+ - `meta_actors` type guard checked `is_a?(Array)` but called `each_value` (Hash method), so meta actors were never hooked
8
+ - `build_actor_list` crashed entire extension load when actor file didn't define expected constant (now skips gracefully)
9
+ - `build_transport` raised NoMethodError on extensions with custom Transport modules missing `build` (now falls back to auto-generate)
10
+
11
+ ## [1.4.46] - 2026-03-17
12
+
13
+ ### Added
14
+ - `Legion::Telemetry.configure_exporter`: OTLP and console span exporters
15
+ - OTLP exporter uses BatchSpanProcessor for production performance
16
+ - Settings: `telemetry.tracing.exporter`, `endpoint`, `headers`, `batch_size`
17
+ - Graceful fallback when opentelemetry-exporter-otlp gem absent
18
+
3
19
  ## [1.4.45] - 2026-03-17
4
20
 
5
21
  ### Added
@@ -21,6 +21,10 @@ module Legion
21
21
  actor_files.each do |file|
22
22
  actor_name = file.split('/').last.sub('.rb', '')
23
23
  actor_class = "#{lex_class}::Actor::#{actor_name.split('_').collect(&:capitalize).join}"
24
+ unless Kernel.const_defined?(actor_class)
25
+ Legion::Logging.warn "Actor constant #{actor_class} not defined, skipping"
26
+ next
27
+ end
24
28
  @actors[actor_name.to_sym] = {
25
29
  extension: lex_class.to_s.downcase,
26
30
  extension_name: extension_name,
@@ -92,13 +92,19 @@ module Legion
92
92
  require "#{extension_path}/transport/autobuild"
93
93
  extension_class::Transport::AutoBuild.build
94
94
  log.warn 'still using transport::autobuild, please upgrade'
95
- elsif File.exist? "#{extension_path}/transport.rb"
95
+ return
96
+ end
97
+
98
+ if File.exist? "#{extension_path}/transport.rb"
96
99
  require "#{extension_path}/transport"
97
- extension_class::Transport.build
100
+ unless extension_class::Transport.respond_to?(:build)
101
+ log.warn "#{extension_class}::Transport does not respond to build, auto-generating"
102
+ auto_generate_transport
103
+ end
98
104
  else
99
105
  auto_generate_transport
100
- extension_class::Transport.build
101
106
  end
107
+ extension_class::Transport.build
102
108
  end
103
109
 
104
110
  def build_settings
@@ -108,7 +108,7 @@ module Legion
108
108
  require 'legion/transport/messages/lex_register'
109
109
  Legion::Transport::Messages::LexRegister.new(function: 'save', opts: extension.runners).publish
110
110
 
111
- if extension.respond_to?(:meta_actors) && extension.meta_actors.is_a?(Array)
111
+ if extension.respond_to?(:meta_actors) && extension.meta_actors.is_a?(Hash)
112
112
  extension.meta_actors.each_value do |actor|
113
113
  extension.log.debug("hooking meta actor: #{actor}") if has_logger
114
114
  hook_actor(**actor)
@@ -199,12 +199,13 @@ module Legion
199
199
  end
200
200
 
201
201
  def gem_load(gem_name, name)
202
- require "#{Gem::Specification.find_by_name(gem_name).gem_dir}/lib/legion/extensions/#{name}"
202
+ gem_dir = Gem::Specification.find_by_name(gem_name).gem_dir
203
+ require "#{gem_dir}/lib/legion/extensions/#{name}"
203
204
  true
204
205
  rescue LoadError => e
205
206
  Legion::Logging.error e.message
206
207
  Legion::Logging.error e.backtrace
207
- Legion::Logging.error "gem_path: #{gem_path}" unless gem_path.nil?
208
+ Legion::Logging.error "gem_path: #{gem_dir}" if defined?(gem_dir) && gem_dir
208
209
  false
209
210
  end
210
211
 
@@ -56,10 +56,67 @@ module Legion
56
56
  {}
57
57
  end
58
58
 
59
+ def configure_exporter
60
+ backend = tracing_settings[:exporter]&.to_sym || :none
61
+
62
+ case backend
63
+ when :otlp
64
+ configure_otlp
65
+ when :console
66
+ configure_console
67
+ end
68
+ end
69
+
70
+ def tracing_settings
71
+ telemetry = Legion::Settings[:telemetry]
72
+ return {} unless telemetry.is_a?(Hash)
73
+
74
+ tracing = telemetry[:tracing]
75
+ tracing.is_a?(Hash) ? tracing : {}
76
+ rescue StandardError
77
+ {}
78
+ end
79
+
59
80
  def otel_init_error?(error)
60
81
  error.message.include?('OpenTelemetry') || error.message.include?('tracer')
61
82
  rescue StandardError
62
83
  false
63
84
  end
85
+
86
+ def configure_otlp
87
+ require 'opentelemetry-exporter-otlp'
88
+
89
+ endpoint = tracing_settings[:endpoint] || 'http://localhost:4318/v1/traces'
90
+ headers = tracing_settings[:headers] || {}
91
+
92
+ exporter = OpenTelemetry::Exporter::OTLP::Exporter.new(
93
+ endpoint: endpoint,
94
+ headers: headers
95
+ )
96
+
97
+ processor = OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
98
+ exporter,
99
+ max_queue_size: 2048,
100
+ max_export_batch_size: tracing_settings[:batch_size] || 512
101
+ )
102
+
103
+ OpenTelemetry.tracer_provider.add_span_processor(processor)
104
+ Legion::Logging.info "OTLP exporter configured: #{endpoint}"
105
+ true
106
+ rescue LoadError
107
+ Legion::Logging.warn 'opentelemetry-exporter-otlp gem not available'
108
+ false
109
+ end
110
+
111
+ def configure_console
112
+ return false unless defined?(OpenTelemetry::SDK::Trace::Export::ConsoleSpanExporter)
113
+
114
+ exporter = OpenTelemetry::SDK::Trace::Export::ConsoleSpanExporter.new
115
+ processor = OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(exporter)
116
+ OpenTelemetry.tracer_provider.add_span_processor(processor)
117
+ true
118
+ rescue StandardError
119
+ false
120
+ end
64
121
  end
65
122
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Legion
4
- VERSION = '1.4.45'
4
+ VERSION = '1.4.47'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legionio
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.45
4
+ version: 1.4.47
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity