Quando um app React Native entra em producao, o time perde uma comodidade silenciosa: o erro deixa de acontecer do lado do desenvolvedor. Em vez de reproduzir tudo no simulador, a equipe passa a depender de sinais enviados por aparelhos reais, redes instaveis, versoes diferentes de build, updates por OTA e fluxos que so quebram em determinado contexto de usuario. Se esses sinais nao existem, o problema chega como frase vaga: "o app travou", "a tela ficou branca", "o upload sumiu", "o push nao abriu", "deu erro depois do login".
Em app corporativo, isso pesa ainda mais. O sistema mobile normalmente participa de rotina de campo, atendimento, aprovacao, coleta de evidencia, consulta ou operacao longe do escritorio. Sem observabilidade, o suporte vira tentativa e erro. E sem um minimo de correlacao entre app, API, release e contexto do usuario, cada incidente custa mais do que deveria.
Este guia organiza uma observabilidade pratica para React Native e Expo, com foco em logs, crash reporting, source maps, versoes, updates e contexto suficiente para investigar sem transformar o app em coletor de ruido.
1. Observabilidade mobile comeca aceitando que producao e outro ambiente
A documentacao do React Native lembra que recursos de debug, Dev Menu, LogBox e DevTools ficam desativados em release builds. Isso muda o jogo. O erro que voce ve claramente em desenvolvimento pode virar sintoma opaco no aparelho do usuario se a equipe nao preparou outro caminho de leitura.
Algumas consequencias praticas:
- voce nao pode depender do menu de desenvolvimento para investigar app em producao;
- warning visual em dev nao significa contexto suficiente no release;
- erro JavaScript minificado ou crash nativo precisa de outra estrategia de leitura;
- problema de rede, permissao, sessao ou OTA update pode acontecer em combinacoes que o time nao testou localmente.
Por isso, observabilidade mobile nao e luxo. E o jeito de reduzir o espaco entre "o app travou" e "o que exatamente aconteceu, em qual versao, com qual usuario e em que parte do fluxo".
2. Comece pelo mapa dos eventos que realmente importam
Nem todo log merece existir. App corporativo nao precisa despejar console infinito em producao. Precisa registrar o que ajuda a responder perguntas de suporte e produto.
Um mapa minimo costuma incluir:
- bootstrap do app;
- restauracao de sessao;
- login e logout;
- abertura de tela critica;
- chamadas importantes para a API;
- fila offline e reenvio;
- upload de anexo;
- recebimento ou abertura de push;
- erros tratados e erros inesperados.
O objetivo nao e gravar tudo. E registrar o suficiente para reconstruir a linha do tempo de um problema. O artigo arquitetura inicial do app corporativo ajuda a decidir quais fluxos merecem ser protegidos primeiro.
3. Log bom em mobile precisa de contexto, nao de volume
Um erro isolado quase nunca basta. O time precisa saber em qual rota estava, qual build rodava, se o usuario estava autenticado, se havia conectividade, qual endpoint falhou, se existia item offline pendente e se o app veio de build embarcada ou de update posterior.
Campos uteis por evento:
- nome do evento ou erro;
- tela ou rota atual;
- versao do app e build number;
- identificador do ambiente da API;
- usuario anonimizado ou identificador tecnico permitido;
- status de conectividade;
- resultado da chamada HTTP;
- correlation ID quando existir integracao com backend;
- momento do ciclo de vida em que o erro ocorreu.
Essa camada conversa com o que ja fazemos no backend. O artigo logs e correlacao de requisicao no Spring Boot mostra por que request ID e contexto valem ouro quando mobile e API precisam conversar para explicar o mesmo incidente.
4. Crash reporting precisa diferenciar excecao previsivel de queda inesperada
A documentacao da Expo sobre integracao com Sentry descreve crash reporting como meio de obter insight em tempo real sobre erros e excecoes em producao, incluindo stack trace, informacoes do dispositivo, versao e contexto adicional. Mesmo que a equipe use outra ferramenta, o principio e o mesmo: falha inesperada precisa parar em um painel com agrupamento e contexto suficiente para acao.
Boa pratica:
- usar uma ferramenta de crash reporting ou equivalente;
- enviar contexto de rota, usuario tecnico e operacao atual;
- separar erro realmente fatal de erro de negocio tratado na interface;
- evitar vazar payload sensivel, token ou dado pessoal em mensagem de erro;
- registrar versao e release do app junto do incidente.
Sem isso, o time recebe reclamacao de suporte, mas nao consegue separar crash real, timeout externo, regra de negocio ou falha de permissao.
5. Source map e symbolication sao parte da investigacao, nao detalhe de build
A documentacao do React Native sobre debugging release builds mostra que excecoes em release podem chegar ofuscadas, com nomes minificados e offsets pouco legiveis. Para transformar isso em arquivo, linha e funcao compreensiveis, a equipe precisa de source maps corretos e correspondentes exatamente ao build que falhou.
Na pratica, isso exige disciplina:
- gerar source maps no processo de build adequado;
- guardar ou enviar esses mapas para a ferramenta de erro usada;
- garantir que o mapa corresponde ao commit e ao binario que foi publicado;
- nao tratar symbolication como algo que sera resolvido depois.
Se a equipe ignora esse ponto, o erro chega com stack ilegivel e a investigacao volta para o escuro. Em app corporativo, isso costuma atrasar hotfix e cria correcao por intuicao.
6. EAS Build e EAS Update pedem rastreabilidade da versao real em uso
A documentacao da Expo sobre Sentry com EAS explica que, em builds, source maps podem ser enviados automaticamente e, em updates OTA, os mapas precisam acompanhar o pacote publicado. Ela tambem mostra como marcar o escopo com `Updates.updateId`, `expo-update-group-id` e informacoes do update para saber em qual release o erro aconteceu.
Mesmo sem copiar a integracao literalmente, a licao e clara: em apps com EAS Update, falar apenas "versao 1.2.0" pode nao bastar. Dois usuarios podem estar com o mesmo binario e JavaScript diferente.
O minimo que vale rastrear:
- versao publica do app;
- build number ou versionCode;
- runtime version quando usada;
- identificador do update OTA, quando houver;
- ambiente da API consumida;
- horario aproximado do erro.
Isso conecta diretamente com o artigo Expo, development build e EAS Build e evita a pergunta classica: "foi no app da loja ou no update que entrou depois?".
7. Erro de API precisa aparecer como historia completa
Muito problema atribuido ao mobile, na verdade, nasce da integracao com o backend. Um 401 depois de refresh mal sincronizado, um 500 vindo de contrato quebrado, um timeout em rede ruim, um upload rejeitado por tamanho ou um endpoint antigo ainda usado pelo app antigo podem aparecer para o usuario apenas como "nao funcionou".
Por isso, vale registrar pelo menos:
- endpoint chamado;
- metodo HTTP;
- codigo de resposta;
- tempo de resposta;
- correlation ID devolvido pelo backend, quando existir;
- tipo resumido da falha: autenticacao, validacao, timeout, servidor, conectividade.
O artigo validacao e erros em API REST ajuda a fechar esse lado do contrato. Mobile observavel depende de backend previsivel.
8. Offline e fila local tambem precisam gerar sinais
Quando o app trabalha com cache e fila local, a ausencia de observabilidade cria um bug perigoso: a equipe acha que o usuario concluiu a tarefa, mas o aparelho ainda esta apenas com item pendente. Isso vale para sincronizacao, anexos, aprovacoes e qualquer operacao que sobreviva sem rede.
Estados uteis para observacao:
- evento entrou na fila local;
- evento foi reenviado;
- conflito de sincronizacao aconteceu;
- ultima tentativa falhou;
- usuario saiu do app com item pendente;
- fila foi concluida depois da reconexao.
Esse desenho se apoia no artigo offline, fila e sincronizacao com API. Offline sem sinais vira falsa sensacao de sucesso.
9. Push, deep link e permissao merecem contexto proprio
Notificacao push parece periferica ate o dia em que leva o usuario para a rota errada, nao abre a tela esperada ou deixa de chegar apenas em parte da base. O mesmo vale para deep links e para permissoes que foram negadas no aparelho real.
Vale observar:
- token de push registrado com sucesso;
- canal e plataforma do dispositivo;
- recebimento da notificacao;
- abertura da notificacao;
- deep link resolvido para rota valida;
- permissao negada ou revogada pelo usuario.
O artigo notificacoes push em app corporativo cobre a parte funcional; aqui o foco e garantir que, quando algo falhar, o time saiba em qual etapa a cadeia se rompeu.
10. Nao confunda observabilidade com espionagem
Registrar sinais tecnicos nao significa capturar tudo. App corporativo precisa manter privacidade e proporcionalidade.
Evite:
- token, senha ou cabecalho de autorizacao em log;
- payload completo com dados pessoais sensiveis;
- anexo, imagem ou documento bruto dentro do evento de erro;
- identificador pessoal desnecessario quando um id tecnico basta;
- ruido que so aumenta custo e polui investigacao.
O melhor log ajuda a agir sem expor o que nao precisa ser exposto. Essa postura precisa seguir o mesmo criterio da politica de privacidade e da politica editorial do portal: registrar o necessario, com contexto, sem exagero.
11. Um pequeno painel de saude vale mais do que cem prints de erro
Mesmo em times pequenos, vale acompanhar alguns indicadores simples por release:
- crashes por versao;
- erros de login por build;
- falhas de sincronizacao offline;
- upload pendente acima do normal;
- tempo de resposta dos endpoints mais usados;
- abertura de push com sucesso;
- percentual de usuarios ainda em build antiga critica.
A pagina indicadores tecnicos ajuda a traduzir isso para acompanhamento de rotina. Observabilidade boa nao vive apenas no incidente; ela melhora a manutencao semanal.
12. Checklist de observabilidade para app React Native em producao
- Definir eventos realmente importantes do app.
- Registrar rota, versao, ambiente e contexto de falha.
- Ter crash reporting com agrupamento e contexto tecnico.
- Garantir source maps corretos para release e update.
- Correlacionar falha mobile com resposta da API.
- Observar fila offline, upload e sincronizacao.
- Registrar sinais de push, deep link e permissao.
- Evitar logs com segredos ou dado sensivel excessivo.
- Acompanhar indicadores por release, nao so por app em geral.
- Documentar como reproduzir, agir e validar o hotfix.
13. Erros comuns
- depender de console em desenvolvimento como se isso existisse em producao;
- registrar erro sem build, versao ou rota;
- subir update OTA sem rastrear qual update o usuario recebeu;
- guardar source map errado para o binario que falhou;
- misturar erro de negocio com crash fatal no mesmo nivel;
- nao correlacionar app e backend na investigacao;
- coletar dado sensivel demais em nome de debug;
- esperar reclamacao do usuario para descobrir que o release quebrou.
14. Quando vale procurar ajuda tecnica
Se o app ja esta em uso real e a equipe continua sem explicar crash, erro intermitente, upload perdido, push inconsistente ou falha que aparece so em determinada versao, talvez o problema nao seja um bug isolado. Pode ser falta de desenho observavel entre mobile, API, release e operacao. Nessa hora, um diagnostico tecnico ajuda a fechar o circuito entre build, backend, fonte do erro, evidencias e plano de correcao.
Observabilidade em app React Native nao precisa comecar gigante. Mas ela precisa existir antes do incidente serio. Quando logs, versoes, source maps e contexto de API trabalham juntos, o time para de adivinhar e volta a investigar com metodo.
Referencias editoriais: React Native Debugging Basics, React Native Debugging Release Builds, Expo runtime issues e Expo Using Sentry.
Termos tecnicos desta leitura
Alguns conceitos aparecem com frequencia neste tema. Abrir o glossario ajuda a comparar definicoes, exemplos e leituras relacionadas sem sair do contexto do artigo.