1. Trước khi bắt đầu
Thông tin chi tiết về truy vấn cho Cloud SQL giúp bạn phát hiện, chẩn đoán và ngăn chặn các vấn đề về hiệu suất truy vấn cho cơ sở dữ liệu Cloud SQL. Công cụ này cung cấp thông tin tự phục vụ, thông tin chẩn đoán và giám sát trực quan, không chỉ phát hiện mà còn giúp bạn xác định nguyên nhân gốc rễ của các vấn đề về hiệu suất.
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách thiết lập một phiên bản Cloud SQL cho PostgreSQL, triển khai một ứng dụng Node.js để sử dụng phiên bản Cloud SQL làm bộ nhớ phụ trợ, sau đó sử dụng Thông tin chi tiết về truy vấn để xem và giám sát các truy vấn.
Điều kiện tiên quyết
- Quen thuộc cơ bản với ngôn ngữ và các công cụ lập trình Node.js
Bạn sẽ thực hiện
- Sử dụng Cloud SQL trong ứng dụng Node.js.
- Bật SQL Commenter trong ứng dụng Node.js.
- Sử dụng Thông tin chi tiết về truy vấn cho Cloud SQL để theo dõi và điều tra hiệu suất truy vấn.
Bạn cần có
- Một tài khoản Google Cloud mà bạn có quyền bật API và tạo dịch vụ
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.)
Ghi nhớ mã dự án mà bạn đang sử dụng. Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT-ID.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.
Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp và tìm hiểu thêm". Phần này hướng dẫn bạn cách tắt các tài nguyên để không phải trả phí ngoài phạm vi hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell.
Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:
Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.
Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đang sử dụng đúng dự án:
Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn.
Chạy lệnh sau để xác nhận rằng bạn đang sử dụng đúng dự án.
gcloud config list project
Nếu muốn sử dụng một dự án khác với dự án bạn đã chọn khi mở Cloud Shell, bạn có thể thiết lập một dự án mới bằng cách chạy:
gcloud config set project <PROJECT-ID>;
3. Thiết lập một phiên bản Cloud SQL cho PostgreSQL có bật tính năng Thông tin chi tiết về truy vấn
- Sau khi Cloud Shell khởi chạy, bạn có thể sử dụng dòng lệnh để tạo một phiên bản Cloud SQL mới có tên là
my-instance, có bật tính năng Thông tin chi tiết về truy vấn:
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
Sau đây là phần giải thích ngắn gọn về các cờ và ý nghĩa của chúng:
- Cờ
--tier db-f1-microchỉ định một loại máy có tài nguyên tối thiểu, vì đây là mục đích phát triển và bạn không cần nhiều tài nguyên cho lớp học lập trình. Bạn có thể tìm hiểu thêm về các cấp độ tại đây. - Cờ
--database-version=POSTGRES_12tạo một phiên bản sẽ là PostgreSQL phiên bản 12. - Cờ
--region=us-centralchỉ định khu vực nơi phiên bản sẽ được tạo. - Cờ
--root-password=<PASSWORD>cho phép bạn chỉ định mật khẩu cho người dùngpostgresgốc. Nhớ thay thế <PASSWORD> bằng mật khẩu bạn chọn. - Cờ
--insights-config-query-insights-enabledcho phép bạn sử dụng Thông tin chi tiết về truy vấn trên phiên bản của mình. - Cờ
--insights-config-record-application-tagscho phép ghi lại các thẻ ứng dụng. Bạn sẽ tìm hiểu thêm về thẻ ứng dụng trong các phần sau. - Cờ
--insights-config-record-client-addresscho phép Thông tin chi tiết về truy vấn ghi lại địa chỉ IP của máy khách.
Bạn có thể được nhắc bật API sqladmin.googleapis.com cho dự án của mình. Nếu được nhắc, hãy chọn y để bật API.
Quá trình tạo phiên bản sẽ mất vài phút. Sau khi hoàn tất thao tác này, phiên bản của bạn sẽ sẵn sàng sử dụng.
- Bây giờ, hãy tạo một cơ sở dữ liệu mà bạn sẽ dùng cho ứng dụng mẫu:
gcloud sql databases create votesdb --instance my-instance
Bạn cũng có thể truy cập và định cấu hình phiên bản thông qua Cloud Console.
- Lấy tên kết nối của phiên bản ở định dạng
PROJECT-ID:ZONE-ID:INSTANCE-IDbằng cách chạy lệnh sau. Bạn sẽ sử dụng thông tin này sau này khi định cấu hình ứng dụng Node.js.
gcloud sql instances describe my-instance | grep connectionName
4. Tạo tài khoản dịch vụ để sử dụng với ứng dụng
Tài khoản dịch vụ được dùng để cấp quyền sử dụng các dịch vụ khác nhau trong dự án GCP của bạn. Đối với lớp học lập trình này, bạn cần có một dự án để cấp cho Cloud SQL Proxy quyền kết nối với phiên bản Cloud SQL.
Tạo tài khoản dịch vụ trong Bảng điều khiển
- Chuyển đến trang tài khoản dịch vụ IAM rồi nhấp vào nút
ở đầu trang.
- Đặt tên và mã nhận dạng riêng biệt cho tài khoản dịch vụ của bạn rồi nhấp vào TẠO.
- Trên trang tiếp theo, hãy nhấp vào trình đơn thả xuống Chọn vai trò. Lọc theo "Cloud SQL" rồi chọn vai trò Cloud SQL Client. Nhấp vào TIẾP TỤC rồi nhấp vào XONG.
- Sau khi tạo tài khoản dịch vụ, hãy nhấp vào biểu tượng ba dấu chấm trong mục Hành động cho tài khoản dịch vụ mới của bạn rồi chọn Quản lý khoá. Trên trang tiếp theo, hãy chọn THÊM KHOÁ rồi chọn Tạo khoá mới. JSON sẽ được chọn; hãy giữ nguyên chế độ mặc định đó rồi nhấp vào TẠO. Thao tác này sẽ tải tệp khoá riêng tư .json xuống. Nhấp vào ĐÓNG.
- Trong Cloud Shell, hãy nhấp vào biểu tượng ba dấu chấm cho trình đơn Tuỳ chọn khác rồi chọn Tải tệp lên. Duyệt tìm tệp .json mà bạn đã tải xuống trên máy cục bộ rồi chọn tệp đó. Thao tác này sẽ tải tệp .json lên thư mục gốc của bạn trong Cloud Shell.
5. Cài đặt và khởi chạy Cloud SQL Proxy
Bạn sẽ dùng Cloud SQL Proxy để giao tiếp giữa ứng dụng và phiên bản cơ sở dữ liệu.
- Tải Cloud SQL Proxy xuống. Trong Cloud Shell, bạn có thể chạy:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
- Chạy proxy như sau sau khi thay thế
<INSTANCE_CONNECTION_NAME>bằng tên kết nối phiên bản mà bạn đã sao chép từ trang Tổng quan về phiên bản Cloud SQL.
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &
Nếu thành công, bạn sẽ thấy một vài dòng đầu ra, kết thúc bằng thông báo Ready for new connections.
6. Sao chép và kiểm thử ứng dụng trên thiết bị
- Sao chép kho lưu trữ cho ứng dụng mẫu và cài đặt các gói cần thiết để chạy ứng dụng.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples/ cd nodejs-docs-samples/cloud-sql/postgres/knex npm install
- Thiết lập các biến môi trường sau:
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'
- Khởi động ứng dụng mẫu.
npm start
- Nhấp vào Web Preview (Xem trước trên web)
trong Cloud Shell, rồi chọn Preview on port 8080 (Xem trước trên cổng 8080).

Bạn sẽ thấy ứng dụng bình chọn Thẻ so với Khoảng trắng như minh hoạ ở đây trong trình duyệt:

- Nhấp vào các nút để bình chọn và lưu một số dữ liệu vào cơ sở dữ liệu.
7. Thêm một trang để xem tất cả các lượt bình chọn
Vì ứng dụng mẫu này rất đơn giản, nên bạn sẽ thêm một trang khác để hiển thị tất cả các lượt bình chọn. Lý do chính cho việc này là để bạn có thêm dữ liệu để xem khi sử dụng Thông tin chi tiết về truy vấn sau này.
- Nhập
Ctrl+cvào Cloud Shell để dừng ứng dụng mẫu. - Trong Cloud Shell, hãy nhấp vào nút
để khởi chạy Trình chỉnh sửa Cloud Shell. - Trong trình khám phá tệp, hãy tìm
nodejs-docs-samples/cloud-sql/postgres/knex/server.jsrồi nhấp vào tệp đó để tải tệpserver.jsvào trình chỉnh sửa.
Thêm mã sau vào sau vị trí xác định hàm 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');
};
- Thêm mã sau cho tuyến đường
'/getAllVotes'bên dưới vị trí xác định các tuyến đường khác:
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();
}
});
- Tạo một tệp mới trong thư mục
nodejs-docs-samples/cloud-sql/postgres/knex/viewscó tên làallvotes.pug. Dán mã sau:
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}.
- Nhấp vào nút
để quay lại Cloud Shell và chạy:
npm start
- Mở ứng dụng từ Web Preview để đảm bảo ứng dụng hoạt động. Thêm
/getAllVotesvào URL trong trình duyệt để xem trang mới mà bạn đã thêm.
8. Bật SQL Commenter trong ứng dụng
Bây giờ, bạn sẽ cài đặt và bật SQL Commenter, một thư viện nguồn mở cho phép ORM tăng cường các câu lệnh SQL bằng các nhận xét trước khi thực thi. SQLcommenter hỗ trợ một số ORM và khung, bao gồm cả khung mà ứng dụng mẫu sử dụng: Knex.js. Thông tin chi tiết về truy vấn sử dụng thông tin trong các nhận xét này để cung cấp chế độ xem tập trung vào ứng dụng về hiệu suất cơ sở dữ liệu và xác định mã xử lý ứng dụng nào đang gây ra vấn đề. Mức hao tổn hiệu suất dự kiến sẽ nhỏ. Xem tài liệu về Thông tin chi tiết về truy vấn.
- Nhập
Ctrl+cvào Cloud Shell để dừng ứng dụng mẫu. - Chạy lệnh sau để cài đặt các gói mà SQLcommenter cần:
npm install @google-cloud/sqlcommenter-knex @opencensus/nodejs @opencensus/propagation-tracecontext @opentelemetry/api @opentelemetry/core --save
- Trong Cloud Shell, hãy nhấp vào nút
để khởi chạy Trình chỉnh sửa Cloud Shell. - Trong trình khám phá tệp, hãy tìm
nodejs-docs-samples/cloud-sql/postgres/knex/server.jsrồi nhấp vào tệp đó để tải tệpserver.jsvào trình chỉnh sửa. - Tìm mã này trong tệp:
const process = require('process');
Bên dưới, hãy thêm mã sau:
const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
- Tìm mã này trong tệp:
// Set Content-Type for all responses for these routes.
app.use((req, res, next) => {
res.set('Content-Type', 'text/html');
next();
});
Bên dưới, hãy thêm mã sau:
app.use(wrapMainKnexAsMiddleware(Knex, {
traceparent: true,
tracestate: true,
route: true,
db_driver: true
}));
Sau khi hoàn tất, mã của bạn sẽ có dạng như sau:
...
// 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
}));
...
- Nhấp vào nút
để quay lại Cloud Shell và chạy:
npm start
- Trong ứng dụng Tabs vs Spaces (Dấu cách so với phím tab), hãy nhấp vào các nút để bỏ thêm phiếu bầu nhằm bổ sung dữ liệu vào cơ sở dữ liệu.
9. Sử dụng Thông tin chi tiết để xem hiệu suất truy vấn và tính năng theo dõi từ đầu đến cuối
Trang tổng quan Thông tin chi tiết về truy vấn giúp bạn khắc phục sự cố về truy vấn Cloud SQL để tìm các vấn đề về hiệu suất. Để truy cập vào Thông tin chi tiết, hãy chọn Thông tin chi tiết về truy vấn trong trình đơn điều hướng bên trái cho phiên bản Cloud SQL của bạn.
Tải cơ sở dữ liệu – biểu đồ tất cả các truy vấn
Trang tổng quan Thông tin chi tiết về truy vấn cấp cao nhất cho thấy biểu đồ Mức sử dụng cơ sở dữ liệu – tất cả truy vấn.

Biểu đồ này chứa thông tin về Dung lượng CPU, CPU và thời gian chờ CPU, thời gian chờ IO và thời gian chờ khoá. Bạn có thể tìm hiểu thêm về ý nghĩa của các chỉ số này, nơi lưu trữ chỉ số và xem một số ví dụ về biểu đồ này cho các truy vấn có vấn đề trong tài liệu. Trong trường hợp ứng dụng mẫu này, mức tải truy vấn cơ sở dữ liệu thấp, nên không có bất kỳ mức tăng đột biến nào trên biểu đồ.
Những truy vấn nào gây ra nhiều tải nhất?
Bên dưới biểu đồ, bạn sẽ thấy bảng QUERIES (Cụm từ tìm kiếm) chứa các cụm từ tìm kiếm được chuẩn hoá cho phạm vi thời gian mà bạn đã chọn. Các truy vấn trong bảng được sắp xếp theo tổng thời gian thực thi.

Bạn có thể nhấp vào một truy vấn riêng lẻ để xem thông tin chi tiết về truy vấn đó, chẳng hạn như mức tải cơ sở dữ liệu cho truy vấn cụ thể này, độ trễ truy vấn, các mẫu kế hoạch truy vấn và những người dùng hàng đầu. Nếu một ứng dụng được tạo bằng ORM, như trong trường hợp của ứng dụng mẫu, thì bạn có thể không biết phần nào của ứng dụng chịu trách nhiệm cho truy vấn nào. Phần Thẻ hàng đầu có thể giúp bạn tìm ra câu trả lời.
Tải truy vấn bắt nguồn từ đâu trong ứng dụng?
Chuyển đổi từ bảng QUERIES (Cụm từ tìm kiếm) sang bảng TAGS (Thẻ) để xem danh sách các cụm từ tìm kiếm được gắn thẻ theo logic nghiệp vụ, giúp bạn có được chế độ xem tập trung hơn vào ứng dụng.

Trong bảng TAGS, bạn có thể xem mức tải cơ sở dữ liệu được phân tích theo tuyến đường tạo ra mức tải đó. Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng tuyến đường '/getAllVotes' có thời gian thực thi trung bình cao hơn và trả về nhiều hàng hơn trung bình. Mặc dù thời gian thực thi mà chúng ta thấy trong bảng không có vấn đề gì trong trường hợp này, nhưng hãy nhấp vào hàng cho '/getAllVotes' để xem dữ liệu chi tiết hơn.
Tại sao các truy vấn chạy chậm?
Nhấp vào dấu chấm trong biểu đồ Mẫu kế hoạch truy vấn để xem kế hoạch truy vấn.

Kế hoạch truy vấn cho biết cách PostgreSQL thực thi một truy vấn, giúp bạn dễ dàng xác định xem có những thao tác nào dẫn đến tình trạng chậm trễ hay không.
Mã xử lý ứng dụng nào đang góp phần làm chậm ứng dụng?
Query Insights cũng cung cấp hình ảnh trực quan trong bối cảnh của hoạt động theo dõi từ đầu đến cuối. Điều này có thể hữu ích cho việc điều tra thêm về những phần của ứng dụng đang tạo ra các truy vấn chậm.
Nhấp vào thẻ END TO END (ĐẦU ĐẾN ĐẦU) để xem dấu vết trong ngữ cảnh.

10. Dọn dẹp và tìm hiểu thêm
Bạn đã tìm hiểu cách sử dụng Thông tin chi tiết về truy vấn để theo dõi và điều tra hiệu suất truy vấn bằng một ứng dụng Node.js và cơ sở dữ liệu Cloud SQL PostgreSQL!
Dọn dẹp
Nếu không muốn tiếp tục chạy phiên bản Cloud SQL, bạn có thể xoá phiên bản đó ngay bây giờ.
gcloud sql instances delete my-instance