All Products
Search
Document Center

Alibaba Cloud Service Mesh:Lacak layanan gRPC di ASM

Last Updated:Jun 22, 2026

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

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 antarmuka ServerInterceptor. Gunakan String v = m.get(k) untuk memperoleh informasi header. Tipe parameter metode get adalah Metadata.Key<String>.

    • Go: Ambil header di sisi server.

      metadata.FromIncomingContext(ctx)(md MD, ok bool), dengan MD berupa map[string][]string.

    • Node.js: Ambil header di sisi server.

      Tipe kembalian dari call.metadata.getMap() adalah [key: string]: MetadataValue, dan tipe MetadataValue didefinisikan sebagai string/Buffer.

    • Python: Ambil header di sisi server.

      context.invocation_metadata() mengembalikan larik tupel-2 berbentuk ('k','v'). Gunakan m.key, m.value untuk 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 konteks ctx berasal dari parameter input metode Talk.

    • 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 konteks ctx diperoleh dari parameter input stream metode TalkOneAnswerMore dengan memanggil stream.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 konteks ctx diperoleh dengan memanggil stream.Context() pada parameter input stream dari metode TalkMoreAnswerOne.

    • 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 konteks ctx diperoleh dari stream.Context(), yang dipanggil pada parameter input stream dari metode TalkBidirectional.

    • 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 antarmuka ClientInterceptor, lalu pada objek ClientCall<ReqT, RespT> yang dikembalikan, implementasikan metode start((Listener<RespT> l, Metadata h)). Gunakan h.put(k, v) untuk menambahkan informasi header. Untuk metode put, parameter k bertipe Metadata.Key<String>, dan v bertipe String.

    • 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 dengan metadata_dict[c.key] = c.value, lalu akhirnya dikonversi ke tipe list tuple list(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.mekanisme

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.Network topology

Lihat jejak

  1. Konfigurasikan instans ASM Anda untuk melaporkan data jejak ke Managed Service for OpenTelemetry. Untuk informasi selengkapnya, lihat Configure ASM to report trace data.

  2. Masuk ke Konsol Managed Service for OpenTelemetry. Di panel navigasi kiri, klik Trace Entrance.

  3. 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 dari istio-ingressgateway ke beberapa lapisan layanan grpc-server. Setiap node diberi label tingkat keberhasilan dan pengali pemanggilan.

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

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