Spanner menyediakan serangkaian tabel statistik bawaan untuk membantu Anda mendapatkan insight tentang kueri, pembacaan, dan transaksi Anda. Untuk mengorelasikan statistik dengan kode aplikasi dan meningkatkan pemecahan masalah, Anda dapat menambahkan tag (string bentuk bebas) ke operasi baca, kueri, dan transaksi Spanner dalam kode aplikasi. Tag ini diisi dalam tabel statistik yang membantu Anda mencari dan mengorelasikan berdasarkan tag.
Spanner mendukung dua jenis tag; tag permintaan dan tag transaksi. Seperti namanya, Anda dapat menambahkan tag transaksi ke transaksi, dan tag permintaan ke API kueri dan baca individual. Anda dapat menetapkan tag transaksi pada cakupan transaksi dan menetapkan tag permintaan individual untuk setiap permintaan API yang berlaku dalam transaksi. Tag permintaan dan tag transaksi yang ditetapkan dalam kode aplikasi diisi di kolom tabel statistik berikut.
| Tabel Statistik | Jenis Tag yang diisi di tabel statistik |
|---|---|
| Statistik Kueri TopN | Tag permintaan |
| Statistik Baca TopN | Tag permintaan |
| Statistik Transaksi TopN | Tag transaksi |
| Statistik Kunci TopN | Tag transaksi |
Tag permintaan
Anda dapat menambahkan tag permintaan opsional ke kueri atau permintaan baca.
Spanner mengelompokkan statistik menurut tag permintaan, yang terlihat di kolom REQUEST_TAG dari tabel statistik kueri dan statistik baca.
Kapan harus menggunakan tag permintaan
Berikut adalah beberapa skenario yang diuntungkan dengan menggunakan tag permintaan.
- Menemukan sumber kueri atau bacaan yang bermasalah: Spanner mengumpulkan statistik untuk bacaan dan kueri dalam tabel statistik bawaan. Jika Anda menemukan kueri lambat atau pembacaan yang menggunakan CPU tinggi dalam tabel statistik, dan Anda telah menetapkan tag ke kueri tersebut, Anda dapat mengidentifikasi sumber (aplikasi/mikroservice) yang memanggil operasi ini berdasarkan informasi dalam tag.
- Mengidentifikasi pembacaan atau kueri dalam tabel statistik: Menetapkan tag permintaan membantu memfilter baris dalam tabel statistik berdasarkan tag yang Anda minati.
- Menemukan apakah kueri dari aplikasi atau microservice tertentu lambat: Tag permintaan dapat membantu mengidentifikasi apakah kueri dari aplikasi atau microservice tertentu memiliki latensi yang lebih tinggi.
- Mengelompokkan statistik untuk serangkaian pembacaan atau kueri: Anda dapat menggunakan tag permintaan untuk melacak, membandingkan, dan melaporkan performa di serangkaian pembacaan atau kueri serupa. Misalnya, jika beberapa kueri mengakses tabel atau sekumpulan tabel dengan pola akses yang sama, Anda dapat mempertimbangkan untuk menambahkan tag yang sama ke semua kueri tersebut untuk melacaknya secara bersamaan.
Cara menetapkan tag permintaan
Contoh berikut menunjukkan cara menetapkan tag permintaan menggunakan library klien Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Cara melihat tag permintaan di tabel statistik
Kueri berikut menampilkan statistik kueri selama interval 10 menit.
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;
Data berikut adalah contoh hasil yang ditampilkan oleh kueri.
| text | 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 kosong] | 154 | 0,048 | 42 | 486,33 |
Dari tabel hasil ini, kita dapat melihat bahwa jika Anda telah menetapkan REQUEST_TAG
untuk kueri, maka kueri tersebut akan diisi dalam tabel statistik. Jika tidak ada tag permintaan yang ditetapkan, tag tersebut akan ditampilkan sebagai string kosong.
Untuk kueri yang diberi tag, statistik diagregasi per tag (misalnya, tag permintaan app=concert,env=dev,action=select memiliki latensi rata-rata 0,025 detik). Jika tidak ada tag yang ditetapkan, statistik akan digabungkan per kueri (misalnya, kueri di baris ketiga memiliki latensi rata-rata 0,048 detik).
Tag transaksi
Tag transaksi opsional dapat ditambahkan ke setiap transaksi.
Spanner mengelompokkan statistik menurut tag transaksi, yang terlihat di kolom TRANSACTION_TAG pada tabel statistik transaksi.
Kapan harus menggunakan tag transaksi
Berikut adalah beberapa skenario yang diuntungkan dengan menggunakan tag transaksi.
- Menemukan sumber transaksi yang bermasalah: Spanner mengumpulkan statistik untuk transaksi baca-tulis dalam tabel statistik transaksi. Saat Anda menemukan transaksi lambat dalam tabel statistik transaksi, jika Anda telah menetapkan tag ke transaksi tersebut, Anda dapat mengidentifikasi sumber (aplikasi/microservice) yang memanggil transaksi ini berdasarkan informasi dalam tag.
- Mengidentifikasi transaksi dalam tabel statistik: Menetapkan tag transaksi membantu memfilter baris dalam tabel statistik transaksi berdasarkan tag yang Anda minati. Tanpa tag transaksi, menemukan operasi apa yang diwakili oleh statistik dapat menjadi proses yang rumit. Misalnya, untuk statistik transaksi, Anda harus memeriksa tabel dan kolom yang terlibat untuk mengidentifikasi transaksi yang tidak diberi tag.
- Menemukan apakah transaksi dari aplikasi atau microservice tertentu berjalan lambat: Tag transaksi dapat membantu mengidentifikasi apakah transaksi dari aplikasi atau microservice tertentu memiliki latensi yang lebih tinggi.
- Mengelompokkan statistik untuk serangkaian transaksi: Anda dapat menggunakan tag transaksi untuk melacak, membandingkan, dan melaporkan performa untuk serangkaian transaksi serupa.
- Menemukan transaksi mana yang mengakses kolom yang terlibat dalam konflik penguncian: Tag transaksi dapat membantu menunjukkan transaksi individual yang menyebabkan konflik penguncian dalam tabel Statistik penguncian.
- Mengalirkan data perubahan pengguna dari Spanner menggunakan aliran perubahan: Data aliran perubahan berisi catatan tag transaksi untuk transaksi yang mengubah data pengguna. Hal ini memungkinkan pembaca aliran perubahan mengaitkan perubahan dengan jenis transaksi berdasarkan tag.
Cara menetapkan tag transaksi
Contoh berikut menunjukkan cara menetapkan tag transaksi menggunakan library klien Spanner. Saat menggunakan library klien, Anda dapat menetapkan tag transaksi di awal panggilan transaksi yang akan diterapkan ke semua operasi individual dalam transaksi tersebut.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Cara melihat tag transaksi di tabel Statistik Transaksi
Kueri berikut menampilkan statistik transaksi selama interval 10 menit.
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;
Data berikut adalah contoh hasil yang ditampilkan oleh kueri.
| 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 kosong] | [Singers.FirstName, Singers.LastName, Singers._exists] | 5357 | 0,048 |
Dari tabel hasil ini, kita dapat melihat bahwa jika Anda telah menetapkan
TRANSACTION_TAG ke transaksi, maka nilai tersebut akan diisi di tabel statistik
transaksi. Jika tidak ada tag transaksi yang ditetapkan, tag tersebut akan ditampilkan sebagai
string kosong.
Untuk transaksi yang diberi tag, statistik diagregasi per tag transaksi
(misalnya, tag transaksi app=concert,env=deva memiliki latensi rata-rata
0,3508 detik). Jika tidak ada tag yang ditetapkan, statistik akan digabungkan per FPRINT (misalnya, 77848338483 di baris ketiga memiliki latensi rata-rata 0,048 detik).
Cara melihat tag transaksi di tabel Statistik Kunci
Kueri berikut menampilkan statistik penguncian selama interval 10 menit.
Fungsi CAST() mengonversi
kolom BYTES row_range_start_key menjadi 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;
Data berikut adalah contoh hasil yang ditampilkan oleh kueri.
| row_range_start_key | lock_wait_seconds | sample_lock_requests |
|---|---|---|
| Lagu(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 |
| album(2,1+) | 0,48 | LOCK_MODE: ReaderShared COLUMN: users._exists1 TRANSACTION_TAG: [empty string] LOCK_MODE: WriterShared COLUMN: users._exists TRANSACTION_TAG: [empty string] |
Dari tabel hasil ini, kita dapat melihat bahwa jika Anda telah menetapkan
TRANSACTION_TAG ke transaksi, maka transaksi tersebut akan diisi di tabel statistik
penguncian. Jika tidak ada tag transaksi yang ditetapkan, tag tersebut akan ditampilkan sebagai
string kosong.
Menetapkan tag secara otomatis
Library klien Spanner mendukung pemberian tag otomatis pada tumpukan panggilan. Jika pemberian tag otomatis diaktifkan, library klien akan memeriksa stack panggilan eksekusi aplikasi Anda untuk menentukan class dan metode mana yang memulai permintaan database. Tag Assistant akan otomatis membuat tag berdasarkan nama ini
(misalnya, OrderDao.placeOrder di Java atau db__OrderDao__PlaceOrder di Go)
dan mengisi request_tag atau transaction_tag.
Pemberian tag otomatis didukung di library klien berikut:
- Java di versi 6.118.0 dan yang lebih baru.
- Go di versi 1.92.0 dan yang lebih baru.
Pertimbangan untuk pemberian tag otomatis
Pertimbangkan hal berikut sebelum menggunakan pemberian tag otomatis:
- Overhead CPU dan latensi: Memeriksa stack panggilan runtime menggunakan refleksi atau caller walking runtime pada setiap permintaan dan transaksi akan menimbulkan overhead CPU dan latensi. Sebelum mengaktifkan pemberian tag otomatis secara paksa secara global di lingkungan produksi QPS tinggi, evaluasi dampak performa pada layanan Anda.
- Perbedaan dari pemberian tag nilai kunci: Tag yang dibuat otomatis (seperti
OrderDao.placeOrder) mengidentifikasi simbol asal kode, bukan metadata nilai kunci terstruktur (sepertiapp=cart,env=dev). Jika kueri pemantauan Anda memfilter tabel statistik menggunakan awalan kunci sepertiSTARTS_WITH(request_tag, "app="), operasi yang diberi tag otomatis tidak akan cocok dengan filter tersebut. - Kardinalitas tag: Nama metode dinamis atau yang sangat kelebihan beban dapat meningkatkan kardinalitas tag dalam tabel statistik. Jika jumlah tag unik melebihi kapasitas pelacakan Spanner selama interval, Spanner memprioritaskan operasi pelacakan dengan konsumsi resource tertinggi.
- Pengungkapan informasi: Karena tag disimpan dalam teks biasa di tabel statistik
SPANNER_SYS, nama class dan metode internal dapat dilihat oleh siapa saja yang memiliki akses untuk mengkueri statistik database. Hindari penggunaan terminologi bisnis sensitif dalam nama metode atau class jika akses pemantauan dibagikan di seluruh batas.
Mengaktifkan dan menonaktifkan pemberian tag otomatis
Anda dapat mengonfigurasi pemberian tag otomatis dalam kode, atau menetapkan setelan secara global dengan variabel lingkungan.
Aturan prioritas konfigurasi
Jika Anda menetapkan request_tag atau transaction_tag secara manual pada permintaan atau
pembangun transaksi, tag tersebut akan selalu diutamakan daripada tag stack panggilan
yang dibuat otomatis. Jika tidak ada tag manual, konfigurasi pemberian tag otomatis
mengikuti aturan prioritas berikut:
- Penggantian paksa nonaktif: Jika
SPANNER_DISABLE_AUTO_TAGGING=truedisetel, pemberian tag otomatis akan sepenuhnya dinonaktifkan secara global, menggantikan konfigurasi terprogram. - Penggantian yang diaktifkan secara paksa: Jika
SPANNER_ENABLE_AUTO_TAGGING=truedisetel, pemberian tag otomatis diaktifkan secara global, menggantikan konfigurasi terprogram. - Konfigurasi terprogram: Jika tidak ada variabel lingkungan pengganti yang ditetapkan, library akan menggunakan konfigurasi terprogram yang ditetapkan di
SpannerOptions(Java) atauClientConfig(Go). - Perilaku default: Jika Anda tidak mengonfigurasi pemberian tag otomatis, fitur ini akan dinonaktifkan secara default.
Penggantian global
Untuk mengaktifkan atau menonaktifkan pemberian tag otomatis secara paksa secara global tanpa mengubah kode aplikasi, tetapkan variabel lingkungan di lingkungan runtime Anda:
# Force-enable globally
export SPANNER_ENABLE_AUTO_TAGGING=true
# Force-disable globally (overrides code configuration)
export SPANNER_DISABLE_AUTO_TAGGING=true
Konfigurasi terprogram
Contoh berikut menunjukkan cara mengaktifkan pemberian tag otomatis call stack menggunakan library klien Spanner.
Go
package main
import (
"context"
"cloud.google.com/go/spanner"
)
func main() {
ctx := context.Background()
config := spanner.ClientConfig{
// Enable call-stack autotagging
EnableAutoTagging: true,
// Optional: Specify target application package prefixes
AutoTaggingPackages: []string{"github.com/mycompany/orderingservice"},
// Optional: Set maximum stack depth to inspect (default is 50)
AutoTaggingTracerLimit: 50,
}
client, err := spanner.NewClientWithConfig(ctx, "projects/p/instances/i/databases/d", config)
if err != nil {
panic(err)
}
defer client.Close()
}
Java
import com.google.cloud.spanner.Spanner;
import com.google.cloud.spanner.SpannerOptions;
import java.util.Arrays;
SpannerOptions options = SpannerOptions.newBuilder()
// Enable call-stack autotagging
.enableAutoTagging()
// Optional: Specify target application package prefixes
.setAutoTaggingPackages(Arrays.asList("com.mycompany.orderingservice."))
// Optional: Set maximum stack depth to inspect (default is 50)
.setAutoTaggingTracerLimit(100)
.build();
Spanner spanner = options.getService();
Pemetaan antara metode API dan tag permintaan serta transaksi
Tag permintaan dan tag transaksi berlaku untuk metode API tertentu berdasarkan apakah mode transaksi adalah transaksi hanya baca atau transaksi baca-tulis. Umumnya, tag transaksi berlaku untuk transaksi baca-tulis, sedangkan tag permintaan berlaku untuk transaksi hanya baca. Tabel berikut menunjukkan pemetaan dari metode API ke jenis tag yang berlaku.
| Metode API | Mode Transaksi | Minta Tag | Tag Transaksi |
|---|---|---|---|
| Read, StreamingRead |
Transaksi hanya baca | Ya | Tidak |
| Transaksi baca-tulis | Ya | Ya | |
| ExecuteSql, ExecuteStreamingSql1 |
Transaksi hanya baca1 | Ya1 | Tidak |
| Transaksi baca-tulis | Ya | Ya | |
| ExecuteBatchDml | Transaksi baca-tulis | Ya | Ya |
| BeginTransaction | Transaksi baca-tulis | Tidak | Ya |
| Commit | Transaksi baca-tulis | Tidak | Ya |
1 Untuk kueri aliran perubahan yang dieksekusi menggunakan konektor Dataflow SpannerIO Apache Beam, REQUEST_TAG berisi nama tugas Dataflow.
Batasan
Saat menambahkan tag ke bacaan, kueri, dan transaksi, pertimbangkan batasan berikut:
- Panjang string tag dibatasi hingga 50 karakter. String yang melebihi batas ini akan dipangkas.
- Hanya karakter ASCII (32-126) yang diizinkan dalam tag. Karakter unicode arbitrary diganti dengan garis bawah.
- Semua karakter garis bawah (_) di awal akan dihapus dari string.
- Tag peka huruf besar/kecil. Misalnya, jika Anda menambahkan tag permintaan
APP=cart,ENV=devke satu set kueri, dan menambahkanapp=cart,env=devke set kueri lainnya, Spanner akan menggabungkan statistik secara terpisah untuk setiap tag. Tag mungkin tidak ada di tabel statistik dalam kondisi berikut:
- Jika Spanner tidak dapat menyimpan statistik untuk semua operasi yang diberi tag yang dijalankan selama interval dalam tabel, sistem akan memprioritaskan operasi dengan sumber daya yang paling banyak digunakan selama interval yang ditentukan.
Penamaan tag
Saat menetapkan tag ke operasi database, penting untuk mempertimbangkan informasi yang ingin Anda sampaikan di setiap string tag. Konvensi atau pola yang Anda pilih membuat tag Anda lebih efektif. Misalnya, penamaan tag yang tepat mempermudah korelasi statistik dengan kode aplikasi.
Anda dapat memilih tag apa pun dalam batasan yang dinyatakan. Namun, sebaiknya buat string tag sebagai serangkaian pasangan nilai kunci yang dipisahkan oleh koma.
Misalnya, asumsikan bahwa Anda menggunakan database Spanner untuk kasus penggunaan e-commerce. Anda dapat menyertakan informasi tentang aplikasi, lingkungan pengembangan, dan tindakan yang dilakukan oleh kueri dalam tag permintaan yang akan Anda tetapkan ke kueri tertentu. Anda dapat
mempertimbangkan untuk menetapkan string tag dalam format nilai kunci sebagai
app=cart,env=dev,action=update. Artinya, kueri dipanggil dari aplikasi keranjang di lingkungan pengembangan, dan digunakan untuk memperbarui keranjang.
Misalkan Anda memiliki kueri lain dari aplikasi penelusuran katalog dan Anda menetapkan string tag sebagai app=catalogsearch,env=dev,action=list. Sekarang, jika ada kueri ini yang muncul di tabel statistik kueri sebagai kueri latensi tinggi, Anda dapat mengidentifikasi sumbernya menggunakan tag.
Berikut beberapa contoh cara pola pemberian tag dapat digunakan untuk mengatur statistik operasi Anda. Contoh ini tidak dimaksudkan untuk menjadi lengkap; Anda juga dapat menggabungkannya dalam string tag menggunakan pembatas seperti koma.
| Kunci tag | Contoh Pasangan nilai tag | Deskripsi |
|---|---|---|
| Aplikasi | app=cart app=frontend app=catalogsearch |
Membantu mengidentifikasi aplikasi yang memanggil operasi. |
| Lingkungan | env=prod env=dev env=test env=staging |
Membantu mengidentifikasi lingkungan yang terkait dengan operasi. |
| Framework | framework=spring framework=django framework=jetty |
Membantu mengidentifikasi framework yang terkait dengan operasi. |
| Tindakan | action=list action=retrieve action=update |
Membantu mengidentifikasi tindakan yang dilakukan oleh operasi. |
| Layanan | service=payment service=shipping |
Membantu mengidentifikasi microservice yang memanggil operasi. |
Hal-Hal yang Perlu Diperhatikan
- Saat Anda menetapkan
REQUEST_TAG, statistik untuk beberapa kueri yang memiliki string tag yang sama dikelompokkan dalam satu baris di tabel statistik kueri. Hanya teks salah satu kueri tersebut yang ditampilkan di kolomTEXT. - Saat Anda menetapkan
REQUEST_TAG, statistik untuk beberapa pembacaan yang memiliki string tag yang sama dikelompokkan dalam satu baris di tabel statistik pembacaan. Kumpulan semua kolom yang dibaca ditambahkan ke kolomREAD_COLUMNS. - Saat Anda menetapkan
TRANSACTION_TAG, statistik untuk transaksi yang memiliki string tag yang sama dikelompokkan dalam satu baris di tabel statistik transaksi. Kumpulan semua kolom yang ditulis oleh transaksi ditambahkan ke kolomWRITE_CONSTRUCTIVE_COLUMNSdan kumpulan semua kolom yang dibaca ditambahkan ke kolomREAD_COLUMNS.
Memecahkan masalah skenario menggunakan tag
Skenario berikut menjelaskan cara menggunakan tag untuk memecahkan masalah performa.
Menemukan sumber transaksi yang bermasalah
Kueri berikut menampilkan data mentah untuk transaksi teratas dalam jangka waktu yang dipilih.
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;
Tabel berikut mencantumkan contoh data yang ditampilkan dari kueri kita, dengan tiga aplikasi, yaitu cart, product, dan frontend, yang memiliki atau mengkueri database yang sama.
Setelah mengidentifikasi transaksi yang mengalami latensi tinggi, Anda dapat menggunakan tag terkait untuk mengidentifikasi bagian kode aplikasi yang relevan, dan memecahkan masalah lebih lanjut menggunakan statistik transaksi.
| 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 kosong] | 0,031 | 0,015 | 14 | 0 |
Demikian pula, Tag Permintaan dapat digunakan untuk menemukan sumber kueri yang bermasalah dari tabel statistik kueri dan sumber pembacaan yang bermasalah dari tabel statistik pembacaan.
Menemukan latensi dan statistik lainnya untuk transaksi dari aplikasi atau microservice tertentu
Jika Anda telah menggunakan nama aplikasi atau nama microservice dalam string tag, hal ini akan membantu memfilter tabel statistik transaksi menurut tag yang berisi nama aplikasi atau nama microservice tersebut.
Misalnya, Anda telah menambahkan transaksi baru ke aplikasi pembayaran dan Anda ingin melihat latensi dan statistik lainnya dari transaksi baru tersebut. Jika Anda telah menggunakan nama aplikasi pembayaran dalam tag, Anda dapat memfilter tabel statistik transaksi hanya untuk tag yang berisi app=payment.
Kueri berikut menampilkan statistik transaksi untuk aplikasi pembayaran selama interval 10 menit.
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;
Berikut beberapa contoh 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 |
Demikian pula, Anda dapat menemukan kueri atau pembacaan dari aplikasi tertentu di tabel statistik kueri atau statistik pembacaan menggunakan tag permintaan.
Menemukan transaksi yang terlibat dalam konflik kunci
Untuk mengetahui transaksi dan kunci baris mana yang mengalami waktu tunggu kunci yang tinggi, kita membuat kueri tabel LOCK_STAT_TOP_10MINUTE, yang mencantumkan kunci baris, kolom, dan transaksi terkait yang terlibat dalam konflik kunci.
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;
Berikut beberapa contoh output dari kueri kita:
| row_range_start_key | total_lock_wait_seconds | lock_wait_seconds | frac_of_total | sample_lock_requests |
|---|---|---|---|---|
| Penyanyi(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 |
Dari tabel hasil ini, kita dapat melihat bahwa konflik terjadi pada tabel Singers
di kunci SingerId=32. Singers.SingerInfo adalah kolom tempat
konflik penguncian terjadi antara ReaderShared dan WriterShared. Anda juga dapat
mengidentifikasi transaksi terkait (app=cart,service=order dan
app=cart,service=redis) yang mengalami konflik.
Setelah transaksi yang menyebabkan konflik kunci diidentifikasi, Anda kini dapat berfokus pada transaksi ini dengan menggunakan Statistik Transaksi untuk lebih memahami tindakan yang dilakukan transaksi tersebut dan apakah Anda dapat menghindari konflik atau mengurangi durasi kunci dipertahankan. Untuk mengetahui informasi selengkapnya, lihat Praktik terbaik untuk mengurangi persaingan kunci.
Langkah berikutnya
- Pelajari alat Introspeksi lainnya.
- Pelajari informasi lain yang disimpan Spanner untuk setiap database di tabel skema informasi database.
- Pelajari lebih lanjut praktik terbaik SQL untuk Spanner.
- Pelajari lebih lanjut Menyelidiki penggunaan CPU yang tinggi.