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.
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.
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
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
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
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 |
|
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 Jika diatur ke |
|
tracing.baggage |
Boolean |
false |
Saat tracing diaktifkan, RUM menyertakan header |
|
tracing.propagatorTypes |
PropagatorType | PropagatorType[] |
null |
Menentukan standar propagasi untuk jejak saat ini. Catatan:
|
|
tracing.allowedUrls |
Array<MatchOption | TraceOption> | undefined |
undefined |
Menentukan URL permintaan tempat tracing diaktifkan.
|
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.comcocok denganhttps://api.aliyun.com/v1/resource. -
RegExp: Menggunakan ekspresi reguler yang disediakan untuk menguji URL. -
function: Menjalankan fungsi dengan URL sebagai parameter. Nilai kembalitruemenunjukkan 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 |
|
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} |
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
-
Buka website atau halaman Web H5 Anda.
-
Buka developer tools browser Anda dan beralih ke tab Network.
-
Periksa permintaan API yang dipicu oleh antarmuka depan (tipe: XHR/Fetch) dan pastikan header permintaannya berisi header protokol propagasi yang sesuai.
Program mini
-
Jalankan program mini di simulator developer.
-
Buka debugger developer tools dan beralih ke tab Network.
-
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.
CatatanUntuk 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:-
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> -
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")); -
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.
-
Tambahkan dependensi.
<dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>Latest Version</version> <!-- Pastikan menggunakan versi Jaeger terbaru. --> </dependency> -
Inisialisasi Tracer.
Ganti
<endpoint>dengan endpoint untuk klien dan wilayah yang sesuai dari halaman 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()); -
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.