Введение в Query Insights для Cloud SQL

1. Прежде чем начать

Query Insights for Cloud SQL помогает обнаруживать, диагностировать и предотвращать проблемы с производительностью запросов в базах данных Cloud SQL. Он предоставляет интуитивно понятный мониторинг и диагностическую информацию, которая выходит за рамки простого обнаружения и помогает определить первопричину проблем с производительностью.

В этом практическом занятии вы узнаете, как настроить экземпляр Cloud SQL для PostgreSQL, развернуть приложение Node.js, использующее экземпляр Cloud SQL в качестве хранилища данных, а затем использовать Query Insights для просмотра и мониторинга запросов.

Предварительные требования

  • Базовые знания языка программирования Node.js и инструментов его использования.

Что вы будете делать

  • Используйте Cloud SQL в приложении Node.js.
  • Включите функцию комментирования SQL-запросов в приложении Node.js.
  • Используйте Query Insights для Cloud SQL, чтобы отслеживать и анализировать производительность запросов.

Что вам понадобится

  • Учетная запись Google Cloud, предоставляющая вам права на включение API и создание сервисов.

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .)

Запомните идентификатор проекта, который вы используете. В дальнейшем в этом практическом занятии он будет обозначаться как PROJECT-ID .

  1. Далее вам потребуется включить оплату в Cloud Console, чтобы использовать ресурсы Google Cloud.

Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка и подробнее», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» .

активировать облачную оболочку

Если вы никогда раньше не запускали Cloud Shell, вам будет показан промежуточный экран (внизу), описывающий его назначение. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:

диалоговое окно облачной оболочки

Подготовка и подключение к Cloud Shell займут всего несколько минут.

терминал облачной оболочки

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию.

  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что вы используете правильный проект:

После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и что проект уже настроен на ваш идентификатор проекта.

Выполните следующую команду, чтобы убедиться, что вы используете правильный проект.

gcloud config list project

Если вы хотите использовать другой проект, отличный от того, который вы выбрали при открытии Cloud Shell, вы можете задать новый проект, выполнив команду:

gcloud config set project <PROJECT-ID>;

3. Настройте экземпляр Cloud SQL for PostgreSQL с включенной функцией Query Insights.

  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 позволяет Query Insights записывать IP-адреса клиентов.

Возможно, вам будет предложено включить 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-oGskT3XkAqfNwRAKkZkllwTe6ugdrUVFwaeKT0M9Y1RwHA8JPZeGmCWYBfr8d9TSycNMIRsLw кнопка вверху страницы.
  2. Присвойте своей учетной записи уникальное имя и идентификатор и нажмите «СОЗДАТЬ» .
  3. На следующей странице щелкните раскрывающийся список «Выберите роль». Отфильтруйте по «Cloud SQL» и выберите роль «Клиент Cloud SQL». Нажмите «ПРОДОЛЖИТЬ» , а затем «ГОТОВО» .
  4. После создания учетной записи службы нажмите на три точки в разделе «Действия» для вашей новой учетной записи службы и выберите «Управление ключами». На следующей странице выберите «ДОБАВИТЬ КЛЮЧ» , а затем «Создать новый ключ» . Будет выбран формат JSON; оставьте значение по умолчанию и нажмите «СОЗДАТЬ» . Это загрузит файл закрытого ключа в формате .json. Нажмите «ЗАКРЫТЬ» .
  5. В Cloud Shell нажмите на три точки, чтобы открыть меню «Дополнительно» , и выберите «Загрузить файл» . Найдите загруженный на ваш локальный компьютер файл .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. Нажмите «Предварительный просмотр веб-страницы» . значок предварительного просмотра веб-страницы В Cloud Shell выберите «Предварительный просмотр» на порту 8080 .

Предварительный просмотр на порту 8080 (пункт меню)

В вашем браузере должно отобразиться приложение для голосования «Вкладки против пробелов», как показано здесь:

Скриншот приложения для голосования «Вкладки против пробелов»

  1. Нажмите на кнопки, чтобы проголосовать и сохранить данные в базе данных.

7. Добавьте страницу для просмотра всех голосов.

Поскольку это очень простое демонстрационное приложение, вам потребуется добавить дополнительную страницу, на которой будут отображаться все голоса. Основная причина этого — наличие большего количества данных для анализа при последующем использовании функции Query Insights.

  1. Нажмите Ctrl+c в Cloud Shell, чтобы остановить демонстрационное приложение.
  2. В Cloud Shell нажмите Кнопка «Открыть редактор» кнопка для запуска редактора Cloud Shell.
  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. Создайте новый файл с именем allvotes.pug в каталоге nodejs-docs-samples/cloud-sql/postgres/knex/views . Вставьте в него следующий код:
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 в приложении.

Теперь вам нужно установить и включить SQL Commenter — библиотеку с открытым исходным кодом, которая позволяет ORM дополнять SQL-запросы комментариями перед их выполнением. SQL Commenter поддерживает несколько 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.
  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. В приложении «Вкладки против пробелов» нажмите кнопки, чтобы проголосовать и добавить больше данных в базу данных.

9. Используйте раздел «Аналитика» для просмотра производительности запросов и сквозной трассировки.

Панель мониторинга Query Insights помогает устранять неполадки в запросах Cloud SQL и выявлять проблемы с производительностью. Чтобы получить доступ к Insights, выберите Query Insights в левой панели навигации для вашего экземпляра Cloud SQL.

График загрузки базы данных — все запросы

На панели мониторинга Query Insights верхнего уровня отображается график загрузки базы данных — все запросы .

График всех запросов

График содержит информацию о загрузке ЦП, загрузке ЦП и времени ожидания ЦП, времени ожидания ввода-вывода и времени ожидания блокировки. Более подробную информацию о значении этих метрик, местах их хранения и примерах отображения графика для проблемных запросов можно найти в документации . В данном примере приложения нагрузка на базу данных при выполнении запросов низкая, поэтому на графике нет больших пиков.

Какие запросы создают наибольшую нагрузку?

Под графиком вы найдете таблицу QUERIES, содержащую нормализованные запросы за выбранный вами временной диапазон. Запросы в таблице отсортированы по общему времени выполнения.

Таблица самых популярных запросов

Вы можете щелкнуть по отдельному запросу, чтобы просмотреть подробную информацию о нем, такую ​​как загрузка базы данных для этого конкретного запроса, задержка запроса, примеры планов выполнения запросов и наиболее часто используемые пользователи. Если приложение создано с использованием ORM, как в случае с примером приложения, вы можете не знать, какая часть приложения отвечает за какой запрос. Раздел «Наиболее часто используемые теги» поможет вам это выяснить.

Откуда в приложении поступает нагрузка на запросы?

Переключитесь с таблицы QUERIES на таблицу TAGS, чтобы увидеть список запросов, помеченных в соответствии с бизнес-логикой, что позволит вам получить более ориентированное на приложение представление.

Таблица главных тегов

В таблице TAGS вы можете увидеть распределение нагрузки на базу данных в зависимости от маршрута, который её вызвал. На скриншоте выше видно, что маршрут '/getAllVotes' имеет более высокое среднее время выполнения и в среднем возвращает больше строк. Хотя время выполнения, которое мы видим в таблице, в данном случае не является проблемой, давайте всё же щёлкнем по строке для '/getAllVotes' чтобы посмотреть данные более подробно.

Почему запросы выполняются медленно?

Щелкните по точке на графике примеров планов запросов , чтобы увидеть план запроса.

Примеры планов выполнения запросов

Планы выполнения запросов показывают, как PostgreSQL выполняет запрос внутри системы, что упрощает определение операций, приводящих к замедлению работы.

Какой фрагмент кода приложения вызывает замедление работы?

Query Insights также предоставляет контекстную визуализацию сквозной трассировки, что может быть полезно для дальнейшего исследования того, какие части приложения генерируют медленные запросы.

Чтобы просмотреть трассировку в контексте, нажмите вкладку « Сквозной маршрут» .

Сквозная трассировка

10. Наведите порядок и узнайте больше.

Вы научились использовать Query Insights для мониторинга и анализа производительности запросов в приложении Node.js и базе данных Cloud SQL PostgreSQL!

Уборка

Если вы не хотите, чтобы ваш экземпляр Cloud SQL продолжал работать, вы можете удалить его прямо сейчас.

gcloud sql instances delete my-instance

Узнать больше