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 e 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-programas) está integrada ao RUM. Para obter detalhes, consulte Integrar uma aplicação Web & H5 e Integrar um mini-programa.
Confirme se sua aplicação de backend está integrada ao ARMS Application Monitoring ou ao Managed Service for OpenTelemetry. Para mais informações, consulte Guia de integração.
Garanta que sua aplicação de backend forneça um serviço web HTTP capaz de analisar o contexto de trace nos cabeçalhos da requisição.
A correlação entre regiões diferentes para aplicações de frontend e backend não é mais suportada. Caso suas aplicações estejam em regiões distintas, acesse o Console do CloudMonitor e integre sua aplicação de frontend na mesma região e workspace da 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
Ativar 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 serviço Application Monitoring ou Managed Service for OpenTelemetry.
CDN sync
Modo simples
Este método é recomendado apenas para navegadores. Como mini-programas não possuem o conceito de requisições de mesma origem, use o Modo Completo e configure allowedUrls.
Geralmente, este modo é utilizado para requisições de mesma origem em que o backend adota o padrão OpenTelemetry. 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 configurações. 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.aliyun.com', propagatorTypes:['tracecontext', 'b3']}, // Match URLs starting with 'https://api.aliyun.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-programas não possuem o conceito de requisições de mesma origem, use o Modo Completo e configure allowedUrls.
Geralmente, este modo é utilizado para requisições de mesma origem em que o backend adota o padrão OpenTelemetry. 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 configurações. 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.aliyun.com', propagatorTypes:['tracecontext', 'b3']}, // Match URLs starting with 'https://api.aliyun.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-programas não possuem o conceito de requisições de mesma origem, use o Modo Completo e configure allowedUrls.
Geralmente, este modo é utilizado para requisições de mesma origem em que o backend adota o padrão OpenTelemetry. 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 configurações. 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.aliyun.com', propagatorTypes:['tracecontext', 'b3']}, // Match URLs starting with 'https://api.aliyun.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 [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 cabeçalho |
|
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 |
Define 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);
O campo allowedUrls corresponde à URL completa e aceita os seguintes tipos:
string: Corresponde a qualquer URL que comece com o valor especificado. Por exemplo,https://api.aliyun.comcorresponde ahttps://api.aliyun.com/v1/resource.RegExp: Utiliza a expressão regular fornecida para testar a URL.function: Executa uma função tendo 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 cabeçalhos 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 cabeçalhos de requisição transmitidos pelos protocolos mencionados acima não são cabeçalhos HTTP padrão e não constam na lista segura de CORS (também conhecida como CORS-safelisted request-headers). Portanto, quando seu site ou aplicação fizer requisições cross-domain (especialmente em cenários como mini-programas), especifique explicitamente esses cabeçalhos no lado do servidor em Access-Control-Allow-Headers. Caso contrário, as requisições cross-domain serão bloqueadas pelo navegador devido à política de CORS.
Verificar 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 cabeçalhos contêm o cabeçalho do protocolo de propagação correspondente.
Mini programs
Execute o mini-programa no simulador de desenvolvimento.
Abra o depurador das ferramentas de desenvolvedor e mude para a aba Network.
Verifique se os cabeçalhos de uma requisição iniciada pelo mini-programa contêm o cabeçalho do protocolo de propagação correspondente.
Configurar 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 ao 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 populares 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 Componentes e frameworks Java suportados pelo Application Monitoring.
Para instruções sobre como integrar o agente do ARMS Application Monitoring, consulte Iniciar monitoramento de uma aplicação Java.
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.
-
Na 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 Relatar dados de aplicação Java usando 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 nos cabeçalhos 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 cabeçalhos e analise o contexto de trace nos cabeçalhos 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 Relatar dados de aplicação Java usando 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 no cabeçalho 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 Relatar dados de aplicação Java usando Zipkin.
Siga as instruções de integração no documento e, em seguida, analise o contexto no cabeçalho da requisição no código 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 Plugin de agente Java.
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 Relatar dados de aplicação Go usando OpenTelemetry.
Siga as instruções de integração e gere um span a partir do contexto da requisição no handler 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 Relatar dados de aplicação Go usando Jaeger.
Siga as instruções de integração e analise o contexto do span no cabeçalho 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 Relatar dados de aplicação Go usando Zipkin.
Siga as instruções de integração e analise o contexto do span no cabeçalho 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 Relatar dados de aplicação Go usando SkyWalking.
Siga as instruções de integração. Recomendamos usar o método de integração skywalking-go, que suporta frameworks web populares 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 no cabeçalho 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 Relatar dados de aplicação Python usando OpenTelemetry.
Siga as instruções de integração e analise o contexto do span no cabeçalho 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 Relatar dados de aplicação Python usando Jaeger.
Siga as instruções de integração e analise o contexto do span no cabeçalho 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 Relatar dados de aplicação Python usando SkyWalking.
Siga as instruções de integração e analise o contexto do span no cabeçalho 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)
Visualizar 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 erros 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. Esse gráfico mostra a sequência de chamadas e a latência de cada serviço, 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-programas: 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 serviços 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 de serviços. Cada nó exibe métricas como contagem de chamadas, latência e contagem de erros.