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

1. Genel Bakış

Dağıtılmış izleme, çok katmanlı bir mikro hizmet mimarisi hakkında bilgi edinmek ve gözlemlenebilirlik sağlamak için önemlidir. Hizmetten hizmete çağrıları zincirlediğinizde (ör. A hizmetinden B hizmetine, B hizmetinden C hizmetine) çağrıların başarılı olup olmadığını ve her adımda gecikme olup olmadığını anlamanız ö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, izleme verilerini Zipkin'e yönlendirebilir.

Google Cloud Platform'da, 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 bulunur. Cloud Trace, gecikme dağılımı raporları da oluşturabilir ve performans gerilemelerini otomatik olarak algılayabilir.

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

  1. Stackdriver Trace Zipkin Proxy'si kullanın ve Spring Cloud Sleuth'u bu proxy'yi Zipkin uç noktası olarak kullanacak şekilde yapılandırın.
  2. Alternatif olarak, Spring Cloud Sleuth ile sorunsuz bir şekilde entegre olan ve iz verilerini doğrudan Cloud Trace'e ileten 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 Cloud Trace'i yapılandırma

Gerekenler

  • Google Cloud Platform projesi
  • Chrome veya Firefox gibi bir tarayıcı
  • Vim, EMACs veya Nano gibi standart Linux metin düzenleyicileri hakkında bilgi sahibi olmanız gerekir.

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

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

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

Yeni başlayan Orta düzey Uzman

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

Başlangıç Orta İleri

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve 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. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Google Cloud Shell

Google Cloud ve Kubernetes, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak bu codelab'de bulutta ç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 'i 853e55310c205094.png 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 ekran gösterildiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

9f0e51b578fecce5.png

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu 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 projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu 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 şekilde başlatabilirsiniz. Bu laboratuvar için testleri atlayalım:

$ ./mvnw -DskipTests spring-boot:run

Uygulama başlatıldı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 süre bekledikten sonra sonucu görürsünüz:

6793a3339447cbb5.png

Cloud Shell'de, izleme kimliği ve kapsam kimliği içeren günlük mesajlarını da görmeniz gerekir:

18d597c388de1ba.png

4. Cloud Trace'i kullanma

Cloud Trace API'yi etkinleştirin

İzleme 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

Uygulama Varsayılan Kimlik Bilgisi'ni ayarlama

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ısı 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.

85f500de6f5dc0a8.png

Ardından, doğrulama kodunu kopyalayıp Cloud Shell'e 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 Trace'i ekleme

Bu hizmette izleme için Spring Cloud Sleuth'u zaten kullanmıştı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>

Spring Cloud Sleuth, varsayılan olarak her isteği örneklemez. Testimizi biraz daha kolay hale getirmek için application.properties bölümünde örnekleme hızını% 100'e çıkararak izleme verilerini görmemizi sağlayın ve önemsemediğ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 uygulamayı görüntülemek için Cloud Shell Web Önizleme'yi 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 işler ve her 10 saniyede bir veya minimum sayıda iz verisi alındığında gönderir. Bu ayar yapılandırılabilir. Daha fazla bilgi için Spring Cloud GCP Trace referans belgelerine bakabilirsiniz.

Hizmete istekte bulunun:

$ curl localhost:8080

Cloud Console'da Operations (İşlemler) → Trace (İz) → Trace list'e (İz listesi) gidin.

be48cb0f99b5f7c2.png

Üst kısımda, zaman aralığını 1 saate daraltın. Otomatik yeniden yükleme özelliği varsayılan olarak açıktır. Bu nedenle, izleme verileri geldiğinde konsolda gösterilir.

3522eef823df39d8.png

İzleme verileri yaklaşık 30 saniye içinde gösterilir.

9628f6e1d2e75b05.png

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

ba9051a8d4f3e725.png

Çok kolaydı.

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'u 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 Spring Boot uygulamasını 8081 numaralı bağlantı noktasında 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 Tüketmek İçin Birinci Hizmeti Güncelleme

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

Öncelikle yeni bir RestTemplate bean'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() içinde Meeting 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 uç noktayı komut satırından 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ı görmeniz gerekir. İzleme kimliği bir hizmetten diğerine yayılır.

Cloud Trace'in İz Listesi'nde ikinci izi görmeniz gerekir:

13490977f1638702.png

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

ca69ef9cdd13d4aa.png

Ayrıca, aralık ayrıntılarını görmek için bu şemadaki herhangi bir aralığı tıklayabilirsiniz.

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

İz verisi depolama alanı olarak Cloud Trace'i kullandığınızda Cloud Trace, gecikme dağılımı raporu oluşturmak için verileri kullanabilir. Raporu bu şekilde oluşturmak için 100'den fazla iz gerekir:

c8713f3d9e51dc25.png

Bu ilk 100'den fazla isteği, Cloud Shell'e önceden yüklenmiş olarak gelen hey'i kullanarak çalıştırabilirsiniz.

$ hey localhost:8080 -n 150

Ayrıca Cloud Trace, Analiz Raporu bölümünde aynı hizmetin iki farklı dönemdeki performans düşüşünü otomatik olarak algılayabilir.

8. Özet

Bu laboratuvarda 2 basit hizmet oluşturdunuz, Spring Cloud Sleuth ile dağıtılmış izleme eklediniz ve izleme bilgilerini Cloud 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.