Observabilidade Mobile com Dynatrace

Referência técnica para SRE — React Native full-stack instrumentation

View the Project on GitHub alanrdel/react_app

Observabilidade Mobile com Dynatrace

Referência técnica para times de SRE e Engenharia Mobile

Capacite seu time a investigar e resolver incidentes mobile em produção com dados de observabilidade coletados desde o cliente, correlacionados com o backend e infraestrutura.


📚 Documentação

Primeiros Passos

Para SREs e Arquitetos

Troubleshooting


🏗️ Arquitetura do Projeto

MOBILE (Android/iOS)
├─ @dynatrace/react-native-plugin v2.337.1
├─ Beacon → https://bf78240axh.bf.dynatrace.com/mbeacon
└─ W3C Trace Context headers em HTTP
    ↓
BACKEND (Node.js/Express — Kubernetes k3s)
├─ namespace: pontos-club
├─ OneAgent via dynatrace-operator
├─ ActiveGate: fov31014.live.dynatrace.com
└─ NetworkZone: ard-rancher-demo
    ↓
DATABASE (MySQL 8.0)
└─ Rastreamento distribuído automático

🎯 Casos de Uso

Cenário Solução
Sessão mobile carrega em 5s, deveria ser 2s TTI por tela + sub-actions mostram qual tile degrada
Usuário reclama de crash ao resgatar prêmio Identificar by userId → histórico de sessão → logs correlacionados do backend
Taxa de erro em login aumentou de 2% para 8% USQL com segmentação por nivel_usuario e segmento
Backend respondendo lento, mobile não sente? Rastreamento distribuído mostra a falha ao nível de query SQL
Problema apenas em produção iOS, não em Android Filtrar por osVersion + appVersion em USQL

📋 Quick Reference

Wrapper dtRum — API Centralizada

// Inicialização
dtRum.init();

// Autenticação
dtRum.identificarUsuario(userId, { nivel, segmento });

// Enriquecimento
dtRum.sessao({ nivel_usuario: "Gold", pontos_usuario: 15430 });

// Performance
dtRum.telaCarregada("Home", startTime, { total_promocoes: 5 });

// Interações
dtRum.clique("Home - Acessar Prêmios", { premio_id: "prm_001" });

// Fluxos compostos
await dtRum.withAction("Home - Carregar Dashboard", async (parent) => {
  const [user, txns] = await Promise.all([
    dtRum.subAcao(parent, "Tile - Pontos", () => api.getUsuario()),
    dtRum.subAcao(parent, "Tile - Transações", () => api.getTransacoes()),
  ]);
});

// HTTP instrumentada
await dtRum.apiCall("Prêmios - Carregar", () => api.getPremios());

// Erros de negócio
dtRum.erroBusiness("Resgate negado: saldo insuficiente", 1001);

// Ciclo de vida
dtRum.encerrarSessao(); // flushEvents + endSession

USQL Essenciais

Performance por tela:

SELECT name, AVG(longProperties.tti_ms) AS avg_tti, percentile(longProperties.tti_ms, 95) AS p95
FROM useraction
WHERE longProperties.tti_ms IS NOT NULL
GROUP BY name
ORDER BY avg_tti DESC

Usuários por segmento:

SELECT stringProperties.nivel_usuario, COUNT(DISTINCT userId) AS usuarios
FROM usersession
WHERE stringProperties.nivel_usuario IS NOT NULL
GROUP BY stringProperties.nivel_usuario

Taxa de erro em APIs:

SELECT name, COUNT(*) AS total,
       SUM(CASE WHEN stringProperties.status = 'erro' THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS taxa_erro_pct
FROM useraction
WHERE name LIKE "API - %"
GROUP BY name
ORDER BY taxa_erro_pct DESC


📝 Sumário Completo


Documentação mantida pelo time de Engenharia Mobile. Última atualização: maio de 2026.