Soluciona problemas de latencia de la aplicación con Cloud Spanner y OpenCensus

En este instructivo, se describe cómo solucionar problemas de latencia de apps que usan Spanner mediante OpenCensus y Cloud Trace. También se muestra cómo identificar problemas comunes relacionados con transacciones complejas, cargas útiles de gran tamaño y análisis de tablas completos. La app de ejemplo genera una carga aleatoria y expone de forma intencional los problemas a fin de mostrar las técnicas para solucionarlos.

En este instructivo, se supone que estás familiarizado con el desarrollo de Go, la API de Cloud Spanner y las API de seguimiento de OpenCensus.

En el siguiente diagrama, se muestra una configuración esquemática de la app de prueba que se usa en este instructivo.

Arquitectura de la app de este instructivo.

La app está instrumentada con la biblioteca de OpenCensus. Los datos de seguimiento y de métricas generados se almacenan y visualizan en Cloud Logging.

Objetivos

  • Agregar la instrumentación de seguimiento y de métricas de OpenCensus a una app que use Spanner
  • Interpretar los datos de seguimiento para identificar las causas de la latencia
  • Agregar una correlación de registro y seguimiento para permitir una mayor comprensión del comportamiento de la app

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta cómo hacer una limpieza.

Antes de comenzar

  1. En Google Cloud Console, ve a la página del selector de proyectos.

    Ir al selector de proyecto

  2. Selecciona o crea un proyecto de Google Cloud.

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.

  4. En Cloud Console, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de Cloud Console, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell que tiene el SDK de Cloud preinstalado, incluida la herramienta de línea de comandos de gcloud, y valores ya establecidos para el proyecto actual. La inicialización de la sesión puede tomar unos minutos.

  5. Habilita las API de Cloud Trace, Cloud Logging, Compute Engine y Cloud Spanner:
    gcloud services enable stackdriver.googleapis.com \
        cloudtrace.googleapis.com \
        spanner.googleapis.com \
        logging.googleapis.com \
        compute.googleapis.com
    

Configura tu entorno

  1. En Cloud Shell, clona el proyecto de GitHub.

    git clone https://github.com/GoogleCloudPlatform/opencensus-spanner-demo
    
  2. Importa las variables de entorno que se encuentran en el archivo setup.env al entorno de Cloud Shell:

    cd opencensus-spanner-demo
    source ./setup.env
    

Configura Spanner

En los siguientes pasos, configurarás Spanner y crearás algunas tablas para la app de prueba con el mismo esquema que se encuentra en Comienza a usar Spanner en Go. Existen dos tablas: Singers y Albums. Albums tiene una referencia a Singers en el campo SingerId.

  1. En Cloud Shell, crea una instancia de Spanner:

    gcloud spanner instances create $SPANNER_INSTANCE \
        --config=regional-us-central1 \
        --description="Test Instance" \
        --nodes=1
    
  2. Crea una base de datos:

    gcloud spanner databases create $DATABASE --instance=$SPANNER_INSTANCE
    

    Las tablas de la aplicación de prueba representan cantantes y álbumes.

  3. En Cloud Console, ve a Spanner.

    Ir a Spanner

  4. Para crear la tabla Singers, haz clic en Crear tabla.

  5. Haz clic en Editar como texto y, luego, ingresa lo siguiente en el campo Declaraciones de DDL:

    CREATE TABLE Singers (
      SingerId   INT64 NOT NULL,
      FirstName  STRING(1024),
      LastName   STRING(1024),
      BirthDate  DATE,
      LastUpdated TIMESTAMP,
    ) PRIMARY KEY(SingerId);
    
  6. Haz clic en Crear.

  7. Para crear la tabla Albums, haz clic en Crear tabla.

  8. Haz clic en Editar como texto y, luego, ingresa lo siguiente en el campo Declaraciones de DDL:

    CREATE TABLE Albums (
      SingerId        INT64 NOT NULL,
      AlbumId         INT64 NOT NULL,
      AlbumTitle      STRING(MAX),
      MarketingBudget INT64,
    ) PRIMARY KEY(SingerId, AlbumId),
      INTERLEAVE IN PARENT Singers ON DELETE CASCADE;
    
  9. Haz clic en Crear.

  10. Para agregar un índice a LastName, sigue estos pasos:

    1. Haz clic en la tabla Singers.
    2. Haz clic en Crear índice.
    3. Haz clic en Editar como texto y, luego, ingresa la siguiente información en el campo Declaraciones de DDL:

      CREATE INDEX SingersByFLastName ON Singers(LastName)
      
  11. Haz clic en Crear.

Instala la app en una instancia de Compute Engine

  1. En Cloud Shell, crea una instancia de Compute Engine para ejecutar la app de prueba:

    gcloud compute instances create $CLIENT_INSTANCE \
        --zone=$ZONE \
        --scopes=https://www.googleapis.com/auth/cloud-platform \
        --boot-disk-size=200GB
    
  2. Busca la dirección de correo electrónico de la cuenta de servicio asociada con la instancia:

    gcloud compute instances describe $CLIENT_INSTANCE --zone=$ZONE \
        --format="value(serviceAccounts.email)"
    

    Toma nota de la dirección de correo electrónico de la cuenta de servicio para el siguiente paso.

  3. Otorga la función roles/spanner.databaseUser a la cuenta de servicio de la instancia:

    SA_ACCOUNT=service-account-id
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member serviceAccount:$SA_ACCOUNT \
        --role roles/spanner.databaseUser
    

    Reemplaza lo siguiente:

    • service-account-id: La dirección de correo electrónico de la cuenta de servicio que recuperaste en el paso anterior
  4. Conéctate a la instancia mediante SSH:

    gcloud compute ssh --zone $ZONE $CLIENT_INSTANCE
    
  5. Instala Git en la instancia:

    sudo apt-get update
    sudo apt-get install -y git
    
  6. Instala la versión 1.12 de Go.

  7. Obtén el código fuente para este instructivo:

    git clone https://github.com/GoogleCloudPlatform/opencensus-spanner-demo.git
    cd opencensus-spanner-demo
    

Ejecuta la aplicación

  1. En Cloud Shell, establece tu ID del proyecto de Google Cloud:

    export GOOGLE_CLOUD_PROJECT=your project-id
    

    Reemplaza lo siguiente:

    • your project-id: El ID de tu proyecto de Google Cloud
  2. Inicializa el entorno:

    source ./setup.env
    
  3. Compila el código:

    go build
    
  4. Ejecuta la app de prueba:

    nohup ./opencensus-spanner-demo --project=$GOOGLE_CLOUD_PROJECT \
        --instance=$SPANNER_INSTANCE \
        --database=$DATABASE \
        --command=simulation \
        --iterations=10000 &
    

    Con este comando, se ejecutan 10,000 iteraciones de la app de prueba en el modo de simulación, que realiza una ejecución aleatoria de consultas y actualizaciones para generar datos de seguimiento y de métricas. Este comando tarda unos diez minutos en ejecutarse. Puedes hacer un seguimiento del progreso:

    tail -f nohup.out
    
  5. En Cloud Console, ve a la página Visor de registros.

    Ir a la página Visor de registros

    Comprueba si hay errores en los registros.

  6. En Cloud Console, ve a la página Lista de seguimiento.

    Ir a la página Lista de seguimiento

    Revisa los datos de seguimiento.

    Diagrama de dispersión con datos de seguimiento y cronograma.

Estructura del código de la app de prueba

En las siguientes secciones, se muestra cómo usar Cloud Trace para resolver problemas que la app de prueba muestra de forma intencional.

El enfoque que consiste en usar la integración de Spanner mediante OpenCensus, como se describe en este instructivo, requiere una pequeña cantidad de código para habilitar el seguimiento del código de la app que usa Spanner. OpenCensus tiene una integración incorporada con gRPC, que habilita la instrumentación de la API de cliente de Spanner. Sin embargo, algunos problemas pueden requerir una instrumentación de la app más allá de gRPC. Para obtener más información, consulta las guías de inicio rápido de OpenCensus y otros recursos en la sección Próximos pasos de este instructivo.

Google Cloud recopila y muestra datos de supervisión para la mayoría de los servicios, incluidos los servicios de almacenamiento. Sin embargo, es importante instrumentar el código para proporcionar datos de rendimiento de la app que reflejen la experiencia de los usuarios. En la guía de integración de Google Cloud de OpenCensus se describe cómo instrumentar el código de la app. En algunos casos, puedes exportar las estadísticas; los datos de seguimiento ya están instrumentados en las bibliotecas cliente. Por el momento, solo los clientes de Spanner para Java y Go están instrumentados con el seguimiento de OpenCensus.

A fin de enviar registros de apps a Logging, en este instructivo, se usan las bibliotecas cliente de Cloud para Go. El paquete applog se incluye para correlacionar seguimientos con registros. La correlación de registro y seguimiento se analiza en la siguiente sección. El exportador de Logging de OpenCensus, el complemento gRPC de OpenCensus y los paquetes de estadísticas y seguimiento se importan en el siguiente fragmento de código de Go:

import (
	"bytes"
	"context"
	"flag"
	"fmt"
	"os"

	"cloud.google.com/go/spanner"

	"contrib.go.opencensus.io/exporter/stackdriver"
	"go.opencensus.io/plugin/ocgrpc"
	"go.opencensus.io/stats/view"
	"go.opencensus.io/trace"

	log "github.com/GoogleCloudPlatform/opencensus-spanner-demo/applog"
	"github.com/GoogleCloudPlatform/opencensus-spanner-demo/query"
	"github.com/GoogleCloudPlatform/opencensus-spanner-demo/testdata"
	"github.com/GoogleCloudPlatform/opencensus-spanner-demo/update"
)

La app debe llamar al exportador de Logging. La app inicializa el exportador:

func initOC(project string) *stackdriver.Exporter {
	se, err := stackdriver.NewExporter(stackdriver.Options{
		ProjectID:    project,
		MetricPrefix: "spanner-oc-test",
	})
	if err != nil {
		ctx := context.Background()
		log.Fatalf(ctx, "Failed to create exporter: %v", err)
	}
	trace.RegisterExporter(se)
	view.RegisterExporter(se)
	if err := view.Register(ocgrpc.DefaultClientViews...); err != nil {
		ctx := context.Background()
		log.Fatalf(ctx, "Failed to register gRPC default client views: %v", err)
	}
	trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()})
	return se
}

Con el código anterior, se inicializa el exportador de Logging y la vista de gRPC, y se establece el seguimiento en AlwaysSample.

En OpenCensus, un seguimiento es un árbol de intervalos. Se crean intervalos de nivel superior para cada una de las transacciones, como se ilustra en el siguiente código de Go:

ctx, span := trace.StartSpan(ctx, "query-albums")
defer span.End()

Para obtener más información, consulta seguimiento.

La llamada StartSpan() anterior es un ejemplo de un intervalo personalizado que se agrega a la app. La biblioteca cliente de Spanner también crea intervalos mediante la integración de gRPC con OpenCensus. La función queryAlbums() en query.go contiene un ejemplo de estos intervalos personalizados.

El siguiente fragmento de código de queryAlbums() llama al método ReadOnlyTransaction() de Spanner, que crea un intervalo. El intervalo se cierra cuando el objeto ReadOnlyTransaction ro queda fuera del alcance.

ro := client.ReadOnlyTransaction()
defer ro.Close()

Interpreta los datos

En las siguientes secciones, se explican los motivos de las diferencias en las mediciones de latencia y cómo aparecen esas causas en los datos de seguimiento. En estos pasos, puedes comparar datos de diferentes seguimientos. Los detalles que ves en tus propios seguimientos pueden ser diferentes, pero se aplican los mismos principios básicos.

Verifica la latencia de la transacción

La secuencia que sigue la app para agregar un cantante y un álbum:

  1. La función AddAllTxn() abre una transacción de lectura y escritura para alojar las lecturas y escrituras de la base de datos.
  2. El comando getSingerId() comprueba si el cantante está en la base de datos según su nombre y apellido. Si el cantante está en la base de datos, este comando recupera el ID del cantante para su uso posterior. Si el cantante no está en la base de datos, este comando agrega al cantante nuevo.
  3. El comando getAlbumId() usa el ID del cantante y el título del álbum para verificar si el álbum está en la base de datos. Si el álbum está en la base de datos, la app no realiza ninguna otra acción.
  4. Si el ID del cantante y el álbum no están en la base de datos, la app agrega el álbum nuevo.

El comando opencensus-spanner-demo anterior para la app de prueba ejecuta 10,000 iteraciones generadas y elige de forma aleatoria entre estas funciones diferentes para simular una app real.

Para revisar los datos de seguimiento, sigue estos pasos:

  1. En Cloud Console, ve a la página Lista de seguimiento.

    Ir a la página Lista de seguimiento

  2. Para explorar el gráfico de dispersión, haz clic en cuatro puntos de seguimiento. Puedes identificar las diferentes rutas de código en la app de prueba con los nombres de los intervalos. Compara los valores de latencia de los diferentes intervalos.

    Cronograma de 4 puntos de seguimiento con diferentes rutas de código.

    El intervalo raíz en la parte superior del detalle del seguimiento muestra que el tiempo completo del seguimiento add-singer, incluidos los intervalos secundarios, requiere 101.925 ms. El inicio de la transacción de lectura y escritura se encuentra al comienzo de la solicitud. En la siguiente captura de pantalla, se muestran varias transacciones en un solo intervalo. Para obtener más información sobre las transacciones, consulta Transacciones.

    Seguimiento de ejemplo con cuatro transacciones cortas.

    La transacción de lectura y escritura se encuentra ahora en la mitad de la secuencia. La tarea completa para add-singer ahora tarda solo 42.747 ms.

Comprueba el efecto de una carga útil de gran tamaño

El tamaño de la carga útil está muy relacionado con la latencia, ya que la app debe transmitir una gran cantidad de datos a través de la red y procesarlos. La app de ejemplo carga suficientes datos en Spanner para demostrar los efectos del tamaño de la carga útil de respuesta. Para obtener más información sobre otros factores que afectan la latencia, consulta Métricas de latencia.

La siguiente consulta en el código de la app muestra todas las filas de la tabla:

SELECT SingerId, AlbumId, AlbumTitle FROM Albums

Para verificar el efecto del tamaño de la carga útil en la latencia, realiza los siguientes pasos:

  1. En Cloud Console, ve a la página Lista de seguimiento.

    Ir a la página Lista de seguimiento

  2. En el campo Solicitar filtro, ingresa query albums y, luego, presiona Enter.

  3. Haz clic en uno de los puntos del gráfico de dispersión.

  4. Haz clic en Mostrar eventos.

    Eventos que muestran una carga útil más grande.

    Puedes identificar la consulta por el nombre de seguimiento. También se muestra la cantidad de bytes recibidos (109,560) en el detalle del seguimiento.

Usa un índice secundario en lugar de análisis de tablas completos

Si consultas un campo distinto de la clave primaria, puede resultar costoso para tablas grandes sin índices secundarios. Estas consultas tienen una latencia alta debido a la necesidad de leer la tabla completa para encontrar filas aptas. La creación de un índice secundario evita el análisis de la tabla y puede reducir la latencia a través de la búsqueda directa de filas aptas mediante columnas indexadas. En la app de ejemplo, se crea un índice secundario en la tabla Singers para el campo LastName con la siguiente declaración de las instrucciones anteriores:

CREATE INDEX SingersByLastName ON Singers(LastName)

El uso de índices secundarios, como el anterior, es una práctica recomendada para acelerar las consultas comunes. El índice secundario es útil para consultas como las siguientes:

SELECT
  SingerId, FirstName, LastName
FROM
  Singers
WHERE
  LastName = 'Zero'

En muchos casos, Spanner usa de forma automática cualquier índice secundario que pueda aumentar la eficacia de la consulta. En otros casos, Spanner no usa de forma automática un índice, o puede elegir uno que aumente la latencia de la consulta.

Sin embargo, en pocos casos, Spanner podría elegir un índice que aumente la latencia de la consulta. Si seguiste los pasos para solucionar problemas de regresiones de rendimiento y confirmaste que deseas probar un índice diferente para la consulta, puedes especificar el índice como parte de tu consulta con la directiva FORCE_INDEX de la siguiente manera:

SELECT
  SingerId, FirstName, LastName
FROM
  Singers@{FORCE_INDEX=SingersByLastName}
WHERE
  LastName = 'Zero'

Para verificar el tiempo de ejecución de la consulta, completa los siguientes pasos:

  1. En Cloud Console, ve a Spanner.

    Ir a Spanner

  2. Haz clic en el nombre de la instancia. En este instructivo, es Test Instance.

  3. Haz clic en el nombre de tu base de datos. En este instructivo, es test.

  4. Haz clic en la pestaña Estadísticas de consulta.

  5. Selecciona un intervalo de 1 hora que incluya la ejecución de prueba.

  6. Selecciona la consulta anterior para ver las Estadísticas de consulta.

    Consulta las estadísticas en el panel Detalles, incluidas la latencia promedio (s) y el promedio de filas analizadas.

    Esta consulta realiza una reversión de la unión a la tabla base para buscar las columnas SingerId y FirstName. Para mejorar aún más la consulta, sigue las sugerencias que se mencionan en Prácticas recomendadas sobre SQL de Spanner.

Correlaciona seguimientos con registros

Para saber si las prácticas recomendadas en la optimización de consultas tienen un impacto en la app, puede que necesites información detallada sobre las rutas de código y las consultas reales de Spanner ejecutadas. Las consultas no están disponibles en el registro de Spanner, pero se agregan a los registros de la app en la app de prueba. Puedes agregar esta información a las anotaciones de seguimiento, sin embargo, el registro suele ser una primera opción para la depuración. Mediante la correlación de registro y seguimiento, puedes ver los mensajes de registro directamente en el detalle del seguimiento. Si el ID de seguimiento se agrega a Entry struct en las bibliotecas cliente de Cloud para Go, puedes correlacionar datos de seguimiento y registro. La app de prueba muestra esta correlación.

El siguiente código de ejemplo para la correlación de registro y seguimiento se encuentra en el paquete applog:

func printf(ctx context.Context, severity logging.Severity, format string,
	v ...interface{}) {
	span := trace.FromContext(ctx)
	if client == nil {
		log.Printf(format, v...)
	} else if span == nil {
		lg := client.Logger(LOGNAME)
		lg.Log(logging.Entry{
			Severity: severity,
			Payload:  fmt.Sprintf(format, v...),
		})
	} else {
		sCtx := span.SpanContext()
		tr := sCtx.TraceID.String()
		lg := client.Logger(LOGNAME)
		trace := fmt.Sprintf("projects/%s/traces/%s", projectId, tr)
		lg.Log(logging.Entry{
			Severity: severity,
			Payload:  fmt.Sprintf(format, v...),
			Trace:    trace,
			SpanID:   sCtx.SpanID.String(),
		})
	}
}

Visualiza mensajes de registro en seguimientos

  1. En Cloud Console, ve a la página Lista de seguimiento.

    Ir a la página Lista de seguimiento

  2. Haz clic en uno de los puntos.

  3. En el gráfico Cronograma, haz clic en Mostrar registros.

  4. Para ver la entrada de registro relacionada en el visor de registros, haz clic en Abrir en el visor de registros.

    Correlación de registro y seguimiento en el cronograma

  5. El detalle del registro también tiene un vínculo a las entradas relacionadas en el visor de registros. Haz clic en Abrir en el visor de registros para ver el detalle del registro. Copia la siguiente consulta del registro para usarla en un paso posterior.

    Detalle del registro con consulta.

Usa consultas extraídas de los registros

El filtro construido sirve para vincular todas las entradas de registro en una sola solicitud, que es difícil de hacer sin un ID de seguimiento. La consulta ejecutada y la cantidad de resultados que se muestran se encuentran en el detalle del registro porque se agregaron a una instrucción de registro en el código de la app. Puedes tomar la consulta desde allí y ejecutarla en Spanner para buscar el plan de ejecución de consultas.

  1. En Cloud Console, ve a la página Lista de seguimiento.

    Ir a la página Lista de seguimiento

  2. En el campo Solicitud, ingresa query-limit.

  3. Para ver el detalle del registro, sigue los pasos de la sección Ver mensajes de registro en seguimientos.

  4. Haz clic en Test instance y, luego, en la base de datos test.

  5. Haz clic en Consulta.

  6. En el campo Query database: test (Base de datos de consulta: prueba), ingresa la consulta que copiaste del registro.

  7. Haz clic en Run query (Ejecutar consulta).

    Base de datos de consulta.

El plan de ejecución de consultas incluye un análisis de tablas. Esta consulta es adecuada para tablas pequeñas, pero es un problema con tablas grandes. Si solo se requieren unas pocas filas, un análisis completo de la tabla es una forma costosa de obtener resultados y puede generar una latencia alta. Es importante verificar el campo Rows scanned (Filas analizadas). Este seguimiento muestra solo 10 filas analizadas. Para obtener más información sobre la optimización de consultas, revisa Prácticas recomendadas sobre SQL, Planes de ejecución de consultas y Operadores de ejecución de consultas.

Cómo ver métricas

Las métricas se recopilan y almacenan en mediciones agregadas en lugar de individuales. Las agregaciones son más útiles a fin de observar tendencias, mientras que los seguimientos son mejores para depurar solicitudes específicas. Spanner proporciona un conjunto de métricas, incluidas las métricas de uso de CPU y las métricas de latencia. Puedes combinar métricas de Spanner con métricas recopiladas por OpenCensus, que proporcionan una vista de cliente, para diagnosticar problemas. Para comparar las métricas de latencia del cliente y del servicio, sigue estos pasos.

  1. En Google Cloud Console, ve a Monitoring o usa el siguiente botón:
    Ir a Monitoring
  2. Si el Explorador de métricas aparece en el panel de navegación, haz clic en Explorador de métricas. De lo contrario, selecciona Recursos y, luego, Explorador de métricas.
  3. Asegúrate de que esté seleccionada la pestaña Métrica.
  4. Haz clic en el cuadro que tiene la etiqueta Find resource type and metric y, a continuación, selecciona el recurso y la métrica en el menú o ingresa sus nombres. Usa la siguiente información para completar los campos de este cuadro de texto:
    1. En Recurso, ingresa opencensus.
    2. En Métrica, ingresa roundtrip_latency.
    3. En Filtro, haz clic en grpc_client_method es igual a ExecuteSQL y, luego, en Aplicar.
    4. En Agregador, selecciona Percentil 50.

  5. Haz clic en Agregar métrica.
  6. Repite los pasos anteriores para agregar los mismos Recursos, Métricas y Filtros. En Agregador, selecciona Percentil 95.
  7. Haz clic en Guardar gráfico.
  8. En el campo Título del gráfico, ingresa Spanner E-E Latency.
  9. Haz clic en Nuevo panel y, luego, ingresa Spanner Metrics.
  10. Haz clic en Guardar.
  11. Para ver el panel que creaste, ve a Paneles > Métricas de Spanner.
  12. Haz clic en Mostrar todas las leyendas.

    El gráfico se filtra por el método ExecuteSql.

    Gráfico que muestra la mediana y la latencia del percentil 95 desde la perspectiva del cliente.

Compara la vista de métricas de la app y de Spanner

Ahora que creaste un gráfico desde la perspectiva de la app, crearás otro desde la perspectiva de Spanner para comparar la latencia.

  1. En Cloud Console, haz clic en Agregar gráfico.
  2. En el cuadro de texto Buscar tipo de recurso y métrica, escribe spanner.
  3. Haz clic en la métrica spanner.googleapis/api/request_latency.
  4. En el campo Filtro, haz clic en method es igual a ExecuteSQL y, luego, en Aplicar.
  5. En la lista desplegable Agregador, haz clic en Percentil 50.
  6. Haz clic en Agregar métrica.
  7. Repite los pasos anteriores para agregar los mismos Recursos, Métricas y Filtros. En Agregador, selecciona Percentil 95.
  8. Haz clic en Agregar métrica.
  9. En el campo Título del gráfico, ingresa Spanner latency (backend).
  10. Haz clic en Guardar gráfico.

    Gráfico que muestra la latencia mediana y del percentil 95 según lo informado por Spanner.

  11. Haz clic en la línea del gráfico en cualquier punto. Para los fines de este instructivo, 9:27 es el punto en el que se hizo clic en el gráfico anterior para verificar los valores medios.

    En ese momento, el valor del cliente es de 8.9 ms, en comparación con el valor medio informado por Spanner de 6.1 ms. La diferencia es de 2.8 ms, que se consume en la transmisión de red y el procesamiento del cliente de gRPC. En caso de que la diferencia sea grande, puedes comenzar por verificar la distancia relativa entre el cliente de la app y las regiones de servicio de Spanner, y el tamaño de las cargas útiles. Este último se puede evaluar a partir de las métricas de bytes recibidos y bytes enviados a Spanner. Sin embargo, si la latencia informada por Spanner es alta, verifica las filas analizadas y el plan de consulta y, también, las métricas de uso de CPU del nodo de Spanner.

Realice una limpieza

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos individuales

Si no quieres borrar todo el proyecto, puedes borrar recursos individuales. Sin embargo, no podrás borrar los datos de seguimiento y supervisión sin borrar el proyecto.

  1. En Cloud Shell, borra la instancia de Spanner:

    gcloud spanner instances delete $SPANNER_INSTANCE
    
  2. Borra la instancia de Compute Engine:

    gcloud compute instances delete $CLIENT_INSTANCE --zone=$ZONE
    

¿Qué sigue?