Python奇怪的问题头脑风暴 - 为什么一行不执行某些时间?

时间:2014-12-18 10:27:56

标签: python

这是我15年编程生涯中遇到过的最棘手的问题之一。

该设置是一个部署的Django应用程序。我们有一项功能,允许用户邀请其他用户。

我遍历电子邮件地址列表。在循环的每次迭代中,我做了很多事情,以便在我们的系统中配置用户,向他们发送欢迎电子邮件,并在第三方系统中记录此事件。

循环体看起来像这样:

try:
    # ... some other code ...

    send_new_user_welcome_email(
        user,
        self.inviter,
        temp_password,
        welcome_message=welcome_message,
        is_reviewer=True
    )

    analytics_record_event(
        self.inviter,
        EVENT_INVITED_USER,
        invite_type='reviewer',
        invited_email=email
    )

    record_customer_io_invited_someone(
        self.inviter, 
        email
    )
except:
    logger.exception('While inviting user "%s"' % email)

我看到的问题是偶尔(大约每50次左右有人邀请一个或多个用户),analytics_record_event函数似乎无法执行。它不会引起任何例外。它被简单地跳过,下一行执行。

为了诊断问题,我已将日志记录添加到analytics_record_event函数,以便每次调用时都记录到文件中:

def analytics_record_event(user,
                           event_name,
                           skip_mixpanel=False,
                           skip_preact=False,
                           **properties):
    username = user.username if hasattr(user, 'username') else user
    logger.info(
        u'analytics_record_event called for user %s and event "%s"' % (username, event_name)
    )

我正在寻找关于如何做到这一点的想法。我已经花了很多时间研究这个问题,我的发现如下:

  • send_new_user_welcome_email被召唤。我们的SMTP服务器日志确认电子邮件已关闭。内部电子邮件日志也会对此进行协作。
  • record_customer_io_invited_someone被召唤。外部系统中存在该用户的事件数据。
  • 在我的日志文件中找不到u'analytics_record_event...日志语句的条目,以查看失败的时间。在其他时候,当此函数执行正常(大多数时间)时,日志条目就在那里。
  • 不存在上述except语句的异常日志。
  • 未找到此时间范围内未处理的例外情况。
  • 当它失败时,对于作为整个邀请用户请求的一部分被邀请的每个电子邮件的循环的每次迭代,它都会失败。它在循环的每次迭代中都失败了。没有一个发送邀请请求的情况,它适用于某些邀请的电子邮件,但在一个请求中有些失败。
  • 它似乎与数据无关。电子邮件地址不包含任何奇怪的字符。

看起来偶尔,对analytics_record_event的调用根本就没有。这让我非常悲痛。如果有人能为此提出调查路径,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

答案结果令人惊讶且非常平凡。

我正在追踪的代码是我正在处理的系统中标准用户创建过程的一部分。但是,有一个基于CSV文件的批量创建过程,它可以完成类似的工作。在此过程中没有调用analytics_record_event

未来的教训: - 我认为我很聪明并且通过在analytics_record_event上放置一个函数装饰器来覆盖很多地方。这样的结果让我更加困惑,导致这种绝望的请求帮助:)。如果我在这个特定函数中调用analytics_record_event之前和之后添加了一个日志语句,我早就意识到它根本没有被调用! KISS在工作。