Spanner menyediakan serangkaian tabel statistik bawaan untuk membantu Anda mendapatkan insight tentang kueri, pembacaan, dan transaksi. Untuk mengaitkan 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 di tabel statistik yang membantu Anda melakukan korelasi dan penelusuran berdasarkan tag.
Spanner mendukung dua jenis tag; tag permintaan dan tag transaksi. Seperti namanya, Anda dapat menambahkan tag transaksi ke transaksi, dan meminta tag ke setiap kueri dan API baca. 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 | Meminta tag |
Statistik Baca TopN | Meminta tag |
Statistik Transaksi TopN | Tag transaksi |
Statistik Kunci TopN | Tag transaksi |
Meminta tag
Anda dapat menambahkan tag permintaan opsional ke kueri atau permintaan baca. Spanner
mengelompokkan statistik berdasarkan tag permintaan, yang terlihat di kolom REQUEST_TAG
pada
tabel
statistik kueri
dan
statistik baca.
Kapan harus menggunakan tag permintaan
Berikut adalah beberapa skenario yang mendapatkan manfaat dari penggunaan tag permintaan.
- Menemukan sumber kueri atau pembacaan yang bermasalah: Spanner mengumpulkan statistik untuk pembacaan dan kueri dalam tabel statistik bawaan. Saat menemukan kueri lambat atau pembacaan yang menggunakan CPU tinggi dalam tabel statistik, jika Anda telah menetapkan tag ke kueri tersebut, Anda dapat mengidentifikasi sumber (aplikasi/microservice) 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 operasi baca atau kueri: Anda dapat menggunakan tag permintaan untuk melacak, membandingkan, dan melaporkan performa di seluruh serangkaian operasi baca atau kueri yang serupa. Misalnya, jika beberapa kueri mengakses tabel/kumpulan tabel dengan pola akses yang sama, sebaiknya tambahkan tag yang sama ke semua kueri tersebut untuk melacaknya bersama-sama.
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;
Mari kita ambil data berikut sebagai contoh hasil yang kita dapatkan dari 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, kueri tersebut akan diisi di tabel statistik. Jika tidak ada tag permintaan yang ditetapkan, tag tersebut akan ditampilkan sebagai string kosong.
Untuk kueri yang diberi tag, statistik digabungkan 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 mendapatkan manfaat dari penggunaan tag transaksi.
- Menemukan sumber transaksi yang bermasalah: Spanner mengumpulkan statistik untuk transaksi baca-tulis di tabel statistik transaksi. Jika menemukan transaksi lambat di tabel statistik transaksi, dan jika 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 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 lambat: Tag transaksi dapat membantu mengidentifikasi apakah transaksi dari aplikasi atau microservice tertentu memiliki latensi yang lebih tinggi.
- Mengelompokkan statistik untuk sekumpulan transaksi: Anda dapat menggunakan tag transaksi untuk melacak, membandingkan, dan melaporkan performa untuk sekumpulan transaksi serupa.
- Menemukan transaksi yang mengakses kolom yang terlibat dalam konflik kunci: Tag transaksi dapat membantu menentukan setiap transaksi yang menyebabkan konflik kunci di tabel Statistik kunci.
- Men-streaming data perubahan pengguna dari Spanner menggunakan aliran data perubahan: Data aliran data perubahan berisi tag transaksi untuk transaksi yang mengubah data pengguna. Hal ini memungkinkan pembaca aliran perubahan untuk 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 diterapkan ke semua operasi individual di 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;
Mari kita ambil data berikut sebagai contoh hasil yang kita dapatkan dari 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, TRANSACTION_TAG
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 digabungkan per tag transaksi
(misalnya, tag transaksi app=concert,env=dev
a 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 kunci 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;
Mari kita ambil data berikut sebagai contoh hasil yang kita dapatkan dari kueri.
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: [string kosong] LOCK_MODE: WriterShared COLUMN: users._exists TRANSACTION_TAG: [string kosong] |
Dari tabel hasil ini, kita dapat melihat bahwa jika Anda telah menetapkan
TRANSACTION_TAG
ke transaksi, transaksi tersebut akan diisi di tabel statistik
kunci. Jika tidak ada tag transaksi yang ditetapkan, tag tersebut akan ditampilkan
sebagai string kosong.
Pemetaan antara metode API dan tag permintaan/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 | Tag Permintaan | 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 dijalankan menggunakan konektor Dataflow SpannerIO
Apache Beam, REQUEST_TAG
berisi nama tugas Dataflow.
Batasan
Saat menambahkan tag ke pembacaan, kueri, dan transaksi, pertimbangkan batasan berikut:
- Panjang string tag dibatasi hingga 50 karakter. String yang melebihi batas ini akan terpotong.
- Hanya karakter ASCII (32-126) yang diizinkan dalam tag. Karakter unicode arbitrer 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=dev
ke satu kumpulan kueri, dan menambahkanapp=cart,env=dev
ke kumpulan kueri lain, Spanner akan menggabungkan statistik secara terpisah untuk setiap tag. Tag mungkin tidak ada di tabel statistik dalam keadaan berikut:
- Jika Spanner tidak dapat menyimpan statistik untuk semua operasi bertag yang dijalankan selama interval dalam tabel, sistem akan memprioritaskan operasi dengan resource yang paling banyak digunakan selama interval yang ditentukan.
Penamaan tag
Saat menetapkan tag ke operasi database, penting untuk mempertimbangkan informasi yang ingin Anda sampaikan dalam setiap string tag. Konvensi atau pola yang Anda pilih akan membuat tag Anda lebih efektif. Misalnya, penamaan tag yang tepat akan mempermudah korelasi statistik dengan kode aplikasi.
Anda dapat memilih tag yang diinginkan dalam batasan yang dinyatakan. Namun, sebaiknya buat string tag sebagai kumpulan pasangan nilai kunci yang dipisahkan oleh koma.
Misalnya, asumsikan Anda menggunakan database Spanner untuk
kasus penggunaan e-commerce. Sebaiknya sertakan 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 menetapkan string tag sebagai app=catalogsearch,env=dev,action=list
. Sekarang, jika salah satu kueri ini muncul di tabel statistik kueri sebagai kueri latensi tinggi, Anda dapat dengan mudah 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 akan 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 operasi baca yang memiliki string tag yang sama akan dikelompokkan dalam satu baris di tabel statistik baca. Kumpulan semua kolom yang dibaca ditambahkan ke kolomREAD_COLUMNS
. - Saat Anda menetapkan
TRANSACTION_TAG
, statistik untuk transaksi yang memiliki string tag yang sama akan dikelompokkan dalam satu baris di tabel statistik transaksi. Kumpulan semua kolom yang ditulis oleh transaksi ditambahkan ke kolomWRITE_CONSTRUCTIVE_COLUMNS
dan kumpulan semua kolom yang dibaca ditambahkan ke kolomREAD_COLUMNS
.
Memecahkan masalah skenario menggunakan tag
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 keranjang, produk, 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 layanan mikro 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 payment dan ingin
melihat latensi dan statistik lainnya dari transaksi baru tersebut. Jika 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 adalah 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 operasi baca dari aplikasi tertentu di tabel statistik kueri atau statistik baca 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 yang sesuai 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 adalah 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 konflik yang terjadi pada tabel Singers
pada kunci SingerId=32. Singers.SingerInfo
adalah kolom tempat
konflik kunci terjadi antara ReaderShared
dan WriterShared
. Anda juga dapat
mengidentifikasi transaksi yang sesuai (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 menggunakan Statistik Transaksi untuk mendapatkan pemahaman yang lebih baik tentang apa yang dilakukan transaksi dan apakah Anda dapat menghindari konflik atau mengurangi waktu kunci ditahan. Untuk informasi selengkapnya, lihat Praktik terbaik untuk mengurangi pertentangan kunci.
Langkah selanjutnya
- 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 artikel Menyelidiki penggunaan CPU yang tinggi.