Spring Cloud Sleuth और Cloud ट्रेस की मदद से डिस्ट्रिब्यूटेड ट्रेसिंग

1. खास जानकारी

मल्टी-टियर माइक्रोसेवाओं के आर्किटेक्चर के बारे में अहम जानकारी पाने और उसे मॉनिटर करने के लिए, डिस्ट्रिब्यूटेड ट्रेसिंग ज़रूरी है. जब आपने सेवा A से सेवा B और सेवा B से सेवा C तक, सेवा से सेवा को कॉल करने की सुविधा चालू की हो, तो यह समझना ज़रूरी है कि कॉल सफल हुए या नहीं. साथ ही, हर चरण में लेटेन्सी कितनी है.

स्प्रिंग बूट में, स्प्रिंग क्लाउड स्लीथ का इस्तेमाल करके, अपने ऐप्लिकेशन में डिस्ट्रिब्यूटेड ट्रेसिंग इंस्ट्रूमेंटेशन को आसानी से जोड़ा जा सकता है. डिफ़ॉल्ट रूप से, यह ट्रेस डेटा को Zipkin पर फ़ॉरवर्ड कर सकता है.

Google Cloud Platform में Cloud Trace की सुविधा उपलब्ध है. यह एक मैनेज की गई सेवा है. इसकी मदद से, ट्रेस डेटा को सेव किया जा सकता है. इसके लिए, आपको न तो अपने Zipkin इंस्टेंस को मैनेज करना होगा और न ही स्टोरेज को. Cloud Trace, इंतज़ार के समय के डिस्ट्रिब्यूशन की रिपोर्ट भी जनरेट कर सकता है. साथ ही, परफ़ॉर्मेंस में गिरावट का अपने-आप पता लगा सकता है.

Spring Boot ऐप्लिकेशन से Cloud Trace का इस्तेमाल करने के लिए, आपके पास दो विकल्प हैं:

  1. Stackdriver Trace Zipkin Proxy का इस्तेमाल करें. साथ ही, Spring Cloud Sleuth को कॉन्फ़िगर करें, ताकि वह इस प्रॉक्सी को Zipkin एंडपॉइंट के तौर पर इस्तेमाल कर सके
  2. इसके अलावा, Spring Cloud GCP Trace का इस्तेमाल करें. यह Spring Cloud Sleuth के साथ आसानी से इंटिग्रेट हो जाता है और ट्रेस डेटा को सीधे Cloud Trace पर भेजता है.

इस कोडलैब में, आपको नया Spring Boot ऐप्लिकेशन बनाने और डिस्ट्रिब्यूटेड ट्रेसिंग के लिए Spring Cloud GCP Trace का इस्तेमाल करने का तरीका बताया जाएगा.

आपको क्या सीखने को मिलेगा

  • Spring Boot Java ऐप्लिकेशन बनाने और Cloud Trace को कॉन्फ़िगर करने का तरीका.

आपको इन चीज़ों की ज़रूरत होगी

  • Google Cloud Platform प्रोजेक्ट
  • कोई ब्राउज़र, जैसे कि Chrome या Firefox
  • Vim, EMACs या Nano जैसे स्टैंडर्ड Linux टेक्स्ट एडिटर के बारे में जानकारी होना

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

सिर्फ़ इसे पढ़ें इसे पढ़ें और एक्सरसाइज़ पूरी करें

एचटीएमएल/सीएसएस वेब ऐप्लिकेशन बनाने के अपने अनुभव को आप क्या रेटिंग देंगे?

शुरुआती सामान्य एडवांस

Google Cloud Platform की सेवाओं को इस्तेमाल करने के अपने अनुभव को आप क्या रेटिंग देंगे?

शुरुआती सामान्य एडवांस

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेट अप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, सभी Google Cloud प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, यूनीक स्ट्रिंग को अपने-आप जनरेट करता है. आम तौर पर, आपको इससे कोई फ़र्क़ नहीं पड़ता कि यह क्या है. ज़्यादातर कोडलैब में, आपको अपने प्रोजेक्ट आईडी (आम तौर पर PROJECT_ID के तौर पर पहचाना जाता है) का रेफ़रंस देना होगा. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा रैंडम आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास अपना नाम आज़माने का विकल्प भी है. इससे आपको पता चलेगा कि वह नाम उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट की अवधि तक बना रहता है.
  • आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जिसे प्रोजेक्ट नंबर कहते हैं. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
  1. इसके बाद, आपको Cloud Console में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा समय नहीं लगेगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ताओं को, 300 डॉलर का क्रेडिट मिलेगा. वे इसे मुफ़्त में आज़मा सकते हैं.

Google Cloud Shell

Google Cloud और Kubernetes को अपने लैपटॉप से रिमोटली चलाया जा सकता है. हालांकि, इस कोडलैब में हम Google Cloud Shell का इस्तेमाल करेंगे. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें 853e55310c205094.png पर क्लिक करें.

55efc1aaa7a4d3ad.png

अगर आपने Cloud Shell को पहली बार शुरू किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर आपको इंटरमीडिएट स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

9c92662c6a846a5c.png

Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है, जो हमेशा बनी रहती है. साथ ही, यह Google Cloud में काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में ज़्यादातर काम ब्राउज़र से किया जा सकता है.

Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि हो गई है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर सेट कर दिया गया है.

  1. पुष्टि करें कि आपने Cloud Shell में पुष्टि कर ली है. इसके लिए, यह कमांड चलाएं:
gcloud auth list

कमांड आउटपुट

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. नई Spring Boot REST सेवा बनाना

Cloud Shell लॉन्च होने के बाद, कमांड लाइन का इस्तेमाल करके Spring Initializr की मदद से नया Spring Boot ऐप्लिकेशन जनरेट किया जा सकता है:

$ 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

नई क्लास जोड़कर, नया REST कंट्रोलर बनाएं:

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!";
  }
}

पक्का करें कि आपके पास ऐप्लिकेशन के लिए सही JVM वर्शन हो:

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

Spring Boot प्लगिन की मदद से, Spring Boot ऐप्लिकेशन को सामान्य तरीके से शुरू किया जा सकता है. आइए, इस लैब के लिए टेस्ट छोड़ते हैं:

$ ./mvnw -DskipTests spring-boot:run

ऐप्लिकेशन शुरू होने के बाद, Cloud Shell टूलबार में मौजूद वेब प्रीव्यू आइकॉन 3a9b40fafa650b2b.png पर क्लिक करें. इसके बाद, पोर्ट 8080 पर झलक देखें को चुनें.

3aca52f76c6c22a3.png

कुछ देर इंतज़ार करने के बाद, आपको यह नतीजा दिखेगा:

6793a3339447cbb5.png

Cloud Shell में, आपको ट्रेस आईडी और स्पैन आईडी के साथ लॉग मैसेज भी दिखेंगे:

18d597c388de1ba.png

4. Cloud Trace का इस्तेमाल करना

Cloud Trace API को चालू करना

ट्रेस डेटा को सेव करने के लिए Cloud Trace का इस्तेमाल करने से पहले, आपको Cloud Trace API चालू करना होगा. एपीआई को चालू करने के लिए, यह कमांड चलाएं:

$ gcloud services enable cloudtrace.googleapis.com

ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल सेट अप करना

इस लैब के लिए, आपको ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल को कॉन्फ़िगर करना होगा. इस क्रेडेंशियल को Spring Cloud GCP Trace starter अपने-आप चुन लेगा.

सबसे पहले, लॉग इन करें:

$ 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: ...

नया ब्राउज़र टैब खोलने के लिए, लिंक पर क्लिक करें. इसके बाद, अनुमति दें पर क्लिक करें

85f500de6f5dc0a8.png

इसके बाद, पुष्टि करने के लिए मिले कोड को Cloud Shell में वापस कॉपी करके चिपकाएं और Enter दबाएं. आपको यह दिखना चाहिए:

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 जोड़ना

इस सेवा में, हमने ट्रेसिंग के लिए पहले से ही Spring Cloud Sleuth का इस्तेमाल किया है. डेटा को Cloud Trace पर फ़ॉरवर्ड करने के लिए, Spring Cloud GCP Trace starter जोड़ते हैं.

Spring Cloud GCP Trace डिपेंडेंसी जोड़ें:

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 हर अनुरोध का सैंपल नहीं लेता है. टेस्टिंग को थोड़ा आसान बनाने के लिए, application.properties में सैंपल रेट को 100% तक बढ़ाएं, ताकि हमें ट्रेस डेटा दिख सके. साथ ही, उन यूआरएल को अनदेखा करें जिनसे हमें कोई फ़र्क़ नहीं पड़ता:

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

ऐप्लिकेशन को फिर से चलाएं और ऐप्लिकेशन देखने के लिए, Cloud Shell की वेब प्रीव्यू सुविधा का इस्तेमाल करें:

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

डिफ़ॉल्ट रूप से, Spring Cloud GCP Trace, ट्रेस डेटा को बैच करता है और उसे हर 10 सेकंड में एक बार भेजता है. ऐसा तब भी होता है, जब कम से कम संख्या में ट्रेस डेटा मिलता है. इसे कॉन्फ़िगर किया जा सकता है. ज़्यादा जानकारी के लिए, Spring Cloud GCP Trace का रेफ़रंस दस्तावेज़ देखें.

सेवा के लिए अनुरोध करना:

$ curl localhost:8080

Cloud Console में, कार्रवाइयांट्रेसट्रेस की सूची पर जाएं

be48cb0f99b5f7c2.png

सबसे ऊपर, समयसीमा को कम करके एक घंटा करें. डिफ़ॉल्ट रूप से, अपने-आप रीलोड होने की सुविधा चालू होती है. इसलिए, जैसे ही ट्रेस डेटा मिलता है, वह कंसोल में दिखना चाहिए!

3522eef823df39d8.png

ट्रेस डेटा को दिखने में करीब 30 सेकंड लगते हैं.

9628f6e1d2e75b05.png

ट्रेस की जानकारी देखने के लिए, नीले बिंदु पर क्लिक करें:

ba9051a8d4f3e725.png

यह बहुत आसान था!

5. दूसरा Spring Boot वेब ऐप्लिकेशन बनाना

+ आइकॉन पर क्लिक करके, नया Cloud Shell सेशन खोलें:

9799bee5fea95aa6.png

नए सेशन में, दूसरा Spring Boot ऐप्लिकेशन बनाएं:

$ 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

नई क्लास जोड़कर, नया REST कंट्रोलर बनाएं:

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 में Spring Cloud GCP Trace जोड़ना

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 को कॉन्फ़िगर करें:

src/main/resources/application.properties

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

आखिर में, Spring Boot प्लगिन की मदद से, Spring Boot ऐप्लिकेशन को पोर्ट 8081 पर शुरू किया जा सकता है:

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

6. दूसरी सेवा का इस्तेमाल करने के लिए, पहली सेवा को अपडेट करना

trace-service-two चालू रहने के दौरान, Cloud Shell के पहले सेशन की विंडो पर वापस जाएं और trace-service-one में बदलाव करें.

सबसे पहले, नया RestTemplate बीन शुरू करें:

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() में, मीटिंग सेवा को कॉल आउट करें.

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);
  }

  ...
}

सेवा को फिर से शुरू करें और कमांड लाइन से एंडपॉइंट को ट्रिगर करें:

$ 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

आपको दोनों सेशन विंडो में लॉग मैसेज दिखने चाहिए. साथ ही, एक सेवा से दूसरी सेवा में Trace ID ट्रांसफ़र किया गया होना चाहिए.

Cloud Trace की ट्रेस सूची में, आपको दूसरी ट्रेस दिखनी चाहिए:

13490977f1638702.png

नए नीले बिंदु पर क्लिक करके, ट्रेस की जानकारी देखी जा सकती है:

ca69ef9cdd13d4aa.png

स्पैन की जानकारी देखने के लिए, इस डायग्राम में मौजूद किसी भी स्पैन पर क्लिक करें.

7. लेटेंसी डिस्ट्रिब्यूशन और परफ़ॉर्मेंस रिपोर्ट

ट्रेस डेटा स्टोरेज के तौर पर Cloud Trace का इस्तेमाल करने पर, Cloud Trace इस डेटा का इस्तेमाल करके, लेटेन्सी डिस्ट्रिब्यूशन रिपोर्ट बना सकता है. इस तरह की रिपोर्ट बनाने के लिए, आपके पास 100 से ज़्यादा ट्रेस होने चाहिए:

c8713f3d9e51dc25.png

hey का इस्तेमाल करके, पहले 100 से ज़्यादा अनुरोध किए जा सकते हैं. यह Cloud Shell पर पहले से इंस्टॉल होता है!

$ hey localhost:8080 -n 150

इसके अलावा, Cloud Trace विश्लेषण रिपोर्ट में, दो अलग-अलग समयावधियों के दौरान एक ही सेवा की परफ़ॉर्मेंस में गिरावट का पता अपने-आप लगा सकता है.

8. खास जानकारी

इस लैब में, आपने दो सामान्य सेवाएं बनाईं. साथ ही, Spring Cloud Sleuth की मदद से डिस्ट्रिब्यूटेड ट्रेसिंग की सुविधा जोड़ी. इसके अलावा, आपने Spring Cloud GCP का इस्तेमाल करके, ट्रेस की जानकारी को Cloud Trace पर फ़ॉरवर्ड किया.

9. बधाई हो!

आपने अपना पहला App Engine वेब ऐप्लिकेशन बनाना सीख लिया है!

ज़्यादा जानें

लाइसेंस

इस काम के लिए, Creative Commons एट्रिब्यूशन 2.0 जेनेरिक लाइसेंस के तहत लाइसेंस मिला है.