O ARMS Real User Monitoring (RUM) permite usar uma sessão de usuário como ponto de partida para rastrear erros, desempenho lento e exceções durante interações. A integração com o ARMS Application Monitoring viabiliza o rastreamento de ponta a ponta e simplifica o fluxo de análise de problemas. Este tópico descreve como conectar traces de frontend e backend para aplicativos móveis.
Pré-requisitos
-
Instrumente seu aplicativo móvel (Android ou iOS) com a versão mais recente do RUM SDK. Para mais informações, consulte Monitor Android apps.
NotaA versão do SDK deve ser 0.2.0 ou posterior para Android e 0.2.0 ou posterior para iOS.
Monitore seu aplicativo de backend com o ARMS Application Monitoring ou o Managed Service for OpenTelemetry. Para mais informações, consulte Integration guide.
Forneça um web service (HTTP) no aplicativo de backend capaz de analisar headers e correlacionar o contexto de trace.
Não há mais suporte para conexão de traces entre aplicativos de frontend e backend em regiões diferentes. Se seus aplicativos estiverem em regiões distintas, acesse o console do CloudMonitor 2.0 e instrumente o aplicativo de frontend na mesma região e workspace do aplicativo de backend.
Protocolos de trace suportados
SkyWalking: v3 (para agentes SkyWalking 8.x)
OpenTelemetry (W3C)
Procedimento
Adicionar domínios de service e ativar a propagação de trace
Faça login no console do ARMS.
No painel de navegação à esquerda, escolha e selecione sua região na barra de navegação superior.
Clique em no nome do aplicativo e, em seguida, clique em Application Settings.
-
Na seção Request Management, configure o domínio do service.
ImportanteNão adicione domínios de services de terceiros como se fossem seus. Caso contrário, a propagação de trace pode falhar.
Adicione o domínio do service, ative a opção Trace Propagation e selecione o protocolo de propagação correspondente ao service de backend.
NotaCertifique-se de que o aplicativo de backend já esteja instrumentado para rastreamento no ARMS. Para mais informações, consulte Integration guide.
Nome do formato
Formato
sw8: {sample}-{trace-id}-{segment-id}-{0}-{service}-{instance}-{endpoint}-{peer}
traceparent : {version}-{trace-id}-{parent-id}-{trace-flags}
tracestate: rum={version}&{appType}&{pid}&{sessionId}
-
Clique em Confirm. O sistema envia automaticamente a configuração de propagação de trace para o aplicativo móvel.
ImportanteA aplicação da configuração no lado do cliente pode levar alguns minutos, dependendo do comportamento do usuário. Por padrão, o SDK busca a configuração uma vez durante a inicialização a frio do aplicativo e também a busca novamente se o aplicativo for reaberto após permanecer em segundo plano por mais de 30 segundos.
Embora aplicativos móveis não estejam sujeitos à política de compartilhamento de recursos de origem cruzada (CORS) de aplicações web, o gateway do servidor deve suportar a propagação de headers de solicitação para cada protocolo. Sem esse suporte, o service de backend não recebe os headers e a conexão entre os traces do RUM e do backend falha.
Verificar a configuração
Esta seção usa o protocolo de propagação SkyWalking v3 como exemplo para verificar a configuração.
Android
Use a ferramenta App Inspection no Android Studio para verificar a presença de informações do protocolo sw8 nos headers de solicitação de rede. A presença dessas informações confirma o sucesso da configuração.
iOS
Use a ferramenta Xcode Profile para verificar as informações do protocolo sw8 nos headers de solicitação de rede. Para isso, na barra de ferramentas do Xcode, escolha .
Na interface do Instruments, selecione a faixa HTTP Traffic. Na lista suspensa no canto inferior esquerdo, mude para a visualização List: HTTP Transactions. Selecione a solicitação desejada e verifique se o header sw8 injetado aparece na seção Request Headers do painel de detalhes à direita.
Configurar a correlação de traces no backend
Para estabelecer um trace completo de ponta a ponta, configure também o aplicativo de backend. Os tipos de aplicativos de backend suportados e os métodos de instrumentação são:
Java application
Application Monitoring agent
O agente do ARMS Application Monitoring possui suporte nativo ao protocolo OpenTelemetry. Portanto, é possível correlacionar traces com o RUM sem configurações adicionais. No entanto, certifique-se dos seguintes pontos:
O agente do Application Monitoring deve ser da versão 2.x, 3.x ou 4.x. Recomendamos atualizar para a versão 4.x para garantir a melhor experiência.
Use um container web mainstream, como Tomcat, Jetty, WebLogic ou Undertow, além de um framework suportado, como SpringBoot ou SpringMVC. Para obter a lista completa de componentes e frameworks suportados, consulte Java components and frameworks supported by Application Monitoring.
Para instruções sobre como instalar o agente do Application Monitoring, consulte Monitor Java applications.
OpenTelemetry
Instrumente seu aplicativo com OpenTelemetry e relate dados ao ARMS (Managed Service for OpenTelemetry). Existem dois métodos disponíveis: instrumentação automática e instrumentação manual.
-
A instrumentação automática não exige configurações extras para correlacionar traces com o RUM, pois o OpenTelemetry suporta a maioria dos frameworks mainstream.
NotaPara informações sobre os frameworks Java suportados pelo OpenTelemetry, consulte Report Java application data by using OpenTelemetry.
-
Na instrumentação manual, use o mecanismo de extensão do SDK do OpenTelemetry para correlacionar os traces. Esse processo envolve analisar o contexto de trace a partir dos headers
traceparentetracestatedas solicitações de frontend. O código abaixo apresenta um exemplo para uma aplicação SpringBoot:-
Adicione as dependências do OpenTelemetry.
<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-trace</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-extension-annotations</artifactId> <version>1.18.0</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-semconv</artifactId> <version>1.30.1-alpha</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId> <version>1.34.1</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-extension-incubator</artifactId> <version>1.35.0-alpha</version> </dependency> -
Adicione o propagador W3C durante a inicialização do OpenTelemetry.
Resource resource = Resource.getDefault() .merge(Resource.create(Attributes.of( ResourceAttributes.SERVICE_NAME, "otel-demo", ResourceAttributes.HOST_NAME, "xxxx" ))); SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() .addSpanProcessor(BatchSpanProcessor.builder(OtlpHttpSpanExporter.builder() .setEndpoint("Your Endpoint") .addHeader("Authentication", "Your Token") .build()).build()) .setResource(resource) .build(); openTelemetry = OpenTelemetrySdk.builder() .setTracerProvider(sdkTracerProvider) // Add the W3C propagator here. .setPropagators(ContextPropagators.create( TextMapPropagator.composite(W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance())) ).buildAndRegisterGlobal(); // An extended Tracer is required here. tracer = ExtendedTracer.create(openTelemetry.getTracer("com.example.tracer", "1.0.0")); -
Na interface de negócios, adicione o parâmetro de headers, analise o contexto de trace a partir do header da solicitação e defina o parent.
// Add the request header parameter in the Controller to parse the trace context. @RequestMapping("/test") public String test(@RequestHeader Map<String, String> headers) { Span span = OpenTelemetrySupport.getTracer() .spanBuilder("/test") // Parse the parent span from the headers. .setParentFrom(OpenTelemetrySupport.getContextPropagators(), headers) .setSpanKind(SpanKind.SERVER) .startSpan(); try (Scope scope = span.makeCurrent()) { // do something } catch (Throwable t) { span.setStatus(StatusCode.ERROR, "handle parent span error"); } finally { span.end(); } return "success"; }
-
SkyWalking
Para o procedimento completo de instrumentação, consulte Java Agent plugin.
Atualmente, o SkyWalking fornece apenas o Java Agent para instrumentação. Basta seguir as instruções no documento vinculado para correlacionar os traces do RUM e do backend.
Correspondência de protocolo: O protocolo sw8 (v3) configurado no lado do RUM corresponde ao agente SkyWalking 8.x.
Go application
OpenTelemetry
Para o procedimento completo de instrumentação, consulte Report Go application data by using OpenTelemetry.
Siga a documentação para instrumentar seu aplicativo. Em seguida, gere um span a partir do contexto da solicitação no handler de requisições HTTP para correlacioná-lo com o trace do RUM.
// Initialize the tracer.
tracer := otel.Tracer(common.TraceInstrumentationName)
// Generate a span from the request context.
handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
ctx := req.Context()
span := trace.SpanFromContext(ctx)
// do something
w.Write([]byte("Hello World"))
})
SkyWalking
Para o procedimento completo de instrumentação, consulte Report Go application data by using SkyWalking.
Siga a documentação para instrumentar seu aplicativo. Recomendamos usar o método skywalking-go, que suporta frameworks web mainstream como Gin, go-restful, http, go-kratos v2, go-micro e go-resty. Isso permite correlacionar traces do RUM sem modificar o código.
Para analisar manualmente o contexto de trace a partir dos headers de solicitação HTTP, utilize o seguinte código:
// Extract context from the 'sw8' HTTP request header.
span, ctx, err := tracer.CreateEntrySpan(r.Context(), "/api/test", func(key string) (string, error) {
return r.Header.Get(key), nil
})
Python application
OpenTelemetry
Para o procedimento completo de instrumentação, consulte Report Python application data by using OpenTelemetry.
Siga a documentação para instrumentar seu aplicativo. Depois, analise o contexto do span a partir dos headers de solicitação HTTP para correlacionar com o trace do RUM. Veja abaixo um exemplo de código:
// Initialize the tracer.
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
tracer = trace.get_tracer(__name__)
@app.route('/test')
def test():
headers = dict(request.headers)
// Parse the trace context from the headers.
carrier ={'traceparent': headers['Traceparent'], 'tracestate': headers['Tracestate']}
ctx = TraceContextTextMapPropagator().extract(carrier=carrier)
with tracer.start_span("test", context=ctx):
// do something
return "success"
SkyWalking
Para o procedimento completo de instrumentação, consulte Report Python application data by using SkyWalking.
Siga a documentação para instrumentar seu aplicativo. Em seguida, analise o contexto do span a partir dos headers de solicitação HTTP para correlacionar com o trace do RUM. Confira o exemplo de código a seguir:
from skywalking import config, agent
from skywalking.trace.context import SpanContext, get_context
from skywalking.trace.carrier import CarrierItem
# Configure SkyWalking. Adjust parameters as needed.
config.init(agent_collector_backend_services='<endpoint>',
agent_authentication='<auth-token>')
agent.start()
# Sample HTTP request handler that requires passing in HTTP request headers.
def handle_request(headers):
# Extract trace information from the request headers.
carrier_items = []
for item in SpanContext.make_carrier():
carrier_header = headers.get(item.key.lower())
if carrier_header:
carrier_items.append(CarrierItem(item.key, carrier_header))
carrier = SpanContext.make_carrier(carrier_items)
# Extract the trace context from the carrier.
context = get_context().extract(carrier)
# Create a new span to process the request.
with get_context().new_entry_span(op='operation_name') as span:
# Process the request here. The span is automatically submitted when finished.
...
# Simulate a received HTTP request header that includes sw8.
incoming_headers = {
'sw8': '1-My40LjU=-MTY1MTcwNDI5OTk5OA==-xxxx-xx-x-x==', # Sample value. Use the actual value from the request.
# Other headers...
}
# Call the function to process the request.
handle_request(incoming_headers)
Visualize dados de trace de ponta a ponta
Após conectar os traces de frontend e backend, visualize a cadeia de chamadas para solicitações de frontend no console do ARMS RUM.
Clique em View Call Chain para visualizar a cadeia de chamadas completa e a topologia do aplicativo referente à solicitação. Assim, você diagnostica solicitações lentas ou com erros combinando os detalhes da solicitação do RUM com os dados de trace do backend.
O span de nível superior representa o span de entrada do RUM. A categorização desse span de entrada ocorre conforme o tipo de instrumentação do lado do cliente:
Web & H5: O nome do aplicativo é
rum-browsere o prefixo do nome do span é"browser.request:".Mini-programs: O nome do aplicativo é
rum-miniappe o prefixo do nome do span é"miniapp.request:".Android: O nome do aplicativo é
rum-androide o prefixo do nome do span é"android.request:".iOS: O nome do aplicativo é
rum-iose o prefixo do nome do span é"ios.request:".
Também é possível usar o gráfico de topologia para visualizar os services upstream e downstream de toda a solicitação.