【发布时间】: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