cadusilva / bolha-clima

Robô que responde com o clima para a cidade informada.
https://bolha.one/@clima
GNU Affero General Public License v3.0
2 stars 0 forks source link

Limite de tempo #9

Closed cadusilva closed 11 months ago

cadusilva commented 11 months ago

Quando a API demorar muito a responder ou retornar outro erro (como o atual, sobre o certificado SSL do site), em vez do bot quebrar e reiniciar, haveria uma resposta dada ao usuário caso o robô não tivesse recebido nada da API em tempo hábil.

nandavereda commented 11 months ago

como o atual, sobre o certificado SSL do site

Não apareceu pra mim o exemplo do log. Poderia incluir?

cadusilva commented 11 months ago

como o atual, sobre o certificado SSL do site

Não apareceu pra mim o exemplo do log. Poderia incluir?

Saindo do forno quentinho (ainda não resolveram a treta):

Traceback (most recent call last):
  File "/usr/lib/python3.11/urllib/request.py", line 1348, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "/usr/lib/python3.11/http/client.py", line 1282, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.11/http/client.py", line 1328, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.11/http/client.py", line 1277, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.11/http/client.py", line 1037, in _send_output
    self.send(msg)
  File "/usr/lib/python3.11/http/client.py", line 975, in send
    self.connect()
  File "/usr/lib/python3.11/http/client.py", line 1454, in connect
    self.sock = self._context.wrap_socket(self.sock,
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/ssl.py", line 517, in wrap_socket
    return self.sslsocket_class._create(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/ssl.py", line 1075, in _create
    self.do_handshake()
  File "/usr/lib/python3.11/ssl.py", line 1346, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'weather.visualcrossing.com'. (_ssl.c:992)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/gitwork/clima/openweathermap.py", line 86, in <module>
    try_city(
  File "/opt/gitwork/clima/openweathermap.py", line 47, in try_city
    with urllib.request.urlopen(full_api_url) as url:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/urllib/request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/urllib/request.py", line 519, in open
    response = self._open(req, data)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/urllib/request.py", line 536, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/urllib/request.py", line 496, in _call_chain
    result = func(*args)
             ^^^^^^^^^^^
  File "/usr/lib/python3.11/urllib/request.py", line 1391, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/urllib/request.py", line 1351, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'weather.visualcrossing.com'. (_ssl.c:992)>
nandavereda commented 11 months ago

esse pedido é um tanto mais complicado que os outros.. Subi uma proposta. Depois me diga se atendeu

cadusilva commented 11 months ago

esse pedido é um tanto mais complicado que os outros.. Subi uma proposta. Depois me diga se atendeu

Testei aqui trocando weather por weatheru na URL da API, para simular que ela esteja fora do ar e defini API_TIMEOUT=60 no .env. A resposta foi:

Algo inesperado aconteceu.
Traceback (most recent call last):
  File "/opt/gitwork/clima/openweathermap.py", line 51, in try_city
    json_data = executor.submit(_read_json, (full_api_url,)).result(timeout=timeout)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 449, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/gitwork/clima/openweathermap.py", line 92, in _read_json
    with urllib.request.urlopen(url) as doc:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/urllib/request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/urllib/request.py", line 509, in open
    req.timeout = timeout
    ^^^^^^^^^^^
AttributeError: 'tuple' object has no attribute 'timeout'
Erro 500
Status recebido de clima.

Era o resultado esperado? O bot parou de crashar e nos notifica na resposta.

nandavereda commented 11 months ago

não era o resultado esperado rsrs. A parte de timeout ainda está quebrada. Vou corrigir..

nandavereda commented 11 months ago

Reabrindo. Quando o timeout tiver sido testado ai sim pode concluir a issue

cadusilva commented 11 months ago

Eis o novo erro:

Algo inesperado aconteceu.
Traceback (most recent call last):
  File "/opt/gitwork/clima/openweathermap.py", line 51, in try_city
    json_data = executor.submit(_read_json, full_api_url).result(timeout=timeout)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 451, in result
    self._condition.wait(timeout)
  File "/usr/lib/python3.11/threading.py", line 323, in wait
    if timeout > 0:
       ^^^^^^^^^^^
TypeError: '>' not supported between instances of 'str' and 'int'
Erro 500
nandavereda commented 11 months ago

Dev que não testa as coisas na máquina testa onde? Em produção, onerando a área de operações... Mal pelos 2 erros anteriores.

cadusilva commented 11 months ago

sem problemas hahaha

Bom, com o último commit ele responde certinho quando a URL da API tá certa e retorna erro de DNS quando está errada, então tudo normal aqui. Porém não sei como simular a API demorando a responder para fazer o timeout valer. Vamos esperar até ocorrer uma queda de verdade?

Hoje acho que a maior parte do downtime foi cache de DNS.

nandavereda commented 11 months ago

Testa com API_TIMEOUT=0 e a URL correta

cadusilva commented 11 months ago

Testa com API_TIMEOUT=0 e a URL correta

Nesse caso retornou erro 429 e uma resposta dizendo que está sobrecarregado.

nandavereda commented 11 months ago

Sucesso. Foi isso que eu programei para retornar.

cadusilva commented 11 months ago

Excelente! Muito obrigado, Fernanda 🥇