Topik ini menyediakan kueri Simple Log Service (SLS) umum untuk membantu Anda melakukan troubleshooting masalah di ApsaraMQ for RabbitMQ, seperti kegagalan pengiriman pesan, error konsumsi, dan backlog pesan.
Prasyarat
Anda telah mengaktifkan fitur manajemen log dan mengonfigurasi indeks.
Kueri umum
Topik ini mencantumkan kueri Simple Log Service (SLS) umum. Untuk langkah-langkah detail dan deskripsi format log, lihat manajemen log.
Temukan alamat IP produsen berdasarkan exchange
Jalankan kueri berikut untuk menampilkan daftar alamat IP produsen.
* and Action : SendMessage and Code : 200 |
select
split_part(ResourceName,',',2) as exchange_name,
split_part(ResourceName, ',', 3) as routing_key,
RemoteAddress as ip_port,
count(*) as total_send_num
group by
exchange_name, routing_key, ip_port
order by
total_send_num DESC
limit 1000000
Temukan alamat IP konsumen berdasarkan queue
Jalankan kueri berikut untuk menampilkan daftar alamat IP konsumen.
* and Action : PushMessage and Code : 200 |
select
InstanceId as instance_id,
VHost as virtual_host,
Queue as queue_name,
RemoteAddress as ip_port,
count(*) as push_total_num
group by
instance_id,virtual_host, ip_port, queue_name
order by
push_total_num DESC
limit 10000000
Lacak sebuah pesan
Jalankan kueri di kotak pencarian untuk melacak sebuah pesan.
-
Lacak pesan berdasarkan ID pesan
InstanceId:amqp-cn-i7m29o3s**** and VHost:cycle**** and ResourceName:msgId=27127757-44dc-4373-afc5-f8ea12f****Kueri ini mengembalikan dua entri log: satu dengan Action SendMessage (Code: 200) dan satu lagi dengan Action PushMessage (Code: 200). Hal ini menunjukkan bahwa pesan berhasil dikirim dan didorong.
Saat client berlangganan menggunakan
BasicConsume, Anda dapat melacak pesan dari pengiriman hingga pengiriman oleh server. AksiSendMessageberkorespondensi dengan panggilanBasicPublisholeh client, dan aksiPushMessageberkorespondensi dengan server yang mendorong pesan ke client. Jika client menarik pesan menggunakanBasicGet, nilai Action adalahBasicGetdan bukanPushMessage.Catatan-
Jika hasil log hanya berisi satu entri
SendMessagetetapi beberapa entriPushMessage or BasicGet, kemungkinan client gagal mengonfirmasi pesan dengan memanggilBasicAckdalam periodeconsumption timeoutsetelahPushMessage or BasicGetpertama. Hal ini menyebabkan server mengasumsikan bahwa konsumsi gagal dan mengirim ulang pesan tersebut. Untuk informasi lebih lanjut tentang consumption timeout, lihat Deskripsi parameter kebijakan retry instans. -
Jika hasil log berisi entri log
SendDlqMessageselain entriSendMessagedanPushMessage, entri logSendDlqMessagemenunjukkan bahwa pesan saat ini dipindahkan ke dead-letter queue.
-
-
Periksa apakah sebuah pesan telah dikonsumsi
InstanceId:amqp-cn-i7m29o3s**** and VHost:cycle**** and Queue:cycleCheckQueue**** and ConnectionId:00163efffe08281f-00004e11-0009732f-799c0af9bc4e4913-96b3**** and ChannelId:1 and (ResourceName:deliveryTag=90 or Property:deliveryTag=90) and RemoteAddress:"/192.168.XX.XX:XXXX"Ambil nilai untuk ConnectionId, ChannelId, deliveryTag, dan RemoteAddress dari log
PushMessage. RemoteAddress adalah alamat IP client. ConnectionId adalah pengidentifikasi unik untuk koneksi. ChannelId adalah pengidentifikasi unik untuk channel.deliveryTagadalah pengidentifikasi unik pesan dari sisi server. Entri logDeleteMessagemenunjukkan bahwa pesan berhasil dikonsumsi oleh client.Kueri ini mengembalikan tiga entri log. Nilai Action mencakup
DeleteMessagedanBasicAck, dan Code masing-masing adalah200. Hal ini menunjukkan bahwa pesan berhasil dikonsumsi.CatatanJika client menetapkan
autoAck=falsesaat memanggilBasicConsume, client harus memanggilBasicAckuntuk mengonfirmasi bahwa pesan telah dikonsumsi. Server kemudian akan menghapus pesan tersebut. PanggilanBasicAckharus dilakukan dalam periode consumption timeout yang dimulai sejak timestampPushMessage. Jika periode timeout terlampaui, server menganggap konsumsi gagal dan mengirim ulang pesan ke client. Untuk informasi lebih lanjut, lihat Deskripsi parameter kebijakan retry instans.-
Jika client memanggil
BasicAck, tetapi kueri status konsumsi pesan tidak mengembalikan entri logDeleteMessage, konsumsi gagal. Periksa selisih waktu antara entriPushMessagedanBasicAck. Jika selisihnya melebihi consumption timeout, panggilanBasicAcktidak valid. -
Jika Anda hanya menemukan entri
PushMessagedanDeleteMessagetanpa entriBasicAck, kemungkinan client menggunakanBasicAck(deliveryTag, multiple=true)untuk mengonfirmasi semua pesan sebelumnya hinggadeliveryTagtertentu dalam satu panggilan.
-
Analisis laju konsumsi queue
Jalankan kueri berikut untuk memeriksa distribusi aksi SendMessage, PushMessage or BasicGet, BasicAck, dan DeleteMessage. Jika persentase keempat aksi tersebut kurang lebih sama, laju produksi dan konsumsi seimbang, sehingga hampir tidak ada backlog pesan.
InstanceId:amqp-cn-i7m29o3s**** and Vhost:cycle**** and Queue: cycleCheckQueue**** and (SendMessage or PushMessage or BasicAck or DeleteMessage)
Di panel Quick Analysis di sisi kiri halaman hasil kueri, lihat distribusi bidang Action. Misalnya, distribusinya bisa berupa BasicAck 25%, DeleteMessage 25%, PushMessage 25%, dan SendMessage 24%.
Jika Anda menemukan pola berikut dalam log, analisis penyebab yang mungkin terjadi:
-
Tidak ada entri
DeleteMessagedalam hasil log: Hal ini dapat terjadi jika client menetapkanautoAck=truesaat memanggilBasicConsumeatauBasicGet. Atau, semua permintaanBasicAckdari client mungkin telah melebihi consumption timeout, sehingga panggilan tersebut tidak valid. Untuk informasi lebih lanjut tentang consumption timeout, lihat Deskripsi parameter kebijakan retry instans. -
Persentase entri
PushMessagejauh lebih rendah daripada entriSendMessage: Hal ini mungkin menunjukkan jumlah subscriber tidak mencukupi. Kami merekomendasikan untuk menambahkan lebih banyak koneksi dan membuat konsumen baru. -
Persentase entri
SendMessagedanPushMessagemirip, tetapi persentase entriDeleteMessagejauh lebih rendah: Hal ini mungkin disebabkan banyak permintaanBasicAckyang melebihi consumption timeout dan menjadi tidak valid. Untuk informasi lebih lanjut tentang consumption timeout, lihat Deskripsi parameter kebijakan retry instans. -
Persentase entri
SendMessage,PushMessage, danDeleteMessagekurang lebih sama, tetapi persentase entriBasicAckjauh lebih rendah: Periksa apakah kode Anda menggunakanBasicAck(multiple=true).
Kueri pesan dead-letter
Masukkan kueri di kotak pencarian log untuk mengambil pesan yang relevan.
-
Pesan diarahkan ke dead-letter queue karena TTL pesan habis
InstanceId:amqp-cn-i7m29o3s**** and VHost:dlq**** and ResourceName:msgId=02a162ba-f842-440f-bfd4-2595dd19****Kueri ini mengembalikan dua entri log. Bidang
Codekeduanya bernilai 200, yang menunjukkan bahwa operasi pesan berhasil.Entri
SendMessageberkorespondensi dengan panggilanBasicPublishAnda untuk mengirim pesan. EntriSendDlqMessagemenunjukkan bahwa pesan dikirim ke dead-letter queue yang sesuai setelah TTL-nya habis.CatatanEntri log ini hanya dihasilkan jika Anda telah mengonfigurasi dead-letter queue.
-
Pesan diarahkan ke dead-letter queue karena TTL queue habis
-
Tetapkan properti dead-letter dan TTL untuk queue.
Map<String, Object> argument = new HashMap<>(); argument.put("x-dead-letter-exchange", [exchangeName]); argument.put("x-dead-letter-routing-key", [routingKey]); argument.put("x-message-ttl", [ttl]); channel.queueDeclare([queueName], true, false, false, argument); -
Masukkan kueri berikut di kotak pencarian log untuk mengambil entri
SendMessagedanSendDlqMessage.InstanceId:amqp-cn-i7m29o3s**** and VHost:dlq**** and ResourceName:msgId=034a75c5-d957-422f-822e-72dfad2a****Kueri ini mengembalikan dua entri log: satu aksi
SendDlqMessageuntuk queue a dan satu aksiSendMessageuntuk queue b. Keduanya memiliki Code 200. Di panel Quick Analysis di sisi kiri, distribusi bidang Action menunjukkan 50% SendMessage dan 50% SendDlqMessage.
-
-
Panggil
BasicRejectatauBasicNackdenganrequeue=falseInstanceId:amqp-cn-i7m29o3s**** and VHost:dlq**** and (ResourceName:msgId=034a75c5-d957-422f-822e-72dfad2a**** or ResourceName:deliveryTag=1)Entri log
PushMessagemenunjukkan bahwa server mendorong pesan ke client. Setelah menerima pesan, client memanggilBasicReject(requeue=false). Entri logSendDlqMessageyang sesuai menunjukkan bahwa pesan diarahkan ke dead-letter queue.
Kueri ini mengembalikan tiga entri log dengan aksi berikut: PushMessage (Code: 200), BasicReject (Code: 200), dan SendDlqMessage (Code: 200).