Managed Service for OpenTelemetry menyediakan serangkaian alat untuk pengembangan aplikasi terdistribusi, termasuk pemetaan jejak, statistik panggilan, topologi jejak, dan analisis ketergantungan aplikasi. Service Mesh (ASM) terintegrasi dengan Managed Service for OpenTelemetry. Topik ini menjelaskan cara menggunakan header untuk melacak layanan berbasis gRPC di ASM.
Prasyarat
Sebuah instance ASM telah dibuat. Untuk informasi lebih lanjut, lihat Buat instance ASM.
Managed Service for OpenTelemetry telah diaktifkan untuk akun Alibaba Cloud Anda. Untuk informasi lebih lanjut tentang penagihan layanan ini, lihat Aturan Penagihan.
Proyek Contoh
Untuk informasi lebih lanjut tentang proyek contoh gRPC, kunjungi hello-servicemesh-grpc. Direktori dalam topik ini adalah direktori dari hello-servicemesh-grpc.
Mendapatkan Header pada Server dan Klien gRPC
Obtain headers on the gRPC server
Metode Dasar
Gunakan Java untuk mengimplementasikan metode dasar mendapatkan header pada server gRPC.
Implementasikan metode
interceptCall(ServerCall<ReqT, RespT> call,final Metadata m,ServerCallHandler<ReqT, RespT> h)dari operasiServerInterceptor. Kemudian, jalankan perintahString v = m.get(k)untuk mendapatkan header pada server. Tipe parameter input metodeget()adalahMetadata.Key<String>.Gunakan Go untuk mengimplementasikan metode dasar mendapatkan header pada server gRPC.
Implementasikan metode
metadata.FromIncomingContext(ctx)(md MD, ok bool). Format MD adalahmap[string][]string.Gunakan Node.js untuk mengimplementasikan metode dasar mendapatkan header pada server gRPC.
Implementasikan metode
call.metadata.getmap(). Tipe nilai yang dikembalikan adalah[key: string]: MetadataValue. TipeMetadataValueadalahstring/Buffer.Gunakan Python untuk mengimplementasikan metode dasar mendapatkan header pada server gRPC.
Implementasikan metode
context.invocation_metadata(). Nilai yang dikembalikan adalah array dua-tupel dalam format('k','v'). Pasangan kunci-nilai dapat diperoleh darim.key, m.value.
Unary RPC
Gunakan Java untuk mengimplementasikan metode panggilan prosedur jarak jauh (RPC) unary mendapatkan header pada server.
Header diintersep.
Gunakan Go untuk mengimplementasikan metode RPC unary mendapatkan header pada server.
Panggil
metadata.FromIncomingContext(ctx)dalam metode. Nilai parameter ctx diperoleh dari parameter input metode Talk.Gunakan Node.js untuk mengimplementasikan metode RPC unary mendapatkan header pada server.
Panggil
call.metadata.getMap()dalam metode.Gunakan Python untuk mengimplementasikan metode RPC unary mendapatkan header pada server.
Panggil
context.invocation_metadata()dalam metode.
Server streaming RPC
Gunakan Java untuk mengimplementasikan metode RPC streaming server mendapatkan header pada server.
Header diintersep.
Gunakan Go untuk mengimplementasikan metode RPC streaming server mendapatkan header pada server.
Panggil
metadata.FromIncomingContext(ctx)dalam metode. Anda dapat memanggil metodestream.Context()untuk mendapatkan nilai parameterctxdari parameter inputstreammetode TalkOneAnswerMore.Gunakan Node.js untuk mengimplementasikan metode RPC streaming server mendapatkan header pada server.
Panggil
call.metadata.getMap()dalam metode.Gunakan Python untuk mengimplementasikan metode RPC streaming server mendapatkan header pada server.
Panggil
context.invocation_metadata()dalam metode.
Client streaming RPC
Gunakan Java untuk mengimplementasikan metode RPC streaming klien mendapatkan header pada server.
Header diintersep.
Gunakan Go untuk mengimplementasikan metode RPC streaming klien mendapatkan header pada server.
Panggil
metadata.FromIncomingContext(ctx)dalam metode. Anda dapat memanggil metodestream.Context()untuk mendapatkan nilai parameterctxdari parameter inputstreammetode TalkMoreAnswerOne.Gunakan Node.js untuk mengimplementasikan metode RPC streaming klien mendapatkan header pada server.
Panggil
call.metadata.getMap()dalam metode.Gunakan Python untuk mengimplementasikan metode RPC streaming klien mendapatkan header pada server.
Panggil
context.invocation_metadata()dalam metode.
Bidirectional streaming RPC
Gunakan Java untuk mengimplementasikan metode RPC streaming dua arah mendapatkan header pada server.
Header diintersep.
Gunakan Go untuk mengimplementasikan metode RPC streaming dua arah mendapatkan header pada server.
Panggil
metadata.FromIncomingContext(ctx)dalam metode. Anda dapat memanggil metodestream.Context()untuk mendapatkan nilai parameterctxdari parameter inputstreammetode TalkBidirectional.Gunakan Node.js untuk mengimplementasikan metode RPC streaming dua arah mendapatkan header pada server.
Panggil
call.metadata.getMap()dalam metode.Gunakan Python untuk mengimplementasikan metode RPC streaming dua arah mendapatkan header pada server.
Panggil
context.invocation_metadata()dalam metode.
Send headers from the client
Metode Dasar
Gunakan Java untuk mengimplementasikan metode dasar mengirim header dari klien.
Implementasikan
interceptCall(MethodDescriptor<ReqT, RespT> mdari antarmuka interceptorClientInterceptor,CallOptions o, Channel c)metode tersebut, dan implementasikan tipe nilai kembaliClientCall<ReqT. Metode start((Listener<RespT> l, Metadata h)) dariRespT>mengisi informasi header denganh.put(k, v). Tipe parameter input metodeputkadalahMetadata.Key<String>, dan tipevadalahString.Gunakan Go untuk mengimplementasikan metode dasar mengirim header dari klien.
metadata.AppendToOutgoingContext(ctx,kv ...) context.ContextGunakan Node.js untuk mengimplementasikan metode dasar mengirim header dari klien.
metadata=call.metadata.getMap()metadata.add(key, headers[key])Gunakan Python untuk mengimplementasikan metode dasar mengirim header dari klien.
Tetapkan variabel dalam perintah
metadata_dict = {}dalam format berikut:metadata_dict[c.key] = c.value. Konversikan tipe data dalam array metadata_dict kelist tupledengan menggunakanlist(metadata_dict.items()).
Unary RPC
Gunakan Java untuk mengimplementasikan metode RPC unary mengirim header dari klien.
Header diintersep.
Gunakan Go untuk mengimplementasikan metode RPC unary mengirim header dari klien.
Panggil
metadata.AppendToOutgoingContext(ctx,kv)dalam metode.Gunakan Node.js untuk mengimplementasikan metode RPC unary mengirim header dari klien.
Panggil metode dasar.
Gunakan Python untuk mengimplementasikan metode RPC unary mengirim header dari klien.
Panggil metode dasar.
Server streaming RPC
Gunakan Java untuk mengimplementasikan metode RPC streaming server mengirim header dari klien.
Header diintersep.
Gunakan Go untuk mengimplementasikan metode RPC streaming server mengirim header dari klien.
Panggil
metadata.AppendToOutgoingContext(ctx,kv)dalam metode.Gunakan Node.js untuk mengimplementasikan metode RPC streaming server mengirim header dari klien.
Panggil metode dasar.
Gunakan Python untuk mengimplementasikan metode RPC streaming server mengirim header dari klien.
Panggil metode dasar.
Client streaming RPC
Gunakan Java untuk mengimplementasikan metode RPC streaming klien mengirim header dari klien.
Header diintersep.
Gunakan Go untuk mengimplementasikan metode RPC streaming klien mengirim header dari klien.
Panggil
metadata.AppendToOutgoingContext(ctx,kv)dalam metode.Gunakan Node.js untuk mengimplementasikan metode RPC streaming klien mengirim header dari klien.
Panggil metode dasar.
Gunakan Python untuk mengimplementasikan metode RPC streaming klien mengirim header dari klien.
Panggil metode dasar.
Bidirectional streaming RPC
Gunakan Java untuk mengimplementasikan metode RPC streaming dua arah mengirim header dari klien.
Header diintersep.
Gunakan Go untuk mengimplementasikan metode RPC streaming dua arah mengirim header dari klien.
Panggil
metadata.AppendToOutgoingContext(ctx,kv)dalam metode.Gunakan Node.js untuk mengimplementasikan metode RPC streaming dua arah mengirim header dari klien.
Panggil metode dasar.
Gunakan Python untuk mengimplementasikan metode RPC streaming dua arah mengirim header dari klien.
Panggil metode dasar.
Propagasi headers
Dalam Managed Service for OpenTelemetry, metadata jejak upstream harus diteruskan ke downstream untuk mendapatkan informasi lengkap dari sebuah jejak. Oleh karena itu, informasi header terkait jejak yang diperoleh pada server harus diteruskan ke klien yang mengirim permintaan ke downstream.
Operasi model komunikasi yang diimplementasikan menggunakan Go, Node.js, dan Python dapat menerima header. Oleh karena itu, tiga tindakan berikut dapat diimplementasikan secara berurutan menggunakan operasi dari empat model komunikasi: Pertama, server membaca header. Lalu, server meneruskan header. Terakhir, klien mengirim header.
Operasi model komunikasi yang diimplementasikan menggunakan Java tidak dapat digunakan untuk menyebarkan header dalam proses terurut. Ini karena Java membaca dan menulis header menggunakan dua interceptor. Hanya interceptor baca yang mendapatkan ID unik dari jejak. Selain itu, layanan gRPC mungkin menerima dan mengirim permintaan secara bersamaan. Akibatnya, kedua interceptor tidak dapat dihubungkan menggunakan caching, yang merupakan metode paling intuitif untuk menampilkan jejak.
Java menggunakan Metadata-Context Propagation untuk melacak header.
Ketika interceptor server membaca header, header ditulis ke Context menggunakan ctx.withValue(key, metadata). Tipe parameter key adalah Context.Key<String>. Kemudian, interceptor klien membaca header dari Context menggunakan key.get(). Secara default, metode get menggunakan Context.current(). Ini memastikan bahwa konteks yang sama digunakan saat header dibaca dan ditulis.
Ketika header dapat disebarkan, Anda dapat melacak pesan permintaan dan respons antara klien dan server gRPC.
Deploy dan Verifikasi Topologi Instance ASM
Sebelum mengaktifkan Managed Service for OpenTelemetry untuk layanan berbasis gRPC, Anda harus menerapkan dan memverifikasi topologi instance ASM tempat layanan berbasis gRPC berada. Pastikan topologi instance ASM bekerja sesuai harapan.
Direktori pelacakan proyek contoh berisi skrip penerapan dalam Java, Go, Node.js, dan Python. Dalam contoh ini, skrip penerapan Go digunakan untuk menerapkan dan memverifikasi topologi instance ASM.
cd go
# Deploy topologi instance ASM.
sh apply.sh
# Verifikasi topologi instance ASM.
sh test.shJika tidak ada pengecualian yang terjadi, topologi instance ASM bekerja sesuai harapan.
Gambar berikut menunjukkan topologi yang diterapkan dari instance Service Mesh.
Lihat Data Pelacakan
Kumpulkan data pelacakan ASM ke Managed Service for OpenTelemetry. Untuk informasi lebih lanjut, lihat Kumpulkan Data Pelacakan ASM ke Managed Service for OpenTelemetry.
Masuk ke Managed Service for OpenTelemetry console. Di panel navigasi kiri, klik Trace Entrance.
Di halaman Trace Entrance, klik Application Topology dari aplikasi yang diinginkan.
Anda dapat melihat jejak lengkap, termasuk requestor lokal-Ingressgateway-grpc-server-svc1-grpc-server-svc2-grpc-server-svc3.

Di halaman End-to-End Aggregation, klik tab End-to-End Aggregation untuk melihat jejak yang teragregasi.

Di tab End-to-End Aggregation, klik jejak di kolom Span Name untuk melihat informasi detail dari jejak tersebut.
