簡體   English   中英

如何配置哨兵從python多處理池產生的進程發送異常?

[英]How to configure sentry to send exception from process spawned by python multiprocessing pools?

我有一個由celery worker運行的腳本,該腳本使用台球庫中的Pool,並且產生了多個進程。 我試圖在這些過程中使用哨兵,以便可以捕獲任何未處理/未處理的異常。 下面寫的是我的示例代碼:

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_CLIENT在配置文件中定義,該文件定義為:configuration.py

from raven import Client
SENTRY_CLIENT = Client("dsn")

我正在嘗試的一種方法是將SENTRY_CLIENT傳遞給每個進程,但是到目前為止,我正在嘗試避免這種情況。 另外,由於此腳本是由celery worker執行的,因此我已經為celery配置了pool.map()以及任何異常,直到pool.map()被哨兵很好地捕獲為止。

我也嘗試打印SENTRY_CLIENT.__dict__ ,我得到了帶有正確值的有效項目。 我的問題是,為什么SENTRY_CLIENT不會將異常發送到哨點儀表板。 可能是我在配置中缺少某些內容。

我終於通過一些閱讀獲得了解決方案。 Sentry在基於異步事件的模型上工作,並且在觸發哨兵后立即殺死進程將無法確保服務器達到異常。 因此,在任何異常情況下終止進程之前,我們需要添加一個延遲(10s),以確保哨兵能夠正常工作。

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()

正如PoloSoares 所說 ,您應該更改傳輸方式,而不要增加任何睡眠延遲。 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM