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

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

ما ستتعلمه

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

المتطلبات

  • مشروع على Google Cloud Platform
  • متصفّح، مثل Chrome أو Firefox
  • الإلمام بأدوات تحرير النصوص العادية في Linux، مثل Vim أو EMACs أو 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 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، انتقِل إلى العملياتTraceقائمة عمليات التتبُّع.

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.

أولاً، ابدأ بإنشاء عنصر 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 طلب أو أكثر باستخدام hey، الذي يأتي مثبّتًا مسبقًا على Cloud Shell.

$ hey localhost:8080 -n 150

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

8. ملخّص

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

9- تهانينا!

لقد تعلّمت كيفية كتابة أول تطبيق ويب لك على App Engine.

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

الترخيص

يخضع هذا العمل لترخيص المشاع الإبداعي مع نسب العمل إلى مؤلفه 2.0 Generic License.