All Products
Search
Document Center

Application Real-Time Monitoring Service:Mengorelasikan jejak antarmuka depan dan backend

Last Updated:May 09, 2026

ARMS RUM memungkinkan Anda melacak error, kinerja lambat, dan anomali selama interaksi pengguna berdasarkan sesi pengguna. Dengan integrasi bersama ARMS Application Monitoring, fitur ini menyediakan analisis end-to-end sehingga memberikan jalur lengkap untuk diagnosis masalah. Topik ini menjelaskan cara mengorelasikan jejak antarmuka depan dan backend untuk pemantauan web.

Prasyarat

  • Pastikan aplikasi antarmuka depan Anda (termasuk web dan program mini) telah diintegrasikan dengan RUM. Untuk detailnya, lihat Integrate a Web & H5 Application dan Integrate a Mini Program.

  • Pastikan aplikasi backend Anda telah diintegrasikan dengan ARMS Application Monitoring atau Managed Service for OpenTelemetry. Untuk informasi lebih lanjut, lihat Integration Guide.

  • Pastikan aplikasi backend Anda menyediakan layanan web HTTP yang mampu mengurai konteks jejak dari header permintaan.

Penting

Korelasi lintas wilayah antara aplikasi antarmuka depan dan backend tidak lagi didukung. Jika aplikasi antarmuka depan dan backend Anda berada di wilayah berbeda, buka CloudMonitor Console dan integrasikan aplikasi antarmuka depan Anda di wilayah dan ruang kerja yang sama dengan aplikasi backend Anda.

Protokol jejak yang didukung

Korelasi jejak RUM saat ini mendukung protokol propagasi konteks jejak utama berikut:

  • w3c: Termasuk klien OpenTelemetry dan agen ARMS.

  • b3/b3multi: Zipkin

  • Jaeger

  • sw8: SkyWalking

Aktifkan korelasi jejak RUM

Saat mengintegrasikan agen RUM ke aplikasi antarmuka depan Anda, aktifkan opsi konfigurasi Tracing.

Penting

Mengaktifkan korelasi jejak RUM menghasilkan data jejak tambahan, yang dapat memengaruhi penagihan layanan Pemantauan Aplikasi atau Managed Service for OpenTelemetry Anda.

CDN sync

Mode sederhana

Penting

Metode ini direkomendasikan hanya untuk browser. Karena program mini tidak memiliki konsep permintaan same-origin, Anda harus menggunakan Mode Lengkap dan mengonfigurasi allowedUrls.

Mode ini biasanya digunakan untuk permintaan same-origin di mana backend menggunakan standar OpenTelemetry secara default. Tipe allowedUrls adalah undefined, tetapi permintaan same-origin secara otomatis diizinkan.

<script>
  window.__rum = {
    pid: "<your pid>",
    endpoint: "<your endpoint>",
    //... Opsi konfigurasi lainnya dihilangkan di sini.
    // Sakelar konfigurasi Tracing, dinonaktifkan secara default.
    tracing: true // Setara dengan { 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>

Mode lengkap

Memberikan kontrol penuh atas semua pengaturan konfigurasi. Tipe allowedUrls adalah Array<TraceOption>.

<script>
  window.__rum = {
    pid: "<your pid>",
    endpoint: "<your endpoint>",
    //... Opsi konfigurasi lainnya dihilangkan di sini.
    // Sakelar konfigurasi Tracing, dinonaktifkan secara default.
    tracing: {
      enable: true, // Mengaktifkan tracing. Dinonaktifkan secara default.
      sample: 60, // Laju sampling: 60%. Default: 100%.
      tracestate: true, // Mengaktifkan propagasi tracestate. Diaktifkan secara default.
      baggage: false, // Menonaktifkan propagasi baggage. Dinonaktifkan secara default.
      allowedUrls:[
        {match: 'https://api.aliyun.com', propagatorTypes:['tracecontext', 'b3']}, // Mencocokkan URL yang dimulai dengan 'https://api.aliyun.com'. Propagator: tracecontext, b3.
        {match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // Pencocokan RegExp untuk URL yang mengandung 'api.alibaba.com'. Propagator: b3multi.
        {match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // Pencocokan fungsi untuk URL yang mengandung '.api'. Propagator: Jaeger.
      ]
    }
  };
</script>
<script type="text/javascript" src="https://sdk.rum.aliyuncs.com/v2/browser-sdk.js " crossorigin></script>

CDN async

Mode sederhana

Penting

Metode ini direkomendasikan hanya untuk browser. Karena program mini tidak memiliki konsep permintaan same-origin, Anda harus menggunakan Mode Lengkap dan mengonfigurasi allowedUrls.

Mode ini biasanya digunakan untuk permintaan same-origin di mana backend menggunakan standar OpenTelemetry secara default. Tipe allowedUrls adalah undefined, tetapi permintaan same-origin secara otomatis diizinkan.

<script>
  !(function(c,b,d,a){c[a]||(c[a]={});c[a].config=
    {
      pid: "<your pid>",
      endpoint: "<your endpoint>",
      //... Opsi konfigurasi lainnya dihilangkan di sini.
      // Sakelar konfigurasi Tracing, dinonaktifkan secara 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>
Mode lengkap

Memberikan kontrol penuh atas semua pengaturan konfigurasi. Tipe allowedUrls adalah Array<TraceOption>.

<script>
  !(function(c,b,d,a){c[a]||(c[a]={});c[a].config=
    {
      pid: "<your pid>",
      endpoint: "<your endpoint>",
      //... Opsi konfigurasi lainnya dihilangkan di sini.
      // Sakelar konfigurasi Tracing, dinonaktifkan secara default.
      tracing: {
        enable: true, // Mengaktifkan tracing. Dinonaktifkan secara default.
        sample: 100, // Laju sampling. Default: 100%.
        tracestate: true, // Mengaktifkan propagasi tracestate. Diaktifkan secara default.
        baggage: true, // Mengaktifkan propagasi baggage. Dinonaktifkan secara default.
        allowedUrls:[
          {match: 'https://api.aliyun.com', propagatorTypes:['tracecontext', 'b3']}, // Mencocokkan URL yang dimulai dengan 'https://api.aliyun.com'. Propagator: tracecontext, b3.
          {match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // Pencocokan RegExp untuk URL yang mengandung 'api.alibaba.com'. Propagator: b3multi.
          {match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // Pencocokan fungsi untuk URL yang mengandung '.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

Mode sederhana

Penting

Metode ini direkomendasikan hanya untuk browser. Karena program mini tidak memiliki konsep permintaan same-origin, Anda harus menggunakan Mode Lengkap dan mengonfigurasi allowedUrls.

Mode ini biasanya digunakan untuk permintaan same-origin di mana backend menggunakan standar OpenTelemetry secara default. Tipe allowedUrls adalah undefined, tetapi permintaan same-origin secara otomatis diizinkan.

import ArmsRum from '@arms/rum-browser';

ArmsRum.init({
  pid: 'your pid',
  endpoint: 'your endpoint',
  //... Opsi konfigurasi lainnya dihilangkan di sini.
  // Sakelar konfigurasi Tracing, dinonaktifkan secara default.
  tracing: true, // Setara dengan { enable: true,  sample: 100, tracestate: true, allowedUrls:[], baggage: false }
});
Mode lengkap

Memberikan kontrol penuh atas semua pengaturan konfigurasi. Tipe allowedUrls adalah Array<TraceOption>.

import ArmsRum from '@arms/rum-browser';

ArmsRum.init({
  pid: "your pid",
  endpoint: "your endpoint",
  //... Opsi konfigurasi lainnya dihilangkan di sini.
  tracing: {
    enable: true, // Mengaktifkan tracing. Dinonaktifkan secara default.
    sample: 100, // Laju sampling. Default: 100%.
    tracestate: true, // Mengaktifkan propagasi tracestate. Diaktifkan secara default.
    baggage: true, // Mengaktifkan propagasi baggage. Dinonaktifkan secara default.
    allowedUrls:[
      {match: 'https://api.aliyun.com', propagatorTypes:['tracecontext', 'b3']}, // Mencocokkan URL yang dimulai dengan 'https://api.aliyun.com'. Propagator: tracecontext, b3.
      {match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // Pencocokan RegExp untuk URL yang mengandung 'api.alibaba.com'. Propagator: b3multi.
      {match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // Pencocokan fungsi untuk URL yang mengandung '.api'. Propagator: Jaeger.
    ]
  }
});

Parameter tracing

Parameter

Tipe

Default

Deskripsi

tracing.enable

Boolean

true

Jika Anda menentukan nilai non-Boolean, nilainya akan diatur ulang menjadi true.

tracing.sample

Number

100

Nilai harus berada dalam rentang [0, 100]. Nilai di luar rentang ini akan diatur ulang menjadi 100.

tracing.tracestate

Boolean

true

Diaktifkan secara default. Parameter ini hanya berlaku dalam mode W3C tracecontext, karena mode lain tidak menggunakan header tracestate.

Jika diatur ke false, header permintaan tracestate tidak disertakan dalam mode W3C.

tracing.baggage

Boolean

false

Saat tracing diaktifkan, RUM menyertakan header baggage dengan informasi relevan dalam permintaan, terlepas dari standar tracing yang digunakan.

tracing.propagatorTypes

PropagatorType | PropagatorType[]

null

Menentukan standar propagasi untuk jejak saat ini.

Catatan:

  • Jika propagatorTypes dikonfigurasi dalam allowedUrls, pengaturan ini akan ditimpa.

  • Jika konfigurasi mencakup sw8, semua tipe lain diabaikan, dan hanya standar sw8 yang digunakan.

tracing.allowedUrls

Array<MatchOption | TraceOption> | undefined

undefined

Menentukan URL permintaan tempat tracing diaktifkan.

  1. Di browser, permintaan same-origin diizinkan secara default. Untuk permintaan lintas domain, Anda harus mengonfigurasi allowedUrls.

  2. Di program mini, Anda harus mengonfigurasi allowedUrls agar tracing berlaku.

Di browser, aturan berikut ditambahkan ke tracing.allowedUrls:

{
  match: (url) => (/^https?:\/\/*/.test(url) || startsWith(url, location.origin)),
  propagatorTypes: ['tracecontext']
}

MatchOption

type MatchOption = string | RegExp | ((value: string) => boolean);

allowedUrls mencocokkan URL lengkap. Jenis yang diterima adalah sebagai berikut:

  • string: Mencocokkan URL apa pun yang dimulai dengan nilai yang ditentukan. Misalnya, https://api.aliyun.com cocok dengan https://api.aliyun.com/v1/resource.

  • RegExp: Menggunakan ekspresi reguler yang disediakan untuk menguji URL.

  • function: Menjalankan fungsi dengan URL sebagai parameter. Nilai kembali true menunjukkan kecocokan.

PropagatorType

Secara default, tracecontext digunakan untuk tracing berbasis OpenTelemetry.

type PropagatorType = 'tracecontext' | 'b3' | 'b3multi' | 'jaeger' | 'sw8';

Tabel berikut mencantumkan header permintaan yang dipropagasikan oleh setiap protokol jejak.

Format propagasi

Format

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}

Penting

Header permintaan yang dilewatkan oleh protokol yang disebutkan di atas bukanlah header permintaan HTTP standar dan tidak termasuk dalam daftar aman CORS (juga dikenal sebagai CORS-safelisted request-headers). Oleh karena itu, ketika website atau aplikasi Anda melakukan permintaan lintas domain (terutama dalam skenario seperti program mini), Anda harus secara eksplisit menentukan header-header ini di sisi server pada Access-Control-Allow-Headers. Jika tidak, permintaan lintas domain akan diblokir oleh browser karena kebijakan CORS.

Verifikasi korelasi jejak RUM

Web dan H5

  1. Buka website atau halaman Web H5 Anda.

  2. Buka developer tools browser Anda dan beralih ke tab Network.

  3. Periksa permintaan API yang dipicu oleh antarmuka depan (tipe: XHR/Fetch) dan pastikan header permintaannya berisi header protokol propagasi yang sesuai.

Program mini

  1. Jalankan program mini di simulator developer.

  2. Buka debugger developer tools dan beralih ke tab Network.

  3. Periksa apakah header permintaan dari permintaan yang dipicu oleh program mini berisi header protokol propagasi yang sesuai.

Konfigurasi korelasi jejak backend

Untuk mengaktifkan tracing end-to-end yang lengkap, Anda juga harus mengonfigurasi aplikasi backend Anda. Jenis aplikasi backend dan metode integrasi berikut didukung.

Aplikasi Java

Agen ARMS

Agen ARMS Application Monitoring memiliki dukungan bawaan untuk protokol OpenTelemetry, sehingga tidak diperlukan konfigurasi tambahan untuk mengorelasikan dengan jejak RUM. Namun, pastikan hal berikut:

  • Versi agen ARMS Application Monitoring yang didukung: 2.x, 3.x, dan 4.x. Untuk pengalaman yang lebih baik, kami merekomendasikan peningkatan ke versi 4.x.

  • Agen mendukung kontainer web utama seperti Tomcat, Jetty, WebLogic, dan Undertow, serta framework seperti Spring Boot dan Spring MVC. Untuk daftar lengkap komponen dan framework yang didukung, lihat Java Components and Frameworks Supported by Application Monitoring.

Untuk petunjuk cara mengintegrasikan agen ARMS Application Monitoring, lihat Start Monitoring a Java Application.

OpenTelemetry

Anda dapat mengintegrasikan aplikasi Anda dengan ARMS (Managed Service for OpenTelemetry) menggunakan OpenTelemetry. Tersedia dua metode: auto instrumentation dan manual instrumentation.

  • Untuk auto instrumentation, OpenTelemetry sudah mendukung sebagian besar framework utama. Tidak diperlukan konfigurasi tambahan untuk mengorelasikan dengan jejak RUM.

    Catatan

    Untuk daftar framework Java yang didukung oleh OpenTelemetry, lihat Report Java Application Data by Using OpenTelemetry.

  • Untuk manual instrumentation, Anda harus menggunakan mekanisme ekstensi yang disediakan oleh SDK OpenTelemetry untuk mengorelasikan dengan jejak RUM. Ini melibatkan penguraian konteks jejak dari header permintaan antarmuka depan (traceparent, tracestate). Berikut adalah contoh kode untuk skenario Spring Boot:

    1. Tambahkan dependensi 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. Tambahkan W3C Propagator selama inisialisasi 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)
              // Tambahkan W3C Propagator di sini.
              .setPropagators(ContextPropagators.create(
                      TextMapPropagator.composite(W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance()))
               ).buildAndRegisterGlobal();
      // Gunakan Tracer yang diperluas di sini.
      tracer = ExtendedTracer.create(openTelemetry.getTracer("com.example.tracer", "1.0.0"));
    3. Dalam metode controller Anda, tambahkan parameter headers dan uraikan konteks jejak dari header permintaan untuk mengatur parent.

      // Tambahkan parameter header permintaan ke Controller untuk mengurai konteks jejak.
      @RequestMapping("/test")
      public String test(@RequestHeader Map<String, String> headers) {
          Span span = OpenTelemetrySupport.getTracer()
                  .spanBuilder("/test")
                  // Uraikan span parent dari headers.
                  .setParentFrom(OpenTelemetrySupport.getContextPropagators(), headers)
                  .setSpanKind(SpanKind.SERVER)
                  .startSpan();
          try (Scope scope = span.makeCurrent()) {
              // lakukan sesuatu
          } catch (Throwable t) {
              span.setStatus(StatusCode.ERROR, "handle parent span error");
          } finally {
              span.end();
          }
          return "success";
      }

Jaeger

Jaeger menyediakan dua metode untuk skenario web: manual instrumentation dan instrumentation dengan komponen Spring Cloud. Untuk petunjuk integrasi lengkap, lihat Report Java Application Data by Using Jaeger.

  • Jika Anda menggunakan instrumentation dengan komponen Spring Cloud, tidak diperlukan konfigurasi tambahan untuk mengorelasikan dengan jejak RUM.

  • Untuk manual instrumentation, Anda perlu mengurai konteks jejak dari header permintaan antarmuka depan. Lihat kode di bawah ini.

    1. Tambahkan dependensi.

      <dependency>
        <groupId>io.jaegertracing</groupId>
        <artifactId>jaeger-client</artifactId>
        <version>Latest Version</version> <!-- Pastikan menggunakan versi Jaeger terbaru. -->
      </dependency>
    2. Inisialisasi Tracer.

      Ganti <endpoint> dengan endpoint untuk klien dan wilayah yang sesuai dari halaman Cluster Configurations > Endpoint Information di konsol Managed Service for OpenTelemetry.

      // Ganti manualDemo dengan nama aplikasi Anda.
      io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("manualDemo");
      io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
      // Ganti <endpoint> dengan endpoint untuk klien dan wilayah yang sesuai dari halaman ikhtisar konsol.
      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. Buat span di antarmuka bisnis Anda. Anda dapat merujuk pada kode berikut untuk mengorelasikan jejak.

      // Tambahkan parameter header permintaan ke Controller untuk mengurai konteks jejak.
      @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");
              // lakukan sesuatu
          } catch (Throwable t) {
              TracingHelper.onError(e, span);
              throw e
          } finally {
              span.finish();
          }
          return "success";
      }

Zipkin

Untuk petunjuk integrasi lengkap, lihat Report Java Application Data by Using Zipkin.

Ikuti petunjuk integrasi dalam dokumen tersebut, lalu uraikan konteks dari header permintaan di kode sisi server untuk mengorelasikan dengan jejak RUM.

// Ekstrak konteks dari header permintaan.
extractor = tracing.propagation().extractor(Request::getHeader);

// ubah konteks tersebut menjadi span yang dapat Anda beri nama dan tambahkan tag
oneWayReceive = nextSpan(tracer, extractor.extract(request))
.name("process-request")
.kind(SERVER)
... tambahkan tag dll.

// mulai sisi server dan flush alih-alih finish
oneWayReceive.start().flush();

// Anda tidak boleh lagi memodifikasi span ini karena sudah selesai. Namun,
// Anda dapat membuat child untuk merepresentasikan pekerjaan lanjutan.
next = tracer.newSpan(oneWayReceive.context()).name("step2").start();

SkyWalking

Untuk petunjuk integrasi lengkap, lihat Java Agent Plugin.

Integrasi SkyWalking ditangani oleh agen Java. Anda hanya perlu mengikuti petunjuk dalam dokumen untuk mengorelasikan jejak RUM dan backend.

Untuk memastikan kompatibilitas protokol dengan RUM, protokol sw8 (v3) sesuai dengan agen SkyWalking 8.x.

Aplikasi Go

OpenTelemetry

Untuk petunjuk integrasi lengkap, lihat Report Go Application Data by Using OpenTelemetry.

Ikuti petunjuk integrasi, lalu hasilkan span dari konteks permintaan di handler permintaan HTTP untuk mengorelasikan dengan jejak RUM.

// Inisialisasi tracer.
tracer := otel.Tracer(common.TraceInstrumentationName)
// Hasilkan span dari konteks permintaan.
handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
    ctx := req.Context()
    span := trace.SpanFromContext(ctx)
    // lakukan sesuatu
    w.Write([]byte("Hello World"))
})

Jaeger

Untuk petunjuk integrasi lengkap, lihat Report Go Application Data by Using Jaeger.

Ikuti petunjuk integrasi, lalu uraikan konteks span dari header permintaan HTTP untuk mengorelasikan dengan jejak RUM. Lihat kode di bawah ini.

// Ekstrak spanCtx dari objek HTTP.
spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx))
...
defer  span.Finish()

Zipkin

Untuk petunjuk integrasi lengkap, lihat Report Go Application Data by Using Zipkin.

Ikuti petunjuk integrasi, lalu uraikan konteks span dari header permintaan HTTP untuk mengorelasikan dengan jejak RUM. Lihat kode di bawah ini.

// Inisialisasi tracer.
tracer, err := exampletracer.NewTracer("go-frontend", frontendPort)
// Hasilkan span dari konteks permintaan.
router.Methods("GET").Path("/").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    // ambil span dari konteks
	span := zipkin.SpanFromContext(r.Context())
    // tambahkan beberapa tag
    span.Tag("some_key", "some_value")
    // lakukan sesuatu...
	span.Annotate(time.Now(), "some_event")
})

SkyWalking

Untuk petunjuk integrasi lengkap, lihat Report Go Application Data by Using SkyWalking.

Ikuti petunjuk integrasi. Kami merekomendasikan menggunakan metode integrasi skywalking-go, yang mendukung framework web utama seperti gin, go-restful, http, go-kratos v2, go-micro, dan go-resty, serta mengorelasikan dengan jejak RUM tanpa memerlukan perubahan kode.

Jika Anda ingin secara manual mengurai konteks jejak dari header permintaan HTTP, Anda juga dapat menggunakan kode berikut:

//Ekstrak konteks dari header permintaan HTTP `sw8`.
span, ctx, err := tracer.CreateEntrySpan(r.Context(), "/api/test", func(key string) (string, error) {
		return r.Header.Get(key), nil
})

Aplikasi Python

OpenTelemetry

Untuk petunjuk integrasi lengkap, lihat Report Python Application Data by Using OpenTelemetry.

Ikuti petunjuk integrasi, lalu uraikan konteks span dari header permintaan HTTP untuk mengorelasikan dengan jejak RUM. Lihat kode di bawah ini.

# Inisialisasi 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)

    # Ekstrak konteks jejak dari headers.
    carrier ={'traceparent': headers['Traceparent'], 'tracestate': headers['Tracestate']}
    ctx = TraceContextTextMapPropagator().extract(carrier=carrier)

    with tracer.start_span("test", context=ctx):
        # lakukan sesuatu
        return "success"

Jaeger

Untuk petunjuk integrasi lengkap, lihat Report Python Application Data by Using Jaeger.

Ikuti petunjuk integrasi, lalu uraikan konteks span dari header permintaan HTTP untuk mengorelasikan dengan jejak RUM. Lihat kode di bawah ini.

import logging
from flask import Flask
from jaeger_client import Config
from opentracing.ext import tags
from opentracing.propagation import Format

# Inisialisasi 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()

# Dekorator trace.
def trace(tracer, span_name):
    def decorator(f):
        @functools.wraps(f)
        def wrapped(*args, **kwargs):
            # Ekstrak konteks jejak dari 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

# Contoh uji API.
@app.route('/test')
@trace(tracer, 'test')
def test():
    return "success"

SkyWalking

Untuk petunjuk integrasi lengkap, lihat Report Python Application Data by Using SkyWalking.

Ikuti petunjuk integrasi, lalu uraikan konteks span dari header permintaan HTTP untuk mengorelasikan dengan jejak RUM. Lihat kode di bawah ini.

from skywalking import config, agent
from skywalking.trace.context import SpanContext, get_context
from skywalking.trace.carrier import CarrierItem

# Konfigurasikan SkyWalking. Sesuaikan parameter sesuai kebutuhan.
config.init(agent_collector_backend_services='<endpoint>',
            agent_authentication='<auth-token>')

agent.start()

# Contoh handler permintaan HTTP. Teruskan header permintaan HTTP.
def handle_request(headers):
    # Ekstrak informasi jejak dari header permintaan.
    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)

    # Ekstrak konteks jejak dari Carrier.
    context = get_context().extract(carrier)
    
    # Buat span baru untuk menangani permintaan.
    with get_context().new_entry_span(op='operation_name') as span:
        # Tangani permintaan di sini. Span dikirimkan secara otomatis saat selesai.
        ...

# Simulasikan header HTTP yang diterima berisi sw8.
incoming_headers = {
    'sw8': '1-My40LjU=-MTY1MTcwNDI5OTk5OA==-xxxx-xx-x-x==',  # Nilai contoh. Gunakan nilai aktual dari permintaan.
    # header lainnya...
}

# Panggil fungsi untuk menangani permintaan.
handle_request(incoming_headers)

Lihat data jejak end-to-end

Setelah mengorelasikan jejak antarmuka depan dan backend, Anda dapat melihat jejak end-to-end lengkap untuk permintaan antarmuka depan di konsol ARMS RUM.

Di konsol ARMS RUM, buka tab API Requests. Di daftar permintaan API, temukan tautan View Trace di kolom Actions.

Klik View Trace untuk melihat jejak lengkap dan topologi aplikasi. Anda kemudian dapat menganalisis permintaan lambat atau error dengan menggabungkan detail permintaan RUM dan data jejak backend.

Hal ini membuka halaman API Request Details. Di sisi kiri terdapat daftar permintaan. Di sisi kanan, beralihlah ke tab Tracing > Trace Details untuk melihat grafik air terjun. Grafik ini menampilkan urutan panggilan dan latensi setiap layanan, mulai dari browser (rum-browser), melalui ingress dan antarmuka depan (Node.js), hingga backend (Java).

Span tingkat atas merepresentasikan span entri RUM. Namanya bervariasi berdasarkan jenis integrasi klien:

  • Web & H5: Nama aplikasi adalah rum-browser, awalan nama span adalah "browser.request:".

  • Program mini: Nama aplikasi adalah rum-miniapp, awalan nama span adalah "miniapp.request:".

  • Android: Nama aplikasi adalah rum-android, awalan nama span adalah "android.request:".

  • iOS: Nama aplikasi adalah rum-ios, awalan nama span adalah "ios.request:".

Anda juga dapat menggunakan topologi aplikasi untuk memvisualisasikan layanan hulu dan hilir untuk seluruh permintaan.

Di tab Topology View, Anda dapat beralih antara tata letak Force-directed, Hierarchical, dan Circular untuk melihat topologi layanan. Setiap node menampilkan metrik seperti jumlah panggilan, latensi, dan jumlah error.