Managed Service for OpenTelemetry, dağıtık uygulama geliştiricilerine iz görselleştirme, istek hacmi istatistikleri, uygulama topolojisi ve bağımlılık analizi gibi kapsamlı bir araç seti sunar. Bu konuda, ASM'de gRPC izlemeyi uygulamak için başlıkların nasıl kullanılacağı açıklanmaktadır.
Önkoşullar
Bir ASM örneği oluşturdunuz. Daha fazla bilgi için bkz. ASM örneği oluşturma.
Managed Service for OpenTelemetry hizmetini etkinleştirdiniz. Faturalandırma bilgileri için bkz. Faturalandırma.
Örnek proje
Örnek gRPC projesine hello-servicemesh-grpc adresinden ulaşabilirsiniz. Bu konuda bahsedilen tüm dizinler hello-servicemesh-grpc deposunda bulunmaktadır.
gRPC başlık programlama uygulamaları
Sunucuda başlıkları alma
-
Temel yöntemler
-
Java: Sunucuda başlıkları alın.
ServerInterceptorarayüzününinterceptCall(ServerCall<ReqT, RespT> call,final Metadata m,ServerCallHandler<ReqT, RespT> h)yöntemini uygulayın. Başlık bilgilerini elde etmek içinString v = m.get(k)ifadesini kullanın.getyönteminin parametre türüMetadata.Key<String>şeklindedir. -
Go: Sunucuda başlıkları alın.
metadata.FromIncomingContext(ctx)(md MD, ok bool)ifadesini kullanın; burada MD,map[string][]stringtüründe bir değişkendir. -
Node.js: Sunucuda başlıkları alın.
call.metadata.getMap()dönüş türü[key: string]: MetadataValueşeklindedir veMetadataValuetürüstring/Bufferolarak tanımlanır. -
Python: Sunucuda başlıkları alın.
context.invocation_metadata()ifadesi,('k','v')biçiminde 2'li demetlerden oluşan bir dizi döndürür. Anahtar-değer çiftini elde etmek içinm.key, m.valueifadelerini kullanın.
-
-
Tek yönlü RPC
-
Java: Tek yönlü RPC için başlıkları alın.
Yöntem, başlıkların farkında değildir.
-
Go: Tek yönlü RPC için başlıkları alın.
Yöntem içinde doğrudan
metadata.FromIncomingContext(ctx)çağrısını yapın. Bağlam parametresictx,Talkyönteminin giriş parametresinden gelir. -
Node.js: Tek yönlü RPC için başlıkları alın.
Yöntem içinde doğrudan
call.metadata.getMap()çağrısını yapın. -
Python: Tek yönlü RPC için başlıkları alın.
Yöntem içinde doğrudan
context.invocation_metadata()çağrısını yapın.
-
-
Sunucu akışlı RPC
-
Java: Sunucu akışlı RPC için başlıkları alın.
Yöntem, başlıkların farkında değildir.
-
Go: Sunucu akışlı RPC için başlıkları alın.
Yöntem içinde doğrudan
metadata.FromIncomingContext(ctx)çağrısını yapın. Bağlam parametresictx,TalkOneAnswerMoreöğesininstreamgiriş parametresindenstream.Context()çağrısı yapılarak elde edilir. -
Node.js: Sunucu akışlı RPC için başlıkları alın.
Yöntem içinde doğrudan
call.metadata.getMap()çağrısını yapın. -
Python: Sunucu akışlı RPC için başlıkları alın.
Yöntem içinde doğrudan
context.invocation_metadata()çağrısını yapın.
-
-
İstemci akışlı RPC
-
Java: İstemci akışlı RPC için başlıkları alın.
Yöntem, başlıkların farkında değildir.
-
Go: İstemci akışlı RPC için başlıkları alın.
Yöntem içinde doğrudan
metadata.FromIncomingContext(ctx)çağrısını yapın. Bağlam parametresictx,TalkMoreAnswerOneyöntemininstreamgiriş parametresi üzerindestream.Context()çağrısı yapılarak elde edilir. -
Node.js: İstemci akışlı RPC için başlıkları alın.
Yöntem içinde doğrudan
call.metadata.getMap()çağrısını yapın. -
Python: İstemci akışlı RPC için başlıkları alın.
Yöntem içinde doğrudan
context.invocation_metadata()çağrısını yapın.
-
-
Çift yönlü akışlı RPC
-
Java: Çift yönlü akışlı RPC için başlıkları alın.
Yöntem, başlıkların farkında değildir.
-
Go: Çift yönlü akışlı RPC için başlıkları alın.
Yöntem içinde doğrudan
metadata.FromIncomingContext(ctx)çağrısını yapın. Bağlam parametresictx,TalkBidirectionalyöntemininstreamgiriş parametresi üzerinde çağrılanstream.Context()ifadesinden elde edilir. -
Node.js: Çift yönlü akışlı RPC için başlıkları alın.
Yöntem içinde doğrudan
call.metadata.getMap()çağrısını yapın. -
Python: Çift yönlü akışlı RPC için başlıkları alın.
Yöntem içinde doğrudan
context.invocation_metadata()çağrısını yapın.
-
İstemciden başlık gönderme
-
Temel yöntemler
-
Java: İstemciden başlık gönderin.
ClientInterceptorarayüzününinterceptCall(MethodDescriptor<ReqT, RespT> m,CallOptions o, Channel c)yöntemini uygulayın ve döndürülenClientCall<ReqT,RespT>nesnesindestart((Listener<RespT> l, Metadata h))yöntemini uygulayın. Başlık bilgisi eklemek içinh.put(k, v)ifadesini kullanın.putyöntemi içinkparametresiMetadata.Key<String>türündedir vevparametresiStringtüründedir. -
Go: İstemciden başlık gönderin.
metadata.AppendToOutgoingContext(ctx,kv ...) context.Context -
Node.js: İstemciden başlık gönderin.
metadata=call.metadata.getMap()metadata.add(key, headers[key]) -
Python: İstemciden başlık gönderin.
metadata_dict = {}değişkenimetadata_dict[c.key] = c.valueifadesiyle doldurulur ve sonundalist tupletürünelist(metadata_dict.items())şeklinde dönüştürülür.
-
-
Tek yönlü RPC
-
Java: Tek yönlü RPC için başlık gönderin.
Yöntem, başlıkların farkında değildir.
-
Go: Tek yönlü RPC için başlık gönderin.
Yöntem içinde doğrudan
metadata.AppendToOutgoingContext(ctx,kv)çağrısını yapın. -
Node.js: Tek yönlü RPC için başlık gönderin.
RPC yönteminizde temel yöntemi doğrudan kullanın.
-
Python: Tek yönlü RPC için başlık gönderin.
RPC yönteminizde temel yöntemi doğrudan kullanın.
-
-
Sunucu akışlı RPC
-
Java: Sunucu akışlı RPC için başlık gönderin.
Yöntem, başlıkların farkında değildir.
-
Go: Sunucu akışlı RPC için başlık gönderin.
Yöntem içinde doğrudan
metadata.AppendToOutgoingContext(ctx,kv)çağrısını yapın. -
Node.js: Sunucu akışlı RPC için başlık gönderin.
RPC yönteminizde temel yöntemi doğrudan kullanın.
-
Python: Sunucu akışlı RPC için başlık gönderin.
RPC yönteminizde temel yöntemi doğrudan kullanın.
-
-
İstemci akışlı RPC
-
Java: İstemci akışlı RPC için başlık gönderin.
Yöntem, başlıkların farkında değildir.
-
Go: İstemci akışlı RPC için başlık gönderin.
Yöntem içinde doğrudan
metadata.AppendToOutgoingContext(ctx,kv)çağrısını yapın. -
Node.js: İstemci akışlı RPC için başlık gönderin.
RPC yönteminizde temel yöntemi doğrudan kullanın.
-
Python: İstemci akışlı RPC için başlık gönderin.
RPC yönteminizde temel yöntemi doğrudan kullanın.
-
-
Çift yönlü akışlı RPC
-
Java: Çift yönlü akışlı RPC için başlık gönderin.
Yöntem, başlıkların farkında değildir.
-
Go: Çift yönlü akışlı RPC için başlık gönderin.
Yöntem içinde doğrudan
metadata.AppendToOutgoingContext(ctx,kv)çağrısını yapın. -
Node.js: Çift yönlü akışlı RPC için başlık gönderin.
RPC yönteminizde temel yöntemi doğrudan kullanın.
-
Python: Çift yönlü akışlı RPC için başlık gönderin.
RPC yönteminizde temel yöntemi doğrudan kullanın.
-
Başlıkları yayma
Uçtan uca izlemenin çalışması için, yukarı akış hizmetinden gelen iz meta verilerinin aşağı akış hizmetlerine aktarılması ve böylece eksiksiz bir iz oluşturulması gerekir. Bu durum, sunucu tarafından alınan izleme ile ilgili başlıkların, aşağı akış isteğini yapan istemciye yayılmasını gerektirir.
Go, Node.js ve Python'da iletişim modeli yöntemleri başlıkların farkındadır. Bu sayede, aynı RPC yöntemi içinde başlıkları sırayla okuyabilir, iletebilir ve gönderebilirsiniz.
Java'da başlık okuma ve yazma işlemleri iki ayrı engelleyici (interceptor) tarafından yönetilir. Bu durum, başlık yayılımının tek bir ardışık süreçte uygulanmasını engeller. Eşzamanlılık ve okuma engelleyicisinin benzersiz iz kimliğine özel erişimi nedeniyle, iki engelleyici arasında köprü kurmak için basit bir önbellekleme mekanizması kullanamazsınız.
Java, bu sorunu çözmek için bir Metadata-Context Yayılımı mekanizması sağlar.
Sunucu engelleyicisinde, Metadata/Header değerini ctx.withValue(key, metadata) kullanarak Bağlamda saklayın; burada key, Context.Key<String> türündedir. Ardından, istemci engelleyicisinde key.get() kullanarak Metadata from the Context değerini alın. get yöntemi varsayılan olarak Context.current() bağlamını kullanır; bu da tek bir isteğe ait başlıkların aynı bağlamdan okunup yazılmasını sağlar.
Bu yayılım mekanizması sayesinde, gRPC tabanlı hizmetler için izlemeyi güvenilir bir şekilde uygulayabilirsiniz.
Ağ topolojisini dağıtma ve doğrulama
gRPC izlemeyi uygulamadan önce, tüm hizmetlerin birbirleriyle iletişim kurabilmesini sağlamak için ağ topolojisini dağıtmanız ve doğrulamanız gerekir.
Örnek projedeki izleme dizinine gidin. Bu dizin, dört programlama dilinin tamamı için dağıtım betikleri içerir. Aşağıdaki örnekte, ağ topolojisini dağıtmak ve doğrulamak için Go sürümü kullanılmaktadır.
cd go
# Deploy the topology
sh apply.sh
# Verify the topology
sh test.sh
Hata bildirilmezse, ağ topolojisi doğru şekilde iletişim kuruyor demektir.
Dağıtımdan sonraki Service Mesh topolojisi aşağıdaki şekilde gösterilmektedir.
İzleri görüntüleme
ASM örneğinizi iz verilerini Managed Service for OpenTelemetry'e raporlayacak şekilde yapılandırın. Daha fazla bilgi için bkz. ASM'yi iz verilerini raporlayacak şekilde yapılandırma.
Managed Service for OpenTelemetry konsoluna oturum açın. Sol gezinme bölmesinde Trace Entrance seçeneğine tıklayın.
-
Trace Entrance sayfasında hedef uygulamanızı bulun ve Application Topology seçeneğine tıklayın.
Yerel istek istemcisinden Ingressgateway'e, ardından grpc-server-svc1, grpc-server-svc2 ve grpc-server-svc3'e giden yolu içeren tam izi görebilirsiniz. Sayfa, hedef uygulama için (örneğin
istio-ingressgateway) hizmet çağrı zincirinin dikey topolojisini gösterir veistio-ingressgatewayile çok katmanlıgrpc-serverhizmetleri arasındaki çağrı ilişkilerini görüntüler. Her düğüm, başarı oranı ve çağrı çarpanı ile etiketlenmiştir. -
End-to-End Aggregation sayfasında, uçtan uca toplamayı görüntülemek için End-to-End Aggregation sekmesine tıklayın.
End-to-End Aggregation sayfası, toplu iz bilgilerini hiyerarşik bir tabloda görüntüler. Sütunlar arasında Span name, Application name, Requests/request ratio, Spans/request, Avg. self duration/ratio, Avg. duration ve Errors/error ratio bulunur. Her bir çağrı hiyerarşisi düzeyini genişleterek her Span için performans ölçümlerini görüntüleyebilirsiniz.
-
End-to-End Aggregation sekmesinde, ayrıntılarını görüntülemek için Span name sütunu altındaki bir iz'e tıklayın.
İz ayrıntıları sayfasının üst kısmında Start time, Duration, Applications, Trace depth ve Total spans gibi meta veriler görüntülenir. Aşağıdaki tabloda, her Span için hiyerarşik bir görünüm sunulur; sütunlar arasında Span name, Timeline görselleştirmesi, Application name, Start time, IP address ve Status bulunur. Bu sayede hizmetler arasındaki çağrı hiyerarşisini ve süre dağılımını görselleştirebilirsiniz.