Python结构,发送故障通知

2024-09-28 05:24:43 发布

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

我一直在试图找出当fabric脚本失败时做某些事情的最佳方法(例如,通过python模块slackbot发送一个slack通知消息)。在

我举了一个例子,我试着在这里做上面的事情:

fab_failtest.pymy_slackclient.py

您可以通过将这两个文件下载到一个目录pip installfabric和{},然后运行:

fab --fabfile=fab_failtest.py fail_test1 或者

fab --fabfile=fab_failtest.py fail_test2

(您还必须有一台可以ssh到的机器,在本例中,mrbluesky@elo22上打开ssh端口)

  • fail_test1使用try-except这样我就可以得到异常错误信息等等
  • fail_test2使用try-finally加上一个简单的布尔变量,因此没有可用的异常信息

一开始我以为我对fail_test1的例子很满意,但是我已经看到它在失败时发送slack消息失败了好几次,我想知道是否有竞争条件或涉及到什么?我可以开始使用fail_test2,但我真的喜欢像fail_test1那样访问堆栈跟踪。在

有没有更好的方法来做到这一点,比如说,python fabric中提供的一些东西完全可以实现我在上面的示例中所要完成的任务?在


Tags: 方法py消息slack事情ssh例子fabfile
2条回答

我不同意你的两种方法。我坚信代码越少越好。我这是什么意思?一个函数应该按照它的名字来做,不多不少,如果你必须像那样添加一个全局处理程序,我会把它作为包装器添加进去,fabric函数很难读懂,不需要在混合中添加错误处理。上面说:

import sys
import traceback

from fabric.api import task, settings, local, abort
from fabric.decorators import _wrap_as_new
from functools import wraps

HOST = 'elo'
PORT = 22


def alert_on_fail(func):
    @wraps(func)
    def decorated(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except:
            # TODO: add more code here
            exception_type, value, tb_msg = sys.exc_info()
            traceback_msg = traceback.format_exc()
            notify('something went wrong: ' + traceback_msg)
            abort('exiting error!!')
    return _wrap_as_new(func, decorated)


@task
@alert_on_fail
def fail_test(host=HOST, port=PORT):
    notify('fail test', msg_type='info')
    local('''python -c "raise Exception('foobar')"''')
    notify('script ran successfully', msg_type='success')  # this will never run because the function above crashed


@task
@alert_on_fail
def pass_test(host=HOST, port=PORT):
    notify('pass test', msg_type='info')
    local('whoami')
    notify('script ran successfully', msg_type='success')


def notify(msg, **kwargs):
    # DISREGARD THIS
    print 'sent to slack:', msg

输出:

^{pr2}$

以及:

^{3}$

你会注意到这些函数现在“很容易”阅读,它们很“简单”,所有的错误处理代码都被移到了其他地方。在

我有一个类似的问题,我想在脚本失败时发送通知。因此,我决定构建一个包Notif,以便在脚本失败时使用修饰符发送通知。在

下面是我的包notif的示例,用于在脚本失败时发送延迟通知:

notif = SlackNotificator(url="webhook_url")
@notification_on_fail(notif=notif, verbose_level='2')
def fail_test():
      print(t)

请看这里的doc。在

I was mostly inspire by the fabric version 1.1

相关问题 更多 >

    热门问题