Spanner proporciona un conjunto de tablas de estadísticas integradas para ayudarte a obtener información sobre tus consultas, lecturas y transacciones. Para correlacionar las estadísticas con el código de tu aplicación y mejorar la solución de problemas, puedes agregar una etiqueta (una cadena de formato libre) a las operaciones de lectura, consulta y transacción de Spanner en el código de tu aplicación. Estas etiquetas se propagan en las tablas de estadísticas, lo que te ayuda a correlacionar y buscar en función de las etiquetas.
Spanner admite dos tipos de etiquetas: etiquetas de solicitud y etiquetas de transacción. Como sus nombres lo sugieren, puedes agregar etiquetas de transacción a las transacciones y etiquetas de solicitud a las APIs de lectura y consultas individuales. Puedes establecer una etiqueta de transacción en el alcance de la transacción y establecer etiquetas de solicitud individuales para cada solicitud a la API aplicable dentro de la transacción. Las etiquetas de solicitud y las etiquetas de transacción que se configuran en el código de la aplicación se propagan en las columnas de las siguientes tablas de estadísticas.
Tabla de estadísticas | Tipo de etiquetas que se completan en la tabla de estadísticas |
---|---|
Estadísticas de consultas TopN | Etiquetas de solicitud |
Estadísticas de lectura de TopN | Etiquetas de solicitud |
Estadísticas de transacciones de TopN | Etiquetas de transacción |
TopN Lock Statistics | Etiquetas de transacción |
Etiquetas de solicitud
Puedes agregar una etiqueta de solicitud opcional a una consulta o a una solicitud de lectura. Spanner agrupa las estadísticas por etiqueta de solicitud, que se puede ver en el campo REQUEST_TAG
de las tablas de estadísticas de consultas y de estadísticas de lectura.
Cuándo usar etiquetas de solicitud
A continuación, se incluyen algunos de los casos en los que es beneficioso usar etiquetas de solicitud.
- Cómo encontrar la fuente de una lectura o consulta problemática: Spanner recopila estadísticas de lecturas y consultas en tablas de estadísticas integradas. Cuando encuentres las consultas lentas o las lecturas con un alto consumo de CPU en la tabla de estadísticas, si ya les asignaste etiquetas, podrás identificar la fuente (aplicación o microservicio) que llama a estas operaciones según la información de la etiqueta.
- Identifica lecturas o consultas en las tablas de estadísticas: Asignar etiquetas de solicitud ayuda a filtrar filas en la tabla de estadísticas según las etiquetas que te interesan.
- Cómo determinar si las consultas de una aplicación o un microservicio en particular son lentas: Las etiquetas de solicitud pueden ayudar a identificar si las consultas de una aplicación o un microservicio en particular tienen latencias más altas.
- Estadísticas de agrupación para un conjunto de lecturas o consultas: Puedes usar etiquetas de solicitud para hacer un seguimiento del rendimiento, compararlo y generar informes sobre él en un conjunto de lecturas o consultas similares. Por ejemplo, si varias consultas acceden a una tabla o a un conjunto de tablas con el mismo patrón de acceso, puedes considerar agregar la misma etiqueta a todas esas consultas para hacer un seguimiento conjunto.
Cómo asignar etiquetas de solicitud
En el siguiente ejemplo, se muestra cómo establecer etiquetas de solicitud con las bibliotecas cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Cómo ver las etiquetas de solicitud en la tabla de estadísticas
La siguiente consulta devuelve las estadísticas de consultas en intervalos de 10 minutos.
SELECT t.text,
t.request_tag,
t.execution_count,
t.avg_latency_seconds,
t.avg_rows,
t.avg_bytes
FROM SPANNER_SYS.QUERY_STATS_TOP_10MINUTE AS t
LIMIT 3;
Tomemos los siguientes datos como ejemplo de los resultados que obtenemos de nuestra consulta.
texto | request_tag | execution_count | avg_latency_seconds | avg_rows | avg_bytes |
---|---|---|---|---|---|
SELECT SingerId, AlbumId, AlbumTitle FROM Albums | app=concert,env=dev,action=select | 212 | 0.025 | 21 | 2365 |
select * from orders; | app=catalogsearch,env=dev,action=list | 55 | 0.02 | 16 | 33.35 |
SELECT SingerId, FirstName, LastName FROM Singers; | [string vacía] | 154 | 0.048 | 42 | 486.33 |
En esta tabla de resultados, podemos ver que, si asignaste un REQUEST_TAG
para una búsqueda, se completará en la tabla de estadísticas. Si no hay ninguna etiqueta de solicitud asignada, se muestra como una cadena vacía.
En el caso de las consultas etiquetadas, las estadísticas se agregan por etiqueta (p.ej., la etiqueta de solicitud app=concert,env=dev,action=select
tiene una latencia promedio de 0.025 segundos). Si no se asigna ninguna etiqueta, las estadísticas se agregan por búsqueda (p.ej., la búsqueda en la tercera fila tiene una latencia promedio de 0.048 segundos).
Etiquetas de transacción
Se puede agregar una etiqueta de transacción opcional a las transacciones individuales.
Spanner agrupa las estadísticas por etiqueta de transacción, que se puede ver en el campo TRANSACTION_TAG
de las tablas de estadísticas de transacciones.
Cuándo usar etiquetas de transacción
A continuación, se incluyen algunos de los casos en los que es beneficioso usar etiquetas de transacción.
- Cómo encontrar la fuente de una transacción problemática: Spanner recopila estadísticas de las transacciones de lectura y escritura en la tabla de estadísticas de transacciones. Cuando encuentres transacciones lentas en la tabla de estadísticas de transacciones, si ya les asignaste etiquetas, podrás identificar la fuente (aplicación o microservicio) que llama a estas transacciones según la información de la etiqueta.
- Identifica transacciones en las tablas de estadísticas: Asignar etiquetas de transacciones ayuda a filtrar las filas de la tabla de estadísticas de transacciones según las etiquetas que te interesan. Sin etiquetas de transacción, descubrir qué operaciones representa una estadística puede ser un proceso engorroso. Por ejemplo, para las estadísticas de transacciones, deberás examinar las tablas y las columnas involucradas para identificar la transacción sin etiquetar.
- Cómo determinar si las transacciones de una aplicación o un microservicio en particular son lentas: Las etiquetas de transacción pueden ayudar a identificar si las transacciones de una aplicación o un microservicio en particular tienen latencias más altas.
- Agrupación de estadísticas para un conjunto de transacciones: Puedes usar etiquetas de transacciones para hacer un seguimiento del rendimiento de un conjunto de transacciones similares, compararlo y generar informes al respecto.
- Cómo encontrar las transacciones que acceden a las columnas involucradas en el conflicto de bloqueo: Las etiquetas de transacción pueden ayudar a identificar las transacciones individuales que causan conflictos de bloqueo en las tablas de Estadísticas de bloqueo.
- Transmite datos de cambios del usuario fuera de Spanner con flujos de cambios: Los registros de datos de flujos de cambios contienen etiquetas de transacción para las transacciones que modificaron los datos del usuario. Esto permite que el lector de un flujo de cambios asocie los cambios con el tipo de transacción según las etiquetas.
Cómo asignar etiquetas de transacción
En el siguiente ejemplo, se muestra cómo establecer etiquetas de transacción con las bibliotecas cliente de Spanner. Cuando usas una biblioteca cliente, puedes establecer una etiqueta de transacción al comienzo de la llamada de transacción que se aplica a todas las operaciones individuales dentro de esa transacción.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Cómo ver las etiquetas de transacción en la tabla de estadísticas de transacciones
La siguiente consulta devuelve las estadísticas de transacciones en intervalos de 10 minutos.
SELECT t.fprint,
t.transaction_tag,
t.read_columns,
t.commit_attempt_count,
t.avg_total_latency_seconds
FROM SPANNER_SYS.TXN_STATS_TOP_10MINUTE AS t
LIMIT 3;
Tomemos los siguientes datos como ejemplo de los resultados que obtenemos de nuestra consulta.
fprint | transaction_tag | read_columns | commit_attempt_count | avg_total_latency_seconds |
---|---|---|---|---|
40015598317 | app=concert,env=dev | [Venues._exists, Venues.VenueId, Venues.VenueName, Venues.Capacity] |
278802 | 0.3508 |
20524969030 | app=product,service=payment | [Singers.SingerInfo] | 129012 | 0.0142 |
77848338483 | [string vacía] | [Singers.FirstName, Singers.LastName, Singers._exists] | 5357 | 0.048 |
En esta tabla de resultados, podemos ver que, si asignaste un TRANSACTION_TAG
a una transacción, se completará en la tabla de estadísticas de transacciones. Si no hay ninguna etiqueta de transacción asignada, se muestra como una cadena vacía.
En el caso de las transacciones etiquetadas, las estadísticas se agregan por etiqueta de transacción (p.ej., la etiqueta de transacción app=concert,env=dev
a tiene una latencia promedio de 0.3508 segundos). Si no se asigna ninguna etiqueta, las estadísticas se agregan por FPRINT
(p.ej., 77848338483 en la tercera fila tiene una latencia promedio de 0.048 segundos).
Cómo ver las etiquetas de transacciones en la tabla de estadísticas de bloqueo
La siguiente consulta muestra las estadísticas de bloqueo en intervalos de 10 minutos.
La función CAST()
convierte el campo row_range_start_key
BYTES en una STRING.
SELECT
CAST(s.row_range_start_key AS STRING) AS row_range_start_key,
s.lock_wait_seconds,
s.sample_lock_requests
FROM SPANNER_SYS.LOCK_STATS_TOP_10MINUTE s
LIMIT 2;
Tomemos los siguientes datos como ejemplo de los resultados que obtenemos de nuestra consulta.
row_range_start_key | lock_wait_seconds | sample_lock_requests |
---|---|---|
Canciones (2,1,1) | 0.61 | LOCK_MODE: ReaderShared COLUMN: Singers.SingerInfo TRANSACTION_TAG: app=product,service=shipping LOCK_MODE: WriterShared COLUMN: Singers.SingerInfo TRANSACTION_TAG: app=product,service=payment |
albums(2,1+) | 0.48 | LOCK_MODE: ReaderShared COLUMN: users._exists1 TRANSACTION_TAG: [empty string] LOCK_MODE: WriterShared COLUMN: users._exists TRANSACTION_TAG: [empty string] |
En esta tabla de resultados, podemos ver que, si asignaste un TRANSACTION_TAG
a una transacción, se completará en la tabla de estadísticas de bloqueo. Si no hay ninguna etiqueta de transacción asignada, se muestra como una cadena vacía.
Asignación entre los métodos de la API y la etiqueta de solicitud o transacción
Las etiquetas de solicitud y las etiquetas de transacción se aplican a métodos de API específicos según si el modo de transacción es de solo lectura o de lectura y escritura. En general, las etiquetas de transacción se aplican a las transacciones de lectura y escritura, mientras que las etiquetas de solicitud se aplican a las transacciones de solo lectura. En la siguiente tabla, se muestra la asignación de los métodos de la API a los tipos de etiquetas aplicables.
Métodos de la API | Modos de transacción | Etiqueta de solicitud | Etiqueta de transacción |
---|---|---|---|
Read, StreamingRead |
Transacción de solo lectura | Sí | No |
Transacción de lectura o escritura | Sí | Sí | |
ExecuteSql, ExecuteStreamingSql1 |
Transacción de solo lectura1 | Sí1 | No |
Transacción de lectura o escritura | Sí | Sí | |
ExecuteBatchDml | Transacción de lectura o escritura | Sí | Sí |
BeginTransaction | Transacción de lectura o escritura | No | Sí |
Confirmación | Transacción de lectura o escritura | No | Sí |
1 Para las consultas de flujos de cambios que se ejecutan con el conector de Dataflow de SpannerIO de Apache Beam, el REQUEST_TAG
contiene un nombre de trabajo de Dataflow.
Limitaciones
Cuando agregues etiquetas a tus lecturas, consultas y transacciones, ten en cuenta las siguientes limitaciones:
- La longitud de una cadena de etiquetas se limita a 50 caracteres. Las cadenas que superen este límite se truncarán.
- En una etiqueta, solo se permiten caracteres ASCII (del 32 al 126). Los caracteres Unicode arbitrarios se reemplazan por guiones bajos.
- Se quitan todos los caracteres de guion bajo (_) iniciales de la cadena.
- Las etiquetas distinguen mayúsculas de minúsculas. Por ejemplo, si agregas la etiqueta de solicitud
APP=cart,ENV=dev
a un conjunto de consultas y agregasapp=cart,env=dev
a otro conjunto de consultas, Spanner agrega las estadísticas por separado para cada etiqueta. Es posible que falten etiquetas en las tablas de estadísticas en las siguientes circunstancias:
- Si Spanner no puede almacenar estadísticas de todas las operaciones etiquetadas que se ejecutan durante el intervalo en las tablas, el sistema prioriza las operaciones con los recursos de mayor consumo durante el intervalo especificado.
Nombres de las etiquetas
Cuando asignes etiquetas a las operaciones de la base de datos, es importante que tengas en cuenta qué información deseas transmitir en cada cadena de etiquetas. La convención o el patrón que elijas harán que tus etiquetas sean más eficaces. Por ejemplo, asignar nombres adecuados a las etiquetas facilita la correlación de las estadísticas con el código de la aplicación.
Puedes elegir cualquier etiqueta que desees dentro de las limitaciones establecidas. Sin embargo, recomendamos construir una cadena de etiquetas como un conjunto de pares clave-valor separados por comas.
Por ejemplo, supongamos que usas una base de datos de Spanner para un caso de uso de comercio electrónico. Es posible que desees incluir información sobre la aplicación, el entorno de desarrollo y la acción que realiza la búsqueda en la etiqueta de solicitud que asignarás a una búsqueda en particular. Puedes considerar asignar la cadena de etiquetas en el formato clave-valor como app=cart,env=dev,action=update
.Esto significa que la consulta se llama desde la aplicación del carrito en el entorno de desarrollo y se usa para actualizar el carrito.
Supongamos que tienes otra consulta de una aplicación de búsqueda de catálogo y asignas la cadena de etiquetas como app=catalogsearch,env=dev,action=list
. Ahora, si alguna de estas consultas aparece en la tabla de estadísticas de consultas como consultas con latencia alta, puedes identificar fácilmente la fuente con la etiqueta.
Estos son algunos ejemplos de cómo se puede usar un patrón de etiquetado para organizar las estadísticas de tu operación. Estos ejemplos no son exhaustivos; también puedes combinarlos en tu cadena de etiquetas con un delimitador, como una coma.
Claves de etiquetas | Ejemplos de pares clave-valor de etiqueta | Descripción |
---|---|---|
Aplicación | app=cart app=frontend app=catalogsearch |
Ayuda a identificar la aplicación que llama a la operación. |
Entorno | env=prod env=dev env=test env=staging |
Ayuda a identificar el entorno asociado a la operación. |
Framework | framework=spring framework=django framework=jetty |
Ayuda a identificar el framework asociado a la operación. |
Acción | action=list action=retrieve action=update |
Ayuda a identificar la acción que realiza la operación. |
Servicio | service=payment service=shipping |
Ayuda a identificar el microservicio que llama a la operación. |
Observe lo siguiente:
- Cuando asignas un
REQUEST_TAG
, las estadísticas de varias búsquedas que tienen la misma cadena de etiquetas se agrupan en una sola fila en la tabla de estadísticas de búsquedas. Solo el texto de una de esas búsquedas se muestra en el campoTEXT
. - Cuando asignas un
REQUEST_TAG
, las estadísticas de varias lecturas que tienen la misma cadena de etiquetas se agrupan en una sola fila en la tabla de estadísticas de lectura. El conjunto de todas las columnas que se leen se agrega al campoREAD_COLUMNS
. - Cuando asignas un
TRANSACTION_TAG
, las estadísticas de las transacciones que tienen la misma cadena de etiquetas se agrupan en una sola fila en la tabla de estadísticas de transacciones. El conjunto de todas las columnas que escriben las transacciones se agrega al campoWRITE_CONSTRUCTIVE_COLUMNS
, y el conjunto de todas las columnas que se leen se agrega al campoREAD_COLUMNS
.
Situaciones de solución de problemas con etiquetas
Cómo encontrar el origen de una transacción problemática
La siguiente consulta muestra los datos sin procesar de las transacciones principales en el período seleccionado.
SELECT
fprint,
transaction_tag,
ROUND(avg_total_latency_seconds,4) as avg_total_latency_sec,
ROUND(avg_commit_latency_seconds,4) as avg_commit_latency_sec,
commit_attempt_count,
commit_abort_count
FROM SPANNER_SYS.TXN_STATS_TOP_10MINUTE
WHERE interval_end = "2020-05-17T18:40:00"
ORDER BY avg_total_latency_seconds DESC;
En la tabla siguiente, se muestran datos de ejemplo de nuestra consulta, en los que tenemos tres aplicaciones: cart, product y frontend, que pertenecen o consultan la misma base de datos.
Una vez que identifiques las transacciones con latencia alta, puedes usar las etiquetas asociadas para identificar la parte pertinente del código de tu aplicación y solucionar problemas con las estadísticas de transacciones.
fprint | transaction_tag | avg_total_latency_sec | avg_commit_latency_sec | commit_attempt_count | commit_abort_count |
---|---|---|---|---|---|
7129109266372596045 | app=cart,service=order | 0.3508 | 0.0139 | 278802 | 142205 |
9353100217060788102 | app=cart,service=redis | 0.1633 | 0.0142 | 129012 | 27177 |
9353100217060788102 | app=product,service=payment | 0.1423 | 0.0133 | 5357 | 636 |
898069986622520747 | app=product,service=shipping | 0.0159 | 0.0118 | 4269 | 1 |
9521689070912159706 | app=frontend,service=ads | 0.0093 | 0.0045 | 164 | 0 |
11079878968512225881 | [string vacía] | 0.031 | 0.015 | 14 | 0 |
Del mismo modo, se puede usar la etiqueta de solicitud para encontrar la fuente de una consulta problemática en la tabla estadísticas de consultas y la fuente de lectura problemática en la tabla lectura de estadísticas.
Cómo encontrar la latencia y otras estadísticas de las transacciones de una aplicación o un microservicio en particular
Si usaste el nombre de la aplicación o el nombre del microservicio en la cadena de etiquetas, esto ayuda a filtrar la tabla de estadísticas de transacciones por etiquetas que contienen ese nombre de la aplicación o nombre del microservicio.
Supongamos que agregaste transacciones nuevas a la app de pago y deseas consultar las latencias y otras estadísticas de esas transacciones nuevas. Si usaste el nombre de la aplicación de pagos dentro de la etiqueta, puedes filtrar la tabla de estadísticas de transacciones para que solo se muestren las etiquetas que contengan app=payment
.
La siguiente consulta muestra las estadísticas de transacciones de la app de pagos en intervalos de más de 10 minutos.
SELECT
transaction_tag,
avg_total_latency_sec,
avg_commit_latency_sec,
commit_attempt_count,
commit_abort_count
FROM SPANNER_SYS.TXN_STATS_TOP_10MINUTE
WHERE STARTS_WITH(transaction_tag, "app=payment")
LIMIT 3;
Este es un ejemplo de resultado:
transaction_tag | avg_total_latency_sec | avg_commit_latency_sec | commit_attempt_count | commit_abort_count |
---|---|---|---|---|
app=payment,action=update | 0.3508 | 0.0139 | 278802 | 142205 |
app=payment,action=transfer | 0.1633 | 0.0142 | 129012 | 27177 |
app=payment, action=retrieve | 0.1423 | 0.0133 | 5357 | 636 |
Del mismo modo, puedes encontrar consultas o lecturas de una aplicación específica en la tabla estadísticas de consultas o estadísticas de lecturas con etiquetas de solicitud.
Descubre las transacciones involucradas en el conflicto de bloqueo
Para saber qué transacciones y claves de filas experimentaron tiempos de espera de bloqueo altos, consultamos la tabla LOCK_STAT_TOP_10MINUTE
, que enumera las claves de filas, las columnas y las transacciones correspondientes que están involucradas en el conflicto de bloqueo.
SELECT CAST(s.row_range_start_key AS STRING) AS row_range_start_key,
t.total_lock_wait_seconds,
s.lock_wait_seconds,
s.lock_wait_seconds/t.total_lock_wait_seconds frac_of_total,
s.sample_lock_requests
FROM spanner_sys.lock_stats_total_10minute t, spanner_sys.lock_stats_top_10minute s
WHERE
t.interval_end = "2020-05-17T18:40:00" and s.interval_end = t.interval_end;
Este es un ejemplo del resultado de nuestra búsqueda:
row_range_start_key | total_lock_wait_seconds | lock_wait_seconds | frac_of_total | sample_lock_requests |
---|---|---|---|---|
Singers(32) | 2.37 | 1.76 | 1 | LOCK_MODE: WriterShared COLUMN: Singers.SingerInfo TRANSACTION_TAG: app=cart,service=order LOCK_MODE: ReaderShared COLUMN: Singers.SingerInfo TRANSACTION_TAG: app=cart,service=redis |
En esta tabla de resultados, podemos ver que el conflicto ocurrió en la tabla Singers
con la clave SingerId=32. Singers.SingerInfo
es la columna en la que se produjo el conflicto de bloqueo entre ReaderShared
y WriterShared
. También puedes identificar las transacciones correspondientes (app=cart,service=order
y app=cart,service=redis
) que experimentan el conflicto.
Una vez que se identifican las transacciones que causan los conflictos de bloqueo, puedes concentrarte en ellas con las Estadísticas de transacciones para comprender mejor qué hacen las transacciones y si puedes evitar un conflicto o reducir el tiempo durante el que se mantienen los bloqueos. Para obtener más información, consulta Prácticas recomendadas para reducir la contención de bloqueos.
¿Qué sigue?
- Obtén más información sobre otras herramientas de introspección.
- Obtén información sobre qué otra información almacena Spanner para cada base de datos en las tablas de esquema de información de la base de datos.
- Obtén más información sobre las prácticas recomendadas de SQL para Spanner.
- Obtén más información para investigar el uso alto de CPU.