Cloud SQL İçin Sorgu Analizleri'ne Giriş

1. Başlamadan önce

Cloud SQL için Sorgu Analizleri, Cloud SQL veritabanlarıyla ilgili sorgu performansı sorunlarını tespit etmenize, teşhis etmenize ve önlemenize yardımcı olur. Performans sorunlarının temel nedenini belirlemenize yardımcı olmak için tespitin ötesine geçen self servis, kolay izleme ve teşhis bilgileri sunar.

Bu codelab'de, PostgreSQL İçin Cloud SQL örneği oluşturmayı, Cloud SQL örneğini arka uç depolama alanı olarak kullanmak için Node.js uygulamasını dağıtmayı ve sorguları görüntülemek ve izlemek için Sorgu Analizleri'ni kullanmayı öğreneceksiniz.

Ön koşullar

  • Node.js programlama dili ve araçları hakkında temel düzeyde bilgi

Yapacaklarınız

  • Node.js uygulamasında Cloud SQL kullanın.
  • Bir Node.js uygulamasında SQL Yorumcu'yu 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 izinlerine sahip olduğunuz bir Google Cloud hesabı

2. Kurulum ve şartlar

Kendi hızınızda ortam kurulumu

  1. 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 hesap oluşturmanız gerekir.)

Kullandığınız projenin proje kimliğini unutmayın. Bu kod laboratuvarın ilerleyen bölümlerinde PROJECT-ID olarak adlandırılacaktır.

  1. Sonraki adımda, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. "Temizleme ve Daha Fazla Bilgi" bölümündeki talimatları bölümünde, bu eğiticinin dışında faturalandırmayla karşılaşmamanız için kaynakları nasıl kapatacağınız konusunda tavsiyelerde bulunacağız. Yeni Google Cloud kullanıcıları 300 ABD doları ücretsiz deneme programından yararlanabilir.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir'i tıklayın.

Cloud Shell'i etkinleştir

Cloud Shell'i daha önce hiç çalıştırmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmında) gösterilir. Bu durumda Devam'ı tıklayın (bunu bir daha görmezsiniz). Tek seferlik ekran şöyle görünür:

cloud shell iletişim penceresi

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

Cloud Shell terminali

İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir.

  1. Doğru projeyi kullandığınızdan emin olmak için Cloud Shell'de aşağıdaki 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ı onaylamak 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 etkin durumdayken PostgreSQL için Cloud SQL örneği oluşturma

  1. Cloud Shell başlatıldıktan sonra, komut satırını kullanarak Sorgu Analizleri etkin şekilde my-instance adlı yeni bir Cloud SQL örneği oluşturabilirsiniz:
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

Aşağıda, işaretlerle ilgili kısa bir açıklama ve ne anlama geldikleri açıklanmıştır:

  • --tier db-f1-micro işareti, geliştirme amaçlı olduğu ve codelab için çok fazla kaynağa ihtiyacınız olmadığı için minimum düzeyde kaynak kullanan bir makine türü belirtmektedir. Katmanlar hakkında daha fazla bilgiyi buradan edinebilirsiniz.
  • --database-version=POSTGRES_12 işareti, PostgreSQL sürüm 12 olacak bir örnek oluşturur.
  • --region=us-central işareti, örneğin oluşturulacağı bölgeyi belirtir.
  • --root-password=<PASSWORD> işareti, kök postgres kullanıcısı için şifreyi belirtmenize olanak tanır. <Şifreyi> değiştirdiğinizden emin olun seçtiğiniz bir şifre ile oturum açın.
  • --insights-config-query-insights-enabled işareti, örneğinizde Sorgu Analizlerini etkinleştirir.
  • --insights-config-record-application-tags işareti, uygulama etiketlerinin kaydedilmesine olanak tanır. Sonraki bölümlerde uygulama etiketleri hakkında daha fazla bilgi edineceksiniz.
  • --insights-config-record-client-address iş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 düğmesini seçin.

Örneğin oluşturulması birkaç dakika sürer. Bu işlem tamamlandığında örneğiniz kullanıma hazır olur.

  1. Şimdi, örnek uygulama için kullanacağınız veritabanını oluşturun:
gcloud sql databases create votesdb --instance my-instance

Örneğe Cloud Console'dan da erişip yapılandırabilirsiniz.

  1. Aşağıdaki komutu çalıştırarak PROJECT-ID:ZONE-ID:INSTANCE-ID biçimindeki örnek bağlantı adını alın. Bunu 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şturun

Hizmet hesapları, GCP projenizdeki farklı hizmetleri kullanma izinleri vermek için kullanılır. Bu codelab'de Cloud SQL Proxy'ye Cloud SQL örneğinize bağlanma izni vermek için bir kod gerekir.

Console'da bir hizmet hesabı oluşturma

  1. IAM hizmet hesapları sayfasına gidin ve sayfanın üst kısmındaki -PCvKR3aQ2zKaUcml8w9lW4JNlmYtN5-r2--mC6kMUp6HOXW8wT1wUvLoYEPU-aA-oGskT3XkAqfNwRAKkZkllwTe6ugdrUVFwaeKT0M9Y1RwHA8JPZeGmCWYBfr8d9TSycNMIRsLw düğmesini tıklayın.
  2. Hizmet hesabınıza benzersiz bir ad ve kimlik verin ve OLUŞTUR'u tıklayın.
  3. Sonraki sayfada, Rol seçin açılır menüsünü tıklayın. "Cloud SQL" filtresi Cloud SQL İstemcisi rolünü seçin. DEVAM'ı, ardından BİTTİ'yi tıklayın.
  4. Hizmet hesabı oluşturulduktan sonra yeni hizmet hesabınız için İşlemler altındaki üç noktayı 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 değeri koruyun ve OLUŞTUR'u tıklayın. Bu işlem, bir .json özel anahtar dosyası indirir. KAPAT'ı tıklayın.
  5. Cloud Shell'de üç noktayı tıklayarak Diğer menüsüne gidin 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.

  1. 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
  1. <INSTANCE_CONNECTION_NAME> kısmını Cloud SQL örneğine Genel Bakış sayfasından kopyaladığınız örnek bağlantı adıyla değiştirdikten 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 çıkış görürsünüz.

6. Uygulamayı yerel olarak klonlayıp test edin

  1. Örnek uygulamaya ait depoyu 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
  1. 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'
  1. Örnek uygulamayı başlatın.
npm start
  1. Cloud Shell'de Web Önizlemesi'ni web önizlemesi simgesi tıklayın, ardından 8080 bağlantı noktasında önizle'yi seçin.

8080 bağlantı noktasında önizle menü öğesinde

Sekmeler - Alanlar oylama uygulamasını tarayıcınızda şu şekilde görürsünüz:

Sekmeler - Alanlar oylama uygulamasının ekran görüntüsü

  1. Oy vermek ve bazı verileri veritabanına kaydetmek için düğmeleri tıklayın.

7. Tüm oyları görüntülemek için bir sayfa ekleyin

Bu örnek uygulama çok basit olduğundan, tüm oyları gösteren ek bir sayfa ekleyeceksiniz. Bunu yapmanın başlıca nedeni, daha sonra Sorgu Analizleri'ni kullandığınızda bakacağınız daha fazla verinin olmasıdır.

  1. Örnek uygulamayı durdurmak için Cloud Shell'inize Ctrl+c girin.
  2. Cloud Shell'de Open Editor (Düzenleyiciyi Aç) düğmesi düğmesini tıklayarak Cloud Shell Düzenleyici'yi başlatın.
  3. Dosya gezgininde nodejs-docs-samples/cloud-sql/postgres/knex/server.js dosyasını bulun ve server.js dosyasını düzenleyiciye yüklemek için tıklayın.

getVotes işlevinin tanımlandığı yerden sonra 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');
};
  1. '/getAllVotes' rotası için, diğer rotaların tanımlandığı yerin altına 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();
  }
});
  1. nodejs-docs-samples/cloud-sql/postgres/knex/views dizininde allvotes.pug adlı 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}.
  1. Cloud Shell'e dönüp şunu çalıştırmak için Terminali aç düğmesi düğmesini tıklayın:
npm start
  1. Çalıştığından emin olmak için uygulamayı Web Önizlemesi'nden açın. Eklediğiniz yeni sayfayı görüntülemek için tarayıcıda URL'ye /getAllVotes ekleyin.

8. Uygulamada SQL Yorumlayıcı'yı etkinleştir

Şimdi, ORM'lerin yürütme işleminden önce SQL ifadelerini yorumlarla zenginleştirmesini sağlayan açık kaynak bir kitaplık olan SQL COMMENTer'ı yükleyip etkinleştireceksiniz. SQLcommenter, örnek uygulamanın kullandığı Knex.js de dahil olmak üzere çeşitli ORM'leri ve çerçeveleri destekler. Sorgu Analizleri, bu yorumlardaki bilgileri kullanarak veritabanı performansına dair uygulama odaklı bir görünüm sunar ve hangi uygulama kodunun sorunlara neden olduğunu belirler. Genel performans yükünün düşük olması beklenir. Sorgu Analizleri belgelerini inceleyin.

  1. Örnek uygulamayı durdurmak için Cloud Shell'inize Ctrl+c girin.
  2. 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
  1. Cloud Shell'de Open Editor (Düzenleyiciyi Aç) düğmesi düğmesini tıklayarak Cloud Shell Düzenleyici'yi başlatın.
  2. Dosya gezgininde nodejs-docs-samples/cloud-sql/postgres/knex/server.js dosyasını bulun ve server.js dosyasını düzenleyiciye yüklemek için tıklayın.
  3. Dosyada şu kodu bulun:
const process = require('process');

Altına aşağıdaki kodu ekleyin:

const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
  1. 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ıktan sonra 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
}));
...
  1. Cloud Shell'e dönüp şunu çalıştırmak için Terminali aç düğmesi düğmesini tıklayın:
npm start
  1. Sekmeler ve Alanlar uygulamasında, veritabanına daha fazla veri eklemek amacıyla birkaç oy daha vermek için düğmeleri tıklayın.

9. Sorgu performansını ve uçtan uca izlemeyi görüntülemek için Analizler'i kullanın

Sorgu Analizleri kontrol paneli, performans sorunlarını aramak için Cloud SQL sorgularındaki sorunları gidermenize yardımcı olur. Analizler'e erişmek için Cloud SQL örneğinizin sol gezinme menüsünden 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.

Tüm Sorgular grafiği

Grafik CPU Kapasitesi, CPU ve CPU bekleme, IO Bekleme ve Kilitleme Bekleme bilgilerini içerir. Bu metriklerin ne anlama geldiği ve metriklerin nerede depolandığı hakkında daha fazla bilgi edinebilir ve belgelerden bu grafiğin sorunlu sorgular için nasıl göründüğüne dair bazı örnekler görebilirsiniz. Bu örnek uygulamada veritabanı sorgu yükü düşüktür, bu nedenle grafikte büyük sıçramalar yoktur.

En fazla yük hangi sorgulardan kaynaklanır?

Grafiğin altında, seçtiğiniz zaman aralığı için normalleştirilmiş sorguları içeren SORULAR tablosunu bulabilirsiniz. Tablodaki sorgular toplam yürütme süresine göre sıralanır.

En Çok Kullanılan Sorgular tablosu

Sorguyla ilgili ayrıntılı bilgileri (ör. belirli bir sorgunun veritabanı yükü, sorgu gecikmesi, sorgu planı örnekleri ve en iyi kullanıcılar) görüntülemek için tek bir sorguyu tıklayabilirsiniz. Örnek uygulamada olduğu gibi, bir uygulama ORM kullanılarak oluşturulduysa, uygulamanın hangi bölümünün hangi sorgudan sorumlu olduğunu bilemeyebilirsiniz. En İyi Etiketler bölümü bunu anlamanıza yardımcı olabilir.

Uygulamada sorgu yükü nerede ortaya çıkıyor?

İş mantığına göre etiketlenen sorguların listesini görmek için SORGULAR tablosundan ETİKETLER tablosuna geçiş yapın. Böylece, daha uygulama merkezli bir görünüm elde edersiniz.

En İyi Etiketler tablosu

ETİKETLER tablosunda, veritabanı yükünün yükü oluşturan rotaya göre dökümünü görebilirsiniz. Yukarıdaki ekran görüntüsünde, '/getAllVotes' rotasının daha yüksek ortalama yürütme süresine sahip olduğunu ve ortalama olarak daha fazla satır döndürüldüğünü görebilirsiniz. Tabloda gördüğümüz yürütme süresi bu durumda sorunlu olmasa da, verileri daha ayrıntılı bir şekilde incelemek için '/getAllVotes' satırını tıklayalım.

Sorgular neden yavaş çalışıyor?

Bir sorgu planını görmek için Sorgu planı örnekleri grafiğindeki noktayı tıklayın.

Örnek sorgu planları

Sorgu planları, PostgreSQL'in kapaklar altında bir sorguyu nasıl yürüttüğünü göstererek yavaşlığa neden olan işlemler olup olmadığının belirlenmesini kolaylaştırır.

Hangi uygulama kodu yavaşlığa katkıda bulunuyor?

Sorgu Analizleri, aynı zamanda uçtan uca izleme için bağlam içi görselleştirme sağlar. Bu görsel, uygulamanın hangi bölümlerinin yavaş sorgular oluşturduğunu daha derinlemesine araştırmanıza yardımcı olabilir.

Bir bağlam içi izlemeyi görüntülemek için SONUÇLAR sekmesini tıklayın.

Uçtan uca iz

10. Yer Açın ve Daha Fazla Bilgi Edinin

Node.js uygulaması ve Cloud SQL PostgreSQL veritabanıyla sorgu performansını izlemek ve incelemek için Sorgu Analizleri'ni kullanmayı öğrendiniz.

Temizleme

Cloud SQL örneğinizin çalışır durumda kalmasını istemiyorsanız örneği hemen silebilirsiniz.

gcloud sql instances delete my-instance

Daha Fazla Bilgi