डिस्ट्रिब्यूटेड ट्रेसिंग, मल्टी-टियर माइक्रोसेवाओं के आर्किटेक्चर के बारे में अहम जानकारी पाने और उसे मॉनिटर करने के लिए ज़रूरी है. जब आपने सेवा से सेवा को कॉल करने की सुविधा चालू की हो, जैसे कि सेवा A से सेवा B और सेवा B से सेवा C को कॉल करने की सुविधा, तो यह समझना ज़रूरी है कि कॉल सही तरीके से किए गए थे या नहीं. साथ ही, हर चरण में लेटेन्सी कितनी थी.
स्प्रिंग बूट में, स्प्रिंग क्लाउड स्लीथ का इस्तेमाल करके, अपने ऐप्लिकेशन में डिस्ट्रिब्यूटेड ट्रेसिंग इंस्ट्रूमेंटेशन को आसानी से जोड़ा जा सकता है. डिफ़ॉल्ट रूप से, यह ट्रेस डेटा को Zipkin पर फ़ॉरवर्ड कर सकता है.
Google Cloud Platform में Stackdriver Trace है. यह एक मैनेज की गई सेवा है. इसकी मदद से, ट्रेस डेटा को सेव किया जा सकता है. इसके लिए, आपको अपने Zipkin इंस्टेंस और स्टोरेज को मैनेज करने की ज़रूरत नहीं होती. Stackdriver Trace, इंतज़ार के समय के डिस्ट्रिब्यूशन की रिपोर्ट भी जनरेट कर सकता है. साथ ही, परफ़ॉर्मेंस में गिरावट का अपने-आप पता लगा सकता है.
Spring Boot ऐप्लिकेशन से Stackdriver Trace का इस्तेमाल करने के लिए, आपके पास दो विकल्प हैं:
- Stackdriver Trace Zipkin Proxy का इस्तेमाल करें. साथ ही, Spring Cloud Sleuth को कॉन्फ़िगर करें, ताकि वह इस प्रॉक्सी को Zipkin एंडपॉइंट के तौर पर इस्तेमाल कर सके
- इसके अलावा, Spring Cloud GCP Trace का इस्तेमाल करें. यह Spring Cloud Sleuth के साथ आसानी से इंटिग्रेट हो जाता है और ट्रेस डेटा को सीधे Stackdriver Trace पर भेजता है.
इस कोडलैब में, आपको नया Spring Boot ऐप्लिकेशन बनाने और डिस्ट्रिब्यूटेड ट्रेसिंग के लिए Spring Cloud GCP Trace का इस्तेमाल करने का तरीका बताया जाएगा.
आपको क्या सीखने को मिलेगा
- Spring Boot Java ऐप्लिकेशन बनाने और Stackdriver Trace को कॉन्फ़िगर करने का तरीका.
आपको इन चीज़ों की ज़रूरत होगी
- Google Cloud Platform प्रोजेक्ट
- कोई ब्राउज़र, जैसे कि Chrome या Firefox
- Vim, EMACs या Nano जैसे स्टैंडर्ड Linux टेक्स्ट एडिटर के बारे में जानकारी होना
इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?
एचटीएमएल/सीएसएस वेब ऐप्लिकेशन बनाने के अपने अनुभव को आप क्या रेटिंग देंगे?
Google Cloud Platform की सेवाओं को इस्तेमाल करने के अपने अनुभव को आप क्या रेटिंग देंगे?
अपने हिसाब से एनवायरमेंट सेट अप करना
अगर आपके पास पहले से कोई Google खाता (Gmail या Google Apps) नहीं है, तो आपको एक खाता बनाना होगा. Google Cloud Platform Console (console.cloud.google.com) में साइन इन करें और एक नया प्रोजेक्ट बनाएं:
प्रोजेक्ट आईडी याद रखें. यह सभी Google Cloud प्रोजेक्ट के लिए एक यूनीक नाम होता है. ऊपर दिया गया नाम पहले ही इस्तेमाल किया जा चुका है. इसलिए, यह आपके लिए काम नहीं करेगा. माफ़ करें! इस कोड लैब में इसे बाद में PROJECT_ID
के तौर पर दिखाया जाएगा.
इसके बाद, Google Cloud संसाधनों का इस्तेमाल करने के लिए, आपको Cloud Console में बिलिंग चालू करनी होगी.
इस कोडलैब को पूरा करने में आपको कुछ डॉलर से ज़्यादा खर्च नहीं करने पड़ेंगे. हालांकि, अगर आपको ज़्यादा संसाधनों का इस्तेमाल करना है या उन्हें चालू रखना है, तो यह खर्च बढ़ सकता है. इस दस्तावेज़ के आखिर में "सफ़ाई" सेक्शन देखें.
Google Cloud Platform के नए उपयोगकर्ता, 300 डॉलर के क्रेडिट के साथ मुफ़्त में आज़माने की सुविधा पा सकते हैं.
Google Cloud Shell
Google Cloud और Kubernetes को अपने लैपटॉप से रिमोटली चलाया जा सकता है. हालांकि, इस कोडलैब में हम Google Cloud Shell का इस्तेमाल करेंगे. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
Google Cloud Shell चालू करना
GCP Console में, सबसे ऊपर दाईं ओर मौजूद टूलबार पर मौजूद Cloud Shell आइकॉन पर क्लिक करें:
इसके बाद, "Cloud Shell शुरू करें" पर क्लिक करें:
इसे चालू करने और एनवायरमेंट से कनेक्ट करने में सिर्फ़ कुछ सेकंड लगेंगे:
इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है. साथ ही, Google Cloud पर काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस लैब में ज़्यादातर काम, सिर्फ़ ब्राउज़र या Google Chromebook से किया जा सकता है.
Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है और प्रोजेक्ट को आपके PROJECT_ID पर पहले ही सेट कर दिया गया है.
पुष्टि करने के लिए कि आपने पुष्टि कर ली है, Cloud Shell में यह कमांड चलाएं:
gcloud auth list
कमांड आउटपुट
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
कमांड आउटपुट
[core] project = <PROJECT_ID>
अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:
gcloud config set project <PROJECT_ID>
कमांड आउटपुट
Updated property [core/project].
Cloud Shell लॉन्च होने के बाद, Spring Initializr की मदद से नया Spring Boot ऐप्लिकेशन जनरेट करने के लिए, कमांड लाइन का इस्तेमाल किया जा सकता है:
$ 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
नई क्लास जोड़कर, नया 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!";
}
}
Spring Boot प्लगिन की मदद से, Spring Boot ऐप्लिकेशन को सामान्य तरीके से शुरू किया जा सकता है. आइए, इस लैब के लिए टेस्ट छोड़ते हैं:
$ ./mvnw -DskipTests spring-boot:run
ऐप्लिकेशन शुरू होने के बाद, Cloud Shell टूलबार में मौजूद वेब प्रीव्यू आइकॉन पर क्लिक करें. इसके बाद, पोर्ट 8080 पर झलक देखें चुनें.
कुछ देर बाद, आपको यह नतीजा दिखेगा:
Cloud Shell में, आपको ट्रेस आईडी और स्पैन आईडी के साथ लॉग मैसेज भी दिखेंगे:
Stackdriver Trace API चालू करना
अपने ट्रेस डेटा को सेव करने के लिए, Stackdriver Trace का इस्तेमाल करने से पहले, आपको Stackdriver Trace API चालू करना होगा. एपीआई चालू करने के लिए, एपीआई सेवाएं → लाइब्रेरी पर जाएं
Stackdriver Trace खोजें
Stackdriver Trace API पर क्लिक करें. इसके बाद, अगर यह पहले से चालू नहीं है, तो चालू करें पर क्लिक करें.
ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल सेट अप करना
इस लैब के लिए, आपको ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल कॉन्फ़िगर करने होंगे. इस क्रेडेंशियल को 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: ...
नया ब्राउज़र टैब खोलने के लिए, लिंक पर क्लिक करें. इसके बाद, अनुमति दें पर क्लिक करें
इसके बाद, पुष्टि करने के कोड को 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 का इस्तेमाल किया है. डेटा को Stackdriver Trace पर भेजने के लिए, Spring Cloud GCP Trace starter जोड़ते हैं.
Spring Cloud GCP Trace डिपेंडेंसी जोड़ें:
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 हर अनुरोध का सैंपल नहीं लेता है. टेस्टिंग को थोड़ा आसान बनाने के लिए, 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 में, Stackdriver → Trace → ट्रेस की सूची पर जाएं
सबसे ऊपर, समयसीमा को कम करके एक घंटे पर सेट करें. डिफ़ॉल्ट रूप से, अपने-आप रीलोड होने की सुविधा चालू होती है. इसलिए, जैसे ही ट्रेस डेटा मिलता है, वह कंसोल में दिखना चाहिए!
ट्रेस डेटा को दिखने में करीब 30 सेकंड लगते हैं.
ट्रेस की जानकारी देखने के लिए, नीले बिंदु पर क्लिक करें:
यह बहुत आसान था!
+ आइकॉन पर क्लिक करके, नया Cloud Shell सेशन खोलें:
नए सेशन में, दूसरा Spring Boot ऐप्लिकेशन बनाएं:
$ 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
नई क्लास जोड़कर, नया 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 Stackdriver Trace starter -->
<dependency>
<groupId>org.springframework.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 -Dserver.port=8081
trace-service-two
चालू रहने के दौरान, Cloud Shell के पहले सेशन की विंडो पर वापस जाएं और trace-service-two
में बदलाव करें.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)'`
$ ./mvnw -DskipTests spring-boot:run
दोनों सेशन विंडो में, आपको लॉग मैसेज दिखने चाहिए. साथ ही, एक सेवा से दूसरी सेवा में Trace ID ट्रांसफ़र होना चाहिए.
Stackdriver Trace की ट्रेस सूची में, आपको दूसरी ट्रेस दिखनी चाहिए:
नए नीले बिंदु पर क्लिक करके, ट्रेस की जानकारी देखी जा सकती है:
स्पैन की जानकारी देखने के लिए, इस डायग्राम में मौजूद किसी भी स्पैन पर क्लिक करें.
ट्रेस डेटा स्टोरेज के तौर पर Stackdriver Trace का इस्तेमाल करने पर, Stackdriver Trace इस डेटा का इस्तेमाल करके, लेटेन्सी डिस्ट्रिब्यूशन रिपोर्ट बना सकता है. इस तरह की रिपोर्ट बनाने के लिए, आपके पास 100 से ज़्यादा ट्रेस होने चाहिए:
इसके अलावा, Stackdriver Trace विश्लेषण रिपोर्ट में, दो अलग-अलग समयावधियों के दौरान एक ही सेवा की परफ़ॉर्मेंस में गिरावट का अपने-आप पता लगा सकता है.
इस लैब में, आपने दो सामान्य सेवाएं बनाईं. साथ ही, Spring Cloud Sleuth की मदद से डिस्ट्रिब्यूटेड ट्रेसिंग की सुविधा जोड़ी. इसके अलावा, आपने Spring Cloud GCP का इस्तेमाल करके, ट्रेस की जानकारी को Stackdriver Trace पर फ़ॉरवर्ड किया.
आपने अपना पहला App Engine वेब ऐप्लिकेशन बनाना सीख लिया है!
ज़्यादा जानें
- Stackdriver Trace: https://cloud.google.com/trace/
- GCP प्रोजेक्ट पर Spring: http://cloud.spring.io/spring-cloud-gcp/
- GCP GitHub रिपॉज़िटरी पर Spring: https://github.com/spring-cloud/spring-cloud-gcp
- Google Cloud Platform पर Java: https://cloud.google.com/java/
लाइसेंस
इस काम के लिए, Creative Commons एट्रिब्यूशन 2.0 जेनेरिक लाइसेंस के तहत लाइसेंस मिला है.