Spanner menyediakan kumpulan tabel statistik bawaan untuk membantu Anda mendapatkan insight tentang kueri, pembacaan, dan transaksi. Untuk menghubungkan statistik dengan kode aplikasi dan untuk meningkatkan pemecahan masalah, Anda dapat menambahkan tag (string bentuk bebas) ke operasi baca, kueri, dan transaksi Spanner dalam kode aplikasi Anda. Tag ini diisi dalam tabel statistik yang membantu Anda mengkorelasikan dan menelusuri berdasarkan tag.
Spanner mendukung dua jenis tag; tag request dan tag transaction. Seperti namanya, Anda dapat menambahkan tag transaksi ke transaksi, dan meminta tag ke masing-masing kueri dan membaca API. 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 di kode aplikasi akan diisi di kolom tabel statistik berikut.
Tabel Statistik | Jenis Tag yang diisi di tabel statistik |
---|---|
Statistik Kueri TopN | Minta tag |
Statistik Bacaan TopN | Minta tag |
Statistik Transaksi TopN | Tag transaksi |
Statistik TopN Lock | Tag transaksi |
Minta tag
Anda dapat menambahkan tag permintaan opsional ke kueri atau permintaan baca. Spanner
mengelompokkan statistik berdasarkan tag permintaan, yang dapat dilihat di kolom REQUEST_TAG
dari tabel
statistik kueri
dan
baca statistik.
Kapan tag permintaan digunakan
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 di tabel statistik bawaan. Ketika Anda menemukan kueri lambat atau pembacaan yang memakan CPU tinggi dalam tabel statistik, jika 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 akan membantu memfilter baris dalam tabel statistik berdasarkan tag yang Anda minati.
- Mengetahui 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 kumpulan pembacaan atau kueri: Anda dapat menggunakan tag permintaan untuk melacak, membandingkan, dan melaporkan performa di seluruh kumpulan pembacaan atau kueri yang serupa. Misalnya, jika beberapa kueri mengakses tabel/kumpulan tabel dengan pola akses yang sama, Anda dapat mempertimbangkan untuk menambahkan tag yang sama ke semua kueri tersebut agar dapat 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 untuk 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 dapat dari kueri.
teks | 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 |
pilih * dari pesanan; | app=catalogsearch,env=dev,action=list | 55 | 0.02 | 16 | 33,35 |
{i>SELECT SingerId<i}, 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 sebuah kueri, kueri tersebut akan diisikan 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 transaksi individual.
Spanner mengelompokkan statistik berdasarkan tag transaksi, yang dapat dilihat di kolom TRANSACTION_TAG
pada tabel statistik transaksi.
Kapan harus menggunakan tag transaksi
Berikut adalah beberapa skenario yang dapat memanfaatkan penggunaan tag transaksi.
- Menemukan sumber transaksi yang bermasalah: Spanner mengumpulkan statistik untuk transaksi baca-tulis di tabel statistik transaksi. Saat menemukan transaksi lambat di tabel statistik transaksi, jika telah menetapkan tag ke transaksi tersebut, Anda dapat mengidentifikasi sumber (aplikasi/layanan mikro) yang memanggil transaksi ini berdasarkan informasi dalam tag.
- Mengidentifikasi transaksi di tabel statistik: Menetapkan tag transaksi akan 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.
- Mengetahui 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 yang serupa.
- Menemukan transaksi mana yang mengakses kolom yang terlibat dalam konflik kunci: Tag transaksi dapat membantu menentukan transaksi individual yang menyebabkan konflik kunci di tabel Statistik kunci.
- Streaming data perubahan pengguna dari Spanner menggunakan aliran perubahan: Data data aliran 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 akan 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 dapat 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, transaksi 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 Kunci Statistik
Kueri berikut menampilkan statistik penguncian selama interval 10 menit.
Fungsi CAST()
mengonversi
kolom row_range_start_key
myactivity 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 dapat dari kueri.
row_range_start_key | lock_wait_seconds | sample_lock_requests |
---|---|---|
Lagu(2;1;1) | 0,61 | LOCK_MODE: ReaderShared KOLOM: Singers.SingerInfo Transition_TAG: app=product,service=shipping LOCK_MODE: WriterShared KOLOM: Singers.SingerInfo TRANS_TAG: app=product,service=payment |
album(2,1+) | 0,48 | LOCK_MODE: ReaderShared COLUMN: users._exists1 TRANS_TAG: [string kosong] LOCK_MODE: WriterShared COLUMN: users._exists TRANS_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 menampilkan pemetaan dari metode API ke jenis tag yang berlaku.
Metode API | Mode Transaksi | Tag Permintaan | Tag Transaksi |
---|---|---|---|
Baca, 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 data perubahan yang dijalankan menggunakan konektor Dataflow
Apache Beam Spanner, REQUEST_TAG
berisi nama tugas Dataflow.
Batasan
Saat menambahkan tag ke pembacaan, kueri, dan transaksi, pertimbangkan pembatasan berikut:
- Panjang string tag dibatasi hingga 50 karakter. String yang melebihi batas ini akan terpotong.
- Hanya karakter ASCII (32-126) yang diperbolehkan dalam tag. Karakter unicode arbitrer diganti dengan garis bawah.
- Setiap karakter garis bawah (_) yang ada 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 lainnya, 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 yang diberi tag yang dijalankan selama interval dalam tabel, sistem akan memprioritaskan operasi dengan resource yang paling banyak menggunakan resource 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 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 Anda membuat string tag sebagai sekumpulan pasangan nilai kunci yang dipisahkan oleh koma.
Misalnya, anggaplah Anda menggunakan database Spanner untuk kasus penggunaan e-commerce. Sebaiknya sertakan informasi tentang aplikasi, lingkungan pengembangan, dan tindakan yang diambil oleh kueri di tag permintaan yang akan ditetapkan untuk 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 sumber dengan menggunakan tag.
Berikut beberapa contoh bagaimana pola pemberian tag dapat digunakan untuk mengatur statistik operasi Anda. Contoh ini tidak 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=fetch action=update |
Membantu mengidentifikasi tindakan yang diambil oleh operasi. |
Layanan | service=pembayaran service=shipping |
Membantu mengidentifikasi microservice yang memanggil operasi. |
Hal yang Perlu Diperhatikan
- Saat Anda menetapkan
REQUEST_TAG
, statistik untuk beberapa kueri yang memiliki string tag yang sama akan dikelompokkan dalam satu baris dalam tabel statistik kueri. Hanya teks dari 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 dalam tabel statistik baca. Kumpulan semua kolom yang dibaca akan 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 akan ditambahkan ke kolomWRITE_CONSTRUCTIVE_COLUMNS
dan kumpulan semua kolom yang dibaca akan ditambahkan ke kolomREAD_COLUMNS
.
Skenario pemecahan masalah 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, tempat kita memiliki 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 yang relevan dari kode aplikasi, dan memecahkan masalahnya lebih lanjut menggunakan statistik transaksi.
fprint | transaction_tag | avg_total_latency_sec | avg_commit_latency_sec | commit_attempt_count | commit_abort_count |
---|---|---|---|---|---|
7129109266372596045 | aplikasi=keranjang,layanan=pesanan | 0,3508 | 0,0139 | 278802 | 142205 |
9353100217060788102 | app=keranjang,layanan=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 bermasalah dari tabel statistik kueri dan sumber pembacaan bermasalah dari tabel statistik baca.
Menemukan latensi dan statistik lainnya untuk transaksi dari aplikasi atau microservice tertentu
Jika Anda telah menggunakan nama aplikasi atau nama microservice di string tag, nama ini akan membantu memfilter tabel statistik transaksi berdasarkan tag yang berisi nama aplikasi atau nama microservice tersebut.
Misalkan Anda telah menambahkan transaksi baru ke aplikasi pembayaran dan ingin melihat latensi serta statistik lain 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 dengan 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=fetch | 0,1423 | 0,0133 | 5357 | 636 |
Demikian pula, Anda dapat menemukan kueri atau pembacaan dari aplikasi tertentu di statistik kueri atau tabel baca statistik menggunakan tag permintaan.
Menemukan transaksi yang terlibat dalam konflik kunci
Untuk mengetahui transaksi dan kunci baris mana yang mengalami waktu tunggu penguncian yang tinggi,
kami 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 Transcript_TAG: app=cart,service=redis |
Dari tabel hasil ini, kita dapat melihat konflik yang terjadi di tabel Singers
pada kunci SingerId=32. Singers.SingerInfo
adalah kolom tempat
konflik kunci 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, kini Anda dapat fokus 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 mengetahui informasi selengkapnya, lihat Praktik terbaik untuk mengurangi pertentangan kunci.
Langkah selanjutnya
- Pelajari alat Introspeksi lainnya.
- Pelajari informasi lain yang disimpan Spanner untuk setiap database dalam tabel skema informasi database.
- Pelajari praktik terbaik SQL untuk Spanner lebih lanjut.
- Pelajari lebih lanjut cara Menyelidiki penggunaan CPU yang tinggi.