尝试推送Azure AppInsights指标时,进程挂起

时间:2017-01-05 23:43:07

标签: python azure azure-application-insights

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

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)

2 个答案:

答案 0 :(得分:0)

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

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

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

    < / LI>

    希望它有所帮助。

答案 1 :(得分:0)

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

import socket
socket.setdefaulttimeout(30)

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