rage-rb 1.19.2 → 1.20.0
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/.rspec +1 -0
- data/Appraisals +19 -0
- data/CHANGELOG.md +15 -1
- data/CODE_OF_CONDUCT.md +13 -17
- data/Gemfile +3 -0
- data/README.md +60 -63
- data/Rakefile +14 -0
- data/lib/rage/all.rb +3 -0
- data/lib/rage/cable/cable.rb +11 -7
- data/lib/rage/cable/channel.rb +6 -1
- data/lib/rage/cable/connection.rb +4 -0
- data/lib/rage/cable/router.rb +14 -9
- data/lib/rage/configuration.rb +235 -21
- data/lib/rage/controller/api.rb +49 -44
- data/lib/rage/deferred/context.rb +30 -2
- data/lib/rage/deferred/deferred.rb +18 -6
- data/lib/rage/deferred/metadata.rb +39 -0
- data/lib/rage/deferred/middleware_chain.rb +67 -0
- data/lib/rage/deferred/task.rb +45 -17
- data/lib/rage/events/events.rb +3 -3
- data/lib/rage/events/subscriber.rb +36 -25
- data/lib/rage/fiber.rb +33 -31
- data/lib/rage/fiber_scheduler.rb +6 -2
- data/lib/rage/logger/logger.rb +7 -1
- data/lib/rage/middleware/body_finalizer.rb +14 -0
- data/lib/rage/response.rb +10 -5
- data/lib/rage/rspec.rb +17 -17
- data/lib/rage/setup.rb +2 -2
- data/lib/rage/telemetry/handler.rb +131 -0
- data/lib/rage/telemetry/spans/await_fiber.rb +50 -0
- data/lib/rage/telemetry/spans/broadcast_cable_stream.rb +50 -0
- data/lib/rage/telemetry/spans/create_websocket_connection.rb +50 -0
- data/lib/rage/telemetry/spans/dispatch_fiber.rb +48 -0
- data/lib/rage/telemetry/spans/enqueue_deferred_task.rb +52 -0
- data/lib/rage/telemetry/spans/process_cable_action.rb +56 -0
- data/lib/rage/telemetry/spans/process_cable_connection.rb +56 -0
- data/lib/rage/telemetry/spans/process_controller_action.rb +56 -0
- data/lib/rage/telemetry/spans/process_deferred_task.rb +54 -0
- data/lib/rage/telemetry/spans/process_event_subscriber.rb +54 -0
- data/lib/rage/telemetry/spans/publish_event.rb +54 -0
- data/lib/rage/telemetry/spans/spawn_fiber.rb +50 -0
- data/lib/rage/telemetry/telemetry.rb +121 -0
- data/lib/rage/telemetry/tracer.rb +97 -0
- data/lib/rage/version.rb +1 -1
- data/rage.gemspec +4 -3
- metadata +38 -5
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Rage::Telemetry::Tracer
|
|
4
|
+
DEFAULT_SPAN_RESULT = Rage::Telemetry::SpanResult.new.freeze
|
|
5
|
+
private_constant :DEFAULT_SPAN_RESULT
|
|
6
|
+
|
|
7
|
+
# @param spans_registry [Hash{String => Rage::Telemetry::Spans}]
|
|
8
|
+
# @param handlers_map [Hash{String => Array<Rage::Telemetry::HandlerRef>}]
|
|
9
|
+
def initialize(spans_registry, handlers_map)
|
|
10
|
+
@spans_registry = spans_registry
|
|
11
|
+
@handlers_map = handlers_map
|
|
12
|
+
|
|
13
|
+
@all_handler_refs = handlers_map.values.flatten
|
|
14
|
+
|
|
15
|
+
@spans_registry.each do |_, span|
|
|
16
|
+
setup_noop(span)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def setup
|
|
21
|
+
@handlers_map.each do |span_id, handler_refs|
|
|
22
|
+
setup_tracer(@spans_registry[span_id], handler_refs)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
# @param span [Rage::Telemetry::Spans]
|
|
29
|
+
def setup_noop(span)
|
|
30
|
+
parameters = span.span_parameters.join(", ")
|
|
31
|
+
|
|
32
|
+
self.class.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
|
33
|
+
def #{tracer_name(span.id)}(#{parameters})
|
|
34
|
+
yield
|
|
35
|
+
end
|
|
36
|
+
RUBY
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @param span [Rage::Telemetry::Spans]
|
|
40
|
+
# @param handler_refs [Array<Rage::Telemetry::HandlerRef>]
|
|
41
|
+
def setup_tracer(span, handler_refs)
|
|
42
|
+
yield_call = <<~RUBY
|
|
43
|
+
yield_called = true
|
|
44
|
+
yield_result = yield
|
|
45
|
+
span_result = DEFAULT_SPAN_RESULT
|
|
46
|
+
rescue Exception => e
|
|
47
|
+
yield_error = e
|
|
48
|
+
span_result = Rage::Telemetry::SpanResult.new(e).freeze
|
|
49
|
+
RUBY
|
|
50
|
+
|
|
51
|
+
calls_chain = handler_refs.reverse.inject(yield_call) do |memo, handler_ref|
|
|
52
|
+
handler_index = @all_handler_refs.index(handler_ref)
|
|
53
|
+
|
|
54
|
+
handler_method = handler_ref.instance.method(handler_ref.method_name)
|
|
55
|
+
handler_arguments = Rage::Internal.build_arguments(
|
|
56
|
+
handler_method,
|
|
57
|
+
{ **span.handler_arguments, id: "\"#{span.id}\".freeze" }
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
<<~RUBY
|
|
61
|
+
@all_handler_refs[#{handler_index}].instance.#{handler_ref.method_name}(#{handler_arguments}) do
|
|
62
|
+
#{memo}
|
|
63
|
+
span_result
|
|
64
|
+
end
|
|
65
|
+
RUBY
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
parameters = span.span_parameters.join(", ")
|
|
69
|
+
|
|
70
|
+
self.class.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
|
71
|
+
def #{tracer_name(span.id)}(#{parameters})
|
|
72
|
+
span_result = yield_called = yield_result = yield_error = nil
|
|
73
|
+
|
|
74
|
+
begin
|
|
75
|
+
#{calls_chain}
|
|
76
|
+
rescue Exception => e
|
|
77
|
+
Rage.logger.error("Telemetry handler failed with error \#{e}:\\n\#{e.backtrace.join("\\n")}")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
unless yield_called
|
|
81
|
+
Rage.logger.warn("Telemetry handler didn't call `yield` when processing span '#{span.id}'\\n\#{caller.join("\\n")}")
|
|
82
|
+
yield_result = yield
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
if yield_error
|
|
86
|
+
raise yield_error
|
|
87
|
+
else
|
|
88
|
+
yield_result
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
RUBY
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def tracer_name(span_id)
|
|
95
|
+
"span_#{span_id.gsub(".", "_")}"
|
|
96
|
+
end
|
|
97
|
+
end
|
data/lib/rage/version.rb
CHANGED
data/rage.gemspec
CHANGED
|
@@ -6,10 +6,10 @@ Gem::Specification.new do |spec|
|
|
|
6
6
|
spec.name = "rage-rb"
|
|
7
7
|
spec.version = Rage::VERSION
|
|
8
8
|
spec.authors = ["Roman Samoilov"]
|
|
9
|
-
spec.email = ["
|
|
9
|
+
spec.email = ["developers@rage-rb.dev"]
|
|
10
10
|
|
|
11
11
|
spec.summary = "Fast web framework compatible with Rails."
|
|
12
|
-
spec.homepage = "https://
|
|
12
|
+
spec.homepage = "https://rage-rb.dev"
|
|
13
13
|
spec.license = "MIT"
|
|
14
14
|
spec.required_ruby_version = ">= 3.2.0"
|
|
15
15
|
|
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
|
21
21
|
spec.files = Dir.chdir(__dir__) do
|
|
22
22
|
`git ls-files -z`.split("\x0").reject do |f|
|
|
23
|
-
(File.expand_path(f) == __FILE__) || f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor .rubocop])
|
|
23
|
+
(File.expand_path(f) == __FILE__) || f.start_with?(*%w[bin/ gemfiles/ test/ spec/ features/ .git .circleci appveyor .rubocop])
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
spec.bindir = "exe"
|
|
@@ -34,4 +34,5 @@ Gem::Specification.new do |spec|
|
|
|
34
34
|
spec.add_dependency "rack-test", "~> 2.1"
|
|
35
35
|
spec.add_dependency "rake", ">= 12.0"
|
|
36
36
|
spec.add_dependency "logger"
|
|
37
|
+
spec.add_dependency "irb"
|
|
37
38
|
end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rage-rb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.20.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Roman Samoilov
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2026-01-
|
|
10
|
+
date: 2026-01-20 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: thor
|
|
@@ -107,8 +107,22 @@ dependencies:
|
|
|
107
107
|
- - ">="
|
|
108
108
|
- !ruby/object:Gem::Version
|
|
109
109
|
version: '0'
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: irb
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - ">="
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: '0'
|
|
117
|
+
type: :runtime
|
|
118
|
+
prerelease: false
|
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - ">="
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: '0'
|
|
110
124
|
email:
|
|
111
|
-
-
|
|
125
|
+
- developers@rage-rb.dev
|
|
112
126
|
executables:
|
|
113
127
|
- rage
|
|
114
128
|
extensions: []
|
|
@@ -117,6 +131,7 @@ files:
|
|
|
117
131
|
- ".rspec"
|
|
118
132
|
- ".yardopts"
|
|
119
133
|
- ARCHITECTURE.md
|
|
134
|
+
- Appraisals
|
|
120
135
|
- CHANGELOG.md
|
|
121
136
|
- CODE_OF_CONDUCT.md
|
|
122
137
|
- Gemfile
|
|
@@ -146,6 +161,8 @@ files:
|
|
|
146
161
|
- lib/rage/deferred/backends/nil.rb
|
|
147
162
|
- lib/rage/deferred/context.rb
|
|
148
163
|
- lib/rage/deferred/deferred.rb
|
|
164
|
+
- lib/rage/deferred/metadata.rb
|
|
165
|
+
- lib/rage/deferred/middleware_chain.rb
|
|
149
166
|
- lib/rage/deferred/proxy.rb
|
|
150
167
|
- lib/rage/deferred/queue.rb
|
|
151
168
|
- lib/rage/deferred/task.rb
|
|
@@ -163,6 +180,7 @@ files:
|
|
|
163
180
|
- lib/rage/logger/json_formatter.rb
|
|
164
181
|
- lib/rage/logger/logger.rb
|
|
165
182
|
- lib/rage/logger/text_formatter.rb
|
|
183
|
+
- lib/rage/middleware/body_finalizer.rb
|
|
166
184
|
- lib/rage/middleware/cors.rb
|
|
167
185
|
- lib/rage/middleware/fiber_wrapper.rb
|
|
168
186
|
- lib/rage/middleware/origin_validator.rb
|
|
@@ -204,6 +222,21 @@ files:
|
|
|
204
222
|
- lib/rage/setup.rb
|
|
205
223
|
- lib/rage/sidekiq_session.rb
|
|
206
224
|
- lib/rage/tasks.rb
|
|
225
|
+
- lib/rage/telemetry/handler.rb
|
|
226
|
+
- lib/rage/telemetry/spans/await_fiber.rb
|
|
227
|
+
- lib/rage/telemetry/spans/broadcast_cable_stream.rb
|
|
228
|
+
- lib/rage/telemetry/spans/create_websocket_connection.rb
|
|
229
|
+
- lib/rage/telemetry/spans/dispatch_fiber.rb
|
|
230
|
+
- lib/rage/telemetry/spans/enqueue_deferred_task.rb
|
|
231
|
+
- lib/rage/telemetry/spans/process_cable_action.rb
|
|
232
|
+
- lib/rage/telemetry/spans/process_cable_connection.rb
|
|
233
|
+
- lib/rage/telemetry/spans/process_controller_action.rb
|
|
234
|
+
- lib/rage/telemetry/spans/process_deferred_task.rb
|
|
235
|
+
- lib/rage/telemetry/spans/process_event_subscriber.rb
|
|
236
|
+
- lib/rage/telemetry/spans/publish_event.rb
|
|
237
|
+
- lib/rage/telemetry/spans/spawn_fiber.rb
|
|
238
|
+
- lib/rage/telemetry/telemetry.rb
|
|
239
|
+
- lib/rage/telemetry/tracer.rb
|
|
207
240
|
- lib/rage/templates/Gemfile
|
|
208
241
|
- lib/rage/templates/Rakefile
|
|
209
242
|
- lib/rage/templates/app-controllers-application_controller.rb
|
|
@@ -229,11 +262,11 @@ files:
|
|
|
229
262
|
- lib/rage/uploaded_file.rb
|
|
230
263
|
- lib/rage/version.rb
|
|
231
264
|
- rage.gemspec
|
|
232
|
-
homepage: https://
|
|
265
|
+
homepage: https://rage-rb.dev
|
|
233
266
|
licenses:
|
|
234
267
|
- MIT
|
|
235
268
|
metadata:
|
|
236
|
-
homepage_uri: https://
|
|
269
|
+
homepage_uri: https://rage-rb.dev
|
|
237
270
|
source_code_uri: https://github.com/rage-rb/rage
|
|
238
271
|
rdoc_options: []
|
|
239
272
|
require_paths:
|