שירותי מעקב מבוזרים באמצעות Spring Cloud Sleuth ו-Cloud Trace

1. סקירה כללית

מעקב מבוזר חשוב כדי לקבל תובנות ולשפר את יכולת הצפייה בארכיטקטורת מיקרו-שירותים מרובת-שכבות. כשמשלבים קריאות משירות לשירות, משירות א' לשירות ב' לשירות ג', חשוב להבין שהקריאות בוצעו בהצלחה וגם את זמן האחזור בכל שלב.

ב-Spring Boot, אפשר להשתמש ב-Spring Cloud Sleuth כדי להוסיף בצורה חלקה את אינסטרומנטציית המעקב המבוזר לאפליקציה. כברירת מחדל, הוא יכול להעביר את נתוני המעקב ל-Zipkin.

ב-Google Cloud Platform יש את Cloud Trace, שירות מנוהל שמאפשר לכם לאחסן נתוני מעקב בלי שתצטרכו לנהל את מופע Zipkin או את האחסון שלכם. ‫Cloud Trace יכול גם ליצור דוחות על חלוקת זמן האחזור ולזהות באופן אוטומטי ירידה בביצועים.

יש שתי אפשרויות לשימוש ב-Cloud Trace מאפליקציית Spring Boot:

  1. משתמשים ב-Stackdriver Trace Zipkin Proxy ומגדירים את Spring Cloud Sleuth כך שישתמש ב-proxy הזה כנקודת הקצה של Zipkin
  2. אפשר גם להשתמש ב-Spring Cloud GCP Trace, שמשתלב בצורה חלקה עם Spring Cloud Sleuth ומעביר את נתוני המעקב ישירות אל Cloud Trace.

ב-Codelab הזה תלמדו איך ליצור אפליקציית Spring Boot חדשה ולהשתמש ב-Spring Cloud GCP Trace למעקב מבוזר.

מה תלמדו

  • איך יוצרים אפליקציית Spring Boot Java ומגדירים את Cloud Trace.

מה תצטרכו

  • פרויקט ב-Google Cloud Platform
  • דפדפן, כמו Chrome או Firefox
  • היכרות עם כלים לעריכת טקסט של Linux, כמו Vim,‏ EMACs או Nano

איך תשתמש במדריך הזה?

רק לקרוא לקרוא ולבצע את התרגילים

מה מידת שביעות הרצון שלך מחוויית השימוש ב-HTML/CSS ליצירת אפליקציות אינטרנט?

מתחילים ביניים מומחים

איזה דירוג מגיע לדעתך לחוויית השימוש שלך בשירותים של Google Cloud Platform?

מתחילים ביניים מומחים

‫2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. תמיד אפשר לעדכן את המיקום.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שהוא מוגדר. מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל מסומן כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר לאורך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. השלמת ה-codelab הזה לא תעלה לכם הרבה, אם בכלל. כדי להשבית את המשאבים ולמנוע חיובים נוספים אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

Google Cloud Shell

אפשר להפעיל את Google Cloud ואת Kubernetes מרחוק מהמחשב הנייד, אבל בסדנת הקוד הזו נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על Activate Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים עם תיאור של השירות. אם הוצג לכם מסך ביניים, לחצו על המשך.

9c92662c6a846a5c.png

הקצאת המשאבים והחיבור ל-Cloud Shell נמשכים רק כמה רגעים.

9f0e51b578fecce5.png

המכונה הווירטואלית הזו כוללת את כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן.

אחרי שמתחברים ל-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 חדש של Spring Boot

אחרי ש-Cloud Shell מופעל, אפשר להשתמש בשורת הפקודה כדי ליצור אפליקציית Spring Boot חדשה באמצעות Spring Initializr:

$ 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

אחרי שהאפליקציה מופעלת, לוחצים על סמל התצוגה המקדימה באינטרנט 3a9b40fafa650b2b.png בסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.

3aca52f76c6c22a3.png

אחרי המתנה קצרה, התוצאה אמורה להופיע:

6793a3339447cbb5.png

ב-Cloud Shell אמורות להופיע גם הודעות היומן עם מזהה המעקב ומזהה הטווח:

18d597c388de1ba.png

4. שימוש ב-Cloud Trace

הפעלה של Cloud Trace API

כדי להשתמש ב-Cloud Trace לאחסון נתוני העקבות, צריך קודם להפעיל את Cloud Trace API. כדי להפעיל את ה-API, מריצים את הפקודה:

$ gcloud services enable cloudtrace.googleapis.com

הגדרת Application Default Credential

כדי לבצע את ה-Lab הזה, תצטרכו להגדיר אישורי ברירת מחדל לאפליקציה. פרטי הכניסה האלה יזוהו באופן אוטומטי על ידי 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 למעקב. נוסיף את Spring Cloud GCP Trace starter כדי להעביר את הנתונים ל-Cloud Trace.

מוסיפים את התלות 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 לא דוגם כל בקשה. כדי להקל על הבדיקה שלנו, צריך להגדיל את קצב הדגימה ל-100% ב-application.properties כדי שנוכל לראות את נתוני המעקב, וגם להתעלם מכתובות URL מסוימות שלא מעניינות אותנו:

$ 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, עוברים אל Operations (פעולות) → Trace (מעקב) → Trace list (רשימת מעקב).

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

הוספה של Spring Cloud GCP Trace ל-pom.xml

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 כך שידגום 100% מהבקשות:

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 ביציאה 8081 באמצעות התוסף Spring Boot:

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

קודם מאתחלים bean חדש של 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 בתור מאגר נתוני המעקב, המערכת יכולה להשתמש בנתונים כדי ליצור דוח על התפלגות זמן האחזור. כדי ליצור דוח כזה, צריך יותר מ-100 עקבות:

c8713f3d9e51dc25.png

אפשר להריץ את 100 הבקשות הראשונות באמצעות hey, שמותקן מראש ב-Cloud Shell.

$ hey localhost:8080 -n 150

בנוסף, Cloud Trace יכול לזהות באופן אוטומטי נסיגה בביצועים של אותו שירות בשתי תקופות זמן שונות בדוח ניתוח.

8. סיכום

בשיעור ה-Lab הזה יצרתם 2 שירותים פשוטים והוספתם מעקב מבוזר באמצעות Spring Cloud Sleuth, והשתמשתם ב-Spring Cloud GCP כדי להעביר את פרטי המעקב אל Cloud Trace.

9. מעולה!

למדתם איך לכתוב את אפליקציית האינטרנט הראשונה שלכם ב-App Engine.

מידע נוסף

רישיון

עבודה זו מורשית תחת רישיון Creative Commons שמותנה בייחוס 2.0 כללי.