Spanner fornisce un insieme di tabelle delle statistiche integrate per aiutarti a ottenere insight nelle query, nelle letture e nelle transazioni. Per correlare le statistiche con del codice dell'applicazione e per migliorare la risoluzione dei problemi, puoi aggiungere un tag (un formato libero string) alle operazioni di lettura, query e transazione di Spanner nel tuo il codice dell'applicazione. Questi tag vengono inseriti in tabelle di statistiche che ti consentono per correlare e cercare in base ai tag.
Spanner supporta due tipi di tag: request e transaction. Come suggerisce il nome, puoi aggiungere tag di transazione transazioni e tag di richiesta a singole query e API di lettura. Puoi impostare un tag transazioni nell'ambito delle transazioni e impostare singoli tag di richiesta a ogni richiesta API applicabile nella transazione. Tag di richiesta e transazione i tag impostati nel codice dell'applicazione vengono completati nelle colonne di le seguenti tabelle di 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
di
sia il
statistiche sulle query
e
leggi le statistiche
tabelle.
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 statistiche per letture e query nelle tabelle delle statistiche integrate. Quando nelle statistiche trovi query lente o un elevato consumo di CPU tabella, se hai già assegnato tag a questi ultimi, puoi identificare il (applicazione/microservizio) che chiama queste operazioni in base a le informazioni nel tag.
- Identificazione di letture o query nelle tabelle delle statistiche: assegnazione della richiesta consente di filtrare le righe nella tabella delle statistiche in base ai tag che a cui sono interessati.
- Per scoprire se le query di una determinata applicazione o di un microservizio vengono lenta: i tag di richiesta consentono di identificare se le query provenienti da un determinato un'applicazione o un microservizio hanno latenze più elevate.
- Raggruppamento di statistiche per un insieme di letture o query:puoi utilizzare l'opzione tag per monitorare, confrontare e generare report sul rendimento per un insieme di letture simili o query. Ad esempio, se più query accedono a una tabella o a un insieme di con lo stesso pattern di accesso, puoi valutare di aggiungere lo stesso tag tutte queste query per monitorarle insieme.
Come assegnare tag di richiesta
L'esempio seguente mostra come impostare i tag di richiesta utilizzando Spanner librerie client.
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 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 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 vedere che se hai assegnato un REQUEST_TAG
per una query, questo viene inserito nella tabella delle statistiche. In caso contrario,
di richiesta assegnato, questo valore viene visualizzato come stringa vuota.
Per le query con tag, le statistiche vengono aggregate per tag (ad es. 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 in base
(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 in base al tag transazione, visibile nel
Campo TRANSACTION_TAG
di
statistiche sulle transazioni
tabelle.
Quando utilizzare i tag transazione
Di seguito sono riportati alcuni scenari che traggono vantaggio dall'utilizzo di transazioni i tag.
- Individuazione dell'origine di una transazione problematica:Spanner raccoglie statistiche per le transazioni di lettura/scrittura nella transazione tabella delle statistiche. Quando noti transazioni lente nella transazione delle statistiche, se sono già stati assegnati tag, puoi Identifica l'origine (applicazione/microservizio) che chiama transazioni in base alle informazioni contenute nel tag.
- Identificazione delle transazioni nelle tabelle delle statistiche: assegnazione delle transazioni consente di filtrare le righe nella tabella delle statistiche delle transazioni in base al che ti interessano. Senza i tag di transazione, la scoperta operazioni sono rappresentate da una statistica può essere un processo complicato. Per Ad esempio, per le statistiche delle transazioni, devi esaminare le tabelle e le colonne coinvolte per identificare la transazione senza tag.
- Scoprire se le transazioni di una determinata applicazione o di un microservizio vengono lenta: i tag transazione consentono di identificare se le transazioni provenienti da un determinato un'applicazione o un microservizio hanno latenze più elevate.
- Raggruppamento delle statistiche per un insieme di transazioni:puoi utilizzare l'opzione per monitorare, confrontare e generare report sul rendimento di un insieme di dati simili transazioni.
- Individuazione delle transazioni che accedono alle colonne coinvolte nel blocco conflitto: i tag transazione possono aiutare a individuare singole transazioni causare conflitti di blocco nelle tabelle Statistiche blocco.
- Trasmettere in streaming i dati delle modifiche utente da Spanner utilizzando i flussi di modifiche: I record di dati delle modifiche in tempo reale contengono tag di transazione per le transazioni che ha modificato i dati utente. In questo modo il lettore di un flusso di modifiche associare le modifiche al tipo di transazione in base ai tag.
Come assegnare tag transazione
L'esempio seguente mostra come impostare i tag transazione utilizzando Spanner librerie client. Quando utilizzi una libreria client, puoi impostare un tag transazione l'inizio della chiamata della transazione, che viene applicata a tutti i singoli operazioni all'interno della transazione.
C++
C#
Vai
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 query.
fprint | transaction_tag | read_columns | commit_attempt_count | avg_total_latency_seconds |
---|---|---|---|---|
40015598317 | app=concert,env=dev | [Sedi._esiste, 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, Cantanti._esiste] | 5357 | 0,048 |
Da questa tabella dei risultati, possiamo notare che se hai assegnato un
TRANSACTION_TAG
a una transazione, che viene poi inserito nella transazione
tabella delle statistiche. Se non è stato assegnato alcun tag transazioni, viene visualizzato come
stringa vuota.
Per le transazioni con tag, le statistiche vengono aggregate per tag di transazione
Ad esempio, il tag transazione app=concert,env=dev
a ha una media
latenza di 0,3508 secondi). Se non è stato assegnato alcun tag, le statistiche
sono aggregati per FPRINT
(ad es. 77848338483 nella terza riga ha un
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
row_range_start_key
BYTES su 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 query.
row_range_start_key | lock_wait_seconds | sample_lock_requests |
---|---|---|
Brani(2; 1; 1) | 0,61 | LOCK_MODE: Condivisione con Reader COLONNA: Cantanti.SingerInfo TRANSACTION_TAG: app=prodotto,servizio=spedizione LOCK_MODE: WriterShared COLONNA: Cantanti.SingerInfo TRANSACTION_TAG: app=prodotto,servizio=pagamento |
album(2,1+) | 0,48 | LOCK_MODE: Condivisione con Reader COLONNA: utenti._esiste1 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, il codice viene inserito nel blocco
tabella delle statistiche. Se non è stato assegnato alcun tag transazioni, viene visualizzato
come stringa vuota.
Mappatura tra metodi API e tag di richiesta/transazione
I tag di richiesta e di transazione sono applicabili a metodi API specifici basati se la modalità di transazione è di sola lettura o lettura/scrittura transazione. Generalmente, i tag transazione sono applicabili alle operazioni di lettura/scrittura mentre i tag di richiesta sono applicabili alle transazioni di sola lettura. La tabella seguente mostra la mappatura dai metodi dell'API ai tipi applicabili di i tag.
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 SpannerIO di Apache Beam
Connettore Dataflow, REQUEST_TAG
contiene il nome di un job Dataflow.
Limitazioni
Quando aggiungi tag a letture, query e transazioni, considera quanto segue limitazioni:
- La lunghezza di una stringa tag è limitata a 50 caratteri. Stringhe che superano questo limite è troncato.
- In un tag sono consentiti solo caratteri ASCII (32-126). Unicode arbitrario 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 di richiesta
APP=cart,ENV=dev
a un insieme di query e aggiungiapp=cart,env=dev
a a un altro insieme di query, Spanner aggrega le statistiche separatamente per ogni tag. Potrebbero mancare tag nelle tabelle delle statistiche nel seguente modo: circostanza:
- Se Spanner non è in grado di archiviare le statistiche per tutti i tag di operazioni eseguite durante l'intervallo nelle tabelle, le operazioni con le risorse che consumano di più durante il periodo specificato intervallo di tempo.
Denominazione dei tag
Quando assegni tag alle operazioni di database, è importante considerare le informazioni che vuoi comunicare in ogni stringa di tag. La convenzione o il pattern scelto rende i tag più efficaci. Ad esempio, tag corretto semplifica la correlazione delle statistiche con il codice dell'applicazione.
Puoi scegliere qualsiasi tag entro i limiti indicati. Tuttavia, consigliamo di creare una stringa tag come un insieme di coppie chiave/valore separate con virgole.
Ad esempio, supponiamo di utilizzare un database Spanner per
caso d'uso dell'e-commerce. Ti consigliamo di includere informazioni sul
dell'applicazione, dell'ambiente di sviluppo e dell'azione eseguita dalla query
il tag di richiesta che intendi assegnare a una determinata query. Puoi
considera l'assegnazione della stringa tag nel formato chiave-valore
app=cart,env=dev,action=update
.Ciò significa che la query viene richiamata dal carrello
nell'ambiente di sviluppo e viene utilizzato per aggiornare il carrello.
Supponi di avere un'altra query da un'applicazione di ricerca catalogo e di assegnare
la stringa tag come app=catalogsearch,env=dev,action=list
. Se uno di questi
visualizzate nella tabella delle statistiche delle query come query ad alta latenza,
identificare facilmente la fonte
utilizzando il tag.
Ecco alcuni esempi di come un pattern di tagging può essere utilizzato per organizzare le statistiche delle operazioni. Questi esempi non intendono essere esaustivi; puoi e combinarle 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=jetty |
Aiuta a identificare il framework associato all'operazione. |
Azione | action=elenco 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 che hanno La stessa stringa tag viene raggruppate in una singola riga nelle 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 è raggruppate in una singola riga nelle statistiche di lettura . L'insieme di tutte le colonne lette viene aggiunto alla tabellaREAD_COLUMNS
. - Quando assegni un
TRANSACTION_TAG
, le statistiche per le transazioni che hanno La stessa stringa tag è raggruppate in una singola riga nelle statistiche sulle transazioni . Viene aggiunto l'insieme di tutte le colonne scritte dalle transazioni al campoWRITE_CONSTRUCTIVE_COLUMNS
e all'insieme di tutte le colonne vengono aggiunte 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 in 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 tre applicazioni, cart, prodotto e frontend, che possiedono o eseguire una query sullo stesso database.
Una volta identificate le transazioni che presentano una latenza elevata, puoi utilizzare il metodo i tag associati per identificare la parte pertinente del codice dell'applicazione e prova a risolvere altri problemi utilizzando 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, è possibile utilizzare Tag di richiesta per trovare l'origine di una query problematica dalla tabella delle statistiche delle query e fonte della lettura problematica dalle statistiche di lettura .
Trovare la latenza e altre statistiche per le transazioni da una particolare applicazione o microservizio
Se hai utilizzato il nome dell'applicazione o del microservizio nella stringa del tag, aiuta a 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
le latenze e altre statistiche delle nuove transazioni. Se disponi
utilizzato il nome dell'applicazione di pagamento all'interno del tag, puoi filtrare
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 negli 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 |
Analogamente, puoi trovare query o letture da un'applicazione specifica in statistiche sulle query o la tabella lettura delle statistiche utilizzando 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 elevati per il blocco:
eseguiamo una query sulla tabella LOCK_STAT_TOP_10MINUTE
, che elenca chiavi di riga, colonne
e le corrispondenti transazioni 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: Cantanti.SingerInfo TRANSACTION_TAG: app=cart,service=order LOCK_MODE: Condivisione con Reader COLONNA: Cantanti.SingerInfo TRANSACTION_TAG: app=cart,service=redis |
Da questa tabella dei risultati, possiamo vedere che il conflitto si è verificato nella Singers
nella chiave SingerId=32. Singers.SingerInfo
è la colonna in cui
si è verificato un 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 Concentrati su queste transazioni utilizzando le statistiche sulle transazioni. per avere un'idea migliore di ciò che stanno facendo le transazioni e se è possibile evitare conflitti o di ridurre il tempo di permanenza dei blocchi. Per ulteriori 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 nella schema di informazioni del database.
- Scopri di più sulle best practice SQL per Spanner.
- Scopri di più sull'analisi di una CPU elevata all'utilizzo delle risorse.