getsentry / getsentry/sentry-python
Support concurrent.future
- 主要語言
- Python
- 星號
- 2.2k
- 分支
- 669
- 平均合併
- 1 天 40 分鐘
- 30 天內合併 PR
- 212
描述
### Problem Statement
When using Sentry with ThreadPoolExecutor, I couldn't automatically capture errors like in this [issue](https://github.com/getsentry/sentry-python/issues/1234).
I think ThreadPoolExecutor use [this run method](https://github.com/python/cpython/blob/723f4d66982e4d2c54f8e874d6084ab7b2ff5833/Lib/concurrent/futures/thread.py#L53).
```
def run(self):
if not self.future.set_running_or_notify_cancel():
return
try:
result = self.fn(*self.args, **self.kwargs)
except BaseException as exc:
self.future.set_exception(exc)
# Break a reference cycle with the exception 'exc'
self = None
else:
self.future.set_result(result)
```
### Solution Brainstorm
In future.thread, it catches BaseException and handles it by using future.set_exception.
Therefore, I am planning to create FutureIntegration to patch Future.set_exception so that Sentry can handle it.
like this.
```
def setup_once():
from concurrent.futures import Future
from concurrent.futures._base import CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED, InvalidStateError
def sentry_set_exception(self, exception):
with self._condition:
if self._state in {CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED}:
raise InvalidStateError('{}: {!r}'.format(self._state, self))
self._exception = exception
self._state = FINISHED
for waiter in self._waiters:
waiter.add_exception(self)
self._condition.notify_all()
self._invoke_callbacks()
_capture_exception()
Future.set_exception = sentry_set_exception
```
I've tested this process in my local environment and confirmed that it works well. Would it be okay for me to contribute in this way?
貢獻指南
研究方向
Start with Python's concurrent.futures ThreadPoolExecutor run method and Future.set_exception, especially the referenced CPython thread.py implementation. Review the proposed FutureIntegration approach and verify that exceptions handled through set_exception are captured without changing future state handling. Done means ThreadPoolExecutor errors are automatically captured by Sentry.
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- python
- 領域
- observability-sre
- Issue 類型
- 功能
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 停滯
- 描述清晰度
- 基本清楚
- 新手友好度
- 25/100