Todos os produtos
Search
Central de documentação

Application Real-Time Monitoring Service:Correlacionar traces de frontend e backend

Última atualização: Jun 27, 2026

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.

Importante

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.

Importante

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

Importante

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

Importante

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

Importante

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 true.

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 tracecontext, pois outros modos não utilizam o cabeçalho tracestate.

Se definido como false, o cabeçalho de requisição tracestate não será incluído no modo W3C.

tracing.baggage

Boolean

false

Quando o tracing está ativado, o RUM inclui o cabeçalho baggage com informações relevantes nas requisições, independentemente do padrão de tracing utilizado.

tracing.propagatorTypes

PropagatorType | PropagatorType[]

null

Especifica o padrão de propagação para o trace atual.

Observação:

  • Se propagatorTypes estiver configurado em allowedUrls, esta definição será substituída.

  • Caso a configuração inclua sw8, todos os outros tipos serão ignorados e apenas o padrão sw8 será utilizado.

tracing.allowedUrls

Array<MatchOption | TraceOption> | undefined

undefined

Define as URLs de requisição para as quais o tracing está ativado.

  1. Em navegadores, requisições de mesma origem são permitidas por padrão. Para requisições cross-domain, configure allowedUrls.

  2. Em mini-programas, é obrigatório configurar allowedUrls para que o tracing tenha efeito.

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.com corresponde a https://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 retorno true indica 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

tracecontext

traceparent : {version}-{trace-id}-{parent-id}-{trace-flags}

tracestate: rum={version}&{appType}&{pid}&{sessionId}

b3

b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}

b3multi

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

sw8: {sample}-{trace-id}-{segment-id}-{0}-{service}-{instance}-{endpoint}-{peer}

Importante

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

  1. Acesse seu site ou página Web H5.

  2. Abra as ferramentas de desenvolvedor do navegador e mude para a aba Network.

  3. 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

  1. Execute o mini-programa no simulador de desenvolvimento.

  2. Abra o depurador das ferramentas de desenvolvedor e mude para a aba Network.

  3. 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.

    Nota

    Para 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:

    1. 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>
    2. 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"));
    3. 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.

    1. 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>
    2. Inicialize o Tracer.

      Substitua <endpoint> pelo endpoint correspondente ao cliente e região na página Cluster Configurations > Endpoint Information 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());
    3. 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.