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

1. قبل البدء

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

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

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

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

المهام التي ستنفذها

  • استخدام Cloud SQL في تطبيق Node.js
  • تفعيل SQL Commenter في تطبيق 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 for 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 مثيلاً سيكون إصدار PostgreSQL 12.
  • تحدّد العلامة --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 Proxy الإذن بالاتصال بمثيل Cloud SQL.

إنشاء حساب خدمة في وحدة التحكّم

  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 Proxy للتواصل بين التطبيق ومثيل قاعدة البيانات.

  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.

عنصر القائمة &quot;المعاينة على المنفذ 8080&quot;

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

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

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

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

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

  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;فتح Terminal&quot; للرجوع إلى Cloud Shell وتشغيل:
npm start
  1. افتح التطبيق من "معاينة الويب" للتأكّد من أنّه يعمل. أضِف /getAllVotes إلى عنوان URL في المتصفّح لعرض الصفحة الجديدة التي أضفتها.

8. تفعيل SQL Commenter في التطبيق

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

  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;فتح Terminal&quot; للرجوع إلى Cloud Shell وتشغيل:
npm start
  1. في تطبيق Tabs vs Spaces، انقر على الأزرار لتسجيل المزيد من الأصوات لإضافة المزيد من البيانات إلى قاعدة البيانات.

9- استخدام "الإحصاءات" للاطّلاع على أداء طلب البحث وتتبُّع العمليات الشاملة

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

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

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

الرسم البياني &quot;جميع الطلبات&quot;

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

ما هي طلبات البحث المسؤولة عن معظم عمليات التحميل؟

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

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

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

ما هو مصدر تحميل طلب البحث في التطبيق؟

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

جدول &quot;أهم العلامات&quot;

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

لماذا يتم تنفيذ طلبات البحث ببطء؟

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

أمثلة على خطط طلبات البحث

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

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

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

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

التتبُّع الشامل

10. تنظيف الجهاز والاطّلاع على مزيد من المعلومات

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

تنظيف البيانات

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

gcloud sql instances delete my-instance

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