|
18 | 18 |
|
19 | 19 |
|
20 | 20 | def metric_scope(fn): # type: ignore |
| 21 | + if inspect.isasyncgenfunction(fn): |
| 22 | + @wraps(fn) |
| 23 | + async def async_gen_wrapper(*args, **kwargs): # type: ignore |
| 24 | + logger = create_metrics_logger() |
| 25 | + if "metrics" in inspect.signature(fn).parameters: |
| 26 | + kwargs["metrics"] = logger |
| 27 | + |
| 28 | + try: |
| 29 | + fn_gen = fn(*args, **kwargs) |
| 30 | + while True: |
| 31 | + result = await fn_gen.__anext__() |
| 32 | + await logger.flush() |
| 33 | + yield result |
| 34 | + except Exception as ex: |
| 35 | + await logger.flush() |
| 36 | + if not isinstance(ex, StopIteration): |
| 37 | + raise |
| 38 | + |
| 39 | + return async_gen_wrapper |
| 40 | + |
| 41 | + elif inspect.isgeneratorfunction(fn): |
| 42 | + @wraps(fn) |
| 43 | + def gen_wrapper(*args, **kwargs): # type: ignore |
| 44 | + logger = create_metrics_logger() |
| 45 | + if "metrics" in inspect.signature(fn).parameters: |
| 46 | + kwargs["metrics"] = logger |
| 47 | + |
| 48 | + try: |
| 49 | + fn_gen = fn(*args, **kwargs) |
| 50 | + while True: |
| 51 | + result = next(fn_gen) |
| 52 | + asyncio.run(logger.flush()) |
| 53 | + yield result |
| 54 | + except Exception as ex: |
| 55 | + asyncio.run(logger.flush()) |
| 56 | + if not isinstance(ex, StopIteration): |
| 57 | + raise |
21 | 58 |
|
22 | | - if asyncio.iscoroutinefunction(fn): |
| 59 | + return gen_wrapper |
23 | 60 |
|
| 61 | + elif asyncio.iscoroutinefunction(fn): |
24 | 62 | @wraps(fn) |
25 | | - async def wrapper(*args, **kwargs): # type: ignore |
| 63 | + async def async_wrapper(*args, **kwargs): # type: ignore |
26 | 64 | logger = create_metrics_logger() |
27 | 65 | if "metrics" in inspect.signature(fn).parameters: |
28 | 66 | kwargs["metrics"] = logger |
| 67 | + |
29 | 68 | try: |
30 | 69 | return await fn(*args, **kwargs) |
31 | | - except Exception as e: |
32 | | - raise e |
33 | 70 | finally: |
34 | 71 | await logger.flush() |
35 | 72 |
|
36 | | - return wrapper |
37 | | - else: |
| 73 | + return async_wrapper |
38 | 74 |
|
| 75 | + else: |
39 | 76 | @wraps(fn) |
40 | 77 | def wrapper(*args, **kwargs): # type: ignore |
41 | 78 | logger = create_metrics_logger() |
42 | 79 | if "metrics" in inspect.signature(fn).parameters: |
43 | 80 | kwargs["metrics"] = logger |
| 81 | + |
44 | 82 | try: |
45 | 83 | return fn(*args, **kwargs) |
46 | | - except Exception as e: |
47 | | - raise e |
48 | 84 | finally: |
49 | | - loop = asyncio.get_event_loop() |
50 | | - loop.run_until_complete(logger.flush()) |
| 85 | + asyncio.run(logger.flush()) |
51 | 86 |
|
52 | 87 | return wrapper |
0 commit comments