Algumas vezes pode ser preciso trabalhar com alguma API pela internet que apresenta problemas de conexão, causando perda de confiabilidade ou respostas de erros inconsistentes e mudar de API nem sempre é uma opção.
Temos aqui cinco dicas para lhe ajudar a lidar com essas APIs problemáticas:
1. Loops de tentativas
Essa dica serve apenas para requisitar informações (e não alterar dados) quando você estiver utilizando uma API que te retorna erro 500 ou outros erros não documentados e em taxas muito altas (por exemplo, 10% de erros ou mais). Matematicamente, se você possui 90% de sucesso nas requisições, tentar novamente irá aumentar sua chance de sucesso para 99%:
90% + (10% x 90%) = 99%
E tentar apenas 2 vezes irá ampliar a grandeza do sucesso:
99% + (1% x 90%) = 99.9%
Assim, podemos traduzir os 99.9% de disponibilidade com um loop de 3 tentativas, como nesse exemplo em Python:
success = False for x in xrange(3): try: response = requests.get('https://api.bigco.com/v1/entries/') if response.status == 200: success = True break except ValueError: logger.info(“Request failed {} time(s)”.format(x+1)) if not success: logger.info(“Failed to complete a request for...”) # Handle error
2. Logs completos
Cada vez que você encontrar um erro durante a requisição de uma API, tenha muito claro o que aconteceu para facilitar o processo de caça ao bug pelo provedor da API. Isso inclui:
- URL da requisição (com o caminho completo);
- Cabeçalhos da requisição;
- Parâmetros de dados da requisição (atenção para diferenciar maiúsculas de minúsculas como nos tokens de acesso);
- Parâmetros de autenticação http;
- O texto de resposta;
Seu código deve armazenar em registro o log dessas informações independente do sucesso ou da falha na requisição – esse é o acompanhamento de auditoria.
3. Defina e-mails automáticos
Conforme você trabalha com mais parceiros, reportar os erros pode descer na sua lista de prioridades, especialmente se você construiu uma aplicação robusta e com um tratamento de erros sólido. Mas isso não é recomendado – existindo diversas APIs parceiras que não são críticas para a sua funcionalidade mas aonde elas ajudam a oferecer uma melhor experiência para o usuário – é muito importante monitorar e reportar todos os erros.
Automatizar e-mails para as equipes de suporte técnico com um diagnóstico detalhado do erro pode ser de grande ajuda. Utilizar uma linguagem casual também, assim não parece que o e-mail é automatizado.
Uma sugestão, em Python:
request_params = { 'url': 'https://api.bigco.com/v1/entries/.../', 'request_type': 'POST', 'data': {}, 'headers': {}, ... } success = False for x in xrange(3): try: response = execute_request(request_params) if response.status == 200: success = True break except ValueError as e: logger.info(“API request {url} failed: {e}, details: {request_params}”.format(**request_params) if not success: logger.info(“Failed to complete a request for...”) send_email_for_bigco_api_error(request_params) # Handle error
4. Use ferramentas de relatórios de erros
Utilize ferramentas de relatórios de erros para reportar as exceções não tratadas. Isso é crítico porque você nunca vai antecipar cada erro e as ferramentas de logs apresentam algum atraso (por exemplo, toda noite enviam um relatório combinado dos erros que aconteceram durante o dia – não é em tempo real).
É importante usar essas ferramentas de relatórios com as suas APIs ou com as APIs de terceiros. Uma das opções é o Sentry mas também existem várias outras opções.
Integrar uma dessas opções geralmente requer um esforço mínimo, e assim, quando uma exceção não tratada ocorrer, você será notificado (junto com a frequência e os usuários afetados).
5. Rastreie e monitore o atraso no tempo das respostas
O aumento do tempo de resposta pode ser o principal indicativo de erros, e não é muito difícil de mensurar esse tempo e acrescentar esse registro na programação e nos logs. Comece analisando o tempo médio das respostas, e encontre a curva de distribuição desses dados.
Por exemplo, sabendo o tempo médio da resposta e a sua distribuição estatística. Quando um atraso na resposta for maior do que 95% das ocorrências, receba um alerta ou contate o parceiro responsável para que ele esteja ciente. Você pode ajudá-los a evitar erros por sobrecarga do sistema!
Além disso, esses dados irão lhe auxiliar a delinear o tempo empregado ao se trabalhar com um grande volume de dados. Por exemplo na Instavest, que utiliza uma quantidade massiva de dados, em alguns momentos haviam scripts levando muito tempo para a execução, mas reagendando esses scripts para horários em que as APIs dos parceiros tinham maior disponibilidade (menor tempo de resposta) houve um ganho significativo na velocidade de execução dos mesmos.
Entender esses dados pode lhe ajudar a diagnosticar algumas questões como o acesso às APIs, o tratamento de erros e a experiência do usuário.
Adaptado de Instavest.