Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:ASM'de gRPC hizmetlerini izleme

Son Güncelleme:Oct 07, 2026

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

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

      ServerInterceptor arayüzünün interceptCall(ServerCall<ReqT, RespT> call,final Metadata m,ServerCallHandler<ReqT, RespT> h) yöntemini uygulayın. Başlık bilgilerini elde etmek için String v = m.get(k) ifadesini kullanın. get yö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][]string tü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 ve MetadataValue türü string/Buffer olarak 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çin m.key, m.value ifadelerini 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 parametresi ctx, Talk yö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 parametresi ctx, TalkOneAnswerMore öğesinin stream giriş parametresinden stream.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 parametresi ctx, TalkMoreAnswerOne yönteminin stream giriş parametresi üzerinde stream.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 parametresi ctx, TalkBidirectional yönteminin stream giriş parametresi üzerinde çağrılan stream.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.

      ClientInterceptor arayüzünün interceptCall(MethodDescriptor<ReqT, RespT> m, CallOptions o, Channel c) yöntemini uygulayın ve döndürülen ClientCall<ReqT, RespT> nesnesinde start((Listener<RespT> l, Metadata h)) yöntemini uygulayın. Başlık bilgisi eklemek için h.put(k, v) ifadesini kullanın. put yöntemi için k parametresi Metadata.Key<String> türündedir ve v parametresi String tü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şkeni metadata_dict[c.key] = c.value ifadesiyle doldurulur ve sonunda list tuple türüne list(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.Network topology

İzleri görüntüleme

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

  2. Managed Service for OpenTelemetry konsoluna oturum açın. Sol gezinme bölmesinde Trace Entrance seçeneğine tıklayın.

  3. 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 ve istio-ingressgateway ile çok katmanlı grpc-server hizmetleri arasındaki çağrı ilişkilerini görüntüler. Her düğüm, başarı oranı ve çağrı çarpanı ile etiketlenmiştir.

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

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