عمليات تتبّع موزَّعة من خلال 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 لاستخدام هذا الخادم الوكيل كنقطة نهاية Zipkin
  2. أو يمكنك استخدام برنامج Spring Cloud Trace Trace، الذي يتكامل بسلاسة مع Spring Cloud Sleuth، ويعيد توجيه بيانات التتبُّع مباشرةً إلى Cloud Trace.

في هذا الدرس التطبيقي، ستتعلم كيفية إنشاء تطبيق Spring Boot جديد واستخدام أداة Spring Cloud Cloud Trace لإجراء عمليات التتبع الموزعة.

المعلومات التي ستطّلع عليها

  • كيفية إنشاء تطبيق Spring Boot Java وإعداد Cloud Trace.

المتطلبات

  • مشروع Google Cloud Platform
  • متصفح، مثل Chrome أو Firefox
  • الإلمام بأدوات تحرير النصوص القياسية في Linux مثل Vim أو EMAC أو Nano

كيف ستستخدم هذا البرنامج التعليمي؟

القراءة فقط اقرأها وأكمِل التمارين

كيف تقيّم تجربتك في إنشاء تطبيقات ويب بتنسيق HTML/CSS؟

حديث متوسط بارع

ما هو تقييمك لتجربتك في استخدام خدمات Google Cloud Platform؟

حديث متوسط بارع

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
  • يكون رقم تعريف المشروع فريدًا في جميع مشاريع 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، ستظهر لك شاشة وسيطة تصف ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

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. شغّل الأمر التالي في 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 API أولاً قبل استخدام Cloud Trace لتخزين بيانات التتبُّع. لتفعيل واجهة برمجة التطبيقات، يمكنك تنفيذ ما يلي:

$ gcloud services enable cloudtrace.googleapis.com

إعداد بيانات الاعتماد التلقائية للتطبيق

بالنسبة لهذا التمرين المعملي، ستحتاج إلى تهيئة بيانات اعتماد افتراضية للتطبيق. سيتم اختيار بيانات الاعتماد هذه تلقائيًا من خلال إجراء التفعيل الخاص بأداة Spring Cloud GCP Trace.

أولاً، تسجيل الدخول:

$ 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 للتتبع. يمكننا إضافة إجراء تفعيل Spring Cloud Trace Trace لإعادة توجيه البيانات إلى 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 ثوانٍ، أو عند تلقّي حد أدنى من بيانات التتبُّع. يمكنك ضبط هذا الإعداد ويمكنك الرجوع إلى المستندات المرجعية لتتبُّع Google Cloud Platform للحصول على مزيد من المعلومات.

تقديم طلب إلى الخدمة:

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

إضافة تتبع GCP Cloud Spring إلى 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.

يجب أولاً إعداد حبوب 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

يمكنك تنفيذ أول 100 طلب باستخدام مرحبًا، التي يتم تثبيتها مسبقًا على Cloud Shell.

$ hey localhost:8080 -n 150

بالإضافة إلى ذلك، يمكن لخدمة Cloud Trace رصد تراجع أداء الخدمة نفسها تلقائيًا في فترتين زمنيتين مختلفتين ضمن تقرير التحليل.

8. ملخّص

في هذا التمرين، تم إنشاء خدمتين بسيطتين وإضافة عمليات التتبع الموزعة باستخدام Spring Cloud Sleuth، كما استخدمت Spring Cloud GCP لإعادة توجيه معلومات التتبع إلى Cloud Trace.

9. تهانينا!

لقد تعلمت كيفية كتابة أول تطبيق ويب لـ App Engine!

مزيد من المعلومات

الترخيص

هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.