簡體   English   中英

在python請求流中恢復生存icinga2

[英]Surviving icinga2 restart in a python requests stream

我一直在研究icinga2的chatbot接口,並且沒有找到一種持續的方式來生存重啟/重裝icinga2服務器。 在移動try / except塊一周后,使用請求會話等,是時候聯系社區了。

這是請求函數的當前迭代:

    def i2api_request(url, headers={}, data={}, stream=False, *, auth=api_auth, ca=api_ca):
    ''' Do not call this function directly; it's a helper for the i2* command functions '''
# Adapted from http://docs.icinga.org/icinga2/latest/doc/module/icinga2/chapter/icinga2-api
# Section 11.10.3.1

    try:
        r = requests.post(url,
            headers=headers,
            auth=auth,
            data=json.dumps(data),
            verify=ca,
            stream=stream
            )
    except (requests.exceptions.ChunkedEncodingError,requests.packages.urllib3.exceptions.ProtocolError, http.client.IncompleteRead,ValueError) as drop:
        return("No connection to Icinga API")

    if r.status_code == 200:
        for line in r.iter_lines():
            try:
                if stream == True:
                    yield(json.loads(line.decode('utf-8')))
                else:
                    return(json.loads(line.decode('utf-8')))
            except:
                debug("Could not produce JSON from "+line)
                continue
    else:
        #r.raise_for_status()
        debug('Received a bad response from Icinga API: '+str(r.status_code))
        print('Icinga2 API connection lost.')

(調試功能只標記並將指示的錯誤打印到控制台。)

此代碼可以很好地處理來自API的事件並將它們發送到chatbot,但是如果重新加載icinga服務器,就像在/ etc / icinga2 ...中添加新服務器定義后需要的那樣,監聽器崩潰了。

以下是重新啟動服務器時收到的錯誤響應:

    Exception in thread Thread-11:
Traceback (most recent call last):
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/packages/urllib3/response.py", line 447, in _update_chunk_length
    self.chunk_left = int(line, 16)
ValueError: invalid literal for int() with base 16: b''

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/packages/urllib3/response.py", line 228, in _error_catcher
    yield
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/packages/urllib3/response.py", line 498, in read_chunked
    self._update_chunk_length()
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/packages/urllib3/response.py", line 451, in _update_chunk_length
    raise httplib.IncompleteRead(line)
http.client.IncompleteRead: IncompleteRead(0 bytes read)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/models.py", line 664, in generate
    for chunk in self.raw.stream(chunk_size, decode_content=True):
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/packages/urllib3/response.py", line 349, in stream
    for line in self.read_chunked(amt, decode_content=decode_content):
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/packages/urllib3/response.py", line 526, in read_chunked
    self._original_response.close()
  File "/usr/lib64/python3.4/contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/packages/urllib3/response.py", line 246, in _error_catcher
    raise ProtocolError('Connection broken: %r' % e, e)
requests.packages.urllib3.exceptions.ProtocolError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib64/python3.4/threading.py", line 920, in _bootstrap_inner
    self.run()
  File "/usr/lib64/python3.4/threading.py", line 868, in run
    self._target(*self._args, **self._kwargs)
  File "/home/errbot/plugins/icinga2bot.py", line 186, in report_events
    for line in queue:
  File "/home/errbot/plugins/icinga2bot.py", line 158, in i2events
    for line in queue:
  File "/home/errbot/plugins/icinga2bot.py", line 98, in i2api_request
    for line in r.iter_lines():
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/models.py", line 706, in iter_lines
    for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
  File "/home/errbot/err3/lib/python3.4/site-packages/requests/models.py", line 667, in generate
    raise ChunkedEncodingError(e)
requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))

使用Icinga2.4時,每次重新啟動服務器時都會發生此崩潰。 在我們升級到2.5之后,我認為這個問題已經消失了,但它現在似乎變成了一個heisenbug。

我最終獲得IRC的建議,重新排序try / except塊並確保它們位於正確的位置。 這是工作結果。

def i2api_request(url, headers={}, data={}, stream=False, *, auth=api_auth, ca=api_ca):
    ''' Do not call this function directly; it's a helper for the i2* command functions '''
# Adapted from http://docs.icinga.org/icinga2/latest/doc/module/icinga2/chapter/icinga2-api
# Section 11.10.3.1

    debug(url)
    debug(headers)
    debug(data)

    try:
        r = requests.post(url,
        headers=headers,
        auth=auth,
        data=json.dumps(data),
        verify=ca,
        stream=stream
        )
        debug("Connecting to Icinga server")
        debug(r)
        if r.status_code == 200:
            try:
                for line in r.iter_lines():
                    debug('in i2api_request: '+str(line))
                    try:
                        if stream == True:
                            yield(json.loads(line.decode('utf-8')))
                        else:
                            return(json.loads(line.decode('utf-8')))
                    except:
                        debug("Could not produce JSON from "+line)
                        return("Could not produce JSON from "+line)
            except (requests.exceptions.ChunkedEncodingError,ConnectionRefusedError):
                return("Connection to Icinga lost.")
        else:
            debug('Received a bad response from Icinga API: '+str(r.status_code))
            print('Icinga2 API connection lost.')
    except (requests.exceptions.ConnectionError,
    requests.packages.urllib3.exceptions.NewConnectionError) as drop:
        debug("No connection to Icinga API. Error received: "+str(drop))
        sleep(5)
        return("No connection to Icinga API.")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM