ApsaraDB for MongoDB menyediakan metrik Opcounters dan Repl Opcounters untuk memantau kinerja database. Topik ini menjelaskan metrik tersebut dan menjawab pertanyaan yang sering diajukan.
Untuk informasi mengenai tipe instans yang mendukung metrik Opcounters dan Repl Opcounters, lihat Monitoring items and metrics.
Metrik Opcounters
ApsaraDB for MongoDB menyediakan metrik Opcounters di konsol:
Metrik QPS di modul Monitoring Data.

Metrik Opcounters di modul Performance.

Metrik ini melaporkan jumlah operasi masing-masing jenis yang telah dilakukan oleh proses mongod atau mongos sejak startup terakhirnya.
Metric | Unit | Description |
insert | Count/second | Jumlah operasi insert per detik. |
query | Count/second | Jumlah operasi query per detik. |
update | Count/second | Jumlah operasi update per detik. |
delete | Count/second | Jumlah operasi delete per detik. |
getmore | Count/second | Jumlah operasi getmore per detik. |
command | Count/second | Jumlah operasi command per detik. |
Selain operasi yang dipicu oleh klien, Opcounters juga mencatat operasi internal database.
Metric | Description |
insert |
|
query |
|
update | Seperti jenis operasi |
delete |
|
getmore | Saat sinkronisasi primary/secondary, operasi |
command |
Untuk informasi selengkapnya, lihat Database Commands. |
Repl Metrik Opcounters
ApsaraDB for MongoDB menyediakan metrik Repl Opcounters di modul Monitoring Data. Biasanya, Anda hanya perlu memantau metrik Repl Opcounters pada node secondary.

Anda juga dapat melihat metrik Opcounters pada node secondary. Metrik ini terdiri dari dua bagian berikut:
Kueri klien yang dieksekusi pada node secondary, sesuai dengan preferensi baca yang ditentukan.
Semua operasi write yang direplikasi dari node primary melalui sinkronisasi primary/secondary.
Seperti Opcounters, metrik Repl Opcounters mencakup jenis operasi insert, query, update, delete, getmore, dan command. Metrik ini merangkum operasi replikasi berdasarkan jenis sejak proses mongod terakhir dimulai.
Metric | Unit | Description |
insert | Count/second | Jumlah operasi insert per detik. |
query | Count/second | Jumlah operasi query per detik. |
update | Count/second | Jumlah operasi update per detik. |
delete | Count/second | Jumlah operasi delete per detik. |
getmore | Count/second | Jumlah operasi getmore per detik. |
command | Count/second | Jumlah operasi command per detik. |
Metrik Repl Opcounters menghitung semua operasi write yang diterapkan pada node secondary. Selain operasi yang disebutkan di bagian Metrik Opcounters, metrik ini juga mencakup hal-hal berikut:
Operasi
insertdanupdateyang dipicu oleh refresh session.Operasi
deleteyang dipicu oleh TTL index.Operasi
deleteyang dipicu oleh penghapusan dokumen orphan, yang biasanya terjadi dengan penundaan setelah migrasi chunk.Operasi write ke koleksi sistem. Misalnya, Retryable Writes melibatkan operasi write ke koleksi
config.transactions.
Nilai Repl Opcounters pada node secondary tidak sama dengan nilai Opcounters pada node primary karena MongoDB melakukan serialisasi operasi secara berbeda selama replikasi.
FAQ
Mengapa Repl Opcounters pada secondary lebih tinggi daripada Opcounters pada primary?
Operasi yang memengaruhi beberapa dokumen, seperti insert batch atau update/delete multi-dokumen, dihitung sebagai satu operasi pada node primary. Saat operasi tersebut direplikasi ke node secondary, proses replikasi bersifat berbasis dokumen. Akibatnya, nilai Repl Opcounters pada node secondary bisa lebih tinggi daripada nilai Opcounters pada node primary.
Contoh berikut menunjukkan perilaku ini:
Sebelum update, periksa opcounters.
Counter
updateOpcounters pada node primary adalah 13.> db.serverStatus().opcounters.update NumberLong(13)Counter
updateRepl Opcounters pada node secondary adalah 11.> db.serverStatus().opcountersRepl.update NumberLong(11)
Lakukan update batch pada node primary. Field
modifiedCountyang dikembalikan menunjukkan bahwa update batch ini memodifikasi empat dokumen.> db.coll.updateMany({x:2},{$set:{x:3}}) { "acknowledged" : true, "matchedCount" : 4, "modifiedCount" : 4 }Setelah update, periksa opcounters lagi.
Counter
updateOpcounters pada node primary sekarang menjadi 14.> db.serverStatus().opcounters.update NumberLong(14)Counter
updateRepl Opcounters pada node secondary sekarang menjadi 15.> db.serverStatus().opcountersRepl.update NumberLong(15)
Mengapa Repl Opcounters menampilkan insert selama update?
Hal ini dapat terjadi karena operasi update Anda menentukan opsi {upsert:true}. Jika dokumen yang ingin Anda update tidak ada, MongoDB mengubah operasi tersebut menjadi operasi insert. Jika oplog mencatat operasi insert, replikasi juga menerapkan operasi insert pada node secondary. Oleh karena itu, Repl Opcounters mencatat operasi insert yang sesuai.
Contoh berikut menunjukkan perilaku ini:
Sebelum update, periksa opcounters.
Pada node primary, Opcounters menunjukkan
update: 33daninsert: 1516.> db.serverStatus().opcounters { "insert" : NumberLong(1516), "query" : NumberLong(70), "update" : NumberLong(33), "delete" : NumberLong(1043), "getmore" : NumberLong(2662), "command" : NumberLong(4000) }Pada node secondary, Repl Opcounters menunjukkan
update: 24daninsert: 1539.> db.serverStatus().opcountersRepl { "insert" : NumberLong(1539), "query" : NumberLong(0), "update" : NumberLong(24), "delete" : NumberLong(6), "getmore" : NumberLong(0), "command" : NumberLong(26) }
Pada node primary, jalankan operasi update dengan opsi
{upsert:true}. FieldupsertedIdyang dikembalikan menunjukkan bahwa satu dokumen telah disisipkan.> db.coll.updateOne({x:"a"}, {$set:{x:"b"}}, {upsert:true}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("64bf72b829907f52b4b363ea") }Setelah update, periksa opcounters lagi.
Pada node primary, counter
updateOpcounters sekarang menjadi 34 dan counterinserttetap 1516.> db.serverStatus().opcounters { "insert" : NumberLong(1516), "query" : NumberLong(70), "update" : NumberLong(34), // Perhatikan perubahan pada counter ini. "delete" : NumberLong(1043), "getmore" : NumberLong(2706), "command" : NumberLong(4286) }Pada node secondary, counter
insertRepl Opcounters sekarang menjadi 1540 dan counterupdatetetap 24.> db.serverStatus().opcountersRepl { "insert" : NumberLong(1540), // Perhatikan perubahan pada counter ini. "query" : NumberLong(0), "update" : NumberLong(24), "delete" : NumberLong(6), "getmore" : NumberLong(0), "command" : NumberLong(26) }
Mengapa jumlah update pada primary lebih tinggi daripada secondary?
Hal ini mungkin terjadi karena logika aplikasi Anda mencakup operasi update berulang. Jika operasi update berulang tidak benar-benar mengubah data apa pun, operasi tersebut tidak direplikasi ke node secondary. Oleh karena itu, jumlah operasi update yang dicatat pada node secondary lebih rendah.
Contoh berikut menunjukkan perilaku ini:
Sebelum update, periksa opcounters.
Jumlah
updatedalam Opcounters pada node primary adalah 34.> db.serverStatus().opcounters { "insert" : NumberLong(1516), "query" : NumberLong(70), "update" : NumberLong(34), "delete" : NumberLong(1043), "getmore" : NumberLong(2760), "command" : NumberLong(4609) }Jumlah
updatedalam Repl Opcounters pada node secondary adalah 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 primary. Informasi yang dikembalikan menunjukkan bahwa tidak ada modifikasi aktual yang terjadi.
> db.coll.updateMany({x:"ab"},{$set:{x:"cd"}}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }Setelah update, periksa opcounters lagi.
Jumlah
updatedalam Opcounters pada node primary sekarang menjadi 35.> db.serverStatus().opcounters { "insert" : NumberLong(1516), "query" : NumberLong(70), "update" : NumberLong(35), // Perhatikan perubahan pada counter ini. "delete" : NumberLong(1043), "getmore" : NumberLong(2778), "command" : NumberLong(4729) }Jumlah
updatedalam Repl Opcounters pada node secondary tetap 24.> db.serverStatus().opcountersRepl { "insert" : NumberLong(1540), "query" : NumberLong(0), "update" : NumberLong(24), "delete" : NumberLong(6), "getmore" : NumberLong(0), "command" : NumberLong(26) }
Mengapa Opcounters aktif pada database yang tidak digunakan?
Bahkan tanpa traffic pengguna, data pemantauan tetap melaporkan sejumlah kecil operasi. Operasi tersebut terdiri dari hal-hal berikut:
Operasi internal dasar yang menjaga database MongoDB tetap berjalan, seperti heartbeat replica set, sinkronisasi primary/secondary, dan refresh session.
Operasi rutin dari komponen manajemen ApsaraDB for MongoDB, seperti pemeriksaan kesehatan, pemantauan, dan pendengaran event.
Mengapa metrik Opcounters berbeda dari agregasi oplog?
Di oplog, Anda dapat menggunakan field op untuk membedakan jenis operasi. Nilai umum meliputi:
kCommand: "c"
kInsert: "i"
kUpdate: "u"
kDelete: "d"
kNoop: "n"Transaksi dicatat di oplog dengan jenis operasi op: "c". Operasi insert, update, dan delete individual dalam transaksi disimpan secara internal di field o.applyOps. Jika Anda mengagregasi hasil hanya berdasarkan field op tingkat atas dari oplog, hasil Anda tidak akan sesuai dengan metrik Opcounters dalam skenario yang melibatkan transaksi. Untuk informasi lebih lanjut tentang format oplog, lihat Analysis of oplog fields.
Untuk menghitung jenis operasi spesifik dalam transaksi, sambungkan ke instans MongoDB Anda menggunakan mongo shell dan jalankan 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"}])Berikut ini penjelasan parameter dalam perintah ini:
Timestamp(1733849400,0): Batas bawah untuk stempel waktutsdalam kueri oplog. Ganti nilai ini dengan waktu kueri yang diinginkan. Anda dapat membaca stempel waktu ini darilocal.oplog.rsatau menggunakan stempel waktu UNIX standar."o.applyOps.0.op":"u": Menentukan bahwa operasi pertama dalam oplog transaksi adalah update. Anda dapat mengganti ini dengan jenis operasi lain. Misalnya, jika operasi pertama adalah insert, gunakan"o.applyOps.0.op":"i".{$count:"count"}: Hanya menghitung jumlah entri oplog yang cocok. Anda dapat menggunakan operator agregasi lain untuk jenis analisis lainnya.
Untuk melihat metrik pemantauan terkait transaksi, buka halaman Monitoring Information di konsol ApsaraDB for MongoDB dan lihat metrik Transaction Operands. Untuk informasi lebih lanjut tentang metrik ini, lihat Monitoring items and metrics.
Contoh berikut menunjukkan perilaku ini:
Sebelum update, periksa Opcounters.
> db.serverStatus().opcounters { "insert" : NumberLong(4), "query" : NumberLong(6723), "update" : NumberLong(110489), "delete" : NumberLong(3065), "getmore" : NumberLong(222670), "command" : NumberLong(1917525) }Pada node primary, lakukan operasi write dalam transaksi.
// 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 jika terjadi error. session.abortTransaction(); throw error; } // Commit transaksi. session.commitTransaction(); session.endSession();Setelah update, periksa Opcounters lagi. Jumlah
insertdalam Opcounters berubah dari 4 menjadi 6.> db.serverStatus().opcounters { "insert" : NumberLong(6), // Perhatikan perubahan pada counter ini. "query" : NumberLong(6728), "update" : NumberLong(110532), "delete" : NumberLong(3067), "getmore" : NumberLong(222823), "command" : NumberLong(1918887) }