ApsaraDB for MongoDB menyediakan metrik Opcounters dan Repl Opcounters. Topik ini menjelaskan metrik tersebut serta memberikan jawaban atas beberapa pertanyaan umum.
Untuk informasi lebih lanjut tentang arsitektur instans yang didukung oleh metrik Opcounters dan Repl Opcounters, lihat Item pemantauan dan metrik.
Opcounters
Metrik Opcounters ditampilkan dalam data pemantauan dan modul kinerja dari ApsaraDB for MongoDB, seperti yang ditunjukkan pada gambar berikut.
Metrik QPS di Modul Data Pemantauan. Untuk informasi lebih lanjut, lihat Informasi pemantauan.

Metrik Opcounters untuk Modul Kinerja. Untuk informasi lebih lanjut, lihat Tren kinerja.

Metrik Opcounters melacak operasi insert, query, update, delete, getMore, dan command. Metrik ini juga menghitung jumlah operasi database yang dilakukan pada mongod atau mongos sejak startup terakhir.
Item yang dilacak | Satuan | Deskripsi |
insert | Jumlah/detik | Jumlah operasi insert per detik di ApsaraDB for MongoDB. |
query | Jumlah/detik | Jumlah operasi query per detik di ApsaraDB for MongoDB. |
update | Jumlah/detik | Jumlah operasi update per detik di ApsaraDB for MongoDB. |
delete | Jumlah/detik | Jumlah operasi delete per detik di ApsaraDB for MongoDB. |
getmore | Jumlah/detik | Jumlah operasi getMore per detik di ApsaraDB for MongoDB. |
command | Jumlah/detik | Jumlah operasi command per detik di ApsaraDB for MongoDB. |
Selain operasi yang dimulai oleh klien, metrik Opcounters juga mencatat operasi internal yang dilakukan pada database Anda.
Item yang dilacak | Deskripsi |
insert |
|
query |
|
update | Mirip dengan operasi |
delete |
|
getmore | Selama sinkronisasi utama/sekunder, operasi getMore yang dilakukan database pada koleksi bernama |
command |
Untuk informasi lebih lanjut tentang perintah lainnya, lihat Command. |
Repl Opcounters
Modul data pemantauan ApsaraDB for MongoDB menyediakan item yang dilacak oleh metrik Repl Opcounters. Dalam kebanyakan kasus, Anda hanya perlu fokus pada nilai metrik node sekunder di instans Anda. Untuk informasi lebih lanjut tentang modul ini, lihat Informasi pemantauan.

Anda juga dapat melihat metrik Opcounters untuk node sekunder. Metrik ini terutama melacak operasi berikut:
Operasi query klien yang dilakukan pada node sekunder. Anda dapat mengonfigurasi readPreference untuk menentukan peran node tempat operasi query dilakukan.
Semua operasi tulis yang dilakukan pada database bernama local. Operasi ini diimplementasikan oleh sinkronisasi utama/sekunder.
Mirip dengan metrik Opcounters, metrik Repl Opcounters juga melacak operasi insert, query, update, delete, getMore, dan command. Metrik Repl Opcounters menunjukkan operasi replikasi database yang diagregasi berdasarkan jenis yang berbeda sejak mongod terakhir kali dimulai.
Item yang dilacak | Satuan | Deskripsi |
insert | Jumlah/detik | Jumlah operasi insert per detik di ApsaraDB for MongoDB. |
query | Jumlah/detik | Jumlah operasi query per detik di ApsaraDB for MongoDB. |
update | Jumlah/detik | Jumlah operasi update per detik di ApsaraDB for MongoDB. |
delete | Jumlah/detik | Jumlah operasi delete per detik di ApsaraDB for MongoDB. |
getmore | Jumlah/detik | Jumlah operasi getMore per detik di ApsaraDB for MongoDB. |
command | Jumlah/detik | Jumlah operasi command per detik di ApsaraDB for MongoDB. |
Metrik Repl Opcounters menghitung semua operasi tulis yang dilakukan pada node sekunder. Selain operasi yang dijelaskan di bagian Opcounters, metrik ini juga melacak operasi berikut:
Operasi insert dan update yang dipicu oleh penyegaran sesi.
Operasi delete yang disebabkan oleh indeks TTL.
Tindakan delete yang dipicu oleh penghapusan dokumen yatim piatu. Dalam kebanyakan kasus, latensi terjadi setelah migrasi chunk.
Operasi terkait untuk menulis data ke koleksi sistem. Misalnya, penulisan ulang memungkinkan driver MongoDB untuk secara otomatis mencoba kembali operasi tulis tertentu pada koleksi bernama
config.transactions. Untuk informasi lebih lanjut tentang penulisan ulang, lihat Retryable Writes.
ApsaraDB for MongoDB melakukan serialisasi data dengan cara yang berbeda selama replikasi utama/sekunder. Oleh karena itu, nilai metrik Repl Opcounters untuk node sekunder dalam suatu instans berbeda dari nilai untuk node utama dalam instans tersebut.
Pertanyaan Umum
Mengapa nilai metrik Repl Opcounters untuk node sekunder dalam suatu instans jauh lebih besar daripada nilai metrik Opcounters untuk node utama dalam instans tersebut?
Operasi yang memengaruhi beberapa dokumen, seperti insert batch, pembaruan multipel, atau penghapusan multipel, diinterpretasikan sebagai satu operasi. Ketika operasi yang memengaruhi beberapa dokumen direplikasi ke node sekunder dalam suatu instans, nilai metrik Repl Opcounters untuk node sekunder mungkin lebih besar daripada nilai metrik Opcounters untuk node utama karena replikasi utama/sekunder dilakukan pada level dokumen.
Contoh:
Lihat metrik Opcounters sebelum pembaruan.
Nilai metrik Opcounters untuk node utama dalam suatu instans ditampilkan sebagai 13.
> db.serverStatus().opcounters.update NumberLong(13)Nilai metrik Repl Opcounters pada node sekunder dalam suatu instans ditampilkan sebagai 11.
> db.serverStatus().opcountersRepl.update NumberLong(11)
Eksekusi pembaruan batch pada node utama dalam instans. Field
modifiedCountyang dikembalikan menunjukkan bahwa empat dokumen dimodifikasi dalam pembaruan batch.> db.coll.updateMany({x:2},{$set:{x:3}}) { "acknowledged" : true, "matchedCount" : 4, "modifiedCount" : 4 }Lihat metrik Opcounters lagi setelah pembaruan.
Nilai metrik Opcounters untuk node utama ditampilkan sebagai 14.
> db.serverStatus().opcounters.update NumberLong(14)Nilai metrik Repl Opcounters untuk node sekunder dalam suatu instans ditampilkan sebagai 15.
> db.serverStatus().opcountersRepl.update NumberLong(15)
Mengapa metrik Repl Opcounters dari node sekunder menunjukkan banyak operasi insert ketika saya hanya melakukan operasi update?
Masalah ini dapat terjadi ketika Anda menentukan opsi {upsert:true} untuk operasi update. Jika dokumen tempat Anda ingin melakukan operasi update tidak ada, operasi insert dilakukan sebagai gantinya. Jika operasi insert dicatat dalam koleksi oplog suatu instans, operasi insert disinkronkan ke node sekunder instans menggunakan replikasi utama/sekunder. Oleh karena itu, operasi insert dicatat dalam metrik Repl Opcounters.
Contoh:
Lihat metrik Opcounters sebelum pembaruan.
Dalam metrik Opcounters dari node utama dalam suatu instans, jumlah operasi update ditampilkan sebagai 33, dan jumlah operasi insert ditampilkan sebagai 1516.
> db.serverStatus().opcounters { "insert" : NumberLong(1516), "query" : NumberLong(70), "update" : NumberLong(33), "delete" : NumberLong(1043), "getmore" : NumberLong(2662), "command" : NumberLong(4000) }Dalam metrik Repl Opcounters dari node sekunder dalam suatu instans, jumlah operasi update ditampilkan sebagai 24, dan jumlah operasi insert ditampilkan sebagai 1539.
> db.serverStatus().opcountersRepl { "insert" : NumberLong(1539), "query" : NumberLong(0), "update" : NumberLong(24), "delete" : NumberLong(6), "getmore" : NumberLong(0), "command" : NumberLong(26) }
Lakukan operasi update dengan opsi
{upsert:true}diaktifkan pada node utama. FieldupsertedIdyang dikembalikan menunjukkan bahwa sebuah dokumen disisipkan.> db.coll.updateOne({x:"a"}, {$set:{x:"b"}}, {upsert:true}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("64bf72b829907f52b4b363ea") }Lihat metrik Opcounters lagi setelah pembaruan.
Dalam metrik Opcounters dari node utama, jumlah operasi update ditampilkan sebagai 34, dan jumlah operasi insert masih ditampilkan sebagai 1516.
> db.serverStatus().opcounters { "insert" : NumberLong(1516), "query" : NumberLong(70), "update" : NumberLong(34), // Perhatikan perubahan nilai metrik di sini. "delete" : NumberLong(1043), "getmore" : NumberLong(2706), "command" : NumberLong(4286) }Dalam metrik Repl Opcounters dari node sekunder, jumlah operasi update masih ditampilkan sebagai 24, dan jumlah operasi Insert ditampilkan sebagai 1540.
> db.serverStatus().opcountersRepl { "insert" : NumberLong(1540), // Perhatikan perubahan nilai metrik di sini. "query" : NumberLong(0), "update" : NumberLong(24), "delete" : NumberLong(6), "getmore" : NumberLong(0), "command" : NumberLong(26) }
Mengapa jumlah operasi update pada node utama suatu instans jauh lebih besar daripada jumlah operasi update yang direplikasi ke node sekunder instans tersebut?
Masalah ini dapat terjadi ketika logika bisnis Anda berisi operasi update duplikat. Operasi update duplikat tidak direplikasi ke node sekunder karena tidak ada perubahan nyata yang terjadi. Oleh karena itu, jumlah operasi update yang direplikasi ke node sekunder lebih kecil.
Contoh:
Lihat metrik Opcounters sebelum pembaruan.
Dalam metrik Opcounters dari node utama dalam suatu instans, jumlah operasi pembaruan ditampilkan sebagai 34.
> db.serverStatus().opcounters { "insert" : NumberLong(1516), "query" : NumberLong(70), "update" : NumberLong(34), "delete" : NumberLong(1043), "getmore" : NumberLong(2760), "command" : NumberLong(4609) }Dalam metrik Repl Opcounters dari node sekunder dalam suatu instans, jumlah operasi pembaruan ditampilkan sebagai 24.
> db.serverStatus().opcountersRepl { "insert" : NumberLong(1540), "query" : NumberLong(0), "update" : NumberLong(24), "delete" : NumberLong(6), "getmore" : NumberLong(0), "command" : NumberLong(26) }
Lakukan operasi update pada node utama. Hasil yang dikembalikan menunjukkan bahwa tidak ada perubahan nyata yang terjadi.
> db.coll.updateMany({x:"ab"},{$set:{x:"cd"}}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }Lihat metrik Opcounters lagi setelah pembaruan.
Dalam metrik Opcounters dari node utama, jumlah operasi update ditampilkan sebagai 35.
> db.serverStatus().opcounters { "insert" : NumberLong(1516), "query" : NumberLong(70), "update" : NumberLong(35), // Perhatikan perubahan nilai metrik di sini. "delete" : NumberLong(1043), "getmore" : NumberLong(2778), "command" : NumberLong(4729) }Dalam metrik Repl Opcounters dari node sekunder, jumlah operasi pembaruan masih ditampilkan sebagai 24.
> db.serverStatus().opcountersRepl { "insert" : NumberLong(1540), "query" : NumberLong(0), "update" : NumberLong(24), "delete" : NumberLong(6), "getmore" : NumberLong(0), "command" : NumberLong(26) }
Mengapa saya masih melihat berbagai jenis operasi yang dilacak oleh metrik Opcounters ketika saya tidak menggunakan database?
Jika tidak ada akses bisnis, operasi yang ditampilkan dalam grafik pemantauan mencakup jenis-jenis berikut:
Operasi internal dasar yang dilakukan untuk menjaga operasi normal ApsaraDB for MongoDB, seperti detak jantung set replika, sinkronisasi utama/sekunder, dan penyegaran sesi.
Operasi harian yang dilakukan oleh komponen kontrol dan manajemen di sekitar ApsaraDB for MongoDB, seperti deteksi, pemantauan, dan pendengaran.
Mengapa item yang dilacak oleh metrik Opcounters berbeda dari yang diagregasi oleh field op dalam koleksi oplog suatu instans?
Dalam koleksi oplog, Anda dapat menggunakan field op untuk membedakan tipe operasi spesifik. Nilai valid dari field ini:
kCommand: "c"
kInsert: "i"
kUpdate: "u"
kDelete: "d"
kNoop: "n"Semua operasi dalam transaksi adalah tipe op:c, dan semua operasi insert, update, dan delete dalam transaksi hanya disimpan di o.applyOps. Jika Anda melakukan agregasi hanya berdasarkan field op dari koleksi oplog, hasil yang diperoleh dalam skenario di mana transaksi ada tidak konsisten dengan yang ditampilkan dalam metrik Opcounters. Untuk informasi lebih lanjut tentang format oplog, lihat Parse oplog fields.
Jika Anda ingin menghitung jumlah operasi spesifik dalam transaksi, Anda dapat menggunakan klien mongo shell untuk terhubung ke ApsaraDB for MongoDB dan kemudian menjalankan perintah berikut:
use local
db.oplog.rs.aggregate([{$match:{"op":"c","ts":{"$gte": Timestamp(1733849400,0)},"o.applyOps":{$exists:true},"o.applyOps.0.op":"u"}},{$count:"count"}])Parameter:
Timestamp(1733849400,0): batas bawah timestamp ts saat Anda ingin menanyakan entri oplog. Anda perlu menggantinya dengan waktu query yang diinginkan. Anda dapat membaca timestamp darilocal.oplog.rsatau menggunakan timestamp UNIX."o.applyOps. 0.op":"u": tipe operasi pertama dalam oplog transaksi. Jika tipe operasi pertama dalam oplog transaksi adalah update, Anda bisa menggantinya dengan tipe operasi lain. Misalnya, jika tipe operasi pertama adalah insert, Anda bisa menggantinya dengan"o.applyOps. 0.op":"i".{$count:"count"}: jumlah entri oplog yang memenuhi persyaratan. Anda dapat menggunakan operator lain dari pernyataan aggregate untuk analisis lainnya.
Jika Anda ingin melihat metrik terkait transaksi, Anda dapat melihat metrik Transaction operations di modul Monitoring Data dari ApsaraDB for MongoDB. Untuk informasi lebih lanjut, lihat Item pemantauan dan metrik.
Contoh:
Lihat metrik Opcounters sebelum pembaruan.
> db.serverStatus().opcounters { "insert" : NumberLong(4), "query" : NumberLong(6723), "update" : NumberLong(110489), "delete" : NumberLong(3065), "getmore" : NumberLong(222670), "command" : NumberLong(1917525) }Lakukan operasi penulisan intra-transaksi pada node utama suatu instans:
// Mulai sesi. session = db.getMongo().startSession( { readPreference: { mode: "primary" } } ); coll1 = session.getDatabase("mydb1").foo; coll2 = session.getDatabase("mydb2").bar; // Mulai transaksi. session.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } ); // Lakukan dua operasi insert dalam transaksi. try { coll1.insertOne( { abc: 1 } ); coll2.insertOne( { xyz: 999 } ); } catch (error) { // Batalkan transaksi ketika terjadi kesalahan. session.abortTransaction(); throw error; } // Komit transaksi. session.commitTransaction(); session.endSession();Lihat metrik Opcounters lagi setelah pembaruan. Dalam metrik Opcounters, jumlah operasi insert berubah dari 4 menjadi 6.
> db.serverStatus().opcounters { "insert" : NumberLong(6), // Perhatikan perubahan nilai metrik di sini. "query" : NumberLong(6728), "update" : NumberLong(110532), "delete" : NumberLong(3067), "getmore" : NumberLong(222823), "command" : NumberLong(1918887) }