O ARMS RUM permite rastrear erros, lentidão e anomalias durante interações do usuário a partir de uma sessão. A integração com o ARMS Application Monitoring oferece análise ponta a ponta, criando um caminho completo para diagnóstico de problemas. Este tópico descreve como correlacionar traces de frontend e backend para monitoramento web.
Pré-requisitos
Verifique se sua aplicação de frontend (incluindo web e mini-programs) está integrada ao RUM. Para mais detalhes, consulte Integrate a Web & H5 Application e Integrate a Mini Program.
Confirme que sua aplicação de backend está integrada ao ARMS Application Monitoring ou ao Managed Service for OpenTelemetry. Para obter mais informações, consulte Integration Guide.
Certifique-se de que sua aplicação de backend fornece um service web HTTP capaz de analisar o contexto de trace a partir dos headers da requisição.
A correlação entre regiões diferentes para aplicações de frontend e backend não é mais suportada. Se suas aplicações de frontend e backend estiverem em regiões distintas, acesse o CloudMonitor Console e integre sua aplicação de frontend na mesma região e workspace da sua aplicação de backend.
Protocolos de trace suportados
A correlação de traces do RUM suporta atualmente os seguintes protocolos principais de propagação de contexto de trace:
w3c: Inclui clientes OpenTelemetry e agentes ARMS.
b3/b3multi: Zipkin
Jaeger
sw8: SkyWalking
Ative a correlação de traces do RUM
Ao integrar o agente RUM à sua aplicação de frontend, ative a opção de configuração Tracing.
Ativar a correlação de traces do RUM gera dados adicionais de trace, o que pode afetar o faturamento do seu service Application Monitoring ou Managed Service for OpenTelemetry.
CDN sync
Modo simples
Este método é recomendado apenas para navegadores. Como mini-programs não possuem o conceito de requisições de mesma origem, use o Modo Completo e configure allowedUrls.
Este modo é geralmente usado para requisições de mesma origem, nas quais o backend utiliza o padrão OpenTelemetry por padrão. O tipo de allowedUrls é undefined, mas requisições de mesma origem são permitidas automaticamente.
<script>
window.__rum = {
pid: "<your pid>",
endpoint: "<your endpoint>",
//... Other configuration options are omitted here.
// Tracing configuration switch, disabled by default.
tracing: true // Equivalent to { enable: true, sample: 100, tracestate: true, allowedUrls:[], baggage: false }
};
</script>
<script type="text/javascript" src="https://sdk.rum.aliyuncs.com/v2/browser-sdk.js " crossorigin></script>
Modo completo
Oferece controle total sobre todas as definições de configuração. O tipo de allowedUrls é Array<TraceOption>.
<script>
window.__rum = {
pid: "<your pid>",
endpoint: "<your endpoint>",
//... Other configuration options are omitted here.
// Tracing configuration switch, disabled by default.
tracing: {
enable: true, // Enables tracing. Disabled by default.
sample: 60, // Sampling rate: 60%. Default: 100%.
tracestate: true, // Enables tracestate propagation. Enabled by default.
baggage: false, // Disables baggage propagation. Disabled by default.
allowedUrls:[
{match: 'https://api.alibabacloud.com', propagatorTypes:['tracecontext', 'b3']}, // Match URLs starting with 'https://api.alibabacloud.com'. Propagators: tracecontext, b3.
{match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // RegExp match for URLs containing 'api.alibaba.com'. Propagator: b3multi.
{match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // Function match for URLs containing '.api'. Propagator: Jaeger.
]
}
};
</script>
<script type="text/javascript" src="https://sdk.rum.aliyuncs.com/v2/browser-sdk.js " crossorigin></script>
CDN async
Modo simples
Este método é recomendado apenas para navegadores. Como mini-programs não possuem o conceito de requisições de mesma origem, use o Modo Completo e configure allowedUrls.
Este modo é geralmente usado para requisições de mesma origem, nas quais o backend utiliza o padrão OpenTelemetry por padrão. O tipo de allowedUrls é undefined, mas requisições de mesma origem são permitidas automaticamente.
<script>
!(function(c,b,d,a){c[a]||(c[a]={});c[a].config=
{
pid: "<your pid>",
endpoint: "<your endpoint>",
//... Other configuration options are omitted here.
// Tracing configuration switch, disabled by default.
tracing: true
}
with(b)with(body)with(insertBefore(createElement("script"),firstChild))setAttribute("crossorigin","",src=d)
})(window,document,"https://sdk.rum.aliyuncs.com/v1/bl.js","__bl");
</script>
Modo completo
Oferece controle total sobre todas as definições de configuração. O tipo de allowedUrls é Array<TraceOption>.
<script>
!(function(c,b,d,a){c[a]||(c[a]={});c[a].config=
{
pid: "<your pid>",
endpoint: "<your endpoint>",
//... Other configuration options are omitted here.
// Tracing configuration switch, disabled by default.
tracing: {
enable: true, // Enables tracing. Disabled by default.
sample: 100, // Sampling rate. Default: 100%.
tracestate: true, // Enables tracestate propagation. Enabled by default.
baggage: true, // Enables baggage propagation. Disabled by default.
allowedUrls:[
{match: 'https://api.alibabacloud.com', propagatorTypes:['tracecontext', 'b3']}, // Match URLs starting with 'https://api.alibabacloud.com'. Propagators: tracecontext, b3.
{match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // RegExp match for URLs containing 'api.alibaba.com'. Propagator: b3multi.
{match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // Function match for URLs containing '.api'. Propagator: Jaeger.
]
}
}
with(b)with(body)with(insertBefore(createElement("script"),firstChild))setAttribute("crossorigin","",src=d)
})(window,document,"https://sdk.rum.aliyuncs.com/v1/bl.js","__bl");
</script>
NPM package
Modo simples
Este método é recomendado apenas para navegadores. Como mini-programs não possuem o conceito de requisições de mesma origem, use o Modo Completo e configure allowedUrls.
Este modo é geralmente usado para requisições de mesma origem, nas quais o backend utiliza o padrão OpenTelemetry por padrão. O tipo de allowedUrls é undefined, mas requisições de mesma origem são permitidas automaticamente.
import ArmsRum from '@arms/rum-browser';
ArmsRum.init({
pid: 'your pid',
endpoint: 'your endpoint',
//... Other configuration options are omitted here.
// Tracing configuration switch, disabled by default.
tracing: true, // Equivalent to { enable: true, sample: 100, tracestate: true, allowedUrls:[], baggage: false }
});
Modo completo
Oferece controle total sobre todas as definições de configuração. O tipo de allowedUrls é Array<TraceOption>.
import ArmsRum from '@arms/rum-browser';
ArmsRum.init({
pid: "your pid",
endpoint: "your endpoint",
//... Other configuration options are omitted here.
tracing: {
enable: true, // Enables tracing. Disabled by default.
sample: 100, // Sampling rate. Default: 100%.
tracestate: true, // Enables tracestate propagation. Enabled by default.
baggage: true, // Enables baggage propagation. Disabled by default.
allowedUrls:[
{match: 'https://api.alibabacloud.com', propagatorTypes:['tracecontext', 'b3']}, // Match URLs starting with 'https://api.alibabacloud.com'. Propagators: tracecontext, b3.
{match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // RegExp match for URLs containing 'api.alibaba.com'. Propagator: b3multi.
{match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // Function match for URLs containing '.api'. Propagator: Jaeger.
]
}
});
Parâmetros de tracing
|
Parâmetro |
Tipo |
Padrão |
Descrição |
|
tracing.enable |
Boolean |
true |
Se você especificar um valor não booleano, ele será redefinido para |
|
tracing.sample |
Number |
100 |
O valor deve estar no intervalo de [0, 100]. Valores fora desse intervalo são redefinidos para 100. |
|
tracing.tracestate |
Boolean |
true |
Ativado por padrão. Este parâmetro é efetivo apenas no modo W3C Se definido como |
|
tracing.baggage |
Boolean |
false |
Quando o tracing está ativado, o RUM inclui o header |
|
tracing.propagatorTypes |
PropagatorType | PropagatorType[] |
null |
Especifica o padrão de propagação para o trace atual. Observação:
|
|
tracing.allowedUrls |
Array<MatchOption | TraceOption> | undefined |
undefined |
Especifica as URLs de requisição para as quais o tracing está ativado.
|
Em navegadores, a seguinte regra é adicionada a tracing.allowedUrls:
{
match: (url) => (/^https?:\/\/*/.test(url) || startsWith(url, location.origin)),
propagatorTypes: ['tracecontext']
}
MatchOption
type MatchOption = string | RegExp | ((value: string) => boolean);
allowedUrls corresponde à URL completa. Aceita os seguintes tipos:
string: Corresponde a qualquer URL que comece com o valor especificado. Por exemplo,https://api.alibabacloud.comcorresponde ahttps://api.alibabacloud.com/v1/resource.RegExp: Utiliza a expressão regular fornecida para testar a URL.function: Executa uma função com a URL como parâmetro. Um valor de retornotrueindica correspondência.
PropagatorType
Por padrão, tracecontext é usado para tracing baseado em OpenTelemetry.
type PropagatorType = 'tracecontext' | 'b3' | 'b3multi' | 'jaeger' | 'sw8';
A tabela a seguir lista os headers de requisição propagados por cada protocolo de trace.
|
Formato de propagação |
Formato |
|
traceparent : {version}-{trace-id}-{parent-id}-{trace-flags} tracestate: rum={version}&{appType}&{pid}&{sessionId} |
|
|
b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId} |
|
|
X-B3-TraceId: {TraceId} X-B3-SpanId: {SpanId} X-B3-ParentSpanId: {ParentSpanId} X-B3-Sampled: {SamplingState} |
|
|
Jaeger |
uber-trace-id : {trace-id}:{span-id}:{parent-span-id}:{flags} |
|
sw8: {sample}-{trace-id}-{segment-id}-{0}-{service}-{instance}-{endpoint}-{peer} |
Os headers de requisição transmitidos pelos protocolos mencionados acima não são headers de requisição HTTP padrão e não estão na lista de permissões CORS (também conhecida como CORS-safelisted request-headers). Portanto, quando seu site ou aplicação faz requisições cross-domain (especialmente em cenários como mini programs), especifique explicitamente esses headers no Access-Control-Allow-Headers do lado do servidor. Caso contrário, as requisições cross-domain serão bloqueadas pelo navegador devido à política CORS.
Verifique a correlação de traces do RUM
Web and H5
Acesse seu site ou página Web H5.
Abra as ferramentas de desenvolvedor do navegador e mude para a aba Network.
Inspecione uma requisição de API iniciada pelo frontend (tipo: XHR/Fetch) e verifique se seus headers de requisição contêm o header do protocolo de propagação correspondente.
Mini programs
Execute o mini-program no simulador de desenvolvimento.
Abra o depurador das ferramentas de desenvolvedor e mude para a aba Network.
Verifique se os headers de uma requisição iniciada pelo mini-program contêm o header do protocolo de propagação correspondente.
Configure a correlação de traces no backend
Para habilitar o tracing completo ponta a ponta, configure também sua aplicação de backend. Os seguintes tipos de aplicação de backend e métodos de integração são suportados.
Java applications
ARMS agent
O agente do ARMS Application Monitoring possui suporte integrado para o protocolo OpenTelemetry, portanto, nenhuma configuração adicional é necessária para correlacionar com traces do RUM. No entanto, garanta o seguinte:
Versões suportadas do agente ARMS Application Monitoring: 2.x, 3.x e 4.x. Para uma melhor experiência, recomendamos atualizar para a versão 4.x.
O agente suporta containers web principais como Tomcat, Jetty, WebLogic e Undertow, além de frameworks como Spring Boot e Spring MVC. Para uma lista completa de componentes e frameworks suportados, consulte Java Components and Frameworks Supported by Application Monitoring.
Para instruções sobre como integrar o agente do ARMS Application Monitoring, consulte Start Monitoring a Java Application.
OpenTelemetry
Integre sua aplicação ao ARMS (Managed Service for OpenTelemetry) usando OpenTelemetry. Dois métodos estão disponíveis: instrumentação automática e instrumentação manual.
-
Para instrumentação automática, o OpenTelemetry já suporta a maioria dos frameworks principais. Nenhuma configuração extra é necessária para correlacionar com traces do RUM.
NotaPara obter uma lista de frameworks Java suportados pelo OpenTelemetry, consulte Report Java Application Data by Using OpenTelemetry.
-
Na instrumentação manual, utilize o mecanismo de extensão fornecido pelo SDK do OpenTelemetry para correlacionar com traces do RUM. Isso envolve analisar o contexto de trace a partir dos headers de requisição do frontend (
traceparent,tracestate). Abaixo está um exemplo de código para um cenário Spring Boot:-
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 W3C Propagator 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(); // Use the extended Tracer here. tracer = ExtendedTracer.create(openTelemetry.getTracer("com.example.tracer", "1.0.0")); -
No método do seu controller, adicione um parâmetro de headers e analise o contexto de trace a partir dos headers da requisição para definir o pai.
// Add a request header parameter to 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"; }
-
Jaeger
O Jaeger oferece dois métodos para cenários web: instrumentação manual e instrumentação com um componente Spring Cloud. Para instruções completas de integração, consulte Report Java Application Data by Using Jaeger.
Se utilizar instrumentação com um componente Spring Cloud, nenhuma configuração extra é necessária para correlacionar com traces do RUM.
-
Para instrumentação manual, analise o contexto de trace a partir do header de requisição do frontend. Consulte o código abaixo.
-
Adicione a dependência.
<dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>Latest Version</version> <!-- Make sure to use the latest Jaeger version. --> </dependency> -
Inicialize o Tracer.
Substitua
<endpoint>pelo endpoint correspondente ao cliente e região na página no console do Managed Service for OpenTelemetry.// Replace manualDemo with your application name. io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("manualDemo"); io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration(); // Replace <endpoint> with the endpoint for the corresponding client and region from the console overview page. sender.withEndpoint("<endpoint>"); config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1)); config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000)); GlobalTracer.register(config.getTracer()); -
Crie um span na sua interface de negócios. Utilize o código a seguir como referência para correlacionar o trace.
// Add a request header parameter to the Controller to parse the trace context. @RequestMapping("/test") public String test(@RequestHeader Map<String, String> headers) { Tracer tracer = GlobalTracer.get(); SpanContext parentCtx = tracer.extract(Format.Builtin.HTTP_HEADERS, new TextMapAdapter(headers)); Span span; if (parentCtx != null) { span = tracer.buildSpan("/test").asChildOf(parentCtx).start(); } else { span = tracer.buildSpan("/test").start(); } try (Scope ignored = tracer.activateSpan(span)) { tracer.activeSpan().setTag("methodName", "test"); // do something } catch (Throwable t) { TracingHelper.onError(e, span); throw e } finally { span.finish(); } return "success"; }
-
Zipkin
Para instruções completas de integração, consulte Report Java Application Data by Using Zipkin.
Siga as instruções de integração no documento e, em seguida, analise o contexto a partir do header da requisição no código do lado do servidor para correlacionar com o trace do RUM.
// Extract the context from the request header.
extractor = tracing.propagation().extractor(Request::getHeader);
// convert that context to a span which you can name and add tags to
oneWayReceive = nextSpan(tracer, extractor.extract(request))
.name("process-request")
.kind(SERVER)
... add tags etc.
// start the server side and flush instead of finish
oneWayReceive.start().flush();
// you should not modify this span anymore as it is complete. However,
// you can create children to represent follow-up work.
next = tracer.newSpan(oneWayReceive.context()).name("step2").start();
SkyWalking
Para instruções completas de integração, consulte Java Agent Plugin.
A integração do SkyWalking é gerenciada por um agente Java. Basta seguir as instruções no documento para correlacionar traces do RUM e do backend.
Para garantir compatibilidade de protocolo com o RUM, o protocolo sw8 (v3) corresponde ao agente SkyWalking 8.x.
Go applications
OpenTelemetry
Para instruções completas de integração, consulte Report Go Application Data by Using OpenTelemetry.
Siga as instruções de integração e gere um span a partir do contexto da requisição no handler de requisição HTTP para correlacionar 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"))
})
Jaeger
Para instruções completas de integração, consulte Report Go Application Data by Using Jaeger.
Siga as instruções de integração e analise o contexto do span a partir do header da requisição HTTP para correlacionar com o trace do RUM. Consulte o código abaixo.
// Extract spanCtx from the HTTP object.
spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx))
...
defer span.Finish()
Zipkin
Para instruções completas de integração, consulte Report Go Application Data by Using Zipkin.
Siga as instruções de integração e analise o contexto do span a partir do header da requisição HTTP para correlacionar com o trace do RUM. Consulte o código abaixo.
// Initialize the tracer.
tracer, err := exampletracer.NewTracer("go-frontend", frontendPort)
// Generate a span from the request context.
router.Methods("GET").Path("/").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// retrieve span from context
span := zipkin.SpanFromContext(r.Context())
// add some tag
span.Tag("some_key", "some_value")
// do something...
span.Annotate(time.Now(), "some_event")
})
SkyWalking
Para instruções completas de integração, consulte Report Go Application Data by Using SkyWalking.
Siga as instruções de integração. Recomendamos usar o método de integração skywalking-go, que suporta frameworks web principais como gin, go-restful, http, go-kratos v2, go-micro e go-resty, correlacionando com traces do RUM sem exigir alterações no código.
Caso prefira analisar manualmente o contexto de trace a partir do header da requisição HTTP, utilize o código a seguir:
//Extract context from the HTTP request header `sw8`.
span, ctx, err := tracer.CreateEntrySpan(r.Context(), "/api/test", func(key string) (string, error) {
return r.Header.Get(key), nil
})
Python applications
OpenTelemetry
Para instruções completas de integração, consulte Report Python Application Data by Using OpenTelemetry.
Siga as instruções de integração e analise o contexto do span a partir do header da requisição HTTP para correlacionar com o trace do RUM. Consulte o código abaixo.
# 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)
# Extract 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"
Jaeger
Para instruções completas de integração, consulte Report Python Application Data by Using Jaeger.
Siga as instruções de integração e analise o contexto do span a partir do header da requisição HTTP para correlacionar com o trace do RUM. Consulte o código abaixo.
import logging
from flask import Flask
from jaeger_client import Config
from opentracing.ext import tags
from opentracing.propagation import Format
# Initialize the tracer.
def init_tracer(service, scope_manager=None):
logging.getLogger('').handlers = []
logging.basicConfig(format='%(message)s', level=logging.DEBUG)
config = Config(
config={
'sampler': {
'type': 'const',
'param': 1,
},
'logging': True,
'reporter_batch_size': 1,
},
service_name=service,
scope_manager=scope_manager
)
return config.initialize_tracer()
# The trace decorator.
def trace(tracer, span_name):
def decorator(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
# Extract the trace context from headers.
span_ctx = tracer.extract(Format.HTTP_HEADERS, request.headers)
span_tags = {tags.SPAN_KIND: tags.SPAN_KIND_RPC_SERVER}
with tracer.start_active_span(span_name, child_of=span_ctx, tags=span_tags) as scope:
rv = f(*args, **kwargs)
return rv
return wrapped
return decorator
# API test example.
@app.route('/test')
@trace(tracer, 'test')
def test():
return "success"
SkyWalking
Para instruções completas de integração, consulte Report Python Application Data by Using SkyWalking.
Siga as instruções de integração e analise o contexto do span a partir do header da requisição HTTP para correlacionar com o trace do RUM. Consulte o código abaixo.
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()
# Example HTTP request handler. Pass the 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 handle the request.
with get_context().new_entry_span(op='operation_name') as span:
# Handle the request here. The span is submitted automatically when finished.
...
# Simulate received HTTP headers containing sw8.
incoming_headers = {
'sw8': '1-My40LjU=-MTY1MTcwNDI5OTk5OA==-xxxx-xx-x-x==', # Example value. Use the actual value from the request.
# other headers...
}
# Call the function to handle the request.
handle_request(incoming_headers)
Visualize dados de trace ponta a ponta
Após correlacionar os traces de frontend e backend, visualize os traces completos ponta a ponta para requisições de frontend no console do ARMS RUM.
No console do ARMS RUM, acesse a aba API Requests. Na lista de requisições de API, localize o link View Trace na coluna Actions.
Clique em View Trace para ver o trace completo e a topologia da aplicação. Em seguida, analise requisições lentas ou com erro combinando os detalhes da requisição do RUM com os dados de trace do backend.
Isso abre a página API Request Details. O lado esquerdo lista as requisições. À direita, mude para a aba Tracing > Trace Details para visualizar um gráfico de cascata. Este gráfico mostra a sequência de chamadas e a latência de cada service, desde o navegador (rum-browser), passando pelo ingresso e frontend (Node.js), até o backend (Java).
O span de nível superior representa o span de entrada do RUM. Seu nome varia conforme o tipo de integração do cliente:
Web & H5: O nome da aplicação é
rum-browser, e o prefixo do nome do span é"browser.request:".Mini-programs: O nome da aplicação é
rum-miniapp, e o prefixo do nome do span é"miniapp.request:".Android: O nome da aplicação é
rum-android, e o prefixo do nome do span é"android.request:".iOS: O nome da aplicação é
rum-ios, e o prefixo do nome do span é"ios.request:".
Utilize também a topologia da aplicação para visualizar os services upstream e downstream de toda a requisição.
Na aba Topology View, alterne entre os layouts Force-directed, Hierarchical e Circular para visualizar a topologia do service. Cada nó exibe métricas como contagem de chamadas, latência e contagem de erros.