OpenTelemetry kullanarak araç izleme bilgileri

1. Giriş

5af4a7e43b0feaab.png

Son Güncelleme Tarihi: 05.03.2021

Uygulamanın gözlemlenebilirliği

Gözlemlenebilirlik ve OpenTemetri

Gözlemlenebilirlik, bir sistemin özelliklerini tanımlamak için kullanılan terimdir. Gözlemlenebilirliğe sahip bir sistem, ekiplerin sistemlerinde etkin bir şekilde hata ayıklamasına olanak tanır. Bu bağlamda, gözlemlenebilirliğin üç ayağı; günlükler, metrikler ve izler, sistemin gözlemlenebilirlik elde etmesi için temel araçlardır.

OpenTelemetry, gözlemlenebilirliğin gerektirdiği telemetri verilerinin (günlükler, metrikler ve izler) enstrümantasyonunu ve dışa aktarımını hızlandıran bir spesifikasyonlar ve SDK'lar grubudur. OpenTelemetry, CNCF kapsamındaki açık standart ve topluluk odaklı bir projedir. Projenin ve ekosisteminin sağladığı kitaplıklardan yararlanan geliştiriciler, uygulamalarını satıcıdan bağımsız bir şekilde ve birden fazla mimariye karşı enstrümantasyonlarını kullanarak gerçekleştirebilirler.

Dağıtılmış İz

Günlükler, metrikler ve izler arasında, sistemdeki sürecin belirli bir bölümünün gecikmesini bildiren telemetri telemetridir. Özellikle mikro hizmet çağında, dağıtılmış izleme, genel olarak dağıtılmış sistemdeki gecikme sorunlarını tespit etmek için güçlü bir etmendir.

Dağıtılmış izleri analiz ederken iz verilerini görselleştirme, genel sistem gecikmelerini bir bakışta anlamanın anahtarıdır. Dağıtılmış izlemede, sistem giriş noktasına yapılan tek bir isteği birden çok aralık içeren Trace biçiminde işlemek için bir dizi çağrıyı ele alırız.

Yayılma, dağıtılmış bir sistemde yapılan tek bir iş birimini temsil eder ve başlangıç ve bitiş zamanlarını kaydeder. Aralıklar genellikle birbirleriyle hiyerarşik ilişkilere sahiptir. Aşağıdaki resimde daha küçük aralıkların alt aralıkları, geniş /mesajlar aralığının alt aralıklarıdır ve bir sistemdeki çalışmanın yolunu gösteren tek bir İzde toplanır.

adbd3ecd69d410cb.png

Dağıtılmış izleme arka ucu seçeneklerinden biri olan Google Cloud Trace, Google Cloud'daki diğer ürünlerle iyi entegre edilmiştir.

Oluşturacaklarınız

Bu codelab'de "Shakesapp" adlı hizmetlerdeki enstrüman izleme bilgilerini kullanacaksınız. çalışan bir uygulamadır. Shakesapp'in mimarisi aşağıda açıklandığı gibidir:

68873c018a7be7de.png

  • İstemciler sunucuya bir sorgu dizesi gönderir
  • Sunucu; istemciden gelen sorguyu kabul eder, tüm Shakespare eserlerini Google Cloud Storage'dan metin biçiminde getirir, sorguyu içeren satırları arar ve istemciyle eşleşen satırın numarasını döndürür.

İzleme bilgilerini istek genelinde kullanacaksınız.

Neler öğreneceksiniz?

  • Python projesinde OpenTelemetry Trace kitaplıklarını kullanmaya başlama
  • Kitaplıkla aralık oluşturma
  • Aralık bağlamlarını kablo genelinde uygulama bileşenleri arasında yayma
  • İz verileri Google Cloud Trace'e nasıl gönderilir?
  • Google Cloud Trace'te izler nasıl analiz edilir?

Bu codelab'de, mikro hizmetlerinizi nasıl kullanacağınız açıklanmaktadır. Anlaşılmasını kolaylaştırmak için bu örnekte yalnızca 3 bileşen (yük oluşturucu, istemci ve sunucu) vardır. Ancak bu codelab'de açıklanan süreci daha karmaşık ve büyük sistemlere de uygulayabilirsiniz.

Gerekenler

  • Python 3 Bilgisi

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

Google Hesabınız (Gmail veya Google Apps) yoksa bir hesap oluşturmanız gerekir. Google Cloud Platform konsolunda ( console.cloud.google.com) oturum açın ve yeni bir proje oluşturun.

Zaten bir projeniz varsa konsolun sol üst köşesindeki proje seçimi açılan menüsünü tıklayın:

15b8b6ac4d917005.png

Sonra ‘YENİ PROJE’yi tıklayın. düğmesini tıklayın:

7136b3ee36ebaf89.png

Henüz projeniz yoksa ilk projenizi oluşturmak için şuna benzer bir iletişim kutusu görmeniz gerekir:

90977ce514204b51.png

Sonraki proje oluşturma iletişim kutusu yeni projenizin ayrıntılarını girmenize olanak tanır:

6d9573e346e930b4.png

Tüm Google Cloud projeleri için benzersiz bir ad olan proje kimliğini unutmayın (yukarıdaki ad daha önce alınmış ve size uygun olmayacaktır!). Bu kod, bu codelab'in ilerleyen bölümlerinde PROJECT_ID olarak adlandırılacaktır.

Sonraki adımda, henüz yapmadıysanız Developers Console'da faturalandırmayı etkinleştirmeniz ve Google Cloud kaynaklarını kullanmak ve Cloud Trace API'yi etkinleştirmek için yapmanız gerekir.

eb5325f65619ad6a.png

Bu codelab'i çalıştırmanın maliyeti birkaç dolardan fazla değildir. Ancak daha fazla kaynak kullanmaya karar verirseniz veya bu kaynakları çalışır durumda bırakırsanız daha yüksek ücret ödemeniz gerekebilir (bu belgenin sonundaki "temizlik" bölümüne bakın). Google Cloud Trace, Google Kubernetes Engine ve Google Artifacat Registry fiyatlandırmaları resmi belgelerde belirtilmiştir.

Yeni Google Cloud Platform kullanıcıları, bu codelab'i tamamen ücretsiz hale getirecek 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Google Cloud Shell Kurulumu

Google Cloud ve Google Cloud Trace, dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.

Bu Debian tabanlı sanal makine, ihtiyacınız olan tüm geliştirme araçlarıyla yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Yani bu codelab'de ihtiyacınız olan tek şey bir tarayıcıdır (Evet, Chromebook'ta çalışır).

Cloud Console'dan Cloud Shell'i etkinleştirmek için Cloud Shell'i Etkinleştir'i gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A tıklamanız yeterlidir (sağlanması ve ortama bağlanması birkaç dakika sürer).

ff81d016724c4f67.png

fbe156ee6edfbb2e.png

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin PROJECT_ID olarak ayarlanmış olduğunu göreceksiniz.

gcloud auth list

Komut çıkışı

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Herhangi bir nedenle proje ayarlanmamışsa şu komutu vermeniz yeterlidir:

gcloud config set project <PROJECT_ID>

PROJECT_ID cihazınızı mı arıyorsunuz? Kurulum adımlarında kullandığınız kimliği kontrol edin veya Cloud Console kontrol panelinden arayın:

a3e716fc9e7454e9.png

Cloud Shell bazı ortam değişkenlerini de varsayılan olarak ayarlar. Bu değişkenler, gelecekte komut çalıştırdığınızda işinize yarayabilir.

echo $GOOGLE_CLOUD_PROJECT

Komut çıkışı

<PROJECT_ID>

Son olarak, varsayılan alt bölgeyi ve proje yapılandırmasını ayarlayın.

gcloud config set compute/zone us-central1-f

Çeşitli farklı alt bölgeler seçebilirsiniz. Daha fazla bilgi için Bölgeler ve Bölgeler.

Python kurulumu

Bu codelab'de "şiir" yönetmeniz gerekecek. Cloud Shell'de aşağıdaki komutu çalıştırın:

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3 -
source $HOME/.poetry/env

Google Kubernetes Kümesi oluşturma

Bu codelab'de, Google Kubernetes Engine'de (GKE) bir mikro hizmet kümesi çalıştıracaksınız. Bu codelab'de süreç aşağıdaki gibidir:

  1. Temel projeyi Cloud Shell'e indirme
  2. Container'larda mikro hizmetler derleme
  3. Kapsayıcıları Google Artifact Registry'ye (GAR) yükleme
  4. Container'ları GKE'ye dağıtma
  5. İzleme araçları için hizmetlerin kaynak kodunu değiştirin
  6. 2. adıma git

Kubernetes Engine'i etkinleştirme

İlk olarak Shakesapp'in GKE'de çalıştığı bir Kubernetes kümesi oluşturmak için GKE'yi etkinleştirmemiz gerekiyor. "Kubernetes Engine" menüsüne gidin ve ETKİNLEŞTİR düğmesine basın.

56c680e93e169731.png

Artık Kubernetes kümesi oluşturmaya hazırsınız.

Kubernetes kümesi oluşturma

Cloud Shell'de, Kubernetes kümesi oluşturmak için aşağıdaki komutu çalıştırın. Lütfen Artifact Registry deposu oluşturmak için kullandığınız bölge değerinin alt bölge değerinin altında olduğunu onaylayın. Depo bölgeniz, alt bölgeyi kapsamıyorsa us-central1-f alt bölge değerini değiştirin.

gcloud container clusters create otel-trace-codelab --zone us-central1-f \
--num-nodes 1 \
--machine-type e2-highcpu-4

Komut çıkışı

Creating cluster otel-trace-codelab in us-central1-f... Cluster is being health-checked (master is healthy)...done.
Created [https://container.googleapis.com/v1/projects/psychic-order-307806/zones/us-central1-f/clusters/otel-trace-codelab].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-f/otel-trace-codelab?project=psychic-order-307806
kubeconfig entry generated for otel-trace-codelab.
NAME                LOCATION       MASTER_VERSION    MASTER_IP        MACHINE_TYPE  NODE_VERSION      NUM_NODES  STATUS
otel-trace-codelab  us-central1-f  1.18.12-gke.1210  104.154.162.176  e2-medium     1.18.12-gke.1210  3          RUNNING

Artifact Registry ve skaffold kurulumu

Artık dağıtılmaya hazır bir Kubernetes kümemiz var. Şimdi, push ve dağıtma container'ları için bir container kaydı hazırlayacağız. Bu adımda GAR'yi kurmamız ve bunu kullanmak için skaffold yapmamız gerekir.

Artifact Registry kurulumu

"Artifact Registry" menüsüne gidin ETKİNLEŞTİR düğmesine basın.

f7493243bae0cdf7.png

Bir süre sonra GAR'nin depo tarayıcısını göreceksiniz. "REPOSITORY OLUŞTUR"u tıklayın. düğmesini tıklayın ve deponun adını girin.

f97f337f5476651.png

Bu codelab'de yeni depoyu trace-codelab olarak adlandırıyorum. Yapının biçimi "Docker"dır ve konum türü "Bölge" ise. Google Compute Engine varsayılan alt bölgesi için belirlediğinize yakın bölgeyi seçin. Örneğin, bu örnek "us-central1-f"yi seçti Burada "us-central1 (Iowa)"yı seçiyoruz. Ardından "OLUŞTUR"u tıklayın. düğmesini tıklayın.

2f04143077ca56db.png

Artık "trace-codelab"i görüyorsunuz. kod deposunda toplanır.

7a3c1f47346bea15.png

Kayıt defteri yolunu kontrol etmek için daha sonra buraya geri döneceğiz.

Skaffold kurulumu

Skaffold, Kubernetes üzerinde çalışan mikro hizmetler oluşturmak için çalışırken kullanabileceğiniz pratik bir araçtır. Küçük komut kümeleriyle uygulama container'ları oluşturma, aktarma ve dağıtma iş akışını yönetir. Skaffold, container kayıt defteri olarak varsayılan olarak Docker Registry'yi kullanır. Bu nedenle, container'lara aktarılırken GAR'yi tanımak için skaffold'u yapılandırmanız gerekir.

Cloud Shell'i tekrar açın ve skaffold yüklü olup olmadığını onaylayın. (Cloud Shell'i varsayılan olarak ortama yükler.) Aşağıdaki komutu çalıştırarak skaffold sürümünü görebilirsiniz.

skaffold version

Komut çıkışı

v1.20.0

Şimdi, varsayılan depoyu skaf Fold'un kullanması için kaydedebilirsiniz. Kayıt defteri yolunu öğrenmek için Artifact Registry kontrol paneline gidip önceki adımda ayarladığınız deponun adını tıklayın.

55173fe922f40327.png

Ardından, sayfanın üst kısmında içerik haritası yollarını görürsünüz. Kayıt defteri yolunu panoya kopyalamak için e157b1359c3edc06.png simgesini tıklayın.

a9b0fa44c37e0178.png

Kopyala düğmesini tıkladığınızda, tarayıcının en altında aşağıdakine benzer bir mesaj içeren bir iletişim kutusu görürsünüz:

&quot;us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab&quot; kopyalandı

Cloud Shell'e geri dönün. Kontrol panelinden kopyaladığınız değerle skaffold config set default-repo komutunu çalıştırın.

skaffold config set default-repo us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab

Komut çıkışı

set value default-repo to us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab for context gke_stackdriver-sandbox-3438851889_us-central1-b_stackdriver-sandbox

Ayrıca, kayıt defterini Docker yapılandırmasına göre yapılandırmanız gerekir. Aşağıdaki komutu çalıştırın:

gcloud auth configure-docker us-central1-docker.pkg.dev --quiet

Komut çıkışı

{
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud",
    "us-central1-docker.pkg.dev": "gcloud"
  }
}
Adding credentials for: us-central1-docker.pkg.dev

Artık GKE'de Kubernetes container'ı oluşturma adımına geçebilirsiniz.

Özet

Bu adımda codelab ortamınızı kuracaksınız:

  • Cloud Shell'i kurma
  • Container kayıt defteri için Artifact Registy deposu oluşturuldu
  • Container kayıt defterini kullanmak için skaffold'u ayarlama
  • codelab mikro hizmetlerinin çalıştırıldığı bir Kubernetes kümesi oluşturuldu

Sonraki bölüm

Bir sonraki adımda mikro hizmetlerinizi derleyecek, kümeye aktaracak ve dağıtacaksınız.

3. Mikro hizmetleri derleme, aktarma ve dağıtma

Codelab materyalini indirin

Önceki adımda bu codelab için tüm ön koşulları ayarladık. Artık tüm mikro hizmetleri bunların üzerinde çalıştırmaya hazırsınız. Codelab materyali GitHub'da barındırıldığından aşağıdaki git komutuyla verileri Cloud Shell ortamına indirin.

cd ~
git clone https://github.com/GoogleCloudPlatform/opentelemetry-trace-codelab-python.git

Projenin dizin yapısı aşağıdaki gibidir:

shakesapp-python
├── LICENSE
├── manifests
│   ├── client.yaml
│   ├── loadgen.yaml
│   └── server.yaml
├── proto
│   └── shakesapp.proto
├── skaffold.yaml
└── src
    ├── client
    ├── loadgen
    └── server
  • manifest'ler: Kubernetes manifest dosyaları
  • proto: istemci ve sunucu arasındaki iletişimin proto tanımı
  • src: her aramanın kaynak kodu için dizinler
  • skaffold.yaml: Skaffold için yapılandırma dosyası

skaffold komutunu çalıştırma

Artık tüm içeriği derlemeye, aktarmaya ve az önce oluşturduğunuz Kubernetes kümesine dağıtmaya hazırsınız. Bu özellik birden fazla adım içeriyormuş gibi görünse de asıl özellik, kaykayın sizin için her şeyi yapmasıdır. Bunu aşağıdaki komutla deneyelim:

cd shakesapp-python
skaffold run --tail

Komutu çalıştırır çalıştırmaz docker build günlük çıkışını görürsünüz ve bunların kayıt defterine başarıyla aktarıldığını onaylayabilirsiniz.

Komut çıkışı

...
---> Running in c39b3ea8692b
 ---> 90932a583ab6
Successfully built 90932a583ab6
Successfully tagged us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/serverservice:step1
The push refers to repository [us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/serverservice]
cc8f5a05df4a: Preparing
5bf719419ee2: Preparing
2901929ad341: Preparing
88d9943798ba: Preparing
b0fdf826a39a: Preparing
3c9c1e0b1647: Preparing
f3427ce9393d: Preparing
14a1ca976738: Preparing
f3427ce9393d: Waiting
14a1ca976738: Waiting
3c9c1e0b1647: Waiting
b0fdf826a39a: Layer already exists
88d9943798ba: Layer already exists
f3427ce9393d: Layer already exists
3c9c1e0b1647: Layer already exists
14a1ca976738: Layer already exists
2901929ad341: Pushed
5bf719419ee2: Pushed
cc8f5a05df4a: Pushed
step1: digest: sha256:8acdbe3a453001f120fb22c11c4f6d64c2451347732f4f271d746c2e4d193bbe size: 2001

Tüm hizmet container'ları aktarıldıktan sonra Kubernetes dağıtımları otomatik olarak başlar.

Komut çıkışı

sha256:b71fce0a96cea08075dc20758ae561cf78c83ff656b04d211ffa00cedb77edf8 size: 1997
Tags used in deployment:
 - serverservice -> us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/serverservice:step4@sha256:8acdbe3a453001f120fb22c11c4f6d64c2451347732f4f271d746c2e4d193bbe
 - clientservice -> us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/clientservice:step4@sha256:b71fce0a96cea08075dc20758ae561cf78c83ff656b04d211ffa00cedb77edf8
 - loadgen -> us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/loadgen:step4@sha256:eea2e5bc8463ecf886f958a86906cab896e9e2e380a0eb143deaeaca40f7888a
Starting deploy...
 - deployment.apps/clientservice created
 - service/clientservice created
 - deployment.apps/loadgen created
 - deployment.apps/serverservice created
 - service/serverservice created

Dikkat: "Belirtilen görüntü deposuna push erişimi yok" gibi bir hata alırsanız skaffold'daki varsayılan kod deposundaki yapılandırmanızdan bağımsız olarak, skaffold komutunun görüntüleri Docker Hub'a (docker.io) aktarmaya çalışıp çalışmadığını kontrol edin. Bu durumda, "–default-repo" eklemeyi deneyin. "patenle koşu" seçeneği aşağıdaki gibidir.

$ skaffold koşu –tail –default-repo=us-central1-docker.pkg.dev/[proje kimliği]/[depo adı]

Dağıtımdan sonra her container'da stdout'a yayınlanan gerçek uygulama günlüklerini aşağıdaki gibi görürsünüz:

Komut çıkışı

[server] {"event": "starting server: 0.0.0.0:5050", "severity": "info", "timestamp": "2021-03-17T05:25:56.758575Z"}
[client] [2021-03-17 05:25:54 +0000] [1] [INFO] Starting gunicorn 20.0.4
[client] [2021-03-17 05:25:54 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
[client] [2021-03-17 05:25:54 +0000] [1] [INFO] Using worker: threads
[client] [2021-03-17 05:25:54 +0000] [7] [INFO] Booting worker with pid: 7
[client] {"event": "server address is serverservice:5050", "severity": "info", "timestamp": "2021-03-17T05:25:54.888627Z"}
[client] {"event": "request to server with query: world", "severity": "info", "timestamp": "2021-03-17T05:26:11.550923Z"}
[server] {"event": "query: world", "severity": "info", "timestamp": "2021-03-17T05:26:11.567048Z"}
[loadgen] {"event": "check connectivity: http://clientservice:8080/_healthz", "severity": "info", "timestamp": "2021-03-17T05:26:11.533605Z"}
[loadgen] {"event": "/_healthz response: ok", "severity": "info", "timestamp": "2021-03-17T05:26:11.544267Z"}
[loadgen] {"event": "confirmed connection ot clientservice", "severity": "info", "timestamp": "2021-03-17T05:26:11.544527Z"}

Son olarak, hizmetlerin dağıtılmış izlemesi için OpenTelemetry ile uygulamanıza enstrümantasyon yapmaya hazırsınız.

Özet

Bu adımda, codelab materyalini ortamınızda hazırladınız ve patenin beklendiği gibi çalıştığını onayladınız.

Sonraki bölüm

Sonraki adımda iz bilgilerini kullanmak için loadgen hizmetinin kaynak kodunu değiştireceksiniz.

4. HTTP Enstrümantasyonu

İz enstrümantasyonu ve yayılımı kavramı

Kaynak kodu düzenlemeden önce, dağıtılmış izlerin nasıl çalıştığını basit bir diyagramda kısaca açıklayayım.

c8c659deaa9c9091.png

Bu örnekte, İzleme ve Aralık bilgilerini Cloud Trace'e aktarmak ve iz bağlamını, istekteki loadgen hizmetinden sunucu hizmetine yaymak için kodda işlemleri gerçekleştiriyoruz.

Uygulamanın, aynı iz kimliğine sahip tüm aralıkları tek izde derleyebilmesi için Cloud Trace'in İzleme Kimliği ve Span Kimliği gibi İz meta verilerini göndermesi gerekir. Ayrıca uygulamanın, aşağı akış hizmetlerini isterken hangi izleme bağlamını işlediklerini öğrenebilmeleri için izleme bağlamlarını (üst aralığın izleme kimliği ve yayılma kimliği kombinasyonu) yayması gerekir.

OpenTelemetry size şu konularda yardımcı olur:

  • benzersiz İzleme Kimliği ve Aralık Kimliği oluşturmak için
  • arka uca iz kimliğini ve yayılma kimliğini aktarmak için
  • izleme bağlamlarını diğer hizmetlere yaymak için

Enstrüman ilk aralık

Enstrüman yük oluşturma hizmeti

Cloud Shell'in sağ üst tarafında bulunan düğmeye 776a11bfb2122549.pngbasarak Cloud Shell Düzenleyici'yi açın. Sol bölmedeki gezginden src/loadgen/loadgen.py işlevini açın ve main işlevini bulun.

src/loadgen/loadgen.py

def main():
    ...
    # start request loop to client service
    logger.info("start client request loop")
    addr = f"http://{target}"
    while True:
        logger.info("start request to client")
        call_client(addr)
        logger.info("end request to client")
        time.sleep(2.0)

main işlevinde, call_client işlevini çağıran döngüyü görürsünüz. Geçerli uygulamada, saniye içinde işlev çağrısının başlangıcını ve sonunu kaydeden 2 günlük satırı bulunur. Şimdi fonksiyon çağrısının gecikmesini izlemek için Span bilgilerini kullanalım.

Öncelikle, benzersiz bir İzleme Kimliği ve Aralık Kimliği'ne sahip bir Span oluşturmanız gerekir. OpenTelemetry bu uygulama için kullanışlı bir kitaplık sağlar. OpenTelemetry kitaplıklarını kodunuza aktarmak için aşağıdaki satırları ekleyin.

 import structlog
+from opentelemetry import propagate, trace
+from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.instrumentation.requests import RequestsInstrumentor
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator

Yük oluşturucu, istemci uygulamasını requests modülü aracılığıyla HTTP'de çağırdığından, requests için uzantı paketini kullanırız ve enstrümantasyonu etkinleştiririz.

 from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator
+
+RequestsInstrumentor().instrument()

Ardından, Trace Contenxt ve dışa aktarıcı ayarlarını işleyen Tracer örneğini kurun

     target = os.environ.get("CLIENT_ADDR", "0.0.0.0:8080")

+    exporter = CloudTraceSpanExporter()
+    trace.get_tracer_provider().add_span_processor(SimpleSpanProcessor(exporter))
+    tracer = trace.get_tracer(__name__)
+    propagate.set_global_textmap(CloudTraceFormatPropagator())
+    trace.set_tracer_provider(TracerProvider())
+
     # connectivity check to client service
     healthz = f"http://{target}/_healthz"
     logger.info(f"check connectivity: {healthz}")

Bu, izleme araçlarının işleyiş şeklini anlamaya yönelik bir codelab olduğundan, Tracer'ı her bir isteği kaydedecek ve arka uca gönderecek şekilde yapılandırdığımızı unutmayın. (SimpleSpanProcessor()) Bu, üretim ortamlarına uygun değildir. Bu nedenle, üretim uygulamanızda ayarlama yaparken bu bölümü mutlaka değiştirin.

Artık Tracer ile Aralıklar'ı kullanabilirsiniz. Burada önemli olan, yapmanız gereken, açıkça bir Span oluşturmaktır ve işte bu kadar! Etkinlik meta verilerini Span'a ekleyen iki satır olsa da, benzersiz İz Kimliği ve Aralık Kimliği oluşturup bunları Span'a yerleştirmeniz gerekmez.

     logger.info("start client request loop")
     addr = f"http://{target}"
     while True:
-        logger.info("start request to client")
-        call_client(addr)
-        logger.info("end request to client")
+        with tracer.start_as_current_span("loadgen") as root_span:
+            root_span.add_event(name="request_start")
+            logger.info("start request to client")
+            call_client(addr)
+            root_span.add_event(name="request_end")
+            logger.info("end request to client")
         time.sleep(2.0)

Docker derlemesi için gerekli OpenTelemetry paketlerini getirebilmek için aşağıdaki komutu çalıştırın:

poetry add "opentelemetry-exporter-gcp-trace=^1.0.0rc0"
poetry add "opentelemetry-propagator-gcp=^1.0.0rc0"
poetry add "opentelemetry-instrumentation-requests=^0.20b0"

İlgili bağımlılık açıklamasının pyproject.toml dilinde yazıldığını onaylayabilirsiniz.

Araç müşteri hizmetleri

Önceki bölümde, aşağıdaki çizimde kırmızı dikdörtgen içine alınan parçaya enstrümantasyon yöntemini uyguladık. Aralık bilgilerini yük oluşturma aracı hizmetinde kullandık. Yük oluşturma hizmetine benzer şekilde, şimdi istemci hizmetinde de enstrümantasyon yapmamız gerekir. Yük oluşturma hizmeti ile farkı, istemci hizmetinin, HTTP üstbilgisindeki yük oluşturucu hizmetinden yayılan İz Kimliği bilgilerini ayıklaması ve bu bilgiyi Aralıkları oluşturmak için kullanmasıdır.

ae074d4513c9931f.png

Cloud Shell Düzenleyici'yi açın ve yük oluşturma aracı hizmeti için yaptığımız gibi gerekli modülleri ekleyin.

src/client/client.py

 import flask
 import grpc
 import structlog
+from opentelemetry import propagate, trace
+from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
+from opentelemetry.instrumentation.flask import FlaskInstrumentor
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.propagators.cloud_trace_propagator import \
+    CloudTraceFormatPropagator

 import shakesapp_pb2
 import shakesapp_pb2_grpc

Kullanıcıların adına, tek bir kod satırıyla İzleme Bağlamları elde etmek üzere HTTP üstbilgilerini çıkarmak üzere Flask uygulaması için otomatik araçları etkinleştiren FlaskInstrumentor dosyasını az önce içe aktardığınızı fark ettiniz. OpenTelemetry topluluğu, diğer büyük kitaplıklarla benzer ve kullanışlı entegrasyonlar sunar. Daha fazla bilgi için resmi belgeleri inceleyebilirsiniz.

 app = flask.Flask(__name__)
+FlaskInstrumentor().instrument_app(app)

Enstrümantasyonu başlatmadan önce yine yük oluşturma aracı hizmetinde yaptığımıza benzer bir şekilde Tracer örneğini hazırlamanız gerekir.

 logger.info(f"server address is {SERVER_ADDR}")

+exporter = CloudTraceSpanExporter()
+trace.get_tracer_provider().add_span_processor(SimpleSpanProcessor(exporter))
+propagate.set_global_textmap(CloudTraceFormatPropagator())
+trace.set_tracer_provider(TracerProvider())

 @app.route("/")
 def main_handler():
    ....

Şimdi işleyiciye araç eklemeye hazır. main_handler() öğesini bulun ve gRPC isteğini sunucu hizmetine gönderen bölümü değiştirin.

@app.route("/")
def main_handler():
    q, count = random.choice(list(queries.items()))

    # get Tracer
    tracer = trace.get_tracer(__name__)

    with tracer.start_as_current_span("client") as cur_span:
        channel = grpc.insecure_channel(SERVER_ADDR)
        stub = shakesapp_pb2_grpc.ShakespeareServiceStub(channel)
        logger.info(f"request to server with query: {q}")
        cur_span.add_event("server_call_start")
        resp = stub.GetMatchCount(shakesapp_pb2.ShakespeareRequest(query=q))
        cur_span.add_event("server_call_end")
        if count != resp.match_count:
            raise UnexpectedResultError(
                f"The expected count for '{q}' was {count}, but result was {resp.match_count } obtained"
            )
        result = str(resp.match_count)
        logger.info(f"matched count for '{q}' is {result}")
    return result

Benzer şekilde, yükleme oluşturucu hizmetine benzer şekilde, aşağıdaki komutu kullanarak gerekli paketleri pyproject.toml bölümüne ekleyin.

poetry add "opentelemetry-exporter-gcp-trace=^1.0.0rc0"
poetry add "opentelemetry-propagator-gcp=^1.0.0rc0"
poetry add "opentelemetry-instrumentation-flask=^0.20b0"

Ardından uygulamayı skaffold run komutuyla başlatmayı deneyin ve Cloud Trace kontrol panelinde nelerin gösterildiğine bakın:

skaffold run --tail

Derleme, aktarma ve dağıtma mesajlarını gördükten sonra uygulama günlüklerini JSON biçiminde göreceksiniz. Cloud Trace'e gidin > İz bilgilerini alıp almadığınızı kontrol etmek için iz listesi. Yük oluşturma hizmeti, istemci hizmetine düzenli olarak istek gönderdiğinden ve tüm istekler için izlemeleri etkinleştirdiğinizden, iz listesinde birçok nokta görmeye başlarsınız.

f7440360551980e.png

Bunlardan birini tıkladığınızda, istek ve yanıt süreci boyunca her bir bölümdeki gecikmeyi açıklayan aşağıdaki gibi bir şelale grafiği görürsünüz. "Etkinlikleri Göster"in yanındaki onay kutusunu bulduktan sonra şelale grafiğinde ek açıklamaları görürsünüz. Bu ek açıklamalar, span.add_event() yöntemiyle kodda sağladığınız ek açıklamalardır.

67596a4a313738.png

Sunucu hizmetinden gelen aralıkları görmediğinizi fark edebilirsiniz. Aralıkları sunucu hizmetinde hiç ayarlamadığımız için bu doğru.

Özet

Bu adımda yük oluşturma aracı hizmeti ve istemci hizmetini kullanarak Trace Bağlamı'nı hizmetlere başarıyla yayabildiğinizi ve her iki hizmetteki Aralık bilgilerini Cloud Trace'e aktarabildiğinizi onayladınız.

Sonraki bölüm

Sonraki adımda gRPC aracılığıyla Bağlam İzlemenin nasıl yayılacağını doğrulamak için istemci hizmeti ve sunucu hizmetini kullanacaksınız.

5. gRPC için Enstrümantasyon

Önceki adımda, isteğin ilk yarısını bu mikro hizmetlerde ayarladık. Bu adımda istemci hizmeti ile sunucu hizmeti arasında gRPC iletişimini sağlamaya çalışırız. (Aşağıdaki resimde yeşil ve mor dikdörtgen)

c4dec3e741c3ab4f.png

gRPC istemcisi için otomatik enstrümantasyon

OpenTelemetry'nin ekosistemi, geliştiricilerin uygulamaları kullanmasına yardımcı olan birçok kullanışlı kitaplık sunar. Önceki adımda, "istekler" için otomatik araçlar kullandık modülünü kullanabilirsiniz. Bu adımda, gRPC aracılığıyla Trace Bağlamı yayılmaya çalışırken bunun için kitaplığı kullanacağız.

src/client/client.py

 import flask
 import grpc
 import structlog
 from opentelemetry import propagate, trace
 from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
 from opentelemetry.instrumentation.flask import FlaskInstrumentor
+from opentelemetry.instrumentation.grpc import GrpcInstrumentorClient
 from opentelemetry.sdk.trace import TracerProvider
 from opentelemetry.sdk.trace.export import SimpleSpanProcessor
 from opentelemetry.propagators.cloud_trace_propagator import \
     CloudTraceFormatPropagator
 import shakesapp_pb2
 import shakesapp_pb2_grpc


 app = flask.Flask(__name__)
 FlaskInstrumentor().instrument_app(app)
+GrpcInstrumentorClient().instrument()

Müşteri hizmetleri söz konusu olduğunda, araçlar için yapmamız gereken şey oldukça küçük. Bizim yapmak istediğimiz, gRPC aracılığıyla mevcut Span'ın İz Kimliği ve Aralık Kimliği kombinasyonu olan Trace Bağlamı'nı yaymaktır. Bu nedenle, işleyici işlevindeki gRPC istemcisinin İzleme Bağlamı'nı alttaki HTTP üst bilgisine yerleştirebilmesi için GrpcInstrumentatorClient.instrument() adını veriyoruz.

poetry add komutuyla pyproject.toml komut dosyasına yeni bağımlılıklar eklediğinizden emin olun:

poetry add "opentelemetry-instrumentation-grpc=^0.20b0"

gRPC sunucusu için otomatik enstrümantasyon

gRPC istemcisi için yaptığımız gibi, biz de gRPC sunucusu için otomatik enstrümantasyon diyoruz. Aşağıdaki gibi içe aktarma işlemleri ekleyin ve dosyanın en üstünde GrpcInstrumentationServer().instrument() öğesini çağırın.

Dikkat: Telefon numaranızı

GrpcInstrumentationServe() 

bu adımda

GrpcInstrumentationClient()

.

src/server/server.py

 import grpc
 import structlog
 from google.cloud import storage
 from grpc_health.v1 import health_pb2, health_pb2_grpc
+from opentelemetry import propagate, trace
+from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
+from opentelemetry.instrumentation.grpc import GrpcInstrumentorServer
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator

 import shakesapp_pb2
 import shakesapp_pb2_grpc


 BUCKET_NAME = "dataflow-samples"
 BUCKET_PREFIX = "shakespeare/"

+# enable auto gRPC server trace instrumentation
+GrpcInstrumentorServer().instrument()
+

Sonraki adımda, iz bilgilerini Cloud Trace arka ucuna göndermesi için dışa aktarıcıyı ekleyeceksiniz. serve() işlevine aşağıdaki kodu ekleyin.

def serve():
+    # start trace exporter
+    trace.set_tracer_provider(TracerProvider())
+    trace.get_tracer_provider().add_span_processor(
+        SimpleSpanProcessor(CloudTraceSpanExporter())
+    )
+    propagators.set_global_textmap(CloudTraceFormatPropagator())
+
+    # add gRPC services to server
     server = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
     service = ShakesappService()
     shakesapp_pb2_grpc.add_ShakespeareServiceServicer_to_server(service, server)
     health_pb2_grpc.add_HealthServicer_to_server(service, server)

Yeni eklenen paketleri sunucu hizmetine eklediğinizden emin olun.

poetry add "opentelemetry-exporter-gcp-trace=^1.0.0rc0"
poetry add "opentelemetry-instrumentation-grpc=^0.20b0"
poetry add "opentelemetry-propagator-gcp=^1.0.0rc0"
poetry add "opentelemetry-instrumentation=^0.20b0"

Mikro hizmeti çalıştırıp izini onaylayın

Ardından, değiştirdiğiniz kodu skaffold komutuyla çalıştırın.

skaffold run --tail

Şimdi tekrar Cloud Trace'in Trace listesi sayfasında bir dizi iz görüyorsunuz. İzlerden birini tıkladığınızda, yük oluşturucu hizmetinden sunucu hizmetine kadar yapılan isteklerin bu izleri görürsünüz.

141cb620245b689d.png

Özet

Bu adımda OpenTelemetry ekosistem kitaplıklarının desteğiyle gRPC tabanlı iletişimi geliştirdiniz. Ayrıca yük oluşturucu hizmetinde oluşturulan İz Bağlamı'nın sunucu hizmetine başarıyla teslim edildiğini de onayladınız.

6. Tebrikler

OpenTelemery ile dağıtılmış izleri başarıyla oluşturdunuz ve Google Cloud Trace'te mikro hizmetteki istek gecikmelerini onayladınız.

Genişletilmiş egzersizler için aşağıdaki konuları kendiniz deneyebilirsiniz.

  • Mevcut uygulama, durum denetimi tarafından oluşturulan tüm aralıkları gönderir. Bu aralıkları Cloud Traces'te nasıl filtrelersiniz? İpucuna buradan ulaşabilirsiniz.
  • Olay günlüklerini aralıklarla ilişkilendirin ve Google Cloud Trace ve Google Cloud Logging'de nasıl çalıştığını öğrenin. İpucuna buradan ulaşabilirsiniz.
  • Bazı hizmetleri başka bir dildeki bir hizmetle değiştirin ve söz konusu dil için OpenTelemetry ile enstrümantasyon yapmayı deneyin

Dikkat: Google Kubernetes Engine ve Google Artifact Registry, kaynağı sürekli olarak tüketir.

Temizleme

Bu codelab'den sonra Google Kubernetes Engine, Google Cloud Trace ve Google Artifact Registry'de beklenmedik ücretlerle karşılaşmamak için lütfen Kubernetes kümesini durdurun ve projeyi sildiğinizden emin olun.

İlk olarak aşağıdaki komutla kümeyi silin:

skaffold delete

Komut çıkışı

Cleaning up...
 - deployment.apps "clientservice" deleted
 - service "clientservice" deleted
 - deployment.apps "loadgen" deleted
 - deployment.apps "serverservice" deleted
 - service "serverservice" deleted

Kümeyi sildikten sonra menü bölmesinden "IAM ve Yönetici" &gt; "Ayarlar"ı, ardından "KAPALI"yı tıklayın. düğmesini tıklayın.

578ca2b72a161e9d.png

Ardından iletişim kutusundaki forma Proje Kimliğini (Proje Adı'nı değil) girin ve kapatmayı onaylayın.