مقدّمة عن "إحصاءات طلبات البحث" في Cloud SQL

1. قبل البدء

تساعدك إحصاءات طلبات البحث في Cloud SQL في رصد مشاكل أداء طلبات البحث في قواعد بيانات Cloud SQL وتشخيصها ومنعها. وتوفّر هذه الميزة معلومات حول الخدمة الذاتية والمراقبة السهلة وبيانات التشخيص التي تتجاوز حدود الرصد لمساعدتك في تحديد السبب الجذري لمشاكل الأداء.

في هذا الدرس التطبيقي، ستتعلّم كيفية إعداد مثيل Cloud SQL لمثيل PostgreSQL ونشر تطبيق Node.js لاستخدام مثيل Cloud SQL كمخزن للخلفية، ثم استخدام "إحصاءات طلبات البحث" لعرض الطلبات ومراقبتها.

المتطلبات الأساسية

  • الإلمام الأساسي بلغة البرمجة وأدوات Node.js

الأنشطة

  • يمكنك استخدام Cloud SQL في تطبيق Node.js.
  • تفعيل معلِّق SQL في تطبيق Node.js.
  • استخدام "إحصاءات طلبات البحث" في Cloud SQL لمراقبة أداء طلبات البحث والتحقيق فيها.

المتطلبات

  • حساب Google Cloud حيث لديك أذونات لتفعيل واجهات برمجة التطبيقات وإنشاء الخدمات

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

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

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

تذكر رقم تعريف المشروع الذي تستخدمه. ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT-ID.

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "التنظيف ومعرفة المزيد". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell.

تفعيل Cloud Shell

إذا لم يسبق لك بدء تشغيل Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف ماهيتها. إذا كان الأمر كذلك، فانقر على متابعة (ولن تراه مرة أخرى مطلقًا). إليك ما تبدو عليه هذه الشاشة التي تُستخدم لمرة واحدة:

نافذة مربّع حوار Cloud Shell

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.

وحدة طرفية في Cloud Shell

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة.

  1. شغّل الأمر التالي في Cloud Shell للتأكد من أنك تستخدم المشروع الصحيح:

بعد الربط بخدمة Cloud Shell، من المفترض أن ترى أنّه قد تمت مصادقتك وأنّ المشروع معيّن سبق أن تم ضبطه على رقم تعريف مشروعك.

شغّل الأمر التالي للتأكد من استخدامك للمشروع الصحيح.

gcloud config list project

إذا أردت استخدام مشروع مختلف عن المشروع الذي اخترته عند فتح Cloud Shell، يمكنك إعداد مشروع جديد من خلال تنفيذ ما يلي:

gcloud config set project <PROJECT-ID>;

3- إعداد Cloud SQL لمثيل PostgreSQL مع تفعيل "إحصاءات طلبات البحث"

  1. بعد إطلاق Cloud Shell، يمكنك استخدام سطر الأوامر لإنشاء مثيل جديد من Cloud SQL باسم my-instance، مع تفعيل "إحصاءات طلبات البحث" وفقًا لما يلي:
gcloud sql instances create my-instance --tier db-f1-micro --database-version=POSTGRES_12 --region=us-central --root-password=<PASSWORD> --insights-config-query-insights-enabled --insights-config-record-application-tags --insights-config-record-client-address

في ما يلي شرح موجز عن عمليات الإبلاغ ومعناها:

  • تحدّد العلامة --tier db-f1-micro نوع جهاز باستخدام الحد الأدنى من الموارد، لأنّ هذا هو لأغراض التطوير، ولا تحتاج إلى الكثير من الموارد للدرس التطبيقي حول الترميز. يمكنك الاطّلاع على المزيد من المعلومات حول الفئات هنا.
  • تنشئ العلامة --database-version=POSTGRES_12 مثيلاً سيكون الإصدار 12 من PostgreSQL.
  • تحدّد العلامة --region=us-central المنطقة التي سيتم إنشاء المثيل فيها.
  • تتيح لك العلامة --root-password=<PASSWORD> تحديد كلمة المرور لمستخدم postgres الجذر. تأكد من استبدال <password> باستخدام كلمة مرور من اختيارك
  • تفعِّل العلامة --insights-config-query-insights-enabled "إحصاءات طلبات البحث" على المثيل.
  • تسمح العلامة --insights-config-record-application-tags بتسجيل علامات التطبيقات. ستتعرف على المزيد من المعلومات عن علامات التطبيقات في أقسام لاحقة.
  • تسمح العلامة --insights-config-record-client-address بتسجيل عناوين IP للعملاء من خلال "إحصاءات طلبات البحث".

قد يُطلب منك تفعيل واجهة برمجة التطبيقات sqladmin.googleapis.com لمشروعك. اختَر y لتفعيل واجهة برمجة التطبيقات إذا طُلب منك ذلك.

سيستغرق إنشاء المثيل عدّة دقائق. بعد اكتمال هذه العملية، سيكون المثيل جاهزًا للاستخدام.

  1. الآن قم بإنشاء قاعدة بيانات ستستخدمها لعينة التطبيق:
gcloud sql databases create votesdb --instance my-instance

يمكنك أيضًا الوصول إلى المثيل وضبطه من خلال Cloud Console.

  1. احصل على اسم اتصال المثيل بالتنسيق PROJECT-ID:ZONE-ID:INSTANCE-ID من خلال تنفيذ الأمر التالي. ويمكنك استخدام هذه المعلومات لاحقًا في ضبط تطبيق Node.js.
gcloud sql instances describe my-instance | grep connectionName

4. إنشاء حساب خدمة لاستخدامه مع التطبيق

يتم استخدام حسابات الخدمة لمنح الأذونات لاستخدام خدمات مختلفة ضمن مشروع Google Cloud Platform. في هذا الدرس التطبيقي حول الترميز، يجب أن تمنح خادم وكيل Cloud SQL الإذن بالاتصال بمثيل Cloud SQL.

إنشاء حساب خدمة في Console

  1. انتقِل إلى صفحة حسابات خدمة إدارة الهوية وإمكانية الوصول وانقر على الزر -PCvKR3aQ2zKaUcml8w9lW4JNlmYtN5-r2--mC6kMUp6HOXW8wT1wUvLoYEPU-aA-oGskT3XkAqfNwRAKkZkllwTe6ugdrUVFwaeKT0M9Y1RwHA8JPZeGmCWYBfr8d9TSycNMIRsLw في أعلى الصفحة.
  2. أدخِل اسمًا ورقم تعريف فريدَين لحساب الخدمة الخاص بك، ثم انقر على إنشاء.
  3. في الصفحة التالية، انقر على القائمة المنسدلة "اختيار دور". فلتر "Cloud SQL" واختَر دور "عميل Cloud SQL" انقر على متابعة، ثم على تم.
  4. بعد إنشاء حساب الخدمة، انقر على النقاط الثلاث ضمن الإجراءات لحساب الخدمة الجديد واختَر "إدارة المفاتيح". في الصفحة التالية، انقر على إضافة مفتاح ثم إنشاء مفتاح جديد. سيتم اختيار JSON. إبقاء هذا الخيار التلقائي والنقر على إنشاء سيؤدي هذا إلى تنزيل ملف مفتاح خاص بتنسيق json. انقر على إغلاق.
  5. في Cloud Shell، انقر على النقاط الثلاث لقائمة المزيد واختَر تحميل ملف. تصفّح للوصول إلى ملف json .الذي نزّلته على جهازك المحلي واختَره. سيؤدي هذا الإجراء إلى تحميل ملف .json إلى الدليل الرئيسي في Cloud Shell.

5- تثبيت خادم وكيل Cloud SQL الوكيل وتشغيله

ستستخدم خادم وكيل Cloud SQL للاتصال بين التطبيق ومثيل قاعدة البيانات.

  1. نزِّل خادم Cloud SQL الوكيل. في Cloud Shell، يمكنك تنفيذ ما يلي:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
  1. يمكنك تشغيل الخادم الوكيل على النحو التالي بعد استبدال <INSTANCE_CONNECTION_NAME> باسم الاتصال بالمثيل الذي نسخته من صفحة النظرة العامة على مثيل Cloud SQL.
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

إذا نجح ذلك، من المفترض أن تظهر لك بضعة أسطر من النتائج، تنتهي برسالة Ready for new connections.

6- استنساخ التطبيق واختبره محليًا

  1. استنسِخ المستودع لنموذج التطبيق، وثبِّت الحزم اللازمة لتشغيل التطبيق.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples/

cd nodejs-docs-samples/cloud-sql/postgres/knex

npm install
  1. اضبط متغيّرات البيئة التالية:
export INSTANCE_CONNECTION_NAME='<PROJECT-ID>:<ZONE-ID>:<INSTANCE-ID>'
export DB_HOST='127.0.0.1:5432'
export DB_USER='postgres'
export DB_PASS='<PASSWORD>'
export DB_NAME='votesdb'
  1. شغِّل نموذج التطبيق.
npm start
  1. انقر على معاينة الويب رمز معاينة الويب في Cloud Shell، ثم اختَر معاينة على المنفذ 8080.

معاينة عنصر القائمة للمنفذ 8080

من المفترض أن يظهر لك تطبيق التصويت "علامات التبويب" مقابل "مساحات" كما هو موضّح هنا في المتصفح:

لقطة شاشة لتطبيق التصويت على علامات التبويب مقابل المساحات

  1. انقر فوق الأزرار لإجراء بعض التصويتات وحفظ بعض البيانات في قاعدة البيانات.

7. يمكنك إضافة صفحة لعرض جميع الأصوات.

نظرًا لأن نموذج التطبيق هذا بسيط للغاية، ستضيف صفحة أخرى تعرض جميع الأصوات. السبب الرئيسي للقيام بذلك هو حصولك على المزيد من البيانات التي يجب إلقاء نظرة عليها عند استخدام Query Insights لاحقًا.

  1. أدخِل Ctrl+c في Cloud Shell لإيقاف نموذج التطبيق.
  2. في Cloud Shell، انقر على الزر الزر &quot;فتح المحرّر&quot; لتشغيل "محرِّر Cloud Shell".
  3. في مستكشف الملفات، ابحث عن nodejs-docs-samples/cloud-sql/postgres/knex/server.js وانقر عليه لتحميل ملف server.js في المحرِّر.

أضِف الرمز التالي بعد تحديد الدالة getVotes:

/**
 * Retrieve all vote records from the database.
 *
 * @param {object} pool The Knex connection object.
 * @returns {Promise}
 */
const getAllVotes = async pool => {
  return await pool
    .select('candidate', 'time_cast')
    .from('votes')
    .orderBy('time_cast', 'desc');
};
  1. أضِف الرمز التالي لمسار '/getAllVotes' أدناه حيث يتم تحديد المسارات الأخرى:
app.get('/getAllVotes', async (req, res) => {
  pool = pool || createPool();
  try {
    // Query all votes from the database.
    const votes = await getAllVotes(pool);

    res.render('allvotes.pug', {
      votes: votes,
    });
  } catch (err) {
    console.error(err);
    res
      .status(500)
      .send('Unable to load page; see logs for more details.')
      .end();
  }
});
  1. أنشِئ ملفًا جديدًا في دليل nodejs-docs-samples/cloud-sql/postgres/knex/views باسم "allvotes.pug". ألصق التعليمة البرمجية التالية:
doctype html
html(lang="en")
  head
    title Tabs VS Spaces

    link(rel="stylesheet", href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css")
    link(rel="stylesheet", href="https://fonts.googleapis.com/icon?family=Material+Icons")
    script(src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js")
  body

    nav(class="red lighten-1")
      div(class="nav-wrapper")
        a(href="#" class="brand-logo center") Tabs VS Spaces

    div(class="section")

      h4(class="header center") Recent Votes
      ul(class="container collection center")
        each vote in votes
          li(class="collection-item avatar")
            if vote.candidate.trim() === 'TABS'
              i(class="material-icons circle green") keyboard_tab
            else
              i(class="material-icons circle blue") space_bar
            span(class="title") A vote for <b>#{vote.candidate}</b>
            p was cast at #{vote.time_cast}.
  1. انقر على زر زر &quot;فتح المحطة الطرفية&quot; للرجوع إلى Cloud Shell وتنفيذ ما يلي:
npm start
  1. افتح التطبيق من "معاينة الويب" للتأكُّد من أنّه يعمل. أضِف "/getAllVotes" على عنوان URL في المتصفِّح لعرض الصفحة الجديدة التي أضفتها.

8. تفعيل مُعلِّق SQL في التطبيق

يمكنك الآن تثبيت وتفعيل SQL Commenter، وهي مكتبة مفتوحة المصدر تمكِّن عمليات ORM من زيادة عبارات SQL مع التعليقات قبل تنفيذها. يدعم SQLcommenter العديد من ORM وأُطر العمل، بما في ذلك النموذج الذي يستخدمه التطبيق النموذجي: Knex.js. تستخدم Query Insights المعلومات الواردة في هذه التعليقات لتوفير عرض يركّز على التطبيق في أداء قاعدة البيانات وتحديد رمز التطبيق الذي يتسبب في حدوث مشاكل. من المتوقع أن تكون النفقات العامة للأداء صغيرة. اطّلِع على مستندات إحصاءات طلبات البحث.

  1. أدخِل Ctrl+c في Cloud Shell لإيقاف نموذج التطبيق.
  2. شغّل الأمر التالي لتثبيت الحزم التي يحتاجها SQLcommenter:
  npm install @google-cloud/sqlcommenter-knex @opencensus/nodejs @opencensus/propagation-tracecontext @opentelemetry/api @opentelemetry/core --save
  1. في Cloud Shell، انقر على الزر الزر &quot;فتح المحرّر&quot; لتشغيل "محرِّر Cloud Shell".
  2. في مستكشف الملفات، ابحث عن nodejs-docs-samples/cloud-sql/postgres/knex/server.js وانقر عليه لتحميل ملف server.js في المحرِّر.
  3. ابحث عن هذه التعليمة البرمجية في الملف:
const process = require('process');

أسفله، أضف التعليمة البرمجية التالية:

const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
  1. ابحث عن هذه التعليمة البرمجية في الملف:
// Set Content-Type for all responses for these routes.
app.use((req, res, next) => {
  res.set('Content-Type', 'text/html');
  next();
});

أسفله، أضف التعليمة البرمجية التالية:

app.use(wrapMainKnexAsMiddleware(Knex, {
    traceparent: true,
    tracestate: true,
    route: true,
    db_driver: true
}));

بمجرد الانتهاء من ذلك، يُفترض أن تبدو التعليمة البرمجية على النحو التالي:

...
// Require process, so we can mock environment variables.
const process = require('process');

const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
const express = require('express');
const Knex = require('knex');
const fs = require('fs');

const app = express();
app.set('view engine', 'pug');
app.enable('trust proxy');

// Automatically parse request body as form data.
app.use(express.urlencoded({extended: false}));
// This middleware is available in Express v4.16.0 onwards
app.use(express.json());

// Set Content-Type for all responses for these routes.
app.use((req, res, next) => {
  res.set('Content-Type', 'text/html');
  next();
});

app.use(wrapMainKnexAsMiddleware(Knex, {
    traceparent: true,
    tracestate: true,
    route: true,
    db_driver: true
}));
...
  1. انقر على زر زر &quot;فتح المحطة الطرفية&quot; للرجوع إلى Cloud Shell وتنفيذ ما يلي:
npm start
  1. في تطبيق علامات التبويب مقابل المساحات، انقر على الأزرار للتصويت بمزيد من التصويت لإضافة المزيد من البيانات إلى قاعدة البيانات.

9. استخدام ميزة "الإحصاءات" لعرض أداء طلبات البحث والتتبّع الشامل

تساعدك لوحة بيانات "إحصاءات طلبات البحث" في تحديد مشاكل طلبات بحث Cloud SQL وحلّها للبحث عن مشاكل الأداء. للوصول إلى "الإحصاءات"، اختَر إحصاءات طلبات البحث في شريط التنقّل الأيمن لمثيل Cloud SQL.

تحميل قاعدة البيانات - رسم بياني لجميع طلبات البحث

تعرض لوحة بيانات "إحصاءات طلبات البحث" ذات المستوى الأعلى الرسم البياني تحميل قاعدة البيانات - جميع طلبات البحث.

الرسم البياني لكل طلبات البحث

يحتوي الرسم البياني على معلومات عن سعة وحدة المعالجة المركزية (CPU) وانتظار وحدة المعالجة المركزية (CPU) ووحدة المعالجة المركزية (CPU) وانتظار طلب الإدراج وانتظار القفل. يمكنك الاطّلاع على مزيد من المعلومات حول معاني هذه المقاييس وأماكن تخزينها والاطّلاع على بعض الأمثلة حول شكل هذا الرسم البياني لطلبات البحث التي تتضمّن مشاكل في المستندات. في حالة تطبيق النموذج هذا، يكون تحميل استعلام قاعدة البيانات منخفضًا، ولذلك ليست هناك أي ارتفاعات كبيرة على الرسم البياني.

ما هي طلبات البحث المسؤولة عن أكبر قدر من التحميل؟

أسفل الرسم البياني، ستجد جدول طلبات البحث الذي يحتوي على طلبات البحث التي تمّت تسويتها للنطاق الزمني الذي اختَرته. يتم ترتيب طلبات البحث في الجدول حسب إجمالي وقت التنفيذ.

جدول &quot;أهم طلبات البحث&quot;

يمكنك النقر على طلب بحث فردي للاطّلاع على معلومات تفصيلية حوله، مثل تحميل قاعدة البيانات لطلب البحث المحدّد هذا ووقت استجابة طلب البحث وعيّنات خطط طلب البحث وأهم المستخدمين. إذا تم إنشاء تطبيق باستخدام ORM، كما هو الحال مع نموذج التطبيق، فقد لا تعرف أي جزء من التطبيق مسؤول عن أي استعلام. يساعدك قسم أهم العلامات في معرفة ذلك.

أين ينشأ تحميل طلبات البحث في التطبيق؟

يمكنك التبديل من جدول "طلبات البحث" إلى جدول TAGS للاطّلاع على قائمة بطلبات البحث التي تم وضع علامات عليها حسب منطق النشاط التجاري، ما يمنحك طريقة عرض أكثر تركيزًا على التطبيق.

جدول أهم العلامات

في جدول TAGS، يمكنك الاطلاع على حِمل قاعدة البيانات مقسمًا حسب المسار الذي أنشأ التحميل. في لقطة الشاشة أعلاه، يمكنك ملاحظة أنّ مسار التنفيذ '/getAllVotes' يسجِّل متوسّط وقت تنفيذ أعلى ويتضمّن المزيد من الصفوف المعروضة في المتوسّط. وعلى الرغم من أنّ وقت التنفيذ الذي نراه في الجدول لا يمثل مشكلة في هذه الحالة، لننقر على صف '/getAllVotes' على أيّ حال للاطّلاع على البيانات بمزيد من التفاصيل.

لماذا تعمل طلبات البحث ببطء؟

انقر على النقطة في الرسم البياني نماذج خطط طلب البحث للاطّلاع على خطة طلب بحث.

نماذج خطط طلبات البحث

توضح خطط الاستعلام كيفية تنفيذ PostgreSQL للاستعلام ضمن الأغلفة، مما يسهل تحديد ما إذا كانت هناك عمليات تؤدي إلى بطء.

ما هو رمز التطبيق الذي يساهم في البطء؟

توفّر "إحصاءات طلبات البحث" أيضًا تصورًا ضمن السياق للتتبُّع التام بين الأطراف، ما قد يكون مفيدًا لإجراء مزيد من التحقيق في أجزاء التطبيق التي تنشئ طلبات بحث بطيئة.

انقر على علامة التبويب من النهاية إلى النهاية لعرض التتبُّع ضمن السياق.

آثار الأنشطة من البداية إلى النهاية

10. إخلاء مساحة تخزين والاطّلاع على مزيد من المعلومات

وتعلّمت كيفية استخدام "إحصاءات طلبات البحث" لمراقبة أداء الطلبات والتحقّق منها باستخدام تطبيق Node.js وقاعدة بيانات Cloud SQL PostgreSQL.

التنظيف

إذا كنت لا تريد إبقاء مثيل Cloud SQL قيد التشغيل، يمكنك حذفه الآن.

gcloud sql instances delete my-instance

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