مقدمه ای بر Query Insights برای Cloud SQL

1. قبل از شروع

Query Insights برای Cloud SQL به شما کمک می کند مشکلات عملکرد پرس و جو را برای پایگاه داده های Cloud SQL شناسایی، تشخیص و پیشگیری کنید. این اطلاعات سلف سرویس، نظارت بصری و تشخیصی را ارائه می دهد که فراتر از تشخیص است تا به شما در شناسایی علت اصلی مشکلات عملکرد کمک کند.

در این کد لبه، یاد خواهید گرفت که چگونه یک Cloud SQL را برای نمونه PostgreSQL راه اندازی کنید، یک برنامه Node.js را برای استفاده از نمونه Cloud SQL به عنوان ذخیره سازی پشتیبان آن، و سپس از Query Insights برای مشاهده و نظارت بر پرس و جوها استفاده کنید.

پیش نیازها

  • آشنایی اولیه با زبان و ابزار برنامه نویسی Node.js

کاری که خواهی کرد

  • از Cloud SQL در برنامه Node.js استفاده کنید.
  • SQL Commenter را در برنامه Node.js فعال کنید.
  • از Query Insights برای Cloud SQL برای نظارت و بررسی عملکرد پرس و جو استفاده کنید.

آنچه شما نیاز دارید

  • یک حساب Google Cloud که در آن مجوز فعال کردن API و ایجاد خدمات را دارید

2. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به کنسول Cloud وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. (اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .)

شناسه پروژه را برای پروژه ای که استفاده می کنید به خاطر بسپارید. بعداً در این آزمایشگاه کد به عنوان PROJECT-ID نامیده خواهد شد.

  1. در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورت‌حساب را در Cloud Console فعال کنید .

اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. حتماً دستورالعمل‌های موجود در بخش «پاکسازی و کسب اطلاعات بیشتر» را دنبال کنید، که به شما توصیه می‌کند چگونه منابع را خاموش کنید تا بیش از این آموزش متحمل صورت‌حساب نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید.

پوسته ابری را فعال کنید

اگر قبلاً Cloud Shell را راه‌اندازی نکرده‌اید، با یک صفحه میانی (زیر تاشو) روبرو می‌شوید که آن را توصیف می‌کند. اگر اینطور است، روی Continue کلیک کنید (و دیگر آن را نخواهید دید). در اینجا به نظر می رسد که آن صفحه یک بار مصرف:

پنجره گفتگوی پوسته ابری

تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.

ترمینال پوسته ابری

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و اح��از هویت را بسیار افزایش می دهد.

  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که از پروژه صحیح استفاده می کنید:

پس از اتصال به Cloud Shell، باید ببینید که قبلاً احراز هویت شده اید و پروژه قبلاً روی ID پروژه شما تنظیم شده است.

دستور زیر را اجرا کنید تا تأیید کنید که از پروژه درست استفاده می کنید.

gcloud config list project

اگر می خواهید از پروژه ای متفاوت از پروژه ای که هنگام باز کردن Cloud Shell انتخاب کرده بودید استفاده کنید، می توانید با اجرای:

gcloud config set project <PROJECT-ID>;

3. با فعال کردن Query Insights یک Cloud SQL برای نمونه PostgreSQL تنظیم کنید

  1. پس از راه‌اندازی Cloud Shell، می‌توانید از خط فرمان برای ایجاد یک نمونه جدید Cloud SQL با نام my-instance با Query Insights استفاده کنید:
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> به شما اجازه می دهد تا رمز عبور کاربر root postgres را مشخص کنید. مطمئن شوید که <PASSWORD> را با یک رمز عبور انتخابی خود جایگزین کنید.
  • پرچم --insights-config-query-insights-enabled Query Insights را در نمونه شما فعال می کند.
  • پرچم --insights-config-record-application-tags اجازه می دهد تا برچسب های برنامه ضبط شوند. در بخش‌های بعدی درباره برچسب‌های برنامه بیشتر خواهید آموخت.
  • پرچم --insights-config-record-client-address اجازه می دهد تا آدرس های IP مشتری توسط Query Insights ثبت شود.

ممکن است از شما خواسته شود که API sqladmin.googleapis.com را برای پروژه خود فعال کنید. اگر از شما خواسته شد، y را انتخاب کنید تا API فعال شود.

ایجاد نمونه چند دقیقه طول می کشد. پس از اتمام این عملیات، نمونه شما آماده استفاده خواهد بود.

  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. یک حساب سرویس برای استفاده با برنامه ایجاد کنید

حساب های سرویس برای اعطای مجوز برای استفاده از سرویس های مختلف در پروژه GCP شما استفاده می شود. برای این کد لبه، شما به یکی نیاز دارید تا به Cloud SQL Proxy اجازه اتصال به نمونه Cloud SQL خود را بدهید.

یک حساب سرویس در کنسول ایجاد کنید

  1. به صفحه حساب های خدمات IAM بروید و روی آن کلیک کنید -PCvKR3aQ2zKaUcml8w9lW4JNlmYtN5-r2--mC6kMUp6HOXW8wT1wUvLoYEPU-aA-oGskT3XkAqfNwRAKkZkllwTe6ugdrUVFwaeKT0GHM8M9WTSwLyRe دکمه بالای صفحه
  2. به حساب سرویس خود یک نام و شناسه منحصربفرد بدهید و روی ایجاد کلیک کنید.
  3. در صفحه بعد، روی منوی کشویی انتخاب نقش کلیک کنید. برای "Cloud SQL" فیلتر کنید و نقش Cloud SQL Client را انتخاب کنید. روی ادامه کلیک کنید و سپس روی انجام شد .
  4. پس از ایجاد حساب سرویس، روی سه نقطه زیر Actions برای حساب سرویس جدید خود کلیک کنید و Manage keys را انتخاب کنید. در صفحه بعد، ADD KEY و سپس Create new key را انتخاب کنید. JSON انتخاب خواهد شد. آن پیش فرض را نگه دارید و روی CREATE کلیک کنید. با این کار یک فایل کلید خصوصی .json دانلود می شود. روی CLOSE کلیک کنید.
  5. در Cloud Shell، روی سه نقطه برای منوی More کلیک کنید و آپلود فایل را انتخاب کنید. به فایل json. که در دستگاه محلی خود دانلود کرده اید، بروید و آن را انتخاب کنید. با این کار فایل json. در فهرست اصلی شما در Cloud Shell آپلود می شود.

5. Cloud SQL Proxy را نصب و راه اندازی کنید

شما از 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. روی Web Preview کلیک کنید نماد پیش نمایش وب در Cloud Shell، سپس Preview در پورت 8080 را انتخاب کنید.

پیش نمایش آیتم منو پورت 8080

باید برنامه رأی گیری Tabs vs Spaces را همانطور که در اینجا در مرورگر خود نشان داده شده است ببینید:

اسکرین شات برنامه رأی گیری Tabs vs Spaces

  1. روی دکمه ها کلیک کنید تا تعدادی رای ایجاد کنید و برخی از داده ها را در پایگاه داده ذخیره کنید.

7. یک صفحه برای مشاهده همه آرا اضافه کنید

از آنجایی که این نمونه برنامه بسیار ساده است، یک صفحه اضافی اضافه خواهید کرد که تمام آرا را نمایش می دهد. دلیل اصلی انجام این کار این است که وقتی بعداً از Query Insights استفاده می‌کنید، داده‌های بیشتری برای مشاهده دارید.

  1. Ctrl+c را در Cloud Shell خود وارد کنید تا برنامه نمونه متوقف شود.
  2. در Cloud Shell، روی دکمه ویرایشگر را باز کنید دکمه برای راه اندازی Cloud Shell Editor.
  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. را کلیک کنید دکمه ترمینال را باز کنید را فشار دهید تا به Cloud Shell برگردید و اجرا کنید:
npm start
  1. برنامه را از پیش نمایش وب باز کنید تا مطمئن شوید که کار می کند. برای مشاهده صفحه جدیدی که اضافه کرده اید /getAllVotes در URL در مرورگر اضافه کنید.

8. SQL Commenter را در برنامه فعال کنید

اکنون SQL Commenter را نصب و فعال خواهید کرد، یک کتابخانه منبع باز که ORM ها را قادر می سازد تا عبارات SQL را با نظرات قبل از اجرا تقویت کنند. SQLcommenter از چندین ORM و چارچوب پشتیبانی می‌کند، از جمله مواردی که برنامه نمونه استفاده می‌کند: Knex.js. Query Insights از اطلاعات موجود در این نظرات برای ارائه یک نمای برنامه محور به عملکرد پایگاه داده و شناسایی کدهای برنامه کاربردی که باعث ایجاد مشکل شده است استفاده می کند. انتظار می رود سربار عملکرد کوچک باشد. به مستندات 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، روی دکمه ویرایشگر را باز کنید دکمه برای راه اندازی Cloud Shell Editor.
  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. را کلیک کنید دکمه ترمینال را باز کنید را فشار دهید تا به Cloud Shell برگردید و اجرا کنید:
npm start
  1. در برنامه Tabs vs Spaces، روی دکمه‌ها کلیک کنید تا رای بیشتری داده شود تا داده‌های بیشتری به پایگاه داده اضافه شود.

9. از Insights برای مشاهده عملکرد پرس و جو و ردیابی سرتاسر استفاده کنید

داشبورد Query Insights به شما کمک می‌کند عیب‌یابی پرس‌و‌جوهای Cloud SQL را پیدا کنید تا به دنبال مشکلات عملکرد باشید. برای دسترسی به Insights، Query insights را در ناوبری سمت چپ برای نمونه Cloud SQL خود انتخاب کنید.

بارگذاری پایگاه داده - نمودار همه پرس و جوها

داشبورد Query Insights سطح بالای بارگذاری پایگاه داده - نمودار همه پرسش‌ها را نشان می‌دهد.

نمودار همه پرس و جوها

این نمودار حاوی اطلاعات ظرفیت CPU، انتظار CPU و CPU، IO Wait و Lock Wait است. می‌توانید درباره معنای این معیارها، جایی که معیارها ذخیره می‌شوند، بیشتر بدانید و نمونه‌هایی از ظاهر این نمودار برای جستارهای مشکل‌ساز در مستندات را ببینید. در مورد این نمونه برنامه، بار پرس و جو پایگاه داده کم است، بنابراین هیچ سنبله بزرگی در نمودار وجود ندارد.

کدام کوئری ها بیشترین بار را دارند؟

در زیر نمودار، جدول QUERIES را خواهید دید که شامل پرس و جوهای نرمال شده برای محدوده زمانی انتخابی شما است. کوئری های جدول بر اساس کل زمان اجرا مرتب شده اند.

جدول پرس و جوهای برتر

برای مشاهده اطلاعات دقیق درباره پرس و جو، مانند بارگذاری پایگاه داده برای این پرس و جو خاص، تأخیر پرس و جو، نمونه طرح پرس و جو، و کاربران برتر، می توانید روی یک پرس و جو کلیک کنید. اگر یک برنامه با استفاده از یک ORM ساخته شده باشد، همانطور که در مورد نمونه برنامه کاربردی وجود دارد، ممکن است ندانید که کدام بخش از برنامه مسئول کدام کوئری است. بخش Top Tags می تواند به شما در درک این موضوع کمک کند.

بار پرس و جو از کجا در برنامه ایجاد می شود؟

از جدول QUERIES به جدول TAGS تغییر وضعیت دهید تا فهرستی از پرس و جوهایی که با منطق تجاری برچسب گذاری شده اند را مشاهده کنید و نمای برنامه محور بیشتری به شما ارائه دهد.

جدول بالا برچسب ها

در جدول TAGS، می توانید بارگذاری پایگاه داده را مشاهده کنید که توسط کدام مسیر بارگذاری ایجاد شده است. در تصویر بالا، می بینید که مسیر '/getAllVotes' میانگین زمان اجرای بالاتری دارد و به طور متوسط ​​ردیف های بیشتری برگردانده شده است. در حالی که زمان اجرایی که در جدول می بینیم در این مورد مشکل ساز نیست، اجازه دهید به هر حال روی ردیف '/getAllVotes' کلیک کنیم تا داده ها را با جزئیات بیشتری بررسی کنیم.

چرا پرس و جوها به کندی اجرا می شوند؟

برای مشاهده طرح پرس و جو، روی نقطه در نمودار نمونه طرح پرس و جو کلیک کنید.

نمونه طرح های پرس و جو

طرح های پرس و جو نشان می دهند که PostgreSQL چگونه یک پرس و جو را در زیر پوشش ها اجرا می کند و تشخیص اینکه آیا عملیاتی وجود دارد که منجر به کندی می شود آسان تر می شود.

کدام کد برنامه به کندی کمک می کند؟

Query Insights همچنین تجسم درون متنی ردیابی سرتاسری را ارائه می‌کند، که می‌تواند برای انجام تحقیقات بیشتر در مورد بخش‌هایی از یک برنامه کاربردی که جست‌وجوهای کند ایجاد می‌کنند مفید باشد.

برای مشاهده ردیابی درون متنی، روی تب END TO END کلیک کنید.

رد به پایان

10. پاکسازی کنید و بیشتر بدانید

یاد گرفتید که چگونه از Query Insights برای نظارت و بررسی عملکرد پرس و جو با یک برنامه Node.js و یک پایگاه داده Cloud SQL PostgreSQL استفاده کنید!

تمیز کردن

اگر نمی خواهید نمونه Cloud SQL خود را در حال اجرا نگه دارید، می توانید اکنون آن را حذف کنید.

gcloud sql instances delete my-instance

بیشتر بدانید