Skip to content

Commit 5f82d40

Browse files
Merge pull request #165 from rosswhitfield/log_failed_call
Log failed call, should also fix disconnected traces
2 parents 3255123 + 0dfdd3c commit 5f82d40

File tree

3 files changed

+83
-8
lines changed

3 files changed

+83
-8
lines changed

ipsframework/services.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -538,16 +538,28 @@ def wait_call(self, call_id, block=True):
538538
raise
539539
msg_id = self._invoke_service(self.fwk.component_id, 'wait_call',
540540
call_id, block)
541-
response = self._get_service_response(msg_id, block=True)
542541
formatted_args = ','.join('%.3f' % (x) if isinstance(x, float)
543542
else str(x) for x in args)
544543
target_full = f'{target}:{method_name}({formatted_args})'
545-
self._send_monitor_event('IPS_CALL_END', 'Target = ' + target_full,
546-
start_time=start_time,
547-
end_time=time.time(),
548-
elapsed_time=time.time()-start_time,
549-
target=target,
550-
operation=f'{method_name}({formatted_args})')
544+
try:
545+
response = self._get_service_response(msg_id, block=True)
546+
self._send_monitor_event('IPS_CALL_END', 'Target = ' + target_full,
547+
start_time=start_time,
548+
end_time=time.time(),
549+
elapsed_time=time.time()-start_time,
550+
target=target,
551+
operation=f'{method_name}({formatted_args})')
552+
except Exception as e:
553+
self._send_monitor_event('IPS_CALL_END',
554+
f'Error: "{e}" Target = {target_full}',
555+
start_time=start_time,
556+
end_time=time.time(),
557+
elapsed_time=time.time()-start_time,
558+
target=target,
559+
operation=f'{method_name}({formatted_args})',
560+
ok=False)
561+
raise
562+
551563
del self.call_targets[call_id]
552564
return response
553565

tests/new/test_bad_components.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import os
2+
import json
13
from ipsframework import Framework
24

35

@@ -84,6 +86,23 @@ def test_exception(tmpdir):
8486
assert "WORKER__exception_worker_2 ERROR Uncaught Exception in component method.\n" in lines
8587
assert "DRIVER__driver_1 ERROR Uncaught Exception in component method.\n" in lines
8688

89+
# check event log
90+
events = read_event_log(tmpdir)
91+
assert len(events) == 11
92+
93+
worker_call_end_event = events[8]
94+
95+
assert worker_call_end_event["code"] == "DRIVER__driver"
96+
assert worker_call_end_event["eventtype"] == "IPS_CALL_END"
97+
assert not worker_call_end_event['ok']
98+
assert worker_call_end_event["comment"] == "Error: \"Runtime error\" Target = test@exception_worker@2:step(0)"
99+
100+
sim_end_event = events[10]
101+
assert sim_end_event["code"] == "Framework"
102+
assert sim_end_event["eventtype"] == "IPS_END"
103+
assert not sim_end_event['ok']
104+
assert sim_end_event["comment"] == "Simulation Execution Error"
105+
87106

88107
def test_bad_task(tmpdir):
89108
platform_file, config_file = write_basic_config_and_platform_files(tmpdir, worker='bad_task_worker')
@@ -111,6 +130,23 @@ def test_bad_task(tmpdir):
111130
assert "WORKER__bad_task_worker_2 ERROR Uncaught Exception in component method.\n" in lines
112131
assert "DRIVER__driver_1 ERROR Uncaught Exception in component method.\n" in lines
113132

133+
# check event log
134+
events = read_event_log(tmpdir)
135+
assert len(events) == 11
136+
137+
worker_call_end_event = events[8]
138+
139+
assert worker_call_end_event["code"] == "DRIVER__driver"
140+
assert worker_call_end_event["eventtype"] == "IPS_CALL_END"
141+
assert not worker_call_end_event['ok']
142+
assert worker_call_end_event["comment"] == "Error: \"task binary of wrong type, expected str but found int\" Target = test@bad_task_worker@2:step(0)"
143+
144+
sim_end_event = events[10]
145+
assert sim_end_event["code"] == "Framework"
146+
assert sim_end_event["eventtype"] == "IPS_END"
147+
assert not sim_end_event['ok']
148+
assert sim_end_event["comment"] == "Simulation Execution Error"
149+
114150

115151
def test_bad_task_pool1(tmpdir):
116152
platform_file, config_file = write_basic_config_and_platform_files(tmpdir, worker='bad_task_pool_worker1')
@@ -192,3 +228,30 @@ def test_assign_protected_attribute(tmpdir):
192228

193229
assert "WORKER__assign_protected_attribute_2 ERROR Uncaught Exception in component method.\n" in lines
194230
assert "DRIVER__driver_1 ERROR Uncaught Exception in component method.\n" in lines
231+
232+
# check event log
233+
events = read_event_log(tmpdir)
234+
assert len(events) == 11
235+
236+
worker_call_end_event = events[8]
237+
238+
assert worker_call_end_event["code"] == "DRIVER__driver"
239+
assert worker_call_end_event["eventtype"] == "IPS_CALL_END"
240+
assert not worker_call_end_event['ok']
241+
# python 3.10 includes the attribute name in the error message
242+
assert worker_call_end_event["comment"] in ("Error: \"can't set attribute\" Target = test@assign_protected_attribute@2:step(0)",
243+
"Error: \"can't set attribute 'args'\" Target = test@assign_protected_attribute@2:step(0)")
244+
245+
sim_end_event = events[10]
246+
assert sim_end_event["code"] == "Framework"
247+
assert sim_end_event["eventtype"] == "IPS_END"
248+
assert not sim_end_event['ok']
249+
assert sim_end_event["comment"] == "Simulation Execution Error"
250+
251+
252+
def read_event_log(tmpdir):
253+
sim_event_log_json = next(f for f in os.listdir(tmpdir.join("simulation_log")) if f.endswith(".json"))
254+
with open(str(tmpdir.join("simulation_log").join(sim_event_log_json)), 'r') as f:
255+
lines = f.readlines()
256+
257+
return [json.loads(line) for line in lines]

tests/new/test_dask.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def test_dask_shifter_fail(tmpdir):
154154
with open(json_files[0], 'r') as json_file:
155155
lines = json_file.readlines()
156156
lines = [json.loads(line.strip()) for line in lines]
157-
assert len(lines) == 12
157+
assert len(lines) == 13
158158

159159
assert lines[-1].get('eventtype') == "IPS_END"
160160
assert lines[-1].get('comment') == "Simulation Execution Error"

0 commit comments

Comments
 (0)