Managed Service for OpenTelemetry menyediakan kumpulan alat komprehensif bagi pengembang aplikasi terdistribusi, termasuk visualisasi jejak (trace), statistik volume permintaan, topologi aplikasi, dan analisis dependensi. Topik ini menjelaskan cara menggunakan header untuk mengimplementasikan tracing gRPC di ASM.
Prasyarat
-
Anda telah membuat instans ASM. Untuk informasi selengkapnya, lihat Create an ASM instance.
-
Anda telah mengaktifkan Managed Service for OpenTelemetry. Untuk informasi tentang penagihan, lihat Billing.
Proyek contoh
Proyek gRPC contoh tersedia di hello-servicemesh-grpc. Semua direktori yang disebutkan dalam topik ini berada di repositori hello-servicemesh-grpc.
Praktik pemrograman header gRPC
Ambil header di sisi server
-
Metode dasar
-
Java: Ambil header di sisi server.
Implementasikan metode
interceptCall(ServerCall<ReqT, RespT> call, final Metadata m, ServerCallHandler<ReqT, RespT> h)dari antarmukaServerInterceptor. GunakanString v = m.get(k)untuk memperoleh informasi header. Tipe parameter metodegetadalahMetadata.Key<String>. -
Go: Ambil header di sisi server.
metadata.FromIncomingContext(ctx)(md MD, ok bool), dengan MD berupamap[string][]string. -
Node.js: Ambil header di sisi server.
Tipe kembalian dari
call.metadata.getMap()adalah[key: string]: MetadataValue, dan tipeMetadataValuedidefinisikan sebagaistring/Buffer. -
Python: Ambil header di sisi server.
context.invocation_metadata()mengembalikan larik tupel-2 berbentuk('k','v'). Gunakanm.key, m.valueuntuk memperoleh pasangan kunci-nilai.
-
-
Unary RPC
-
Java: Ambil header untuk unary RPC.
Metode tidak mengetahui keberadaan header.
-
Go: Ambil header untuk unary RPC.
Dalam metode, panggil langsung
metadata.FromIncomingContext(ctx). Parameter konteksctxberasal dari parameter input metodeTalk. -
Node.js: Ambil header untuk unary RPC.
Panggil langsung
call.metadata.getMap()di dalam metode. -
Python: Ambil header untuk unary RPC.
Panggil langsung
context.invocation_metadata()di dalam metode.
-
-
Server streaming RPC
-
Java: Ambil header untuk server streaming RPC.
Metode tidak mengetahui keberadaan header.
-
Go: Ambil header untuk server streaming RPC.
Dalam metode, panggil langsung
metadata.FromIncomingContext(ctx). Parameter konteksctxdiperoleh dari parameter inputstreammetodeTalkOneAnswerMoredengan memanggilstream.Context(). -
Node.js: Ambil header untuk server streaming RPC.
Panggil
call.metadata.getMap()langsung di dalam metode. -
Python: Ambil header untuk server streaming RPC.
Panggil langsung
context.invocation_metadata()di dalam metode.
-
-
Client streaming RPC
-
Java: Ambil header untuk client streaming RPC.
Metode tidak mengetahui keberadaan header.
-
Go: Ambil header untuk client streaming RPC.
Dalam metode, panggil langsung
metadata.FromIncomingContext(ctx). Parameter konteksctxdiperoleh dengan memanggilstream.Context()pada parameter inputstreamdari metodeTalkMoreAnswerOne. -
Node.js: Ambil header untuk client streaming RPC.
Panggil langsung
call.metadata.getMap()di dalam metode. -
Python: Ambil header untuk client streaming RPC.
Panggil langsung
context.invocation_metadata()di dalam metode.
-
-
Bidirectional streaming RPC
-
Java: Ambil header untuk bidirectional streaming RPC.
Metode tidak mengetahui keberadaan header.
-
Go: Ambil header untuk bidirectional streaming RPC.
Dalam metode, panggil langsung
metadata.FromIncomingContext(ctx). Parameter konteksctxdiperoleh daristream.Context(), yang dipanggil pada parameter inputstreamdari metodeTalkBidirectional. -
Node.js: Ambil header untuk bidirectional streaming RPC.
Panggil langsung
call.metadata.getMap()di dalam metode. -
Python: Ambil header untuk bidirectional streaming RPC.
Panggil langsung
context.invocation_metadata()di dalam metode.
-
Kirim header dari klien
-
Metode dasar
-
Java: Kirim header dari klien.
Implementasikan metode
interceptCall(MethodDescriptor<ReqT, RespT> m,CallOptions o, Channel c)dari antarmukaClientInterceptor, lalu pada objekClientCall<ReqT,RespT>yang dikembalikan, implementasikan metodestart((Listener<RespT> l, Metadata h)). Gunakanh.put(k, v)untuk menambahkan informasi header. Untuk metodeput, parameterkbertipeMetadata.Key<String>, danvbertipeString. -
Go: Kirim header dari klien.
metadata.AppendToOutgoingContext(ctx, kv ...) context.Context -
Node.js: Kirim header dari klien.
metadata = call.metadata.getMap(); metadata.add(key, headers[key]) -
Python: Kirim header dari klien.
Variabel
metadata_dict = {}diisi denganmetadata_dict[c.key] = c.value, lalu akhirnya dikonversi ke tipelist tuplelist(metadata_dict.items()).
-
-
Unary RPC
-
Java: Kirim header untuk unary RPC.
Metode tidak mengetahui keberadaan header.
-
Go: Kirim header untuk unary RPC.
Dalam metode, panggil langsung
metadata.AppendToOutgoingContext(ctx, kv). -
Node.js: Kirim header untuk unary RPC.
Gunakan metode dasar secara langsung di dalam metode RPC Anda.
-
Python: Kirim header untuk unary RPC.
Gunakan metode dasar secara langsung di dalam metode RPC Anda.
-
-
Server streaming RPC
-
Java: Kirim header untuk server streaming RPC.
Metode tidak mengetahui keberadaan header.
-
Go: Kirim header untuk server streaming RPC.
Panggil langsung
metadata.AppendToOutgoingContext(ctx, kv)di dalam metode. -
Node.js: Kirim header untuk server streaming RPC.
Gunakan metode dasar secara langsung di dalam metode RPC Anda.
-
Python: Kirim header untuk server streaming RPC.
Gunakan metode dasar secara langsung di dalam metode RPC Anda.
-
-
Client streaming RPC
-
Java: Kirim header untuk client streaming RPC.
Metode tidak mengetahui keberadaan header.
-
Go: Kirim header untuk client streaming RPC.
Panggil langsung
metadata.AppendToOutgoingContext(ctx, kv)di dalam metode. -
Node.js: Kirim header untuk client streaming RPC.
Gunakan metode dasar secara langsung di dalam metode RPC Anda.
-
Python: Kirim header untuk client streaming RPC.
Gunakan metode dasar secara langsung di dalam metode RPC Anda.
-
-
Bidirectional streaming RPC
-
Java: Kirim header untuk bidirectional streaming RPC.
Metode tidak mengetahui keberadaan header.
-
Go: Kirim header untuk bidirectional streaming RPC.
Panggil langsung
metadata.AppendToOutgoingContext(ctx, kv)di dalam metode. -
Node.js: Kirim header untuk bidirectional streaming RPC.
Gunakan metode dasar secara langsung di dalam metode RPC Anda.
-
Python: Kirim header untuk bidirectional streaming RPC.
Gunakan metode dasar secara langsung di dalam metode RPC Anda.
-
Propagasikan header
Agar tracing end-to-end berfungsi, metadata jejak dari layanan hulu harus diteruskan ke layanan hilir untuk membentuk jejak lengkap. Hal ini mengharuskan header terkait tracing yang diterima oleh server diteruskan ke klien yang melakukan permintaan ke layanan hilir.
Di Go, Node.js, dan Python, metode model komunikasi mengetahui keberadaan header. Hal ini memungkinkan Anda membaca, meneruskan, dan mengirim header secara berurutan dalam satu metode RPC yang sama.
Di Java, pembacaan dan penulisan header ditangani oleh dua interceptor terpisah. Hal ini mencegah implementasi propagasi header dalam satu proses berurutan. Karena konkurensi dan akses eksklusif interceptor baca terhadap ID jejak unik, Anda tidak dapat menggunakan mekanisme caching sederhana untuk menghubungkan kedua interceptor tersebut.
Java menyediakan mekanisme Propagasi Konteks-Metadata untuk mengatasi masalah ini.
Di interceptor server, simpan Metadata/Header ke dalam Context dengan menggunakan ctx.withValue(key, metadata), dengan key bertipe Context.Key<String>. Lalu, di interceptor klien, ambil Metadata from the Context dengan menggunakan key.get(). Metode get menggunakan konteks Context.current() secara default, yang memastikan bahwa header untuk satu permintaan dibaca dari dan ditulis ke konteks yang sama.
Dengan mekanisme propagasi ini, Anda dapat mengimplementasikan tracing untuk layanan berbasis gRPC secara andal.
Penerapan dan verifikasi topologi mesh
Sebelum mengimplementasikan tracing gRPC, Anda harus menerapkan dan memverifikasi topologi mesh untuk memastikan semua layanan dapat saling berkomunikasi.
Buka direktori tracing di proyek contoh. Direktori ini berisi skrip penerapan untuk keempat bahasa pemrograman. Contoh berikut menggunakan versi Go untuk menerapkan dan memverifikasi topologi mesh.
cd go
# Deploy the topology
sh apply.sh
# Verify the topology
sh test.sh
Jika tidak ada error yang dilaporkan, topologi mesh berkomunikasi dengan benar.
Topologi Service Mesh setelah penerapan ditunjukkan pada gambar berikut.
Lihat jejak
-
Konfigurasikan instans ASM Anda untuk melaporkan data jejak ke Managed Service for OpenTelemetry. Untuk informasi selengkapnya, lihat Configure ASM to report trace data.
-
Masuk ke Konsol Managed Service for OpenTelemetry. Di panel navigasi kiri, klik Trace Entrance.
-
Pada halaman Trace Entrance, temukan aplikasi target Anda dan klik Application Topology.
Anda dapat melihat jejak lengkap, yang mencakup jalur dari klien permintaan lokal ke Ingressgateway, lalu ke grpc-server-svc1, grpc-server-svc2, dan grpc-server-svc3. Halaman ini menampilkan topologi vertikal rantai pemanggilan layanan untuk aplikasi target (seperti
istio-ingressgateway), menunjukkan hubungan pemanggilan dariistio-ingressgatewayke beberapa lapisan layanangrpc-server. Setiap node diberi label tingkat keberhasilan dan pengali pemanggilan. -
Pada halaman End-to-End Aggregation, klik tab End-to-End Aggregation untuk melihat agregasi end-to-end.
Halaman End-to-End Aggregation menampilkan informasi jejak teragregasi dalam tabel hierarkis. Kolom-kolomnya meliputi Span name, Application name, Requests/request ratio, Spans/request, Avg. self duration/ratio, Avg. duration, dan Errors/error ratio. Anda dapat memperluas setiap level hierarki pemanggilan untuk melihat metrik kinerja setiap Span.
-
Pada tab End-to-End Aggregation, klik jejak di bawah kolom Span name untuk melihat detailnya.
Bagian atas halaman detail jejak menampilkan metadata, termasuk Start time, Duration, Applications, Trace depth, dan Total spans. Tabel di bawahnya menunjukkan tampilan hierarkis setiap Span, dengan kolom Span name, visualisasi Timeline, Application name, Start time, IP address, dan Status. Hal ini memungkinkan Anda memvisualisasikan hierarki pemanggilan dan distribusi durasi di antara layanan.