Spring Cloud Sleuth ve Stackdriver Trace ile dağıtılmış izleme

Spring Cloud Sleuth ve Stackdriver Trace ile dağıtılmış izleme

Bu codelab hakkında

subjectSon güncelleme Şub 10, 2020
account_circleBir Google çalışanı tarafından yazılmıştır

1. Genel bakış

Dağılım izleme, çok katmanlı bir mikro hizmet mimarisine dair bilgi ve gözlemlenebilirlik elde etmek için önemlidir. Hizmetten B'ye ve C'ye kadar hizmet görüşmelerine ayrılmış zincirleme çağrılarında, çağrıların başarılı olduğunu ve her adımdaki gecikmeyi anlamak önemlidir.

Spring Boot'ta, dağıtılmış izleme enstrümantasyonunu uygulamanıza sorunsuz bir şekilde eklemek için Spring Cloud Sleuth'u kullanabilirsiniz. Varsayılan olarak, iz verilerini Zipkin'e yönlendirebilir.

Google Cloud Platform, kendi Zipkin örneğinizi veya depolama alanınızı yönetmek zorunda kalmadan iz verilerinizi saklamanızı sağlayan yönetilen bir hizmettir. Stackdriver Trace, gecikme dağıtımı raporları da oluşturabilir ve performans regresyonlarını otomatik olarak algılayabilir.

Spring Boot uygulamasından Stackdriver Trace'i kullanmak için iki seçeneğiniz vardır:

  1. Stackdriver Trace Zipkin Proxy kullanın ve Spring Cloud Sleuth'u bu proxy'yi Zipkin uç noktası olarak kullanacak şekilde yapılandırın
  2. Ayrıca, Spring Cloud Sleuth ile sorunsuz bir şekilde entegre olan ve iz verilerini doğrudan Stackdriver Trace'e yönlendiren Spring Cloud GCP Trace'i kullanabilirsiniz.

Bu codelab'de, yeni bir Spring Boot uygulaması oluşturmayı ve dağıtılmış izleme için Spring Cloud GCP Trace'i kullanmayı öğreneceksiniz.

Neler öğreneceksiniz?

  • Spring Boot Java uygulaması oluşturma ve Stackdriver Trace'i yapılandırma.

Gerekenler

  • Bir Google Cloud Platform Projesi
  • Chrome veya Firefox gibi bir Tarayıcı
  • Vim, EMACs veya Nano gibi standart Linux metin düzenleyicilerini kullanma

Bu eğitimi nasıl kullanacaksınız?

HTML/CSS web uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?

Google Cloud Platform hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

2. Kurulum ve Gereksinimler

Bağımsız tempolu ortam kurulumu

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

Ekran görüntüsü: 10.02.2016 12:45:26.png

Proje kimliğini tüm Google Cloud projeleri genelinde benzersiz bir ad olarak hatırlayın (yukarıdaki ad zaten alınmıştı ve maalesef sizin için çalışmaz). Bu, daha sonra bu codelab'de PROJECT_ID olarak adlandırılacaktır.

Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i gözden geçirmek için çalışmanın birkaç dolardan fazla maliyeti olmayacak. Ancak daha fazla kaynak kullanmaya karar verirseniz veya bunları çalışır durumda bırakırsanız (bu belgenin sonundaki "temizlik" bölümüne bakın) daha yüksek maliyetli olabilir.

Yeni Google Cloud Platform kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Google Cloud Shell

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

Google Cloud Shell'i etkinleştir

GCP Console'dan, sağ üstteki araç çubuğu üzerinde Cloud Shell simgesini tıklayın:

Ardından "Cloud Shell'i Başlat"ı tıklayın:

Ortamın temel hazırlığı ve bağlantı kurması yalnızca birkaç dakika sürer:

Bu sanal makine, ihtiyacınız olan tüm geliştirme araçları yüklüdür. 5 GB kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu laboratuvardaki çalışmalarınızın neredeyse tamamı tarayıcı veya Google Chromebook ile yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin zaten doğrulanmış olduğunu ve projenin PROJECT_ID'nize ayarlanmış olduğunu görmeniz gerekir.

Kimliğinizin doğrulanmasını sağlamak için Cloud Shell'de aşağıdaki komutu çalıştırın:

gcloud auth list

Komut çıkışı

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

Komut çıkışı

[core]
project = <PROJECT_ID>

Ayarlanmamışsa şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Yeni bir Spring Boot REST Hizmeti oluşturun

Cloud Shell açıldıktan sonra, Spring Initializr ile yeni bir Spring Boot uygulaması oluşturmak için komut satırını kullanabilirsiniz:

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
 
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
 
-d baseDir=trace-service-one | tar -xzvf - \
 
&& cd trace-service-one

Yeni bir sınıf ekleyerek yeni bir REST denetleyicisi oluşturun:

src/main/java/com/example/demo/WorkController.java

package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@RestController
@Slf4j
public class WorkController {
 
Random r = new Random();

 
public void meeting() {
   
try {
      log
.info("meeting...");
     
// Delay for random number of milliseconds.
     
Thread.sleep(r.nextInt(500));
   
} catch (InterruptedException e) {
   
}
 
}

 
@GetMapping("/")
 
public String work() {
   
// What is work? Meetings!
   
// When you hit this URL, it'll call meetings() 5 times.
   
// Each time will have a random delay.
    log
.info("starting to work");
   
for (int i = 0; i < 5; i++) {
     
this.meeting();
   
}
    log
.info("finished!");
   
return "finished work!";
 
}
}

Spring Boot eklentisini kullanarak Spring Boot uygulamasını normal şekilde başlatabilirsiniz. Bu laboratuvar için testleri atla:

$ ./mvnw -DskipTests spring-boot:run

Uygulama başladıktan sonra, Cloud Shell araç çubuğundaki Web Önizlemesi simgesini tıklayın ve 8080 bağlantı noktasında önizleme'yi seçin.

Kısa bir bekleme süresinin sonunda sonuç gösterilir:

Cloud Shell'de iz kimliği ve aralık kimliğine sahip günlük mesajlarını da görmeniz gerekir:

4. Stackdriver Trace&#39;i kullanma

Stackdriver Trace API'yi etkinleştir

İz verilerinizi depolamak amacıyla Stackdriver Trace'i kullanmak için önce Stackdriver Trace API'sını etkinleştirmeniz gerekir. API'yi etkinleştirmek için API Hizmetleri → Kitaplık'a gidin

Stackdriver Trace için arama yapın

Stackdriver Trace API'yi, ardından henüz etkinleştirilmemişse Etkinleştir'i tıklayın.

Uygulama Varsayılan Kimlik Bilgilerini Ayarlama

Bu laboratuvarda bir uygulamanın varsayılan kimlik bilgilerini yapılandırmanız gerekir. Bu kimlik bilgisi, Spring Cloud GCP Trace başlatıcı tarafından otomatik olarak alınır.

Öncelikle giriş yapın:

$ gcloud auth application-default login
You are running on a Google Compute Engine virtual machine.
The service credentials associated with this virtual machine
will automatically be used
by Application Default
Credentials, so it is not necessary to use this command.
If you decide to proceed anyway, your user credentials may be visible
to others
with access to this virtual machine. Are you sure you want
to authenticate
with your personal account?
Do you want to continue (Y/n)? Y

Go to the following link in your browser:
    https
://accounts.google.com/o/oauth2/auth...
Enter verification code: ...

Yeni bir tarayıcı sekmesi açmak için bağlantıyı, ardından İzin ver'i tıklayın

Ardından, doğrulama kodunu kopyalayıp Cloud Shell'e tekrar yapıştırın ve Enter tuşuna basın. Aşağıdaki bilgileri görürsünüz:

Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.

Spring Cloud GCP İzlemesi Ekleme

Bu hizmette izleme için Spring Cloud Sleuth'u zaten kullanıyorduk. Verileri Stackdriver Trace'e yönlendirmek için Spring Cloud GCP Trace başlatıcıyı ekleyelim.

Spring Cloud GCP Trace bağımlılığını ekleyin:

pom.xml

<project>
  ...
 
<dependencies>
    ...
   
<!-- Add Stackdriver Trace Starter -->
   
<dependency>
     
<groupId>org.springframework.cloud</groupId>
     
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
   
</dependency>
 
</dependencies>
  ...
</project>

Varsayılan olarak, Spring Cloud Sleuth her isteği örneklemez. Testlerimizi biraz daha kolaylaştırmak için iz verilerini gördüğümüzden emin olmak amacıyla application.properties içinde örnek oranını% 100'e getirin ve önem vermediğimiz bazı URL'leri yok sayın:

$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
"
> src/main/resources/application.properties

Uygulamayı tekrar çalıştırın ve görüntülemek için Cloud Shell Web Önizlemesi'ni kullanın:

$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$
./mvnw -DskipTests spring-boot:run

Varsayılan olarak, Spring Cloud GCP Trace, iz verilerini toplu olarak toplar ve 10 saniyede bir veya en az sayıda iz verisi alındığında gönderir. Bu yapılandırılabilirdir. Daha fazla bilgi için Spring Cloud GCP Trace referans belgelerini inceleyin.

Hizmet için istek gönderin:

$ curl localhost:8080

Cloud Console'da Stackdriver TraceTrace listesi

Üstte, zaman aralığını 1 saat olacak şekilde daraltın. Otomatik Yeniden Yükleme varsayılan olarak etkindir. İz verileri geldikçe konsolda gösterilmeleri gerekir.

İz verileri yaklaşık 30 saniye içinde görünecektir.

İz ayrıntılarını görmek için mavi noktasını tıklayın:

Bu çok basitti.

5. İkinci bir Bahar Dönemi Web Uygulaması oluşturun

+ simgesini tıklayarak yeni bir Cloud Shell oturumu açın:

Yeni oturumda ikinci Spring Boot uygulamasını oluşturun:

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
 
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
 
-d baseDir=trace-service-two | tar -xzvf - \
 
&& cd trace-service-two

Yeni bir sınıf ekleyerek yeni bir REST denetleyicisi oluşturun:

src/main/java/com/example/demo/MeetingController.java

package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@RestController
@Slf4j
public class MeetingController {
 
Random r = new Random();

 
@GetMapping("/meet")
 
public String meeting() {
   
try {
      log
.info("meeting...");
     
Thread.sleep(r.nextInt(500 - 20 + 1) + 20);
   
} catch (InterruptedException e) {
   
}
   
return "finished meeting";
 
}
}

pom.xml dosyasına Spring Cloud GCP Trace'i ekleyin

pom.xml

<project>
  ...
 
<dependencies>
    ...
   
<!-- Add Stackdriver Trace starter -->
   
<dependency>
     
<groupId>org.springframework.cloud</groupId>
     
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
   
</dependency>
 
</dependencies>
  ...
</project>

Sleuth özelliğini isteklerin% 100'ünü kullanacak şekilde yapılandırın:

src/main/resources/application.properties

$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
"
> src/main/resources/application.properties

Son olarak, Spring Boot eklentisini kullanarak 8081 bağlantı noktasında Spring Boot uygulamasını başlatabilirsiniz:

$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$
./mvnw -DskipTests spring-boot:run -Dserver.port=8081

6. İkinci Hizmeti Kullanacak Birinci Hizmeti Güncelle

trace-service-two çalışıyorken ilk Cloud Shell oturum penceresine dönüp trace-service-one üzerinde değişiklik yapın.

Önce yeni bir RestTemplate çekirdeki başlatın:

src/main/java/com/example/demo/DemoApplication.java

package com.example.demo;

...

import org.springframework.web.client.RestTemplate;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {
       
@Bean
       
public RestTemplate restTemplate() {
               
return new RestTemplate();
       
}
       
       
public static void main(String[] args) {
               
SpringApplication.run(DemoApplication.class, args);
       
}
}

WorkController.meeting() bölgesinde, Toplantı hizmetine çağrı yapın.

src/main/java/com/example/demo/WorkController.java

package com.example.demo;

...
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;

@RestController
@Slf4j
public class WorkController {
 
@Autowired
 
RestTemplate restTemplate;

 
public void meeting() {
   
String result = restTemplate.getForObject("http://localhost:8081/meet", String.class);
    log
.info(result);
 
}

 
...
}

Hizmeti yeniden başlatın ve uç noktayı Web Önizlemesi'nden tetikleyin:

$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$
./mvnw -DskipTests spring-boot:run

Her iki oturum penceresinde de günlük iletileri (İzleme Kimliği bir hizmetten diğerine yayılır) görürsünüz.

Stackdriver Trace & Trace Listesinde ikinci izi göreceksiniz:

Yeni mavi noktayı tıklayıp iz ayrıntısını görebilirsiniz:

Ayrıca, şemadaki herhangi bir aralığı tıklayarak aralık ayrıntılarını görebilirsiniz.

7. Gecikme Dağıtımı ve Performans Raporu

İz veri depolaması olarak Stackdriver Trace'i kullandığınızda, Stackdriver Trace verileri gecikme dağıtımı raporu oluşturmak için kullanabilir. Raporu aynı şekilde oluşturmak için 100'den fazla iz gerekir:

Ayrıca Stackdriver Trace, Analysis Raporu'nun altında aynı hizmetin iki farklı zaman aralığında performans regresyonunu otomatik olarak tespit edebilir.

8. Özet

Bu laboratuvarda, 2 basit hizmet oluşturdunuz ve Spring Cloud Sleuth ile dağıtılmış izleme eklediniz. Ardından, iz bilgilerini Stackdriver Trace'e yönlendirmek için Spring Cloud GCP'yi kullandınız.

9. Tebrikler!

İlk App Engine web uygulamanızı nasıl yazacağınızı öğrendiniz.

Daha Fazla Bilgi

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.