Introducción a Cloud SQL Insights

Cloud SQL Insights te ayuda a detectar, diagnosticar y evitar problemas de rendimiento de las consultas de las bases de datos de Cloud SQL. Proporciona información de autoservicio, supervisión intuitiva y diagnóstico que va más allá de la detección para ayudarte a identificar la causa raíz de los problemas de rendimiento.

En este codelab, aprenderás a configurar una instancia de Cloud SQL para PostgreSQL, a implementar una aplicación de Node.js a fin de usar la instancia de Cloud SQL como su almacenamiento en backend y a usar Cloud SQL Insights a fin de ver y supervisar consultas.

Requisitos previos

  • Conocimiento básico del lenguaje de programación y las herramientas de Node.js

Actividades

  • Usar Cloud SQL en una aplicación de Node.js
  • Habilitar SQL Commenter en una app de Node.js.
  • Usar Cloud SQL Insights para investigar y supervisar el rendimiento de las consultas.

Qué necesitará

  • Una cuenta de Google Cloud en la que tengas permisos para habilitar las API y crear servicios

Configuración del entorno a su propio ritmo

  1. Accede a Cloud Console y crea un proyecto nuevo o reutiliza uno existente. (Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una).

Recuerda el ID del proyecto que estás usas. Se mencionará más adelante en este codelab como PROJECT-ID.

  1. A continuación, deberás habilitar la facturación en Cloud Console para usar los recursos de Google Cloud recursos.

Ejecutar este codelab no debería costar mucho, tal vez nada. Asegúrate de seguir las instrucciones de la sección “Limpieza y más información”, que te aconseja cómo cerrar recursos para que no se te facture más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Activar Cloud Shell

  1. En Cloud Console, haz clic en Activar Cloud Shell:

Activar Cloud Shell

Si nunca ha iniciado Cloud Shell, aparecerá una pantalla intermedia (debajo de la mitad inferior de la página) que describe qué es. Si ese es el caso, haz clic en Continuar (y no volverás a verlo). Así es como se ve la pantalla única:

ventana de diálogo de Cloud Shell

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

Terminal de Cloud Shell

Esta máquina virtual está cargada con todas las herramientas para desarrolladores que necesitará. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación.

  1. Ejecuta el siguiente comando en Cloud Shell para confirmar que usas el proyecto correcto:

Una vez conectado a Cloud Shell, debería ver que ya se autenticó y que el proyecto ya se configuró con tu ID del proyecto.

Ejecuta el siguiente comando para confirmar que estás usando el proyecto correcto.

gcloud config list project

Si quieres usar un proyecto diferente del que seleccionaste cuando abriste Cloud Shell, puedes configurar un proyecto nuevo. Para ello, ejecuta el siguiente comando:

gcloud config set project <PROJECT-ID>;
  1. Después del inicio de Cloud Shell, puedes usar la línea de comandos para crear una nueva instancia de Cloud SQL llamada my-instance, con Cloud SQL Insights habilitado:
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 continuación, presentamos una breve explicación de las marcas y lo que significan:

  • La marca --tier db-f1-micro especifica un tipo de máquina con recursos mínimos, ya que esto es para fines de desarrollo y no necesitas muchos recursos de codelab. Puedes obtener más información sobre los niveles aquí.
  • La marca --database-version=POSTGRES_12 crea una instancia que será la versión 12 de PostgreSQL.
  • La marca --region=us-central especifica la región en la que se creará la instancia.
  • La marca --root-password=<PASSWORD> te permite especificar la contraseña para el usuario raíz postgres. Asegúrate de reemplazar <PASSWORD> por la contraseña que elijas.
  • La marca --insights-config-query-insights-enabled habilita Cloud SQL Insights en tu instancia.
  • La marca --insights-config-record-application-tags permite que se registren etiquetas de aplicaciones. Obtendrás más información sobre las etiquetas de aplicación en las secciones posteriores.
  • La marca --insights-config-record-client-address permite que las direcciones IP de cliente se registren en Cloud SQL Insights.

Es posible que se te solicite habilitar la API sqladmin.googleapis.com en su proyecto. Si se te solicita, selecciona y para habilitar la API.

La creación de la instancia tardará varios minutos. Una vez que se complete esta operación, tu instancia estará lista para usar.

  1. Ahora, crea una base de datos que usarás para la aplicación de muestra:
gcloud sql databases create votesdb --instance my-instance

También puedes acceder a la instancia y configurarla a través de Cloud Console.

  1. Obtén el nombre de la conexión de la instancia en el formato PROJECT-ID:ZONE-ID:INSTANCE-ID mediante la ejecución del comando siguiente. Lo usarás más adelante para configurar su aplicación Node.js.
gcloud sql instances describe my-instance | grep connectionName

Las cuentas de servicio se usan para otorgar permisos a fin de usar distintos servicios dentro de tu proyecto de GCP. En este codelab, necesitas uno para otorgar permiso al proxy de Cloud SQL a fin de conectarte a tu instancia de Cloud SQL.

Crea una cuenta de servicio en Console

  1. Ve a la página de cuentas de servicio de IAM y haz clic en el botón -PCvKR3aQ2zKaUcml8w9lW4JNlmYtN5-r2--mC6kMUp6HOXW8wT1wUvLoYEPU-aA-oGskT3XkAqfNwRAKkZkllwTe6ugdrUVFwaeKT0M9Y1RwHA8JPZeGmCWYBfr8d9TSycNMIRsLw que se encuentra en la parte superior de la página.
  2. Asigna un nombre y un ID únicos a tu cuenta de servicio y haz clic en CREAR.
  3. En la página siguiente, haz clic en el menú desplegable para seleccionar una función. Filtra para “Cloud SQL” y selecciona la función Cliente de Cloud SQL. Haz clic en Continuar y, luego, en Listo.
  4. Una vez que se haya creado la cuenta de servicio, haz clic en los tres puntos de Acciones de la nueva cuenta de servicio y selecciona Crear clave. Se seleccionará JSON, mantén el valor predeterminado y haz clic en CREAR. Se descargará un archivo de clave privada .json. Haz clic en Cerrar.
  5. En Cloud Shell, haz clic en los tres puntos del menú Más y selecciona Subir archivo. Busca el archivo .json que se descargó en tu máquina local y selecciónalo. Esta acción subirá el archivo .json al directorio principal de Cloud Shell.

Usarás el proxy de Cloud SQL para la comunicación entre la aplicación y la instancia de base de datos.

  1. Descarga el proxy de Cloud SQL: En Cloud Shell, puedes ejecutar lo siguiente comando:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
  1. Si deseas ejecutar el proxy, usa el nombre de conexión de la instancia que copiaste de los detalles de la instancia de Cloud SQL para reemplazar <INSTANCE_CONNECTION_NAME>. Para el archivo de credenciales, ingresa la ruta de acceso del archivo que subiste en el último paso.
./cloud_sql_proxy -credential_file=/path/to/credential_file.json -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

Si esto es correcto, deberías ver algunas líneas de salida y terminar con un mensaje Ready for new connections.

  1. Clona el repositorio de la aplicación de muestra y, luego, instala los paquetes necesarios para ejecutar la app.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples/

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

npm install
  1. Configura las siguientes variables de entorno:
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. Ejecuta createTable.js para crear la tabla de base de datos que necesita la aplicación y asegúrate de que la base de datos esté configurada correctamente y, luego, inicia la aplicación de muestra.
node createTable.js $DB_USER $DB_PASS $DB_NAME $CLOUD_SQL_CONNECTION_NAME votes $DB_HOST

npm start
  1. Haz clic en Vista previa en la WebÍcono de vista previa web en Cloud Shell y selecciona Vista previa en el puerto 8080.

Vista previa en el elemento del menú 8080

Deberías ver la app de votación de comparación entre pestañas y espacios, como se muestra aquí en tu navegador:

Captura de pantalla de la aplicación de votación de comparación entre pestañas y espacios

  1. Haz clic en los botones para votar y guardar algunos datos en la base de datos.

Como esta aplicación de muestra es muy simple, agregarás una página adicional que muestra todos los votos. El motivo principal de este paso es que tengas más datos para analizar cuando uses Cloud SQL Insights más adelante.

  1. Ingresa Ctrl+c en Cloud Shell para detener la aplicación de muestra.
  2. En Cloud Shell, haz clic en el botón Botón para abrir el editor para iniciar el editor de Cloud Shell.
  3. En el explorador de archivos, busca nodejs-docs-samples/cloud-sql/postgres/knex/server.js y haz clic en él para cargar el archivo server.js en el editor.

Agrega el siguiente código después de definir la función 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. Agrega el siguiente código para la ruta '/getAllVotes' debajo de donde se definen las otras rutas:
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. Crea un archivo nuevo en el directorio nodejs-docs-samples/cloud-sql/postgres/knex/views llamado allvotes.pug. Pega el siguiente código:
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. Haz clic en el botón Botón Abrir terminal para regresar a Cloud Shell y ejecutar lo siguiente:
npm start
  1. Abre la app desde la vista previa en la Web para asegurarte de que funcione. Agrega /getAllVotes a la URL del navegador para ver la nueva página que agregaste.

Ahora, instalará y habilitará SQL Commenter, una biblioteca de código abierto que permite que ORM aumente las instrucciones de SQL con comentarios antes de la ejecución. SQL Commenter admite varios ORM y frameworks, incluido el que usa la aplicación de muestra: Knex.js. Cloud SQL Insights usa la información de estos comentarios para proporcionar una vista centrada en las aplicaciones en el rendimiento de la base de datos y, además, identifica qué código de la aplicación causa problemas. Se espera que la sobrecarga de rendimiento sea pequeña y puedas obtener más información sobre el rendimiento en la documentación.

  1. Ingresa Ctrl+c en Cloud Shell para detener la aplicación de muestra.
  2. Ejecuta el siguiente comando para instalar los paquetes que necesita SQL Commenter:
  npm install @google-cloud/sqlcommenter-knex @opencensus/nodejs @opencensus/propagation-tracecontext @opentelemetry/api @opentelemetry/core --save
  1. En Cloud Shell, haz clic en el botón Botón para abrir el editor para iniciar el editor de Cloud Shell.
  2. En el explorador de archivos, busca nodejs-docs-samples/cloud-sql/postgres/knex/server.js y haz clic en él para cargar el archivo server.js en el editor.
  3. Busca este código en el archivo:
const process = require('process');

Debajo, agrega el siguiente código:

const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
  1. Busca este código en el archivo:
// Set Content-Type for all responses for these routes.
app.use((req, res, next) => {
  res.set('Content-Type', 'text/html');
  next();
});

Debajo, agrega el siguiente código:

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

Cuando lo hagas, el código debería ser similar al siguiente:

...
// 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. Haz clic en el botón Botón Abrir terminal para regresar a Cloud Shell y ejecutar lo siguiente:
npm start
  1. En la aplicación de comparación de pestañas y espacios, haz clic en los botones para enviar más votos y agregar más datos a la base de datos.

El panel de Estadísticas de consulta te ayuda a solucionar problemas de consultas de Cloud SQL para detectar problemas de rendimiento.

Carga de la base de datos: grafo de todas las consultas

El panel de Estadísticas de consulta de nivel superior muestra el grafo Carga de la base de datos: todas las consultas principales.

Grafo de todas las consultas

El grafo contiene información sobre la capacidad de CPU, el tiempo de espera entre CPU y CPU, y el tiempo de IO y de bloqueo. Para obtener más información sobre el significado de estas métricas, dónde se almacenan, consulta algunos ejemplos de cómo se ve este grafo en relación con consultas problemáticas en la documentación. En el caso de esta aplicación de muestra, la carga de consultas de la base de datos es baja, por lo que no hay grandes aumentos en el grafo.

¿Qué consultas son responsables de la mayor carga?

Debajo del grafo, encontrarás la tabla de CONSULTAS que contiene las consultas normalizadas para el intervalo de tiempo que seleccionaste. Las consultas en la tabla se ordenan por el tiempo total de ejecución.

Tabla de consultas principales

Puedes hacer clic en una consulta individual para ver información detallada sobre la consulta, como la carga de la base de datos en esta consulta específica, latencia de consulta, muestras de planes de consultas y usuarios principales. Si una aplicación se compiló con un ORM, como sucede con la aplicación de muestra, es posible que no sepas qué parte de la aplicación es responsable de qué consulta. La sección Etiquetas principales puede ayudarte a descubrirlo.

¿Dónde está la carga de la consulta originada en la aplicación?

Activa o desactiva la tabla de CONSULTAS a la tabla de ETIQUETAS para ver una lista de consultas etiquetadas por lógica empresarial, lo que te brinda una vista más centrada en la aplicación.

Tabla de etiquetas principales

En la tabla de etiquetas, puedes ver la carga de base de datos desglosada por la ruta que generó la carga. En la captura de pantalla anterior, puedes ver que la ruta '/getAllVotes' tiene un tiempo de ejecución promedio más alto y muestra más filas en promedio. Si bien el tiempo de ejecución que vemos en la tabla no es problemático en este caso, haz clic en la fila de '/getAllVotes' para ver los datos con más detalle.

¿Por qué las consultas se ejecutan con lentitud?

Haz clic en el punto del grafo de Muestras del plan de consultas para ver un plan de consultas.

Planes de consulta de muestra

En los planes de consulta se muestra cómo PostgreSQL ejecuta una consulta de manera privada, lo que facilita determinar si hay operaciones que den como resultado la lentitud.

¿Qué código de aplicación ayuda a la lentitud?

Cloud SQL Insights también tiene una visualización en contexto del seguimiento de extremo a extremo, lo cual puede ser útil para realizar más investigaciones sobre las partes de una aplicación que generan consultas lentas.

Haz clic en la pestaña DE EXTREMO A EXTREMO para ver un seguimiento en contexto.

Seguimiento de extremo a extremo

Aprendiste a usar Cloud SQL Insights para supervisar y también investigar el rendimiento de las consultas con una aplicación Node.js y una base de datos PostgreSQL de Cloud SQL.

Limpiar

Si no deseas mantener tu instancia de Cloud SQL en ejecución, puedes borrarla ahora.

gcloud sql instances delete my-instance

Más información