

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Penelusuran kueri terdistribusi di log PostgreSQL di Aurora PostgreSQL Limitless Database
<a name="limitless-query.tracing"></a>

Penelusuran kueri terdistribusi adalah alat untuk melacak dan mengkorelasikan kueri di log PostgreSQL di Aurora PostgreSQL Limitless Database. Di Aurora PostgreSQL, Anda menggunakan ID transaksi untuk mengidentifikasi transaksi. Namun di Aurora PostgreSQL Limitless Database, ID transaksi dapat diulang di berbagai router. Oleh karena itu, kami menyarankan Anda menggunakan ID penelusuran sebagai gantinya di Limitless Database.

Kasus penggunaan utama adalah sebagai berikut:
+ Gunakan `rds_aurora.limitless_get_last_trace_id()` fungsi untuk menemukan ID penelusuran unik dari kueri terakhir yang dijalankan di sesi saat ini. Kemudian cari grup log cluster DB di Amazon CloudWatch Logs menggunakan ID penelusuran itu untuk menemukan semua log terkait.

  Anda dapat menggunakan `log_min_error_statement` parameter `log_min_messages` dan bersama-sama untuk mengontrol volume log yang dicetak dan mencetak pernyataan yang berisi ID penelusuran.
+ Gunakan `log_min_duration_statement` parameter untuk menentukan waktu proses di mana semua kueri mencetak durasi proses dan ID penelusuran. Waktu berjalan ini kemudian dapat dicari di grup log cluster DB di CloudWatch Log untuk membantu menentukan node bottleneck dan upaya pengoptimalan perencana.

  `log_min_duration_statement`Parameter memungkinkan ID penelusuran untuk semua node terlepas dari nilai `log_min_messages` dan `log_min_error_statement` parameter.

**Topics**
+ [ID Penelusuran](#limitless-query.tracing.ID)
+ [Menggunakan penelusuran kueri](#limitless-query.tracing.using)
+ [Contoh log](#limitless-query.tracing.examples)

## ID Penelusuran
<a name="limitless-query.tracing.ID"></a>

Inti dari fitur ini adalah pengenal unik yang dikenal sebagai ID *penelusuran.* ID penelusuran adalah string 31 digit yang ditambahkan ke baris log STATEMENT log PostgreSQL, bertindak sebagai pengidentifikasi yang tepat untuk menghubungkan log yang terkait dengan eksekusi kueri tertentu. Contohnya adalah `1126253375719408504000000000011` dan `1126253375719408495000000000090`.

ID penelusuran terdiri dari yang berikut:
+ Pengenal transaksi — 20 digit pertama, mengidentifikasi transaksi secara unik.
+ Command identifier — 30 digit pertama, yang menunjukkan kueri individu dalam suatu transaksi.

  Jika lebih dari 4.294.967.294 kueri dijalankan di dalam blok transaksi eksplisit, perintah Identifier membungkusnya. `1` Ketika ini terjadi, Anda akan diberi tahu oleh `LOG` pesan berikut di log PostgreSQL:

  ```
  wrapping around the tracing ID back to 1 after running 4294967294 (4.2 billion or 2^32-2) queries inside of an explicit transaction block
  ```
+ Pengidentifikasi tipe node — Digit terakhir, yang menunjukkan apakah node berfungsi sebagai router koordinator (`1`) atau node peserta (`0`).

Contoh berikut menggambarkan komponen ID penelusuran:
+ `1126253375719408504000000000011`:
  + Pengidentifikasi transaksi — `1126253375719408504`
  + Command identifier — `112625337571940850400000000001` menunjukkan perintah pertama di blok transaksi
  + Pengidentifikasi tipe node - `1` menunjukkan router koordinator
+ `1126253375719408495000000000090`:
  + Pengidentifikasi transaksi — `1126253375719408495`
  + Command identifier — `112625337571940849500000000009` menunjukkan perintah kesembilan di blok transaksi
  + Pengidentifikasi tipe node - `0` menunjukkan node peserta

## Menggunakan penelusuran kueri
<a name="limitless-query.tracing.using"></a>

Lakukan tugas-tugas berikut untuk menggunakan penelusuran kueri:

1. Pastikan penelusuran diaktifkan.

   Anda dapat memeriksa menggunakan perintah berikut:

   ```
   SHOW rds_aurora.limitless_log_distributed_trace_id;
   ```

   Ini diaktifkan secara default (`on`). Jika tidak diaktifkan, atur menggunakan perintah berikut:

   ```
   SET rds_aurora.limitless_log_distributed_trace_id = on;
   ```

1. Kontrol volume log yang dicetak dengan mengonfigurasi tingkat keparahan log.

   Volume log dikendalikan oleh `log_min_messages` parameter. `log_min_error_statement`Parameter digunakan untuk mencetak `STATEMENT` garis dengan ID penelusuran. Keduanya diatur secara `ERROR` default. Anda dapat memeriksa menggunakan perintah berikut:

   ```
   SHOW log_min_messages;
   SHOW log_min_error_statement;
   ```

   Untuk memperbarui tingkat keparahan dan mencetak `STATEMENT` baris untuk sesi saat ini, gunakan perintah berikut dengan salah satu tingkat keparahan ini:

   ```
   SET log_min_messages = '{{DEBUG5}} | {{DEBUG4}} | {{DEBUG3}} | {{DEBUG2}} | {{DEBUG1}} | {{INFO}} | {{NOTICE}} | {{WARNING}} | {{ERROR}} | {{LOG}} | {{FATAL}} | {{PANIC}}';
   SET log_min_error_statement = '{{DEBUG5}} | {{DEBUG4}} | {{DEBUG3}} | {{DEBUG2}} | {{DEBUG1}} | {{INFO}} | {{NOTICE}} | {{WARNING}} | {{ERROR}} | {{LOG}} | {{FATAL}} | {{PANIC}}';
   ```

   Contoh:

   ```
   SET log_min_messages = 'WARNING';
   SET log_min_error_statement = 'WARNING';
   ```

1. Aktifkan pencetakan ID penelusuran di log di atas waktu proses tertentu.

   `log_min_duration_statement`Parameter dapat diubah ke waktu proses kueri minimum di mana kueri mencetak baris log dengan durasi proses, bersama dengan ID penelusuran di seluruh cluster DB. Parameter ini diatur ke secara `-1` default, yang berarti itu dinonaktifkan. Anda dapat memeriksa menggunakan perintah berikut:

   ```
   SHOW log_min_duration_statement;
   ```

   Mengubahnya untuk `0` mencetak durasi dan melacak ID di log untuk setiap kueri di seluruh cluster DB. Anda dapat mengaturnya `0` untuk sesi saat ini dengan menggunakan perintah berikut:

   ```
   SET log_min_duration_statement = 0;
   ```

1. Dapatkan ID penelusuran.

   Setelah menjalankan kueri (bahkan di dalam blok transaksi eksplisit), panggil `rds_aurora.limitless_get_last_trace_id` fungsi untuk mendapatkan ID penelusuran dari kueri terakhir yang dijalankan:

   ```
   SELECT * FROM rds_aurora.limitless_get_last_trace_id();
   ```

   Fungsi ini mengembalikan identifier transaksi dan pengidentifikasi perintah. Itu tidak mengembalikan pengidentifikasi tipe simpul.

   ```
   => SELECT * FROM customers;
    customer_id | fname | lname 
   -------------+-------+-------
   (0 rows)
   
   => SELECT * FROM rds_aurora.limitless_get_last_trace_id();
    transaction_identifier |       command_identifier       
   ------------------------+--------------------------------
    10104661421959001813   | 101046614219590018130000000001
   (1 row)
   ```

   Fungsi mengembalikan baris kosong untuk kueri yang tidak didistribusikan, karena mereka tidak memiliki ID penelusuran.

   ```
   => SET search_path = public;
   SET
   
   => SELECT * FROM rds_aurora.limitless_get_last_trace_id();
    transaction_identifier | command_identifier 
   ------------------------+--------------------
                           | 
   (1 row)
   ```
**catatan**  
Untuk kueri VACUUM dan ANALYSIS, pernyataan durasi tidak dicatat dengan ID penelusuran. Oleh karena itu, `limitless_get_last_trace_id()` tidak mengembalikan ID penelusuran. Jika VACUUM atau ANALYZE adalah operasi yang berjalan lama, Anda dapat menggunakan kueri berikut untuk mendapatkan ID penelusuran untuk operasi tersebut:  

   ```
   SELECT * FROM rds_aurora.limitless_stat_activity 
   WHERE distributed_tracing_id IS NOT NULL;
   ```
Jika server berhenti sebelum Anda dapat menemukan ID penelusuran terakhir, Anda harus mencari log PostgreSQL secara manual untuk menemukan ID penelusuran di log dari tepat sebelum kegagalan.

1. Cari ID penelusuran di seluruh log cluster DB menggunakan CloudWatch.

   Gunakan [CloudWatch Wawasan](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html) untuk menanyakan grup log cluster DB, seperti yang ditunjukkan pada contoh berikut.
   + Kueri untuk pengidentifikasi transaksi tertentu dan semua perintah berjalan di dalamnya:

     ```
     fields @timestamp, @message
     | filter @message like /10104661421959001813/
     | sort @timestamp desc
     ```
   + Kueri untuk pengidentifikasi perintah tertentu:

     ```
     fields @timestamp, @message
     | filter @message like /101046614219590018130000000001/
     | sort @timestamp desc
     ```

1. Periksa semua log di seluruh cluster DB yang dihasilkan oleh kueri terdistribusi.

## Contoh log
<a name="limitless-query.tracing.examples"></a>

Contoh berikut menunjukkan penggunaan query tracing.

### Mengkorelasikan log untuk kueri rawan kesalahan
<a name="limitless-query.tracing.example1"></a>

Dalam contoh ini `TRUNCATE` perintah dijalankan di atas `customers` meja ketika tabel itu tidak ada.

**Tanpa penelusuran kueri**  
File log PostgreSQL pada router koordinator:  

```
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:ERROR: failed to execute remote query
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:DETAIL: relation "public.customers" does not exist
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:CONTEXT: remote SQL command: truncate public.customers;
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:STATEMENT: truncate customers;
```
File log PostgreSQL pada pecahan peserta:  

```
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[ 27503]:ERROR: failed to execute remote query
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[ 27503]:STATEMENT: truncate customers;
```
Log ini khas. Mereka tidak memiliki pengidentifikasi tepat yang diperlukan untuk dengan mudah menghubungkan kueri di seluruh cluster DB.

**Dengan penelusuran kueri**  
File log PostgreSQL pada router koordinator:  

```
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:ERROR: failed to execute remote query
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:DETAIL: relation "public.customers" does not exist
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:CONTEXT: remote SQL command: truncate public.customers;
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:STATEMENT: /* tid = 1126253375719408502700000000011 */ truncate customers;
```
File log PostgreSQL pada pecahan peserta:  

```
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:ERROR:  failed to execute remote query
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:STATEMENT:  /* tid = 1126253375719408502700000000010 */ truncate customers;
```
Dengan adanya penelusuran kueri, setiap baris log ditambahkan dengan pengidentifikasi unik 31 digit. Di sini, `1126253375719408502700000000011` dan `1126253375719408502700000000010` mewakili ID penelusuran untuk koordinator dan node peserta, masing-masing.  
+ Pengidentifikasi transaksi — `11262533757194085027`
+ Pengidentifikasi perintah: - `112625337571940850270000000001`
+ Pengidentifikasi tipe node — Digit terakhir, `1` atau`0`, menunjukkan router koordinator dan node peserta, masing-masing.

### Mengkorelasikan log untuk menemukan waktu proses kueri pada berbagai node
<a name="limitless-query.tracing.example2"></a>

Dalam contoh ini, `log_min_duration_statement` parameter telah diperbarui `0` untuk mencetak durasi untuk semua kueri.

**Tanpa penelusuran kueri**  

```
2024-01-15 07:28:46 UTC:[local]:postgres@postgres_limitless:[178322]:LOG: duration: 12.779 ms statement: select * from customers;
```

**Dengan penelusuran kueri**  
File log PostgreSQL pada router koordinator:  

```
2024-01-15 07:32:08 UTC:[local]:postgres@postgres_limitless:[183877]:LOG: duration: 12.618 ms statement: /* tid = 0457669566240497088400000000011 */ select * from customers;
```
File log PostgreSQL pada pecahan peserta:  

```
2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.279 ms statement: /* tid = 0457669566240497088400000000010 */ START TRANSACTION ISOLATION LEVEL READ COMMITTED
2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.249 ms parse <unnamed>: SELECT customer_id, fname, lname FROM public.customers
2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.398 ms bind <unnamed>/c1: SELECT customer_id, fname, lname FROM public.customers
2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.019 ms execute <unnamed>/c1: SELECT customer_id, fname, lname FROM public.customers
2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.073 ms statement: /* tid = 0457669566240497088400000000010 */ COMMIT TRANSACTION
```