1. Başlamadan önce
Cloud SQL için Sorgu Analizleri, Cloud SQL veritabanlarında sorgu performansıyla ilgili sorunları tespit etmenize, teşhis etmenize ve önlemenize yardımcı olur. Performans sorunlarının temel nedenini belirlemenize yardımcı olmak için algılamanın ötesine geçen self servis, sezgisel izleme ve teşhis bilgileri sağlar.
Bu codelab'de, PostgreSQL için Cloud SQL örneği oluşturmayı, Cloud SQL örneğini arka uç depolama alanı olarak kullanacak bir Node.js uygulaması dağıtmayı ve ardından sorguları görüntülemek ve izlemek için Query Insights'ı kullanmayı öğreneceksiniz.
Ön koşullar
- Node.js programlama dili ve araçları hakkında temel düzeyde bilgi sahibi olmak
Yapacaklarınız
- Node.js uygulamasında Cloud SQL'i kullanma
- Node.js uygulamasında SQL Commenter'ı etkinleştirin.
- Sorgu performansını izlemek ve incelemek için Cloud SQL için Sorgu Analizleri'ni kullanın.
Gerekenler
- API'leri etkinleştirme ve hizmet oluşturma izninizin olduğu bir Google Cloud hesabı
2. Kurulum ve şartlar
Yönlendirmesiz ortam kurulumu
- Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. (Gmail veya Google Workspace hesabınız yoksa oluşturmanız gerekir.)
Kullandığınız projenin proje kimliğini unutmayın. Bu codelab'in ilerleyen kısımlarında PROJECT-ID olarak adlandırılacaktır.
- Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları nasıl kapatacağınız konusunda size tavsiyelerde bulunan "Temizleme ve Daha Fazla Bilgi" bölümündeki talimatları uyguladığınızdan emin olun. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.
Cloud Shell'i etkinleştirme
- Cloud Console'da, Cloud Shell'i etkinleştir'i tıklayın.
Cloud Shell'i daha önce hiç başlatmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmı) gösterilir. Bu durumda Devam'ı tıkladığınızda bu ekranı bir daha görmezsiniz. Bu tek seferlik ekran aşağıdaki gibi görünür:
Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.
Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir.
- Doğru projeyi kullandığınızı onaylamak için Cloud Shell'de şu komutu çalıştırın:
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.
Doğru projeyi kullandığınızı doğrulamak için aşağıdaki komutu çalıştırın.
gcloud config list project
Cloud Shell'i açtığınızda seçtiğinizden farklı bir proje kullanmak istiyorsanız aşağıdaki komutu çalıştırarak yeni bir proje ayarlayabilirsiniz:
gcloud config set project <PROJECT-ID>;
3. Sorgu Analizleri'nin etkin olduğu bir PostgreSQL için Cloud SQL örneği oluşturma
- Cloud Shell başlatıldıktan sonra, Query Insights'ın etkin olduğu
my-instanceadlı yeni bir Cloud SQL örneği oluşturmak için komut satırını kullanabilirsiniz:
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
İşaretler ve anlamları hakkında kısa bir açıklama:
--tier db-f1-microişareti, geliştirme amaçlı olduğundan ve kod laboratuvarı için çok fazla kaynağa ihtiyacınız olmadığından minimum kaynaklara sahip bir makine türü belirtiyor. Katmanlar hakkında daha fazla bilgiyi burada bulabilirsiniz.--database-version=POSTGRES_12işareti, PostgreSQL sürüm 12 olan bir örnek oluşturur.--region=us-centralişareti, örneğin oluşturulacağı bölgeyi belirtir.--root-password=<PASSWORD>işareti, kökpostgreskullanıcısının şifresini belirtmenize olanak tanır. <PASSWORD> ifadesini istediğiniz bir şifreyle değiştirdiğinizden emin olun.--insights-config-query-insights-enabledişareti, örneğinizde sorgu analizlerini etkinleştirir.--insights-config-record-application-tagsişareti, uygulama etiketlerinin kaydedilmesine olanak tanır. Uygulama etiketleri hakkında daha fazla bilgiyi sonraki bölümlerde bulabilirsiniz.--insights-config-record-client-addressişareti, istemci IP adreslerinin sorgu analizleri tarafından kaydedilmesine olanak tanır.
Projeniz için sqladmin.googleapis.com API'sini etkinleştirmeniz istenebilir. İstenirse API'yi etkinleştirmek için y seçeneğini belirleyin.
Örneği oluşturma işlemi birkaç dakika sürer. Bu işlem tamamlandığında örneğiniz kullanıma hazır olur.
- Şimdi örnek uygulama için kullanacağınız bir veritabanı oluşturun:
gcloud sql databases create votesdb --instance my-instance
Ayrıca, Cloud Console üzerinden örneğe erişip yapılandırabilirsiniz.
- Aşağıdaki komutu çalıştırarak
PROJECT-ID:ZONE-ID:INSTANCE-IDbiçiminde örnek bağlantı adını alın. Bu değeri daha sonra Node.js uygulamanızı yapılandırırken kullanacaksınız.
gcloud sql instances describe my-instance | grep connectionName
4. Uygulamayla kullanılacak bir hizmet hesabı oluşturma
Hizmet hesapları, GCP projenizdeki farklı hizmetleri kullanma izni vermek için kullanılır. Bu codelab'de, Cloud SQL Proxy'ye Cloud SQL örneğinize bağlanma izni vermek için bir tane oluşturmanız gerekir.
Konsol'da hizmet hesabı oluşturma
- IAM hizmet hesapları sayfasına gidip sayfanın üst kısmındaki
düğmesini tıklayın.
- Hizmet hesabınıza benzersiz bir ad ve kimlik verip OLUŞTUR'u tıklayın.
- Sonraki sayfada, "Bir rol seçin" açılır listesini tıklayın. "Cloud SQL" için filtreleyin ve Cloud SQL İstemcisi rolünü seçin. DEVAM'ı ve ardından BİTTİ'yi tıklayın.
- Hizmet hesabı oluşturulduktan sonra, yeni hizmet hesabınız için İşlemler bölümündeki üç nokta simgesini tıklayın ve Anahtarları yönet'i seçin. Sonraki sayfada ANAHTAR EKLE'yi ve ardından Yeni anahtar oluştur'u seçin. JSON seçilir. Bu varsayılan ayarı koruyun ve OLUŞTUR'u tıklayın. Bu işlem, .json özel anahtar dosyasını indirir. KAPAT'ı tıklayın.
- Cloud Shell'de Diğer menüsünün üç noktasını tıklayın ve Dosya Yükle'yi seçin. Yerel makinenize indirdiğiniz .json dosyasına göz atın ve dosyayı seçin. Bu işlem, .json dosyasını Cloud Shell'deki ana dizininize yükler.
5. Cloud SQL Proxy'yi yükleme ve başlatma
Uygulama ile veritabanı örneği arasındaki iletişim için Cloud SQL Proxy'yi kullanacaksınız.
- Cloud SQL proxy'sini indirin. Cloud Shell'de şunları çalıştırabilirsiniz:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
<INSTANCE_CONNECTION_NAME>yerine Cloud SQL örneğine genel bakış sayfasından kopyaladığınız örnek bağlantı adını yazdıktan sonra proxy'yi aşağıdaki gibi çalıştırın.
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &
Bu işlem başarılı olursa Ready for new connections mesajıyla biten birkaç satırlık çıktı görmeniz gerekir.
6. Uygulamayı klonlama ve yerel olarak test etme
- Örnek uygulamanın deposunu klonlayın ve uygulamayı çalıştırmak için gereken paketleri yükleyin.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples/ cd nodejs-docs-samples/cloud-sql/postgres/knex npm install
- Aşağıdaki ortam değişkenlerini ayarlayın:
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'
- Örnek uygulamayı başlatın.
npm start
- Cloud Shell'de Web Önizlemesi'ni
tıklayın, ardından 8080 numaralı bağlantı noktasında önizle'yi seçin.

Tarayıcınızda, burada gösterildiği gibi Sekmeler ve Boşluklar oylama uygulamasını görmelisiniz:

- Bazı oylar vermek ve veritabanına bazı veriler kaydetmek için düğmeleri tıklayın.
7. Tüm oyları görüntülemek için bir sayfa ekleme
Bu örnek uygulama çok basit olduğundan, tüm oyları gösteren ek bir sayfa ekleyeceksiniz. Bunu yapmanın temel nedeni, daha sonra sorgu analizlerini kullandığınızda inceleyebileceğiniz daha fazla veriye sahip olmaktır.
- Örnek uygulamayı durdurmak için Cloud Shell'de
Ctrl+ctuşuna basın. - Cloud Shell'de
düğmesini tıklayarak Cloud Shell Düzenleyici'yi başlatın. - Dosya gezgininde
nodejs-docs-samples/cloud-sql/postgres/knex/server.jssimgesini bulun ve düzenleyiciyeserver.jsdosyasını yüklemek için simgeyi tıklayın.
getVotes işlevinin tanımlandığı yerin sonrasına aşağıdaki kodu ekleyin:
/**
* 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');
};
- Diğer rotaların tanımlandığı yerin altına
'/getAllVotes'rotası için aşağıdaki kodu ekleyin:
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/viewsdizinindeallvotes.pugadlı yeni bir dosya oluşturun. Aşağıdaki kodu yapıştırın:
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'e dönmek için
düğmesini tıklayın ve şu komutu çalıştırın:
npm start
- Çalıştığından emin olmak için uygulamayı Web Önizleme'den açın. Eklediğiniz yeni sayfayı görüntülemek için tarayıcıdaki URL'ye
/getAllVotesekleyin.
8. Uygulamada SQL Commenter'ı etkinleştirme
Şimdi, ORM'lerin SQL ifadelerini yürütülmeden önce yorumlarla zenginleştirmesini sağlayan açık kaynaklı bir kitaplık olan SQL Commenter'ı yükleyip etkinleştireceksiniz. SQLcommenter, örnek uygulamanın kullandığı Knex.js dahil olmak üzere çeşitli ORM'leri ve çerçeveleri destekler. Sorgu Analizleri, veritabanı performansına uygulama odaklı bir bakış sunmak ve hangi uygulama kodunun sorunlara neden olduğunu belirlemek için bu yorumlardaki bilgileri kullanır. Performans ek yükünün küçük olması beklenir. Sorgu Analizleri belgelerine bakın.
- Örnek uygulamayı durdurmak için Cloud Shell'de
Ctrl+ctuşuna basın. - SQLcommenter'ın ihtiyaç duyduğu paketleri yüklemek için aşağıdaki komutu çalıştırın:
npm install @google-cloud/sqlcommenter-knex @opencensus/nodejs @opencensus/propagation-tracecontext @opentelemetry/api @opentelemetry/core --save
- Cloud Shell'de
düğmesini tıklayarak Cloud Shell Düzenleyici'yi başlatın. - Dosya gezgininde
nodejs-docs-samples/cloud-sql/postgres/knex/server.jssimgesini bulun ve düzenleyiciyeserver.jsdosyasını yüklemek için simgeyi tıklayın. - Dosyada şu kodu bulun:
const process = require('process');
Altına aşağıdaki kodu ekleyin:
const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
- Dosyada şu kodu bulun:
// Set Content-Type for all responses for these routes.
app.use((req, res, next) => {
res.set('Content-Type', 'text/html');
next();
});
Altına aşağıdaki kodu ekleyin:
app.use(wrapMainKnexAsMiddleware(Knex, {
traceparent: true,
tracestate: true,
route: true,
db_driver: true
}));
Bu işlem tamamlandığında kodunuz aşağıdaki gibi görünmelidir:
...
// 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'e dönmek için
düğmesini tıklayın ve şu komutu çalıştırın:
npm start
- Tabs vs Spaces uygulamasında, veritabanına daha fazla veri eklemek için düğmeleri tıklayarak oy kullanın.
9. Sorgu performansını ve uçtan uca izlemeyi görüntülemek için analizleri kullanma
Sorgu Analizleri kontrol paneli, performans sorunlarını aramak için Cloud SQL sorgularında sorun gidermenize yardımcı olur. Analizler'e erişmek için Cloud SQL örneğinizin sol gezinme bölmesinde Sorgu analizleri'ni seçin.
Veritabanı yükü - tüm sorgular grafiği
Üst düzey sorgu analizleri kontrol panelinde Veritabanı yükü - tüm sorgular grafiği gösterilir.

Grafikte CPU kapasitesi, CPU ve CPU bekleme, IO bekleme ve kilitleme bekleme bilgileri yer alır. Bu metriklerin ne anlama geldiği, metriklerin nerede depolandığı ve bu grafiğin sorunlu sorgular için nasıl göründüğüne dair bazı örnekler hakkında daha fazla bilgiyi dokümanlarda bulabilirsiniz. Bu örnek uygulamada veritabanı sorgu yükü düşük olduğundan grafikte büyük artışlar görülmüyor.
En fazla yükten hangi sorgular sorumlu?
Grafiğin altında, seçtiğiniz zaman aralığına ait normalleştirilmiş sorguları içeren SORGULAR tablosunu görürsünüz. Tablodaki sorgular, toplam yürütme süresine göre sıralanır.

Sorguyla ilgili ayrıntılı bilgileri (ör. bu sorguya özgü veritabanı yükü, sorgu gecikmesi, sorgu planı örnekleri ve en çok sorgu gönderen kullanıcılar) görüntülemek için sorguyu tıklayabilirsiniz. Bir uygulama, örnek uygulamada olduğu gibi bir ORM kullanılarak oluşturulmuşsa uygulamanın hangi bölümünün hangi sorgudan sorumlu olduğunu bilemeyebilirsiniz. En Popüler Etiketler bölümü bu konuda size yardımcı olabilir.
Uygulamada sorgu yükü nereden kaynaklanıyor?
İş mantığına göre etiketlenmiş sorguların listesini görmek için SORGULAR tablosundan ETİKETLER tablosuna geçiş yapın. Bu sayede, uygulamaya daha fazla odaklanan bir görünüm elde edersiniz.

ETİKETLER tablosunda, veritabanı yükünün hangi rotanın yükü oluşturduğuna göre ayrıldığını görebilirsiniz. Yukarıdaki ekran görüntüsünde, '/getAllVotes' rotasının ortalama yürütme süresinin daha yüksek olduğu ve ortalama olarak daha fazla satır döndürdüğü görülmektedir. Tabloda gördüğümüz yürütme süresi bu durumda sorunlu olmasa da verileri daha ayrıntılı incelemek için '/getAllVotes' satırını tıklayalım.
Sorgular neden yavaş çalışıyor?
Sorgu planını görmek için Sorgu planı örnekleri grafiğindeki noktayı tıklayın.

Sorgu planları, PostgreSQL'in bir sorguyu arka planda nasıl yürüttüğünü gösterir. Bu sayede, yavaşlığa neden olan işlemler olup olmadığını belirlemek kolaylaşır.
Hangi uygulama kodu yavaşlığa neden oluyor?
Sorgu Analizleri, uçtan uca izlemenin bağlam içi görselleştirilmesini de sağlar. Bu, bir uygulamanın hangi bölümlerinin yavaş sorgular oluşturduğuyla ilgili daha fazla araştırma yapmak için yararlı olabilir.
Bağlam içi izlemeyi görüntülemek için END TO END (UÇTAN UCA) sekmesini tıklayın.

10. Temizleme ve daha fazla bilgi
Node.js uygulaması ve Cloud SQL PostgreSQL veritabanı ile sorgu performansını izlemek ve incelemek için Query Insights'ı nasıl kullanacağınızı öğrendiniz.
Temizleme
Cloud SQL örneğinizi çalıştırmaya devam etmek istemiyorsanız şimdi silebilirsiniz.
gcloud sql instances delete my-instance