Spanner fornisce un insieme di tabelle di statistiche integrate per aiutarti a ottenere informazioni su query, letture e transazioni. Per correlare le statistiche con il codice dell'applicazione e migliorare la risoluzione dei problemi, puoi aggiungere un tag (una stringa di formato libero) alle operazioni di lettura, query e transazione di Spanner nel codice dell'applicazione. Questi tag vengono compilati nelle tabelle statistiche per aiutarti a eseguire ricerche e correlazioni in base ai tag.
Spanner supporta due tipi di tag: tag di richiesta e tag di transazione. Come suggeriscono i nomi, puoi aggiungere tag transazioni alle transazioni e tag richiesta alle singole query e API di lettura. Puoi impostare un tag transazione a livello di ambito della transazione e singoli tag di richiesta per ogni richiesta API applicabile all'interno della transazione. I tag di richiesta e di transazione impostati nel codice dell'applicazione vengono inseriti nelle colonne delle seguenti tabelle statistiche.
Tabella delle statistiche | Tipo di tag compilati nella tabella delle statistiche |
---|---|
Statistiche sulle query TopN | Tag di richiesta |
Statistiche di lettura TopN | Tag di richiesta |
Statistiche sulle transazioni TopN | Tag transazioni |
Statistiche delle serrature TopN | Tag transazioni |
Tag di richiesta
Puoi aggiungere un tag richiesta facoltativo a una query o a una richiesta di lettura. Spanner agrupa le statistiche per tag richiesta, che è visibile nel campo REQUEST_TAG
sia delle tabelle delle statistiche sulle query sia delle tabelle delle statistiche sulle letture.
Quando utilizzare i tag di richiesta
Di seguito sono riportati alcuni scenari che traggono vantaggio dall'utilizzo dei tag di richiesta.
- Ricerca dell'origine di una query o lettura problematica: Spanner raccoglie le statistiche relative a letture e query nelle tabelle delle statistiche integrate. Quando nella tabella delle statistiche trovi query lente o letture con elevato consumo di CPU, se hai già assegnato tag a queste query, puoi identificare la sorgente (applicazione/microservizio) che chiama queste operazioni in base alle informazioni nel tag.
- Identificazione di letture o query nelle tabelle delle statistiche: l'assegnazione dei tag richiesta consente di filtrare le righe nella tabella delle statistiche in base ai tag che ti interessano.
- Scoprire se le query di una determinata applicazione o di un determinato microservizio sono lente: i tag di richiesta possono aiutarti a identificare se le query di una determinata applicazione o di un determinato microservizio hanno latenze più elevate.
- Raggruppamento delle statistiche per un insieme di letture o query: puoi utilizzare i tag richiesta per monitorare, confrontare e generare report sul rendimento in un insieme di letture o query simili. Ad esempio, se più query accedono a una tabella/a un insieme di tabelle con lo stesso pattern di accesso, puoi valutare la possibilità di aggiungere lo stesso tag a tutte le query per monitorarle insieme.
Come assegnare i tag richiesta
L'esempio seguente mostra come impostare i tag di richiesta utilizzando le librerie client di Spanner.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Come visualizzare i tag di richiesta nella tabella delle statistiche
La seguente query restituisce le statistiche delle query in intervalli di 10 minuti.
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;
Prendiamo i seguenti dati come esempio dei risultati che riceviamo dalla nostra query.
testo | 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; | [stringa vuota] | 154 | 0,048 | 42 | 486,33 |
Da questa tabella dei risultati, possiamo vedere che se hai assegnato un REQUEST_TAG
per una query, questo viene inserito nella tabella delle statistiche. Se non è assegnato alcun tag richiesta, viene visualizzato come stringa vuota.
Per le query con tag, le statistiche vengono aggregate per tag (ad es. il tag richiestaapp=concert,env=dev,action=select
ha una latenza media di 0,025 secondi). Se non è stato assegnato alcun tag, le statistiche vengono aggregate per query (ad es. la query nella terza riga ha una latenza media di 0,048 secondi).
Tag transazioni
È possibile aggiungere un tag transazioni facoltativo alle singole transazioni.
Spanner raggruppa le statistiche per tag transazioni, che è visibile nel campo TRANSACTION_TAG
delle tabelle delle statistiche delle transazioni.
Quando utilizzare i tag transazioni
Di seguito sono riportati alcuni scenari che traggono vantaggio dall'utilizzo dei tag transaction.
- Ricerca dell'origine di una transazione problematica: Spanner raccoglie le statistiche per le transazioni di lettura-scrittura nella tabella delle statistiche delle transazioni. Quando nella tabella delle statistiche sulle transazioni trovi transazioni lente, se hai già assegnato loro dei tag, puoi identificare l'origine (applicazione/microservizio) che richiama queste transazioni in base alle informazioni nel tag.
- Identificazione delle transazioni nelle tabelle delle statistiche: l'assegnazione dei tag transazioni consente di filtrare le righe nella tabella delle statistiche delle transazioni in base ai tag che ti interessano. Senza i tag transazioni, scoprire quali operazioni sono rappresentate da una statistica può essere un processo complicato. Ad esempio, per le statistiche sulle transazioni, devi esaminare le tabelle e le colonne coinvolte per identificare la transazione non taggata.
- Verificare se le transazioni di un'applicazione o di un microservizio specifico sono lente: i tag di transazione possono aiutarti a identificare se le transazioni di un'applicazione o di un microservizio specifico hanno latenze più elevate.
- Raggruppamento delle statistiche per un insieme di transazioni:puoi utilizzare i tag transazioni per monitorare, confrontare e generare report sul rendimento di un insieme di transazioni simili.
- Trovare le transazioni che accedono alle colonne coinvolte nel conflitto di blocco: i tag transazioni possono aiutarti a individuare le singole transazioni che causano conflitti di blocco nelle tabelle Statistiche dei blocchi.
- Eseguire lo streaming dei dati delle modifiche utente da Spanner utilizzando i stream delle modifiche: i record dei dati degli stream delle modifiche contengono i tag transazioni per le transazioni che hanno modificato i dati utente. In questo modo, il lettore di uno stream di modifiche può associare le modifiche al tipo di transazione in base ai tag.
Come assegnare i tag transazioni
L'esempio seguente mostra come impostare i tag transazioni utilizzando le librerie client di Spanner. Quando utilizzi una libreria client, puoi impostare un tag transazione all'inizio della chiamata alla transazione, che viene applicato a tutte le singole operazioni all'interno della transazione.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Come visualizzare i tag transazioni nella tabella Statistiche sulle transazioni
La seguente query restituisce le statistiche sulle transazioni in intervalli di 10 minuti.
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;
Prendiamo i seguenti dati come esempio dei risultati che riceviamo dalla nostra query.
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 | [stringa vuota] | [Singers.FirstName, Singers.LastName, Singers._exists] | 5357 | 0,048 |
Da questa tabella dei risultati, possiamo vedere che se hai assegnato un valore TRANSACTION_TAG
a una transazione, questo viene inserito nella tabella delle statistiche sulle transazioni. Se non è assegnato alcun tag transazione, viene visualizzata come stringa vuota.
Per le transazioni con tag, le statistiche vengono aggregate per tag transazione
(ad es. il tag transazione app=concert,env=dev
a ha una latenza media di 0,3508 secondi). Se non è stato assegnato alcun tag, le statistiche vengono aggregate per FPRINT
(ad es. 77848338483 nella terza riga ha una latenza media di 0,048 secondi).
Come visualizzare i tag transazioni nella tabella Statistiche blocco
La seguente query restituisce le statistiche di blocco in intervalli di 10 minuti.
La funzione CAST()
converte il
row_range_start_key
campo BYTES in una STRINGA.
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;
Prendiamo i seguenti dati come esempio dei risultati che riceviamo dalla nostra query.
row_range_start_key | lock_wait_seconds | sample_lock_requests |
---|---|---|
Songs(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: [stringa vuota] LOCK_MODE: WriterShared COLUMN: users._exists TRANSACTION_TAG: [stringa vuota] |
Da questa tabella dei risultati, possiamo vedere che se hai assegnato un TRANSACTION_TAG
a una transazione, questo viene inserito nella tabella delle statistiche dei blocchi. Se non è assegnato alcun tag transazione, viene visualizzato come stringa vuota.
Mappatura tra i metodi API e il tag richiesta/transazione
I tag richiesta e i tag transazione sono applicabili a metodi API specifici in base al fatto che la modalità di transazione sia di sola lettura o di lettura/scrittura. In genere, i tag di transazione sono applicabili alle transazioni di lettura/scrittura, mentre i tag di richiesta sono applicabili alle transazioni di sola lettura. La tabella seguente mostra la mappatura dei metodi dell'API ai tipi di tag applicabili.
Metodi API | Modalità di transazione | Tag richiesta | Tag transazione |
---|---|---|---|
Leggi, streamingRead |
Transazione di sola lettura | Sì | No |
Transazione di lettura/scrittura | Sì | Sì | |
ExecuteSql, ExecuteStreamingSql1 |
Transazione di sola lettura1 | Sì1 | No |
Transazione di lettura/scrittura | Sì | Sì | |
ExecuteBatchDml | Transazione di lettura/scrittura | Sì | Sì |
BeginTransaction | Transazione di lettura/scrittura | No | Sì |
Esegui il commit | Transazione di lettura/scrittura | No | Sì |
1 Per le query sul flusso di modifiche eseguite utilizzando il connettore Apache Beam SpannerIO Dataflow, REQUEST_TAG
contiene il nome di un job Dataflow.
Limitazioni
Quando aggiungi tag a letture, query e transazioni, tieni presenti le seguenti limitazioni:
- La lunghezza di una stringa di tag è limitata a 50 caratteri. Le stringhe che superano questo limite vengono troncate.
- In un tag sono consentiti solo caratteri ASCII (32-126). I caratteri Unicode arbitrari vengono sostituiti da trattini bassi.
- Eventuali trattini bassi (_) iniziali vengono rimossi dalla stringa.
- I tag sono sensibili alle maiuscole. Ad esempio, se aggiungi il tag di richiesta
APP=cart,ENV=dev
a un insieme di query eapp=cart,env=dev
a un altro insieme di query, Spanner aggrega le statistiche distintamente per ogni tag. I tag potrebbero non essere presenti nelle tabelle delle statistiche nelle seguenti condizioni:
- Se Spanner non è in grado di memorizzare le statistiche per tutte le operazioni con tag eseguite durante l'intervallo nelle tabelle, il sistema dà la priorità alle operazioni con il maggiore consumo di risorse durante l'intervallo specificato.
Denominazione dei tag
Quando assegni i tag alle operazioni del database, è importante considerare le informazioni che vuoi trasmettere in ogni stringa del tag. La convenzione o il pattern che scegli rende i tag più efficaci. Ad esempio, la scelta di nomi appropriati per i tag semplifica la correlazione delle statistiche con il codice dell'applicazione.
Puoi scegliere qualsiasi tag entro i limiti indicati. Tuttavia, consigliamo di creare una stringa di tag come un insieme di coppie chiave-valore separate da virgole.
Ad esempio, supponiamo che tu stia utilizzando un database Spanner per un
caso d'uso di e-commerce. Ti consigliamo di includere informazioni sull'applicazione, sull'ambiente di sviluppo e sull'azione intrapresa dalla query nel tag richiesta che assegni a una determinata query. Puoi
considerare l'assegnazione della stringa del tag nel formato chiave/valore come
app=cart,env=dev,action=update
.Ciò significa che la query viene chiamata dall'applicazione del carrello
nell'ambiente di sviluppo e viene utilizzata per aggiornare il carrello.
Supponiamo che tu abbia un'altra query da un'applicazione di ricerca nel catalogo e assegni la stringa del tag come app=catalogsearch,env=dev,action=list
. Ora, se una di queste query viene visualizzata nella tabella delle statistiche delle query come query con latenza elevata, puoi identificare facilmente la sorgente utilizzando il tag.
Ecco alcuni esempi di come un pattern di tagging può essere utilizzato per organizzare le statistiche sulle operazioni. Questi esempi non sono esaustivi. Puoi anche combinarli nella stringa del tag utilizzando un delimitatore come una virgola.
Chiavi dei tag | Esempi di coppia tag-valore | Descrizione |
---|---|---|
Applicazione | app=cart app=frontend app=catalogsearch |
Aiuta a identificare l'applicazione che chiama l'operazione. |
Ambiente | env=prod env=dev env=test env=staging |
Aiuta a identificare l'ambiente associato all'operazione. |
Framework | framework=spring framework=django framework=jetty |
Aiuta a identificare il framework associato all'operazione. |
Azione | action=list action=retrieve action=update |
Aiuta a identificare l'azione intrapresa dall'operazione. |
Servizio | service=payment service=shipping |
Aiuta a identificare il microservizio che chiama l'operazione. |
Aspetti da considerare
- Quando assegni un
REQUEST_TAG
, le statistiche relative a più query che hanno la stessa stringa di tag vengono raggruppate in una singola riga nella tabella Statistiche query. Nel campoTEXT
viene mostrato solo il testo di una di queste query. - Quando assegni un
REQUEST_TAG
, le statistiche relative a più letture che hanno la stessa stringa di tag vengono raggruppate in una singola riga nella tabella delle statistiche di lettura. L'insieme di tutte le colonne lette viene aggiunto al campoREAD_COLUMNS
. - Quando assegni un
TRANSACTION_TAG
, le statistiche relative alle transazioni che hanno la stessa stringa di tag vengono raggruppate in una singola riga nella tabella delle statistiche delle transazioni. L'insieme di tutte le colonne scritte dalle transazioni viene aggiunto al campoWRITE_CONSTRUCTIVE_COLUMNS
e l'insieme di tutte le colonne lette viene aggiunto al campoREAD_COLUMNS
.
Scenari di risoluzione dei problemi che utilizzano i tag
Trovare la fonte di una transazione problematica
La seguente query restituisce i dati non elaborati per le transazioni principali nel periodo di tempo selezionato.
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;
La tabella seguente elenca i dati di esempio restituiti dalla nostra query, in cui abbiamo tre applicazioni, ovvero cart, product e frontend, che possiedono o eseguono query sullo stesso database.
Una volta identificate le transazioni con una latenza elevata, puoi utilizzare i tag associati per identificare la parte pertinente del codice dell'applicazione e risolvere ulteriormente i problemi utilizzando le statistiche sulle transazioni.
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 | [stringa vuota] | 0,031 | 0,015 | 14 | 0 |
Analogamente, il tag richiesta può essere utilizzato per trovare l'origine di una query problematica dalla tabella Statistiche query e l'origine di una lettura problematica dalla tabella Statistiche letture.
Trovare la latenza e altre statistiche per le transazioni di una determinata applicazione o di un determinato microservizio
Se hai utilizzato il nome dell'applicazione o del microservizio nella stringa del tag, puoi filtrare la tabella delle statistiche sulle transazioni in base ai tag che contengono il nome dell'applicazione o del microservizio.
Supponiamo che tu abbia aggiunto nuove transazioni all'app di pagamento e che tu voglia esaminare le latenze e altre statistiche di queste nuove transazioni. Se hai utilizzato il nome dell'applicazione di pagamento all'interno del tag, puoi filtrare la tabella delle statistiche sulle transazioni in base solo ai tag contenenti app=payment
.
La seguente query restituisce le statistiche sulle transazioni per l'app di pagamento su intervalli di 10 minuti.
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;
Ecco un esempio di output:
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 |
Analogamente, puoi trovare query o letture da un'applicazione specifica nella tabella Statistiche query o Statistiche letture utilizzando i tag richiesta.
Individuare le transazioni coinvolte nel conflitto di blocco
Per scoprire quali transazioni e chiavi di riga hanno registrato tempi di attesa elevati per i blocchi,
effettuiamo una query sulla tabella LOCK_STAT_TOP_10MINUTE
, che elenca le chiavi di riga, le colonne
e le transazioni corrispondenti coinvolte nel conflitto di blocco.
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;
Ecco alcuni esempi di output della nostra query:
row_range_start_key | total_lock_wait_seconds | lock_wait_seconds | frac_of_total | sample_lock_requests |
---|---|---|---|---|
Cantanti(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 |
Da questa tabella dei risultati, possiamo vedere che il conflitto si è verificato nella tabella Singers
nella chiave SingerId=32. Singers.SingerInfo
è la colonna in cui si è verificato il
conflitto di blocco tra ReaderShared
e WriterShared
. Puoi anche identificare le transazioni corrispondenti (app=cart,service=order
e app=cart,service=redis
) che presentano il conflitto.
Una volta identificate le transazioni che causano i conflitti di blocco, ora puoi concentrarti su queste transazioni utilizzando le Statistiche sulle transazioni per avere un quadro migliore di cosa stanno facendo le transazioni e se puoi evitare un conflitto o ridurre il tempo per cui vengono trattenuti i blocchi. Per ulteriori informazioni, consulta le best practice per ridurre le contese sui blocchi.
Passaggi successivi
- Scopri altri strumenti di introspezione.
- Scopri altre informazioni archiviate da Spanner per ogni database nelle tabelle dello schema delle informazioni del database.
- Scopri di più sulle best practice per SQL per Spanner.
- Scopri di più su come esaminare l'utilizzo elevato della CPU.