【问题标题】:Process hangs while trying to push Azure AppInsights metric尝试推送 Azure AppInsights 指标时进程挂起
【发布时间】:2017-01-05 23:43:06
【问题描述】:

我使用 Application Insights Python API 每 30 秒发布一次我的应用程序的自定义指标。 这可以正常工作一段时间(最多几天),但随后我的 Python 脚本在尝试将数据刷新到 Azure 时挂起。

Python 代码本身相当简单,就是这个无限循环:

while True:
    count = get_connection_count()
    if count is not None:
        tc.track_metric("ConnectionCount", count, type=DataPointType.measurement, count=1)
        tc.flush()
    time.sleep(10)

堆栈跟踪(下图)显示进程卡在tc.flush(),等待来自服务器的答复。

如果我查看进程的 TCP 连接,我可以看到进程仍然与 Azure 建立了开放的 TCP 连接;它只是没有得到任何答复。 有没有人遇到过类似的问题?什么会导致 Azure AppInsights 停止响应?

或者,可以为tc.flush 调用定义超时,这样我至少可以从无响应的端点中恢复吗?

这是我能够提取的堆栈跟踪:

  File "/var/lib/app-monitor/connectionMonitor.py", line 52, in <module>
        tc.flush()
  File "/usr/local/lib/python2.7/dist-packages/applicationinsights/TelemetryClient.py", line 55, in flush
        self._channel.flush()
  File "/usr/local/lib/python2.7/dist-packages/applicationinsights/channel/TelemetryChannel.py", line 71, in flush
        self._queue.flush()
  File "/usr/local/lib/python2.7/dist-packages/applicationinsights/channel/SynchronousQueue.py", line 39, in flush
        local_sender.send(data)
  File "/usr/local/lib/python2.7/dist-packages/applicationinsights/channel/SenderBase.py", line 118, in send
        response = HTTPClient.urlopen(request)
  File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
        return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 404, in open
        response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 422, in _open
        '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
        result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1222, in https_open
        return self.do_open(httplib.HTTPSConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1187, in do_open
        r = h.getresponse(buffering=True)
  File "/usr/lib/python2.7/httplib.py", line 1089, in getresponse
        response.begin()
  File "/usr/lib/python2.7/httplib.py", line 444, in begin
        version, status, reason = self._read_status()
  File "/usr/lib/python2.7/httplib.py", line 400, in _read_status
        line = self.fp.readline(_MAXLINE + 1)
  File "/usr/lib/python2.7/socket.py", line 476, in readline
        data = self._sock.recv(self._rbufsize)
  File "/usr/lib/python2.7/ssl.py", line 341, in recv
        return self.read(buflen)
  File "/usr/lib/python2.7/ssl.py", line 260, in read
        return self._sslobj.read(len)

【问题讨论】:

  • 如果这仅发生在其中一台机器上,我会假设该机器的某些东西被搞砸了,比如糟糕的 https 证书、代理集或阻止它实际制作的东西联系?如果您只是使用其他任何东西手动连接到dc.services.visualstudio.com,它会连接吗?你能从那台机器等上 ping/traceroute 它吗?
  • 不,这会在我启动的任何虚拟机上随机发生。
  • 它通常可以正常工作几个小时,直到发生冻结。打开与 dc.services.visualstudio.com 的连接工作正常。事实上,每当 Python 进程像这样被冻结时,我仍然可以使用 netstat 在端口 443 上看到与 dc.services.visualstudio.com 的打开连接。
  • 这很奇怪。失败或成功应该非常快,而且我认为该服务不会尝试进行保持连接或任何可以保持这些连接打开的操作

标签: python azure azure-application-insights


【解决方案1】:

经过内部讨论,有一个解决方法,虽然不是真正的修复: 确保套接字具有某种默认超时值,以防止它们永远挂起:

import socket
socket.setdefaulttimeout(30)

请注意,这适用于脚本中的任何+所有 http 调用,因此它不一定理想,但确实可以防止事情长时间挂起。

【讨论】:

  • 谢谢@john。我确实向我正在与之合作的 Microsoft 联系人提出了这个确切的修复建议,并且在过去的几天里一直在尝试这种解决方法。我似乎确实“解决”了这个问题。仅供参考,我收到了很多 HTTP 错误(500 和 503),但是这些会立即重试,所以它们不是问题。
  • 顺便说一句,有没有计划在 Python API 中提供实际修复?在 HTTP 调用中硬编码超时值,或者更好地在 API 中指定超时值?
  • 大声笑,我没有意识到线程工作是相同的:D。不知道python api。如果这是在 github 上,您可能会将其作为问题放在那里,或者可能显式设置由 sdk 在那里完成的 webrequest/etc 的超时?
  • 它已经存在 (Flush gets stuck on Linux),这正是我在最新评论中所建议的:D
【解决方案2】:

根据我的经验,可能有两个原因会导致此问题。

  1. 您的应用程序超出了指标和事件数量的一些限制,请参阅官方document 并通过 Linux 上的 Wireshark 或 Fiddler 捕获响应状态代码以进行检查。这种情况有一些错误代码,包括402(需要付款)、429(请求过多)、503(服务不可用)等。

  2. 您始终可以通过 http://aka.ms/aistatus 获取 Application Insights 有关服务运行状况和状态的信息,以检查问题是否是由计划维护或问题解决的某些操作引起的。

希望对你有帮助。

【讨论】:

  • 感谢您的回复。不过,我不确定我是否在 AppInsights 上遇到任何限制,因为这个 Python 脚本运行在相当多的 VM 上,如果是这种情况,我预计问题会发生在所有 VM 上。此外,查看堆栈,看起来我没有收到任何 HTTP 状态消息,无论是否有错误。如果是这种情况,我希望 urllib2 会抛出,你不觉得吗?
猜你喜欢
  • 2018-05-01
  • 1970-01-01
  • 2013-05-30
  • 2014-02-26
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
相关资源
最近更新 更多