如何配置sentry从python多处理池产生的进程发送异常?

2024-04-16 08:05:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,是由芹菜工人运行的,它使用台球库的池子,我产生了多个进程。我尝试在这些进程中使用sentry,以便可以捕获任何未处理/已处理的异常。下面是我的示例代码:

from configurations import SENTRY_CLIENT


def process_data(data):
try:
    s = data/0
except ZeroDivisionError:
    print "Sentry must report this."
    SENTRY_CLIENT.captureException()

import multiprocessing
from billiard import Pool
POOL_SIZE=multiprocessing.cpu_count()
pool = Pool(POOL_SIZE)
data=[0, 1, 2, 3, 4, 5]
pool.map(process_data, data)
pool.close()
pool.terminate()

SENTRY_客户端在配置文件中定义为: 配置.py在

^{pr2}$

我正在尝试的一种方法是将SENTRY_客户端传递给每个进程,但我现在正试图避免这种情况。 同样,由于这个脚本是由celery worker执行的,所以我为celery配置了sentry,直到pool.map()的任何异常都会被sentry很好地捕捉到。在

我还尝试打印SENTRY_CLIENT.__dict__,得到了值正确的有效项。 我的问题是为什么SENTRY_客户端不向SENTRY仪表板发送异常。可能是我在配置中遗漏了一些东西。在


Tags: fromimport脚本client客户端datasize进程
2条回答

我终于通过阅读得到了答案。 Sentry使用基于异步事件的模型,在触发Sentry之后立即终止一个进程将不能确保异常到达服务器。因此,我们需要增加一个延迟(10秒),以防出现任何异常情况,以确保sentry完成任务。在

def process_data(data):
    from configurations import SENTRY_CLIENT
    try:
       s = data/0
    except ZeroDivisionError:
       print "Sentry must report this."
       import time
       SENTRY_CLIENT.captureException()
       time.sleep(10)

import multiprocessing
from billiard import Pool
POOL_SIZE=multiprocessing.cpu_count()
pool = Pool(POOL_SIZE)
data=[0, 1, 2, 3, 4, 5]
pool.map(process_data, data)
pool.close()
pool.terminate()

正如PoloSoaressaid,你应该改变一个传输,而不是增加任何睡眠延迟。raven lib 6.10.0版本的有效解决方案示例:

import multiprocessing

from billiard import Pool
from raven import Client
from raven.transport.http import HTTPTransport

SENTRY_CLIENT = Client("dsn", transport=HTTPTransport)


def process_data(data):
    try:
        s = data / 0
    except ZeroDivisionError:
        print("Sentry must report this.")
        SENTRY_CLIENT.captureException()


POOL_SIZE = multiprocessing.cpu_count()
pool = Pool(POOL_SIZE)
data = [0, 1, 2, 3, 4, 5]
pool.map(process_data, data)
pool.close()
pool.terminate()

相关问题 更多 >