1. Giriş
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.
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:
- İ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:
Sonra ‘YENİ PROJE’yi tıklayın. düğmesini tıklayın:
Henüz projeniz yoksa ilk projenizi oluşturmak için şuna benzer bir iletişim kutusu görmeniz gerekir:
Sonraki proje oluşturma iletişim kutusu yeni projenizin ayrıntılarını girmenize olanak tanır:
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.
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.
- Google Cloud Gözlemlenebilirliği Fiyatlandırması
- Fiyatlandırma | Kubernetes Engine Belgeleri
- Artifact Registry Fiyatlandırması | Artifact Registry belgeleri
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 tıklamanız yeterlidir (sağlanması ve ortama bağlanması birkaç dakika sürer).
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:
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:
- Temel projeyi Cloud Shell'e indirme
- Container'larda mikro hizmetler derleme
- Kapsayıcıları Google Artifact Registry'ye (GAR) yükleme
- Container'ları GKE'ye dağıtma
- İzleme araçları için hizmetlerin kaynak kodunu değiştirin
- 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.
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.
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.
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.
Artık "trace-codelab"i görüyorsunuz. kod deposunda toplanır.
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.
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 simgesini tıklayın.
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:
"us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab" 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.
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 basarak 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.
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.
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.
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)
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.
Ö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" > "Ayarlar"ı, ardından "KAPALI"yı tıklayın. düğmesini tıklayın.
Ardından iletişim kutusundaki forma Proje Kimliğini (Proje Adı'nı değil) girin ve kapatmayı onaylayın.