Pengantar Cloud SQL Insights

Cloud SQL Insights membantu Anda mendeteksi, mendiagnosis, dan mencegah masalah performa kueri untuk database Cloud SQL. Solusi ini menyediakan informasi layanan mandiri, pemantauan yang intuitif, dan diagnostik yang lebih dari sekadar deteksi untuk membantu Anda mengidentifikasi penyebab utama masalah performa.

Di codelab ini, Anda akan mempelajari cara menyiapkan instance Cloud SQL untuk PostgreSQL, men-deploy aplikasi Node.js untuk menggunakan instance Cloud SQL sebagai penyimpanan backendnya, lalu menggunakan Cloud SQL Insights untuk melihat dan memantau kueri.

Prasyarat

  • Pemahaman dasar tentang bahasa dan alat pemrograman Node.js

Yang akan Anda lakukan

  • Menggunakan Cloud SQL di aplikasi Node.js.
  • Mengaktifkan SQL Commenter di aplikasi Node.js.
  • Menggunakan Cloud SQL Insights untuk memantau dan menyelidiki performa kueri.

Yang akan Anda perlukan

  • Akun Google Cloud tempat Anda memiliki izin untuk mengaktifkan API dan membuat layanan

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.)

Ingat project ID untuk project yang Anda gunakan. Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT-ID.

  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Pastikan untuk mengikuti petunjuk yang ada di bagian "Pembersihan dan Pelajari Lebih Lanjut", yang memberi tahu Anda cara menonaktifkan resource sehingga tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Aktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell.

Aktifkan Cloud Shell

Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:

jendela dialog cloud shell

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

terminal cloud shell

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda menggunakan project yang benar:

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda.

Jalankan perintah berikut untuk mengonfirmasi bahwa Anda menggunakan project yang benar.

gcloud config list project

Jika Anda ingin menggunakan project yang berbeda dari project yang dipilih saat membuka Cloud Shell, Anda dapat menyetel project baru dengan menjalankan:

gcloud config set project <PROJECT-ID>;
  1. Setelah Cloud Shell diluncurkan, Anda dapat menggunakan command line untuk membuat instance Cloud SQL baru yang bernama my-instance, dengan Cloud SQL Insights diaktifkan:
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

Berikut adalah penjelasan singkat tentang flag dan artinya:

  • Flag --tier db-f1-micro menentukan jenis mesin dengan resource minimum, karena ini adalah untuk tujuan pengembangan, dan Anda tidak memerlukan banyak resource untuk codelab. Anda dapat mempelajari tingkatan lebih lanjut di sini.
  • Flag --database-version=POSTGRES_12 membuat instance yang akan menjadi PostgreSQL versi 12.
  • Flag --region=us-central menentukan region tempat instance akan dibuat.
  • Flag --root-password=<PASSWORD> memungkinkan Anda menentukan sandi untuk pengguna postgres root. Pastikan untuk mengganti <PASSWORD> dengan sandi pilihan Anda.
  • Flag --insights-config-query-insights-enabled mengaktifkan Cloud SQL Insights pada instance Anda.
  • Flag --insights-config-record-application-tags membuat tag aplikasi bisa dicatat. Anda akan mempelajari lebih lanjut tentang tag aplikasi di bagian selanjutnya.
  • Flag --insights-config-record-client-address memungkinkan alamat IP klien dicatat oleh Cloud SQL Insights.

Anda mungkin akan diminta untuk mengaktifkan API sqladmin.googleapis.com untuk project Anda. Jika diminta, pilih y untuk mengaktifkan API.

Pembuatan instance akan memerlukan waktu beberapa menit. Setelah operasi ini selesai, instance Anda akan siap digunakan.

  1. Sekarang buat database yang akan Anda gunakan untuk aplikasi contoh:
gcloud sql databases create votesdb --instance my-instance

Anda juga dapat mengakses dan mengonfigurasi instance melalui Cloud Console.

  1. Dapatkan nama koneksi instance dalam format PROJECT-ID:ZONE-ID:INSTANCE-ID dengan menjalankan perintah berikut. Anda akan menggunakannya nanti dalam mengonfigurasi aplikasi Node.js.
gcloud sql instances describe my-instance | grep connectionName

Akun layanan digunakan untuk memberikan izin penggunaan layanan yang berbeda dalam project GCP Anda. Untuk codelab ini, Anda memerlukannya agar dapat memberikan izin kepada Proxy Cloud SQL untuk terhubung ke instance Cloud SQL Anda.

Membuat akun layanan di Console

  1. Buka halaman akun layanan IAM dan klik tombol -PCvKR3aQ2zKaUcml8w9lW4JNlmYtN5-r2--mC6kMUp6HOXW8wT1wUvLoYEPU-aA-oGskT3XkAqfNwRAKkZkllwTe6ugdrUVFwaeKT0M9Y1RwHA8JPZeGmCWYBfr8d9TSycNMIRsLw di bagian atas halaman.
  2. Beri nama dan ID yang unik untuk akun layanan Anda, lalu klik BUAT.
  3. Di halaman berikutnya, klik menu drop-down untuk Memilih peran. Filter untuk "Cloud SQL" dan pilih peran Cloud SQL Client. Klik LANJUTKAN lalu klik SELESAI.
  4. Setelah akun layanan dibuat, klik tiga titik di bawah Tindakan untuk akun layanan baru Anda dan pilih Buat kunci. JSON akan dipilih; tetap gunakan itu sebagai default, lalu klik BUAT. Tindakan ini akan mendownload file kunci pribadi .json. Klik TUTUP.
  5. Di Cloud Shell, klik tiga titik untuk menu Lainnya dan pilih Upload File. Cari file .json yang Anda download di mesin lokal Anda, lalu pilih file tersebut. Tindakan ini akan mengupload file .json ke direktori beranda Anda di Cloud Shell.

Anda akan menggunakan Proxy Cloud SQL untuk komunikasi antara aplikasi dan instance database.

  1. Download proxy Cloud SQL. Di Cloud Shell, Anda dapat menjalankan:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
  1. Untuk menjalankan proxy, gunakan nama koneksi instance yang Anda salin dari detail instance Cloud SQL untuk mengganti <INSTANCE_CONNECTION_NAME>. Untuk file kredensial, masukkan jalur ke file yang Anda upload di langkah terakhir.
./cloud_sql_proxy -credential_file=/path/to/credential_file.json -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

Jika berhasil, Anda akan melihat beberapa baris output, yang diakhiri dengan pesan Ready for new connections.

  1. Clone repo untuk aplikasi contoh, dan instal paket yang diperlukan untuk menjalankan aplikasi.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples/

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

npm install
  1. Tetapkan variabel lingkungan berikut:
export CLOUD_SQL_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. Jalankan createTable.js untuk membuat tabel database yang diperlukan aplikasi dan pastikan database dikonfigurasi dengan benar, lalu mulai aplikasi contoh.
node createTable.js $DB_USER $DB_PASS $DB_NAME $CLOUD_SQL_CONNECTION_NAME votes $DB_HOST

npm start
  1. Klik Pratinjau Webikon pratinjau web di Cloud Shell, lalu pilih Pratinjau di port 8080.

Pratinjau pada item menu port 8080

Anda akan melihat aplikasi voting Tabs vs Spaces seperti yang ditampilkan di browser Anda:

Screenshot aplikasi voting Tabs vs Spaces

  1. Klik tombol untuk memberikan suara dan menyimpan beberapa data di database.

Karena contoh aplikasi ini sangat sederhana, Anda akan menambahkan halaman tambahan yang menampilkan semua suara. Alasan utama melakukan hal ini adalah agar Anda memiliki lebih banyak data untuk dilihat saat menggunakan Cloud SQL Insights nanti.

  1. Masukkan Ctrl+c di Cloud Shell untuk menghentikan aplikasi contoh.
  2. Di Cloud Shell, klik tombol Tombol Buka Editor untuk meluncurkan Editor Cloud Shell.
  3. Di file explorer, temukan nodejs-docs-samples/cloud-sql/postgres/knex/server.js lalu klik untuk memuat file server.js di editor.

Tambahkan kode berikut setelah fungsi getVotes ditentukan:

/**
 * 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. Tambahkan kode berikut untuk rute '/getAllVotes' di bawah ini tempat rute lainnya ditentukan:
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. Buat file baru di direktori nodejs-docs-samples/cloud-sql/postgres/knex/views yang diberi nama allvotes.pug. Tempelkan kode berikut:
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. Klik tombol Tombol Buka Terminal untuk kembali ke Cloud Shell dan jalankan:
npm start
  1. Buka aplikasi dari Pratinjau Web untuk memastikannya berfungsi. Tambahkan /getAllVotes pada URL di browser untuk melihat halaman baru yang Anda tambahkan.

Sekarang Anda akan menginstal dan mengaktifkan SQL Commenter, library open source yang memungkinkan ORM menambah komentar pada pernyataan SQL sebelum eksekusi. SQLcommenter mendukung beberapa ORM dan framework, termasuk yang digunakan oleh aplikasi contoh: Knex.js. Cloud SQL Insights menggunakan informasi dalam komentar ini untuk memberikan tampilan yang berfokus pada aplikasi ke dalam performa database dan mengidentifikasi kode aplikasi yang menyebabkan masalah. Overhead performa diharapkan berukuran kecil, dan Anda dapat menemukan informasi selengkapnya tentang performa di dokumentasi.

  1. Masukkan Ctrl+c di Cloud Shell untuk menghentikan aplikasi contoh.
  2. Jalankan perintah berikut untuk menginstal paket yang diperlukan SQLcommenter:
  npm install @google-cloud/sqlcommenter-knex @opencensus/nodejs @opencensus/propagation-tracecontext @opentelemetry/api @opentelemetry/core --save
  1. Di Cloud Shell, klik tombol Tombol Buka Editor untuk meluncurkan Editor Cloud Shell.
  2. Di file explorer, temukan nodejs-docs-samples/cloud-sql/postgres/knex/server.js lalu klik untuk memuat file server.js di editor.
  3. Temukan kode ini dalam file:
const process = require('process');

Di bawahnya, tambahkan kode berikut:

const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
  1. Temukan kode ini dalam file:
// Set Content-Type for all responses for these routes.
app.use((req, res, next) => {
  res.set('Content-Type', 'text/html');
  next();
});

Di bawahnya, tambahkan kode berikut:

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

Setelah selesai, kode Anda akan terlihat seperti ini:

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

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

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

// Automatically parse request body as form data.
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.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. Klik tombol Tombol Buka Terminal untuk kembali ke Cloud Shell dan jalankan:
npm start
  1. Di aplikasi Tabs vs Spaces, klik tombol tersebut untuk memberikan lebih banyak suara guna menambahkan lebih banyak data ke database.

Dasbor Query Insights membantu Anda memecahkan masalah kueri Cloud SQL untuk mencari masalah performa.

Pemuatan database - grafik semua kueri

Dasbor Query Insights tingkat atas menampilkan Pemuatan database - grafik semua kueri.

Grafik Semua Kueri

Grafik berisi informasi untuk Kapasitas CPU, CPU dan waktu tunggu CPU (CPU wait), waktu tunggu IO (IO Wait), dan Waktu Tunggu Kunci (Lock Wait). Anda dapat mempelajari lebih lanjut tentang arti metrik tersebut, tempat metrik disimpan, dan melihat beberapa contoh tampilan grafik ini untuk kueri bermasalah di dokumentasi. Dalam kasus aplikasi contoh ini, pemuatan kueri database rendah, sehingga tidak ada lonjakan besar pada grafik.

Kueri mana yang paling banyak menyebabkan pemuatan?

Di bawah grafik, Anda akan menemukan tabel QUERIES yang berisi kueri yang dinormalkan untuk rentang waktu yang Anda pilih. Kueri dalam tabel ini diurutkan berdasarkan total waktu eksekusi.

Tabel Kueri Teratas

Anda dapat mengklik masing-masing kueri untuk melihat informasi mendetail tentang kueri tersebut, seperti pemuatan database untuk kueri tertentu ini, latensi kueri, contoh paket kueri, dan pengguna teratas. Jika aplikasi dibuat menggunakan ORM, seperti kasus aplikasi contoh ini, Anda mungkin tidak tahu bagian mana dari aplikasi yang bertanggung jawab atas kueri yang mana. Bagian Tag Teratas dapat membantu Anda mengetahuinya.

Dari mana asal pemuatan kueri di aplikasi?

Beralih dari tabel QUERIES ke tabel TAGS untuk melihat daftar kueri yang diberi tag oleh logika bisnis, sehingga Anda memiliki tampilan yang lebih terfokus pada aplikasi.

Tabel Tag Teratas

Di tabel TAGS, Anda dapat melihat pemuatan database yang dikelompokkan berdasarkan rute yang menghasilkan beban. Pada screenshot di atas, Anda dapat melihat bahwa rute '/getAllVotes' memiliki waktu eksekusi rata-rata yang lebih tinggi dan rata-rata baris yang dihasilkan lebih banyak. Meskipun waktu eksekusi yang kami lihat dalam tabel tidak bermasalah dalam kasus ini, mari klik baris untuk '/getAllVotes' untuk melihat data secara lebih detail.

Mengapa kueri berjalan lambat?

Klik titik di grafik Contoh paket kueri untuk melihat paket kueri.

Contoh paket kueri

Paket kueri menunjukkan cara PostgreSQL menjalankan kueri di bawah sampul, sehingga lebih mudah untuk menentukan apakah ada operasi yang menyebabkan kelambatan.

Kode aplikasi mana yang menyebabkan kelambatan?

Cloud SQL Insights juga memiliki visualisasi dalam konteks pelacakan menyeluruh, yang dapat berguna untuk melakukan penyelidikan lebih lanjut terhadap bagian aplikasi mana yang menghasilkan kueri lambat.

Klik tab END TO END untuk melihat pelacakan dalam konteks.

Pelacakan menyeluruh

Anda telah mempelajari cara menggunakan Cloud SQL Insights untuk memantau dan menyelidiki performa kueri dengan aplikasi Node.js dan database Cloud SQL PostgreSQL!

Membersihkan

Jika tidak ingin instance Cloud SQL tetap berjalan, Anda dapat menghapusnya sekarang.

gcloud sql instances delete my-instance

Pelajari Lebih Lanjut