1. قبل البدء
تساعدك أداة "إحصاءات الاستعلامات" في Cloud SQL على رصد مشاكل أداء الاستعلامات في قواعد بيانات Cloud SQL وتشخيصها ومنع حدوثها. وتوفّر هذه الأداة خدمة ذاتية ومراقبة سهلة الاستخدام ومعلومات تشخيصية تتجاوز عملية الرصد لمساعدتك في تحديد السبب الجذري لمشاكل الأداء.
في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية إعداد مثيل PostgreSQL على Cloud SQL، ونشر تطبيق Node.js لاستخدام مثيل Cloud SQL كمساحة تخزين خلفية، ثم استخدام "إحصاءات الطلبات" لعرض الطلبات ومراقبتها.
المتطلبات الأساسية
- معرفة أساسية بلغة البرمجة وأدوات Node.js
المهام التي ستنفِّذها
- استخدام Cloud SQL في تطبيق Node.js
- تفعيل SQL Commenter في تطبيق Node.js
- استخدِم ميزة "إحصاءات حول الاستعلامات" في Cloud SQL لمراقبة أداء الاستعلامات والتحقيق فيه.
المتطلبات
- حساب على Google Cloud لديك فيه أذونات لتفعيل واجهات برمجة التطبيقات وإنشاء الخدمات
2. الإعداد والمتطلبات
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب).
تذكَّر رقم تعريف المشروع الذي تستخدمه، وسيتم الإشارة إليه لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT-ID.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد Google Cloud.
لن يكلفك إكمال هذا الدرس التطبيقي حول الترميز الكثير من المال، إن وجد. احرص على اتّباع أي تعليمات في قسم "إخلاء مساحة ومعرفة المزيد" الذي ينصحك بكيفية إيقاف الموارد حتى لا تتحمّل رسومًا تتجاوز هذا الدليل التوجيهي/التعليمي. يمكن للمستخدمين الجدد في Google Cloud الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell.
إذا لم يسبق لك بدء Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) توضّح ماهيته. في هذه الحالة، انقر على متابعة (ولن تظهر لك مرة أخرى). إليك الشكل الذي ستظهر به هذه الشاشة لمرة واحدة:
يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير.
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من أنّك تستخدم المشروع الصحيح:
بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تم إثبات هويتك وأنّه تم ضبط المشروع على رقم تعريف مشروعك.
نفِّذ الأمر التالي للتأكّد من أنّك تستخدم المشروع الصحيح.
gcloud config list project
إذا كنت تريد استخدام مشروع مختلف عن المشروع الذي اخترته عند فتح Cloud Shell، يمكنك إعداد مشروع جديد من خلال تنفيذ ما يلي:
gcloud config set project <PROJECT-ID>;
3- إعداد مثيل Cloud SQL for PostgreSQL مع تفعيل ميزة "إحصاءات طلبات البحث"
- بعد تشغيل 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 لتفعيل واجهة برمجة التطبيقات.
سيستغرق إنشاء الجهاز الافتراضي عدة دقائق، وبعد اكتمال هذه العملية، سيصبح الجهاز الافتراضي جاهزًا للاستخدام.
- الآن، أنشئ نموذج تطبيق ستستخدمه لقاعدة البيانات:
gcloud sql databases create votesdb --instance my-instance
يمكنك أيضًا الوصول إلى الجهاز الظاهري وضبطه من خلال Cloud Console.
- احصل على اسم الاتصال بالمثيل بالتنسيق
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.
إنشاء حساب خدمة في وحدة التحكّم
- انتقِل إلى صفحة حسابات الخدمة في "إدارة الهوية وإمكانية الوصول" وانقر على الزر
في أعلى الصفحة.
- امنح حساب الخدمة اسمًا ورقم تعريف فريدَين، ثم انقر على إنشاء.
- في الصفحة التالية، انقر على القائمة المنسدلة "اختيار دور". ابحث عن "Cloud SQL" وحدِّد دور "عميل Cloud SQL". انقر على متابعة، ثم انقر على تم.
- بعد إنشاء حساب الخدمة، انقر على النقاط الثلاث ضمن الإجراءات لحساب الخدمة الجديد واختَر "إدارة المفاتيح". في الصفحة التالية، انقر على إضافة مفتاح ثم على إنشاء مفتاح جديد. سيتم اختيار JSON، احتفِظ بهذا الإعداد التلقائي وانقر على إنشاء. سيؤدي ذلك إلى تنزيل ملف مفتاح خاص بتنسيق .json. انقر على إغلاق.
- في Cloud Shell، انقر على النقاط الثلاث في قائمة المزيد، ثم اختَر تحميل ملف. انتقِل إلى ملف .json الذي نزّلته على جهازك المحلي واختَره. سيؤدي ذلك إلى تحميل ملف .json إلى الدليل الرئيسي في Cloud Shell.
5- تثبيت خادم Cloud SQL الوكيل وتشغيله
ستستخدم Cloud SQL Proxy للتواصل بين التطبيق ومثيل قاعدة البيانات.
- نزِّل خادم Cloud SQL الوكيل. في Cloud Shell، يمكنك تشغيل:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
- شغِّل الخادم الوكيل على النحو التالي بعد استبدال
<INSTANCE_CONNECTION_NAME>باسم الاتصال بالمثيل الذي نسخته من صفحة "نظرة عامة" الخاصة بمثيل Cloud SQL.
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &
في حال نجاح ذلك، من المفترض أن ترى بضعة أسطر من الناتج، تنتهي بالرسالة Ready for new connections.
6. استنساخ التطبيق واختباره على الجهاز
- استنسِخ مستودع التطبيق النموذجي، وثبِّت الحِزم اللازمة لتشغيل التطبيق.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples/ cd nodejs-docs-samples/cloud-sql/postgres/knex npm install
- اضبط متغيرات البيئة التالية:
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'
- ابدأ تشغيل نموذج التطبيق.
npm start
- انقر على معاينة الويب
في Cloud Shell، ثم اختَر المعاينة على المنفذ 8080.

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

- انقر على الأزرار للتصويت وحفظ بعض البيانات في قاعدة البيانات.
7. إضافة صفحة لعرض جميع الأصوات
بما أنّ هذا التطبيق النموذجي بسيط جدًا، ستضيف صفحة إضافية تعرض جميع الأصوات. والسبب الرئيسي لذلك هو توفّر المزيد من البيانات التي يمكنك الاطّلاع عليها عند استخدام "إحصاءات طلبات البحث" لاحقًا.
- أدخِل
Ctrl+cفي Cloud Shell لإيقاف نموذج التطبيق. - في Cloud Shell، انقر على الزر
لتشغيل "محرِّر Cloud Shell". - في مستكشف الملفات، ابحث عن
nodejs-docs-samples/cloud-sql/postgres/knex/index.jsوانقر عليه لتحميل ملفindex.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');
};
- أضِف الرمز التالي للمسار
'/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();
}
});
- أنشئ ملفًا جديدًا في الدليل
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}.
- انقر على الزر
للرجوع إلى Cloud Shell وتشغيل:
npm start
- افتح التطبيق من "معاينة الويب" للتأكّد من أنّه يعمل، وأضِف
/getAllVotesإلى عنوان URL في المتصفّح لعرض الصفحة الجديدة التي أضفتها.
8. تفعيل SQL Commenter في التطبيق
الآن، عليك تثبيت SQL Commenter وتفعيله، وهو مكتبة مفتوحة المصدر تتيح لبرامج ORM إضافة تعليقات إلى عبارات SQL قبل تنفيذها. تتوافق SQLcommenter مع العديد من برامج ORM وأُطر العمل، بما في ذلك البرنامج الذي يستخدمه نموذج التطبيق: Knex.js. تستخدم "إحصاءات الاستعلامات" المعلومات الواردة في هذه التعليقات لتقديم نظرة شاملة على أداء قاعدة البيانات من منظور التطبيق وتحديد الرمز البرمجي للتطبيق الذي يسبّب المشاكل. ومن المتوقّع أن يكون الحمل الزائد للأداء صغيرًا. راجِع مستندات إحصاءات الاستعلامات.
- أدخِل
Ctrl+cفي Cloud Shell لإيقاف نموذج التطبيق. - نفِّذ الأمر التالي لتثبيت الحِزم التي يحتاجها SQLcommenter:
npm install @google-cloud/sqlcommenter-knex @opencensus/nodejs @opencensus/propagation-tracecontext @opentelemetry/api @opentelemetry/core --save
- في Cloud Shell، انقر على الزر
لتشغيل "محرِّر Cloud Shell". - في مستكشف الملفات، ابحث عن
nodejs-docs-samples/cloud-sql/postgres/knex/server.jsوانقر عليه لتحميل ملفserver.jsفي المحرّر. - ابحث عن هذا الرمز في الملف:
const process = require('process');
أضِف الرمز التالي أدناه:
const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
- ابحث عن هذا الرمز في الملف:
// 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
}));
...
- انقر على الزر
للرجوع إلى Cloud Shell وتشغيل:
npm start
- في تطبيق Tabs vs Spaces، انقر على الأزرار لتسجيل المزيد من الأصوات لإضافة المزيد من البيانات إلى قاعدة البيانات.
9- استخدام "الإحصاءات" للاطّلاع على أداء طلبات البحث وتتبُّعها من البداية إلى النهاية
تساعدك لوحة بيانات Query Insights في تحديد المشاكل وحلّها في استعلامات Cloud SQL للبحث عن مشاكل في الأداء. للوصول إلى Insights، اختَر إحصاءات الاستعلامات في شريط التنقّل الأيمن لمثيل Cloud SQL.
تحميل قاعدة البيانات - الرسم البياني لجميع طلبات البحث
تعرض لوحة بيانات "إحصاءات طلبات البحث" ذات المستوى الأعلى الرسم البياني تحميل قاعدة البيانات - جميع طلبات البحث.

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

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

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

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

10. تنظيف الجهاز والاطّلاع على مزيد من المعلومات
لقد تعلّمت كيفية استخدام ميزة "إحصاءات الاستعلامات" لمراقبة أداء الاستعلامات والتحقيق فيه باستخدام تطبيق Node.js وقاعدة بيانات PostgreSQL على Cloud SQL.
تنظيف البيانات
إذا كنت لا تريد إبقاء مثيل Cloud SQL قيد التشغيل، يمكنك حذفه الآن.
gcloud sql instances delete my-instance