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

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

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

Spring बूट में, आप अपने ऐप्लिकेशन में आसानी से डिस्ट्रिब्यूट किए गए ट्रेसिंग इंस्ट्रुमेंट जोड़ने के लिए Spring Cloud Sleuth का इस्तेमाल कर सकते हैं. डिफ़ॉल्ट रूप से, यह ट्रेस डेटा को Zipkin पर भेज सकता है.

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

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

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

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

आपको इनके बारे में जानकारी मिलेगी

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

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

  • Google Cloud Platform प्रोजेक्ट
  • ब्राउज़र, जैसे कि Chrome या Firefox
  • Vim, EMAC या 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 में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, बिलिंग से बचने के लिए संसाधनों को बंद करें. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

Google Cloud शेल

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

Cloud Shell चालू करें

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

55efc1aaa7a4d3ad.png

अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

9c92662c6a846a5c.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में डेवलपमेंट के सभी ज़रूरी टूल मौजूद हैं. इसमें लगातार पांच जीबी की होम डायरेक्ट्री मिलती है और यह 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. Cloud Shell में यह कमांड चलाएं, ताकि यह पुष्टि की जा सके कि gcloud के लिए कमांड को आपके प्रोजेक्ट के बारे में जानकारी है:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो आप इसे इस निर्देश की मदद से सेट कर सकते हैं:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. नई स्प्रिंग बूट REST सेवा बनाएं

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

$ 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 बूट प्लग इन से Spring बूट ऐप्लिकेशन को सामान्य रूप से शुरू कर सकते हैं. आइए, इस लैब के लिए की जाने वाली जांचों को छोड़ दें:

$ ./mvnw -DskipTests spring-boot:run

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

3aca52f76c6c22a3.png

थोड़ी देर इंतज़ार करने के बाद आपको नतीजा दिखेगा:

6793a3339447cbb5.png

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

18d597c388de1ba.png

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

Cloud Trace API चालू करें

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

$ gcloud services enable cloudtrace.googleapis.com

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

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

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

$ 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 ट्रेस जोड़ना

हम इस सेवा में, ट्रेस करने के लिए पहले ही Spring Cloud Sleuth का इस्तेमाल कर रहे हैं. डेटा को Cloud Trace पर भेजने के लिए, अब Spring Cloud GCP ट्रेस स्टार्टर को जोड़ें.

Spring Cloud GCP ट्रेस डिपेंडेंसी जोड़ें:

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 Web Preview का इस्तेमाल करें:

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

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

इस सेवा को ऐक्सेस करने का अनुरोध करें:

$ curl localhost:8080

Cloud Console में, ऑपरेशनट्रेसट्रेस लिस्ट पर जाएं

be48cb0f99b5f7c2.png

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

3522eef823df39d8.png

ट्रेस डेटा करीब 30 सेकंड में दिखना चाहिए.

9628f6e1d2e75b05.png

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

ba9051a8d4f3e725.png

यह काफ़ी आसान था!

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

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

9799bee5fea95aa6.png

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

$ 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 में स्प्रिंग क्लाउड GCP ट्रेस जोड़ें

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

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

$ 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

दोनों सेशन विंडो में, आपको लॉग मैसेज दिखेंगे. साथ ही, ट्रेस आईडी एक सेवा से दूसरी सेवा पर लागू होता है.

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 की मदद से ट्रेसिंग को जोड़ा और ट्रेस की जानकारी को Cloud Trace पर भेजने के लिए, Spring Cloud GCP का इस्तेमाल किया..

9. बधाई हो!

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

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

लाइसेंस

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