API Design: Status Codes e o impacto na Observabilidade de APIs
Introdução
No desenvolvimento de APIs, o design não se limita apenas a atender requisitos funcionais e técnicos, mas também desempenha um papel crucial na experiência dos consumidores e na manutenção da aplicação. Entre os diversos aspectos que compõem um bom design de API, o uso correto dos status codes é um dos pilares fundamentais. Esses códigos são mais do que simples respostas aos consumidores das APIs; eles são um meio de comunicação padrão que transmite informações claras sobre o resultado das solicitações. Quando utilizados corretamente, ajudam os desenvolvedores a entender rapidamente o que aconteceu, seja para depurar erros, ajustar chamadas ou monitorar o desempenho.
Além de serem essenciais para a experiência do consumidor, os status codes também têm um impacto direto na observabilidade de APIs. A observabilidade vai além do simples monitoramento, permitindo uma visão detalhada de como a API está se comportando nos seus ambientes, principalmente no ambiente produtivo. Status codes bem implementados ajudam a rastrear padrões de uso, identificar falhas e avaliar a saúde geral do sistema, possibilitando uma reação mais ágil a problemas. Por outro lado, um uso inadequado pode gerar ambiguidades, dificultando a identificação de problemas e reduzindo a confiabilidade da API.
Neste contexto, o entendimento e a aplicação estratégica de status codes são essenciais para criar APIs robustas, fáceis de usar e altamente observáveis. Este texto explora como esses códigos podem ser utilizados de maneira eficiente, seus impactos na rastreabilidade de erros e como contribuem para melhorar a experiência tanto de consumidores quanto de operadores de APIs.
API Design
Durante a fase de design da API é onde modelamos e definimos o contrato da API baseado nos requisitos funcionais e técnicos. Durante a definição do contrato da API, os status codes são usados sob a ótica dos cenários de sucesso e de falhas, respeitando os requisitos e com isso garantindo uma comunicação padronizada e consistente, facilitando a depuração e tratamento de erros, melhorando a experiência do consumidor e por fim, melhorando a observabilidade das APIs pelos seus operadores.
Porém, existem muitos casos em que API Developers não levam em consideração o uso correto dos status codes, causando um enorme impacto na observabilidade das APIs, seja por falta de conhecimento das diretrizes do protocolo HTTP (RFC), seja pelo uso incorreto de frameworks que geram o contrato de API automaticamente ou pelo já conhecido “a entrega é para ontem”. Com isso, seguem alguns exemplos do uso incorreto dos status codes:
Uso Genérico de Códigos de Sucesso
A classe 2xx contém uma gama de códigos para serem usados em vários cenários de sucessos, desde o mais genérico (200), até os mais específicos como recurso criado (201), requisição aceita (202), sucesso sem conteúdo (204), retorno parcial (206), entre outros.
Ao não levar em consideração o correto status code, utilizando de código genérico tanto para cenários de sucesso quanto para cenários de falhas internas, força os operadores de API a dependerem exclusivamente do corpo da resposta para interpretar o resultado, contrariando a ideia de que os status codes devem transmitir informações claras e com isso dificultando o tratamento de erros programático e a automação, além de comprometer a observabilidade. Veja um exemplo do uso incorreto desses status codes:
Status Code: 200 OK
Response:
{
“status”: “error”,
“message”: “Falha no envio das informações”,
“detail”: “O campo xxx não foi informado.”
}
Uso Errado de Códigos de Cliente e Servidor
Assim como na classe 2xx, as classes 4xx e 5xx possuem vários códigos específicos para os cenários de erros do lado do cliente e do lado do servidor, desde os mais genéricos (400 e 500), até os mais específicos como erro de autenticação (401), autorização (403), recurso requisitado não existente (404), muitas requisições enviadas (429), serviço indisponível (503), entre outros.
Para o uso correto desses códigos, é importante identificar corretamente se o erro foi causado pelo consumidor da API ou pelo serviço da API e com isso retornar o código correto. Se em erros de cliente for usado o código genérico 500 ou em erros de servidor for usado o código genérico 400, acarretará transferência da culpa indevidamente para o cliente ou para o servidor, gerando confusão e dificultando a depuração. Veja um exemplo do uso incorreto desses status codes:
Status Code: 500 Internal Server Error
Response:
{
“message”: “Falha na autenticação”,
“detail”: “O token de acesso está expirado ou inválido.”
}
Respostas Ambíguas ou Genéricas
Assim como nos exemplos anteriores, retornar o mesmo código para diferentes cenários, como usar o código 400 tanto para erros de validação quanto para autenticação inválida, faz com que os operadores não consigam distinguir facilmente as causas dos erros durante a observabilidade da API, aumentando a dificuldade de diagnóstico e a complexidade para tratamento de erros.
Uso de Códigos Diferentes para Diferentes Cenários de Negócio
Esse é outro problema que pode acontecer quando os códigos não são usados corretamente. Por exemplo, em uma consulta de produtos, dependendo do cenário de negócio, o produto pode vir com valores normais ou valores com descontos ou ambos e para cada cenário estaria usando um código diferente, como 200 para produtos com valores normais, 202 para produtos com valores com desconto e 207 para produtos com ambos valores.
Nesse exemplo, além do problema do uso de códigos diferentes quando o correto seria usar apenas o código 200 deixando a cargo do corpo da resposta diferenciar os cenários, também existe o problema do uso de códigos não padronizados (207) podendo causar incompatibilidades com ferramentas de automação para observabilidade e bibliotecas existentes.
Em resumo, o uso inadequado de status codes pode transformar uma API promissora em um desafio frustrante para seus operadores na observabilidade da API. Para evitar esses problemas, é essencial seguir as diretrizes do protocolo HTTP (RFC) e ser consistente na escolha dos códigos. Um design bem pensado, com status codes claros e precisos, melhora a usabilidade da API, facilita a depuração, melhora a observabilidade e fortalece a confiança dos consumidores.
Recomendados pelo LinkedIn
Status codes na Observabilidade de APIs
Como explicado, os status codes têm um alto grau de impacto na observabilidade das APIs, seja para o lado positivo (uso correto) ou para o lado negativo (uso incorreto). Os API Developers devem sempre ter em mente que o uso correto dos status codes ajudam na criação e configuração dos tipos de monitoramento (funcionais e técnicos) que se deseja para as APIs e com isso, ajudam a entender e otimizar tanto a saúde operacional quanto o impacto das APIs nos objetivos organizacionais. Com isso, seguem alguns exemplos de observabilidade com o uso dos status codes:
Observabilidade Técnica
Garantindo a Saúde e Performance da API
No contexto técnico, os status codes são fundamentais para medir a saúde operacional da API e identificar possíveis gargalos ou falhas.
Detecção de falhas e monitoramento de erros: Códigos como 500 ou 503 sinalizam problemas críticos no lado do servidor. A análise da frequência e distribuição desses códigos permite às equipes de operação identificar falhas rapidamente, muitas vezes antes que os consumidores finais sejam significativamente impactados.
Análise de padrões de uso: A distribuição de status codes ao longo do tempo, como 200, 201 e 206, pode indicar como a API está sendo utilizada. Um aumento no uso de respostas parciais (206) pode sugerir eficiência no consumo já que a latência não será impactada, enquanto um volume anormal de 429 pode indicar sobrecarga de recursos.
Identificação de problemas regionais ou de rede: Em sistemas distribuídos, códigos como 504 podem indicar problemas de conectividade entre serviços ou regiões específicas, permitindo uma análise mais granular de onde o sistema está falhando.
Identificação de ataques: Um alto volume de erros repentino com códigos 401, 403 ou 429, pode indicar que as APIs estão sofrendo um ataque e nesse momento executar análise é primordial para evitar problemas de latência, queda dos serviços e até possíveis roubos de informações caso obtenham sucesso nas requisições.
Observabilidade Funcional
Insights Estratégicos para a Organização
Os status codes também oferecem informações valiosas para avaliar o impacto das APIs nos objetivos de negócio.
Análise de conversão e sucesso: Um alto volume de respostas de sucesso, como 200 ou 201, pode indicar que a API está atendendo bem às demandas dos consumidores. Por outro lado, um aumento em 400 ou 403 pode apontar dificuldades de usuários na utilização correta, sugerindo a necessidade de melhorias na documentação ou no design da API.
Engajamento e retenção de usuários: Padrões de uso identificados por status codes podem revelar como os consumidores interagem com a API. Respostas 404 frequentes podem indicar endpoints mal documentados ou desatualizados, enquanto um excesso de 401 pode sugerir dificuldades de autenticação, impactando a experiência do cliente e sua retenção.
Planejamento de capacidade: Respostas como 429 fornecem indicadores claros sobre quando os limites de consumo estão sendo atingidos, permitindo um planejamento mais eficiente de escalabilidade e otimização de recursos.
Conexão entre Observabilidade Técnica e Funcional
O Valor da Observabilidade Integrada
Uma API observável não apenas opera de forma eficiente, mas também fornece insights que conectam métricas técnicas aos objetivos de negócio. Por exemplo:
Essa integração entre métricas técnicas e indicadores de negócio permite que equipes técnicas e estratégicas colaborem de forma mais eficaz, usando dados para tomar as decisões.
Conclusão
Os status codes desempenham um papel crucial na observabilidade de APIs, indo além de sua função técnica para impactar diretamente os objetivos de negócio. Com um uso estratégico, eles ajudam a diagnosticar falhas, otimizar o desempenho e monitorar o impacto econômico das APIs, fornecendo às organizações uma visão completa e acionável de seu ecossistema digital. Investir em um design de API que priorize status codes bem definidos é, portanto, essencial para promover a confiabilidade técnica e o sucesso comercial.
Consultor Arquiteto Sr at Sensedia
1 mParabéns. Bons pontos. Ainda reforço que em tempos de automatização de tudo que é possível. APIs com design adequados são habilitadores importantes para a agilidade e inovação. Enquanto APIs com design ruim, sem semântica e despadronizadas, dificultam a governança, operação e a inovação.
Partner Builders & CEO Retechers | Vendas | Startup Mentor | Executive as a Service (Business & Tech) | Solution Architect Executive | Advisor
1 mExcelente conteúdo Vinicius Lourenço de Sousa Apis se inicia 100% em um bom design de contrato de estrutura e mensageria
Chief of Growth @ Builders | Partner | Digital Platforms Thinking | Enterprise Architecture
1 mShow. Bons contratos de APIs incluem a definição de exceções relevantes, no caso, Status Codes . DbC para APIs! 👏
Enterprise Architect & Corporate Governance
1 mMuito bom, Vini. Parabéns.