Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9147120

Browse files
authored
fix: Telemetry middleware crashes on unhandled guard events (#276)
* fix: telemetry middleware implements guard stepsAdds telemetry events for guard steps in the telemetry middleware* feat: add tests for guard telemetry eventsIntroduces tests to verify telemetry events for guard pass and guard halt scenarios
1 parent6c9543e commit9147120

File tree

2 files changed

+184
-0
lines changed

2 files changed

+184
-0
lines changed

‎lib/reactor/middleware/telemetry.ex‎

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ defmodule Reactor.Middleware.Telemetry do
1313
* `[:reactor, :run, :stop]`
1414
* `[:reactor, :step, :run, :start]`
1515
* `[:reactor, :step, :run, :stop]`
16+
* `[:reactor, :step, :guard, :start]`
17+
* `[:reactor, :step, :guard, :stop]`
1618
* `[:reactor, :step, :process, :start]`
1719
* `[:reactor, :step, :process, :stop]`
1820
* `[:reactor, :step, :compensate, :start]`
@@ -300,6 +302,73 @@ defmodule Reactor.Middleware.Telemetry do
300302
)
301303
end
302304

305+
defevent({:guard_start,guard,arguments},step,%{__MODULE__=>%{metadata:metadata}})do
306+
metadata=
307+
metadata
308+
|>Map.merge(%{
309+
step:step,
310+
guard:guard,
311+
arguments:arguments,
312+
status::guard
313+
})
314+
315+
start_time=System.monotonic_time()
316+
Process.put({__MODULE__,:guard_start_time,step.name,guard},start_time)
317+
318+
:telemetry.execute(
319+
[:reactor,:step,:guard,:start],
320+
%{system_time:System.system_time()},
321+
metadata
322+
)
323+
end
324+
325+
defevent({:guard_fail,guard,result},step,%{__MODULE__=>%{metadata:metadata}})do
326+
metadata=
327+
metadata
328+
|>Map.merge(%{
329+
step:step,
330+
guard:guard,
331+
result:result,
332+
status::error
333+
})
334+
335+
start_time=Process.delete({__MODULE__,:guard_start_time,step.name,guard})
336+
end_time=System.monotonic_time()
337+
duration=end_time-start_time
338+
339+
:telemetry.execute(
340+
[:reactor,:step,:guard,:stop],
341+
%{
342+
system_time:System.system_time(),
343+
duration:duration
344+
},
345+
metadata
346+
)
347+
end
348+
349+
defevent({:guard_pass,guard},step,%{__MODULE__=>%{metadata:metadata}})do
350+
metadata=
351+
metadata
352+
|>Map.merge(%{
353+
step:step,
354+
guard:guard,
355+
status::ok
356+
})
357+
358+
start_time=Process.delete({__MODULE__,:guard_start_time,step.name,guard})
359+
end_time=System.monotonic_time()
360+
duration=end_time-start_time
361+
362+
:telemetry.execute(
363+
[:reactor,:step,:guard,:stop],
364+
%{
365+
system_time:System.system_time(),
366+
duration:duration
367+
},
368+
metadata
369+
)
370+
end
371+
303372
defevent({:compensate_start,reason},step,%{__MODULE__=>%{metadata:metadata}})do
304373
metadata=
305374
metadata

‎test/reactor/middleware/telemetry_test.exs‎

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ defmodule Reactor.Middleware.TelemetryTest do
1616
[
1717
[:reactor,:run,:start],
1818
[:reactor,:run,:stop],
19+
[:reactor,:step,:guard,:start],
20+
[:reactor,:step,:guard,:stop],
1921
[:reactor,:step,:process,:start],
2022
[:reactor,:step,:process,:stop],
2123
[:reactor,:step,:run,:start],
@@ -187,4 +189,117 @@ defmodule Reactor.Middleware.TelemetryTest do
187189
[:reactor,:run,:stop]
188190
]=Enum.map(events,&&1.event)
189191
end
192+
193+
test"guard pass events",%{table:table}do
194+
defmoduleGuardPassReactordo
195+
@moduledocfalse
196+
useReactor
197+
198+
middlewaresdo
199+
middlewareReactor.Middleware.Telemetry
200+
end
201+
202+
step:noopdo
203+
guardfn_args,_context->
204+
:cont
205+
end
206+
207+
runfn_,_->{:ok,:noop}end
208+
end
209+
end
210+
211+
{:ok,:noop}=Reactor.run(GuardPassReactor)
212+
213+
events=get_events(table)
214+
215+
assert[
216+
[:reactor,:run,:start],
217+
[:reactor,:step,:process,:start],
218+
[:reactor,:step,:guard,:start],
219+
[:reactor,:step,:guard,:stop],
220+
[:reactor,:step,:run,:start],
221+
[:reactor,:step,:run,:stop],
222+
[:reactor,:step,:process,:stop],
223+
[:reactor,:run,:stop]
224+
]=Enum.map(events,&&1.event)
225+
226+
guard_stop=Enum.at(events,3)
227+
assertguard_stop.metadata.status==:ok
228+
end
229+
230+
test"guard halt events",%{table:table}do
231+
defmoduleGuardHaltReactordo
232+
@moduledocfalse
233+
useReactor
234+
235+
middlewaresdo
236+
middlewareReactor.Middleware.Telemetry
237+
end
238+
239+
step:guarddo
240+
guardfn_,_->
241+
{:halt,{:error,:hodor}}
242+
end
243+
244+
runfn_,_->{:ok,:noop}end
245+
end
246+
end
247+
248+
{:error,_}=Reactor.run(GuardHaltReactor)
249+
250+
events=get_events(table)
251+
252+
assert[
253+
[:reactor,:run,:start],
254+
[:reactor,:step,:process,:start],
255+
[:reactor,:step,:guard,:start],
256+
[:reactor,:step,:guard,:stop],
257+
[:reactor,:step,:process,:stop],
258+
[:reactor,:run,:stop]
259+
]=Enum.map(events,&&1.event)
260+
261+
guard_stop=Enum.at(events,3)
262+
assertguard_stop.metadata.status==:error
263+
assertguard_stop.metadata.result=={:error,:hodor}
264+
end
265+
266+
test"guard fail events",%{table:table}do
267+
defmoduleGuardFailReactordo
268+
@moduledocfalse
269+
useReactor
270+
271+
middlewaresdo
272+
middlewareReactor.Middleware.Telemetry
273+
end
274+
275+
step:guarddo
276+
guardfn_,_->
277+
raise"winter is coming"
278+
end
279+
280+
runfn_,_->{:ok,:noop}end
281+
end
282+
end
283+
284+
{:error,_}=Reactor.run(GuardFailReactor)
285+
286+
events=get_events(table)
287+
288+
assert[
289+
[:reactor,:run,:start],
290+
[:reactor,:step,:process,:start],
291+
[:reactor,:step,:guard,:start],
292+
[:reactor,:step,:guard,:stop],
293+
[:reactor,:step,:process,:stop],
294+
[:reactor,:run,:stop]
295+
]=Enum.map(events,&&1.event)
296+
297+
guard_stop=Enum.at(events,3)
298+
assertguard_stop.metadata.status==:error
299+
300+
assertmatch?(
301+
{:error,%RuntimeError{message:"winter is coming"}},
302+
guard_stop.metadata.result
303+
)
304+
end
190305
end

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp