Spanner offre un insieme di tabelle di statistiche integrate per aiutarti a ottenere insight 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 in formato libero) alle operazioni di lettura, query e transazione di Spanner nel codice dell'applicazione. Questi tag vengono inseriti in tabelle di statistiche che consentono di correlare e cercare in base ai tag.
Spanner supporta due tipi di tag: i tag request e i tag transaction. Come suggerisce il nome, puoi aggiungere tag di transazione alle transazioni e richiedere tag a singole query e API di lettura. Puoi impostare un tag transazione nell'ambito delle transazioni e impostare 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 completati nelle colonne delle seguenti tabelle delle statistiche.
Tabella delle statistiche | Tipo di tag inseriti nella tabella delle statistiche |
---|---|
Statistiche sulle query TopN | Tag di richiesta |
Statistiche di lettura TopN | Tag di richiesta |
Statistiche sulle transazioni TopN | Tag transazione |
Statistiche blocco TopN | Tag transazione |
Tag di richiesta
Puoi aggiungere un tag di richiesta facoltativo a una query o a una richiesta di lettura. Spanner raggruppa le statistiche per tag di richiesta, visibile nel campo REQUEST_TAG
delle tabelle statistiche sulle query e statistiche di lettura.
Quando utilizzare i tag di richiesta
Di seguito sono riportati alcuni scenari che traggono vantaggio dall'utilizzo dei tag di richiesta.
- Individuazione dell'origine di una query o lettura problematica: Spanner raccoglie le statistiche per le letture e le query nelle tabelle delle statistiche integrate. Quando nella tabella delle statistiche trovi le query lente o l'utilizzo elevato di CPU, se hai già assegnato dei tag, puoi identificare l'origine (applicazione/microservizio) che chiama queste operazioni in base alle informazioni nel tag.
- Identificare le letture o le query nelle tabelle delle statistiche: l'assegnazione di tag delle richieste consente di filtrare le righe nella tabella delle statistiche in base ai tag che ti interessano.
- Per rilevare se le query di una determinata applicazione o di un microservizio sono lente: i tag di richiesta consentono di identificare se le query di una determinata applicazione o di un microservizio hanno latenze maggiori.
- Raggruppamento di statistiche per un insieme di letture o query:puoi utilizzare i tag delle richieste per monitorare, confrontare e generare report sul rendimento per un insieme di letture o query simili. Ad esempio, se più query accedono a una tabella o a un insieme di tabelle con lo stesso pattern di accesso, puoi valutare di aggiungere lo stesso tag a tutte le query per monitorarle insieme.
Come assegnare tag di richiesta
L'esempio seguente mostra come impostare i tag di richiesta utilizzando le librerie client di Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Come visualizzare i tag di richiesta nella tabella delle statistiche
La seguente query restituisce le statistiche relative alle query su 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 otteniamo dalla nostra query.
sms | request_tag | execution_count | avg_latency_seconds | avg_rows | avg_bytes |
---|---|---|---|---|---|
SELECT SingerId, AlbumId, AlbumTitle FROM Album | app=concert,env=dev,action=select | 212 | 0,025 | 21 | 2365 |
selezionare * dagli ordini; | 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 notare che se hai assegnato un REQUEST_TAG
per una query, questo viene compilato nella tabella delle statistiche. Se non è stato assegnato
un tag di richiesta, viene visualizzato come stringa vuota.
Per le query con tag, le statistiche vengono aggregate per tag (ad es. il tag di richiesta app=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 transazione
È possibile aggiungere un tag transazione facoltativo alle singole transazioni.
Spanner raggruppa le statistiche per tag transazione, visibile nel campo TRANSACTION_TAG
delle tabelle delle statistiche sulle transazioni.
Quando utilizzare i tag transazione
Di seguito sono riportati alcuni scenari in cui trarre vantaggio dall'utilizzo dei tag transazioni.
- Individuazione dell'origine di una transazione problematica: Spanner raccoglie le statistiche per le transazioni di lettura e scrittura nella tabella delle statistiche delle transazioni. Se nella tabella delle statistiche delle transazioni hai già assegnato dei tag, puoi identificare l'origine (applicazione/microservizio) che chiama le transazioni lente in base alle informazioni contenute nel tag.
- Identificazione delle transazioni nelle tabelle delle statistiche: l'assegnazione di tag di transazioni consente di filtrare le righe della tabella delle statistiche delle transazioni in base ai tag che ti interessano. Senza i tag di transazione, 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 interessate per identificare la transazione senza tag.
- Come scoprire se le transazioni di una determinata applicazione o di un microservizio sono lente: i tag Transaction possono aiutare a identificare se le transazioni di una determinata applicazione o di un microservizio hanno latenze più elevate.
- Raggruppamento delle statistiche per un insieme di transazioni: puoi utilizzare i tag transazione per monitorare, confrontare e generare report sul rendimento di un insieme di transazioni simili.
- Individuare le transazioni che accedono alle colonne coinvolte nel conflitto di blocco: i tag transazione possono essere utili per individuare le singole transazioni che causano conflitti di blocco nelle tabelle Statistiche blocco.
- Flusso di dati delle modifiche utente da Spanner tramite flussi di modifiche: I record di dati delle modifiche in tempo reale contengono tag di transazione per le transazioni che hanno modificato i dati utente. In questo modo il lettore di una modifica in tempo reale associa le modifiche al tipo di transazione in base ai tag.
Come assegnare tag transazione
L'esempio seguente mostra come impostare i tag di transazione utilizzando le librerie client di Spanner. Quando utilizzi una libreria client, puoi impostare un tag transazioni all'inizio della chiamata della transazione, che viene applicato a tutte le singole operazioni all'interno della transazione.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Come visualizzare i tag transazione nella tabella delle statistiche delle transazioni
La seguente query restituisce le statistiche delle transazioni su 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 otteniamo 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.Capacità] |
278802 | 0,3508 |
20524969030 | app=product,service=payment | [Cantanti.Info] | 129012 | 0,0142 |
77848338483 | [stringa vuota] | [Singers.FirstName, Singers.LastName, Cantanti._esiste] | 5357 | 0,048 |
Da questa tabella dei risultati, possiamo notare che se hai assegnato un
TRANSACTION_TAG
a una transazione, questo viene inserito nella tabella
delle statistiche delle transazioni. Se non è stato assegnato alcun tag di transazione, viene visualizzata come una stringa vuota.
Per le transazioni con tag, le statistiche vengono aggregate in base al tag di transazione (ad es. il tag delle transazioni app=concert,env=dev
ha una latenza media di 0,3508 secondi). Se non è assegnato alcun tag, le statistiche
vengono aggregate in base a FPRINT
(ad es. 77848338483 nella terza riga ha una
latenza media di 0,048 secondi).
Come visualizzare i tag transazione nella tabella Statistiche di blocco
La seguente query restituisce le statistiche di blocco su intervalli di 10 minuti.
La funzione CAST()
converte il campo row_range_start_key
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 otteniamo dalla nostra query.
row_range_start_key | lock_wait_seconds | sample_lock_requests |
---|---|---|
Brani(2; 1; 1) | 0,61 | LOCK_MODE: ReaderShared COLONNA: Singers.SingerInfo TRANSACTION_TAG: app=product,service=shipping LOCK_MODE: WriterShared COLONNA: Singers.SingerInfo TRANSACTION_TAG: app=product,service=payment |
album(2,1+) | 0,48 | LOCK_MODE: ReaderShared COLONNA: users._exists1 TRANSACTION_TAG: [stringa vuota] LOCK_MODE: WriterShared COLONNA: users._exists TRANSACTION_TAG: [stringa vuota] |
Da questa tabella dei risultati, possiamo notare che se hai assegnato un
TRANSACTION_TAG
a una transazione, questo viene inserito nella tabella
delle statistiche di blocco. Se non è stato assegnato alcun tag di transazione, viene visualizzato come stringa vuota.
Mappatura tra metodi API e tag di richiesta/transazione
I tag di richiesta e i tag di transazione sono applicabili a metodi API specifici a seconda che la modalità di transazione sia una transazione di sola lettura o una transazione di lettura-scrittura. In genere, i tag di transazione sono applicabili alle transazioni di lettura-scrittura, mentre i tag di richiesta si applicano alle transazioni di sola lettura. La tabella seguente mostra la mappatura dai metodi API ai tipi di tag applicabili.
Metodi API | Modalità transazione | Richiedi tag | Tag transazione |
---|---|---|---|
Letto, StreamingRead |
Transazione di sola lettura | Sì | No |
Transazione di lettura/scrittura | Sì | Sì | |
EsecuzioneSql, EsecuzioneStreamingSql1 |
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 di modifiche in tempo reale eseguite utilizzando il connettore Dataflow
di Apache Beam SpannerIO, REQUEST_TAG
contiene il nome di un job Dataflow.
Limitazioni
Quando aggiungi tag a letture, query e transazioni, tieni presente le seguenti limitazioni:
- La lunghezza di una stringa 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.
- Il trattino basso (_) iniziale viene rimosso dalla stringa.
- I tag sono sensibili alle maiuscole. Ad esempio, se aggiungi il tag della richiesta
APP=cart,ENV=dev
a un insieme di query e aggiungiapp=cart,env=dev
a un altro insieme di query, Spanner aggrega le statistiche separatamente per ogni tag. Nelle tabelle delle statistiche potrebbero mancare tag nei seguenti casi:
- Se Spanner non è in grado di archiviare le statistiche per tutte le operazioni con tag eseguite durante l'intervallo nelle tabelle, il sistema assegna la priorità alle operazioni con le risorse che consumano di più durante l'intervallo specificato.
Denominazione dei tag
Quando assegni tag alle operazioni di database, è importante considerare quali informazioni desideri trasmettere in ogni stringa di tag. La convenzione o il pattern che scegli rende i tuoi tag più efficaci. Ad esempio, una corretta denominazione dei tag semplifica la correlazione delle statistiche con il codice dell'applicazione.
Puoi scegliere qualsiasi tag entro i limiti indicati. Tuttavia, ti consigliamo di creare una stringa tag come un insieme di coppie chiave-valore separate da virgole.
Ad esempio, supponiamo di utilizzare un database Spanner per un caso d'uso di e-commerce. Potresti voler includere informazioni sull'applicazione, sull'ambiente di sviluppo e sull'azione eseguita dalla query nel tag della richiesta che vuoi assegnare a una determinata query. Puoi
valutare l'assegnazione della stringa tag nel formato chiave-valore come
app=cart,env=dev,action=update
.Ciò significa che la query viene chiamata dall'applicazione carrello nell'ambiente di sviluppo e viene utilizzata per aggiornare il carrello.
Supponi di avere un'altra query da un'applicazione di ricerca di cataloghi e di assegnare
la stringa tag come app=catalogsearch,env=dev,action=list
. Ora, se una di queste query viene visualizzata nella tabella delle statistiche delle query come query ad alta latenza, puoi identificare facilmente l'origine utilizzando il tag.
Ecco alcuni esempi di come un pattern di tagging può essere utilizzato per organizzare le statistiche delle operazioni. Questi esempi non sono esaustivi; puoi anche combinarli nella stringa tag utilizzando un delimitatore, ad esempio una virgola.
Chiavi 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=molo |
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. |
Da tenere presente
- Quando assegni un
REQUEST_TAG
, le statistiche per più query con la stessa stringa tag vengono raggruppate in una singola riga nella tabella delle statistiche delle query. Nel campoTEXT
viene mostrato solo il testo di una di queste query. - Quando assegni un
REQUEST_TAG
, le statistiche per più letture con la stessa stringa tag vengono raggruppate in una singola riga nella tabella delle letture delle statistiche. L'insieme di tutte le colonne lette viene aggiunto al campoREAD_COLUMNS
. - Quando assegni un
TRANSACTION_TAG
, le statistiche per le transazioni che hanno la stessa stringa 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
, mentre l'insieme di tutte le colonne lette viene aggiunto al campoREAD_COLUMNS
.
Scenari di risoluzione dei problemi relativi all'utilizzo dei tag
Individuare l'origine 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 sono presenti tre applicazioni, cart, product e frontend, che possiedono o eseguono una query sullo stesso database.
Una volta identificate le transazioni con latenza elevata, puoi utilizzare i tag associati per identificare la parte pertinente del codice dell'applicazione e risolvere ulteriori 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,servizio=ordine | 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 |
Allo stesso modo, il tag di richiesta può essere utilizzato per trovare l'origine di una query problematica dalla tabella delle statistiche sulle query e l'origine della lettura problematica dalla tabella delle statistiche di lettura.
Trovare la latenza e altre statistiche per le transazioni da una particolare applicazione o microservizio
Se nella stringa tag hai utilizzato il nome dell'applicazione o del microservizio, consente di filtrare la tabella delle statistiche delle 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 voglia
controllare 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 delle transazioni solo per i tag che contengono app=payment
.
La seguente query restituisce le statistiche delle transazioni per l'app di pagamento a 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 output di esempio:
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 |
Allo stesso modo, puoi trovare query o letture da un'applicazione specifica nelle statistiche delle query o nella tabella delle statistiche di lettura utilizzando i tag di richiesta.
Rilevamento delle transazioni coinvolte nel conflitto di blocchi
Per scoprire quali transazioni e chiavi di riga hanno riscontrato i tempi di attesa per il blocco elevati,
eseguiamo 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 un esempio 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 COLONNA: Singers.SingerInfo TRANSACTION_TAG: app=cart,service=order LOCK_MODE: ReaderShared COLONNA: Singers.SingerInfo TRANSACTION_TAG: app=cart,service=redis |
Da questa tabella dei risultati, è possibile 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 stanno riscontrando il conflitto.
Una volta identificate le transazioni che causano i conflitti di blocco, puoi concentrarti su queste transazioni utilizzando Statistiche sulle transazioni per avere un'idea migliore di cosa stanno facendo le transazioni e se puoi evitare un conflitto o ridurre il tempo di sospensione dei blocchi. Per maggiori informazioni, consulta le best practice per ridurre il conflitto di blocchi.
Passaggi successivi
- Scopri di più sugli altri strumenti di introspezione.
- Scopri di più sulle altre informazioni che Spanner archivia per ogni database nelle tabelle dello schema di informazioni del database.
- Scopri di più sulle best practice SQL per Spanner.
- Scopri di più sull'analisi di un elevato utilizzo della CPU.