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

Dağıtılmış izleme, çok katmanlı bir mikro hizmet mimarisi hakkında bilgi edinmek ve gözlemlenebilirlik sağlamak için önemlidir. Hizmet A'dan hizmet B'ye ve hizmet C'ye kadar hizmetten hizmete çağrı zinciri oluşturduğunuzda, çağrıların başarılı olduğunu ve her adımda gecikme süresini anlamanız önemlidir.

Spring Boot'ta, dağıtılmış izleme araçlarını 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 Stackdriver Trace bulunur. Stackdriver Trace, gecikme dağılımı raporları da oluşturabilir ve performans gerilemelerini otomatik olarak algılayabilir.

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

  1. Stackdriver Trace Zipkin Proxy'yi 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 izleme 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

  • 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ğitimi nasıl kullanacaksı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

Kendi hızınızda ortam kurulumu

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

Screenshot from 2016-02-10 12:45:26.png

Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında 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 tamamlamak size birkaç dolardan fazla maliyet getirmemelidir. Ancak daha fazla kaynak kullanmaya karar verirseniz veya kaynakları çalışır durumda bırakırsanız maliyet daha yüksek olabilir (bu belgenin sonundaki "temizleme" bölümüne bakın).

Google Cloud Platform'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme sürümünden 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.

Google Cloud Shell'i etkinleştir

GCP Console'da sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

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

Ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer:

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu laboratuvardaki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Google Chromebook'unuzla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin zaten doğrulandığını ve projenin PROJECT_ID'nize göre ayarlandığını görürsünüz.

Kimliğinizin doğrulandığını onaylamak 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>

Değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

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 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 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 tıklayın ve 8080 bağlantı noktasında önizle'yi seçin.

Kısa bir süre sonra sonucu görürsünüz:

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

Stackdriver Trace API'yi etkinleştirme

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

Stackdriver Trace'i arayın.

Stackdriver Trace API'yi tıklayın. Ardından, API etkinleştirilmemişse Etkinleştir'i tıklayın.

Uygulama Varsayılan Kimlik Bilgisi'ni ayarlama

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

Öncelikle oturum açı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 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 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>

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 istek gönderin:

$ curl localhost:8080

Cloud Console'da Stackdriver TraceTrace list'e (İzleme listesi) gidin.

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

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

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

Oldukça kolaydı.

+ 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'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 -Dserver.port=8081

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ı Web Önizleme'den 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 mesajlarını görmeniz gerekir. İzleme kimliği bir hizmetten diğerine yayılır.

Stackdriver Trace'in İzleme Listesi'nde ikinci izlemeyi görmeniz gerekir:

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

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

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

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

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

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