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

1. Genel Bakış

Dağıtılmış izleme, çok katmanlı mikro hizmet mimarisi hakkında bilgi edinmek ve gözlemlenebilirlik elde etmek açısından önemlidir. A hizmetinden B hizmetine veya C hizmetine kadar hizmet ve hizmet çağrılarına zincirleme bağlı olduğunuzda, hem çağrıların başarılı olduğunu hem de her adımdaki gecikmenin farkında olmanız önemlidir.

Spring Boot'ta, dağıtılmış izleme araçlarını uygulamanıza sorunsuz bir şekilde eklemek için Spring Cloud Sleuth'ü 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 izleme verilerini depolamanıza olanak tanıyan yönetilen bir hizmet olan Cloud Trace'e sahiptir. Cloud Trace, gecikme dağılımı raporları da oluşturabilir ve performans regresyonlarını otomatik olarak tespit edebilir.

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

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

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

Neler öğreneceksiniz?

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

Gerekenler

  • Bir Google Cloud Platform Projesi
  • Chrome veya Firefox gibi bir tarayıcı
  • Vim, EMAC veya Nano gibi standart Linux metin düzenleyicileri hakkında bilgi

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

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

Acemi Orta Yeterli

Google Cloud Platform hizmetlerinin kullanımıyla ilgili deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud 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ılabilse de bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini tıklayın.

55efc1aaa7a4d3ad.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

Gereken tüm geliştirme araçları bu sanal makinede 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. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Yeni bir Spring Boot REST Hizmeti oluşturma

Cloud Shell başlatı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 bootVersion=2.7.6 \
  -d dependencies=web,lombok,cloud-gcp,distributed-tracing \
  -d jvmVersion=17 \
  -d type=maven-project \
  -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!";
  }
}

Uygulama için doğru JVM sürümüne sahip olduğunuzdan emin olun:

$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

Spring Boot uygulamasını, Spring Boot eklentisiyle normal bir şekilde başlatabilirsiniz. Bu laboratuvara yönelik testleri atlayalım:

$ ./mvnw -DskipTests spring-boot:run

Uygulama başladıktan sonra Cloud Shell araç çubuğunda Web Önizlemesi simgesini 3a9b40fafa650b2b.png tıklayın ve 8080 bağlantı noktasında önizle'yi seçin.

3aca52f76c6c22a3.png

Kısa bir beklemenin ardından sonucu görürsünüz:

6793a3339447cbb5.png

Cloud Shell'de izleme kimliği ve aralık kimliğine sahip günlük mesajlarını da görürsünüz:

18d597c388de1ba.png

4. Cloud Trace'i kullanma

Cloud Trace API'yi etkinleştirin

İz verilerinizi depolamak için Cloud Trace'i kullanmadan önce Cloud Trace API'yi etkinleştirmeniz gerekir. API'yi etkinleştirmek için şu komutu yürütün:

$ gcloud services enable cloudtrace.googleapis.com

Uygulamanın Varsayılan Kimlik Bilgilerini Ayarlayın

Bu laboratuvar için bir uygulama varsayılan kimlik bilgisi yapılandırmanız gerekir. Bu kimlik bilgisi, Spring Cloud GCP Trace başlatıcı tarafından otomatik olarak alınır.

İlk olarak 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ı tıklayın, ardından İzin ver'i tıklayın

85f500de6f5dc0a8.png

Ardından, doğrulama kodunu kopyalayıp Cloud Shell'e geri 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 zaten Spring Cloud Sleuth'ü kullandık. Verileri Cloud 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 Cloud Trace Starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-trace</artifactId>
    </dependency>
  </dependencies>
  ...
</project>

Varsayılan olarak, Spring Cloud Sleuth her isteği örneklemez. Testimizi biraz kolaylaştırmak amacıyla, iz verilerini gördüğümüzden emin olmak için application.properties ürününde örnek hızını% 100'e yükseltin ve ilgilenmediğimiz bazı URL'leri yoksayı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 Cloud Shell Web Önizlemesi'ni kullanarak uygulamayı görüntüleyin:

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

Spring Cloud GCP Trace, izleme verilerini varsayılan olarak gruplar ve 10 saniyede bir ya da minimum sayıda iz verisi alındığında toplu olarak gönderir. Bu yapılandırma yapılandırılabilir. Daha fazla bilgi için Spring Cloud GCP Trace referans belgelerine göz atabilirsiniz.

Hizmete istekte bulunun:

$ curl localhost:8080

Cloud Console'da İşlemlerİzlemeİzleme listesi'ne gidin.

be48cb0f99b5f7c2.png

En üstte, zaman aralığını 1 saat olacak şekilde daraltın. Otomatik Yeniden Yükle seçeneği varsayılan olarak açıktır. Yani iz verileri geldiğinde konsolda görünecektir.

3522eef823df39d8.png

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

9628f6e1d2e75b05.png

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

ba9051a8d4f3e725.png

Oldukça basitti.

5. İkinci bir Spring Boot Web Uygulaması oluşturma

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

9799bee5fea95aa6.png

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

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
  -d bootVersion=2.7.6 \
  -d dependencies=web,lombok,cloud-gcp,distributed-tracing \
  -d jvmVersion=17 \
  -d type=maven-project \
  -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 Cloud Trace starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-trace</artifactId>
    </dependency>
  </dependencies>
  ...
</project>

Sleuth'ü isteklerin% 100'ünü örnekleyecek ş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 eklentisiyle 8081 numaralı 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 -Dspring-boot.run.jvmArguments="-Dserver.port=8081"

6. İkinci Hizmeti Kullanmak İçin İlk Hizmeti Güncelleme

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

İlk olarak yeni bir RestTemplate çekirdeği 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() uygulamasında 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 tekrar başlatın ve komut satırından uç noktayı tetikleyin:

$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`

# The '&' places the process in the background. Bring it back to the foreground with 'fg'.
$ ./mvnw -DskipTests spring-boot:run &

$ curl localhost:8080

Her iki oturum penceresinde de günlük mesajlarını, bir hizmetten diğerine yayılmış olarak İzleme Kimliğinin yer aldığı şekilde görürsünüz.

Cloud Trace'in Trace Listesinde ikinci izi göreceksiniz:

13490977f1638702.png

Yeni mavi noktayı tıklayarak iz ayrıntılarını görebilirsiniz:

ca69ef9cdd13d4aa.png

Aralık ayrıntılarını görmek için bu şemadaki herhangi bir kapsamı da tıklayabilirsiniz.

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

İz verilerinin depolanması olarak Cloud Trace'i kullandığınızda Cloud Trace, bu verileri kullanarak gecikme dağıtım raporu oluşturabilir. Raporu aşağıdaki gibi oluşturmak için 100'den fazla ize ihtiyacınız vardır:

c8713f3d9e51dc25.png

Cloud Shell'de önceden yüklü olarak gelen hey özelliğini kullanarak bu ilk 100'den fazla isteği çalıştırabilirsiniz.

$ hey localhost:8080 -n 150

Ayrıca Cloud Trace, aynı hizmetin iki farklı dönemdeki performans regresyonunu Analiz Raporu altında otomatik olarak tespit edebilir.

8. Özet

Bu laboratuvarda, 2 basit hizmet oluşturup Spring Cloud Sleuth ile dağıtılmış izleme eklediniz ve izleme bilgilerini Cloud Trace'e iletmek için Spring Cloud GCP'yi kullandınız.

9. Tebrikler!

İlk App Engine web uygulamanızı yazmayı öğ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.