O ApsaraDB for MongoDB expõe duas métricas de contadores de operações — Opcounters e Repl Opcounters — que ajudam a compreender a carga de trabalho do banco de dados e diagnosticar anomalias de desempenho. Para as arquiteturas de instância que suportam essas métricas, consulte Monitoring items and metrics.
|
Métrica |
Onde encontrar |
Para que serve |
|
Opcounters |
módulo Monitoring Data (métrica QPS) e módulo Performance |
Identificar qual tipo de operação está gerando alta carga no nó primário |
|
Repl Opcounters |
módulo Monitoring Data |
Verifique a saúde da replicação e identificar amplificação de escrita inesperada em nós secundários |
Opcounters
Opcounters contabiliza operações de insert, query, update, delete, getMore e command executadas em um mongod ou mongos desde a última inicialização. A contagem inclui operações iniciadas pelo cliente e operações internas.
A métrica aparece em dois locais no console do ApsaraDB for MongoDB:
Métrica QPS no módulo Monitoring Data. Para mais informações, consulte Monitoring information.

Métrica Opcounters no módulo Performance. Consulte Performance trends.

Operações monitoradas
|
Operação |
Unidade |
Descrição |
|
insert |
Contagem/segundo |
Operações de insert por segundo |
|
query |
Contagem/segundo |
Operações de query por segundo |
|
update |
Contagem/segundo |
Operações de update por segundo |
|
delete |
Contagem/segundo |
Operações de delete por segundo |
|
getmore |
Contagem/segundo |
Operações de getMore por segundo. Este valor pode ser alto mesmo quando a contagem de query é baixa, porque nós secundários enviam operações de getMore contra |
|
command |
Contagem/segundo |
Operações de command por segundo. Contabiliza todos os comandos exceto insert, update, delete, query e getmore. |
Operações de múltiplos documentos — como updateMany que afeta quatro documentos — são contabilizadas como uma única operação em Opcounters. Se precisar de granularidade no nível de documento, consulte o FAQ abaixo.
Operações internas
Além do tráfego do cliente, Opcounters também registra operações internas. A tabela abaixo explica o que aciona cada contador na ausência de atividade do cliente.
|
Operação |
Comportamento interno |
|
insert |
(1) Durante a migração de chunk, o nó primário, que atua como shard de destino, registra essas operações de insert. (2) Nós do replica set descarregam sessões em memória para |
|
query |
(1) Quando Mirrored Reads está ativado, operações de query são refletidas para nós secundários. O recurso é ativado por padrão para instâncias que executam versões do MongoDB posteriores a 4.4. Para detalhes, consulte Mirrored Reads. (2) Defina |
|
update |
Descarregamentos de sessão (mesmo mecanismo do insert) também geram operações de update. |
|
delete |
Exclusões de índice TTL não são registradas. Exclusões de documentos órfãos após migração de chunk não são registradas. |
|
getmore |
Sincronização primário/secundário gera operações de getMore contra |
|
command |
Comandos registrados incluem: |
Repl Opcounters
Repl Opcounters contabiliza operações de replicação do banco de dados por tipo desde a última inicialização do mongod. Está disponível no módulo Monitoring Data do console do ApsaraDB for MongoDB. Para mais detalhes, consulte Monitoring information.

Concentre-se nos valores dos nós secundários ao monitorar Repl Opcounters. A métrica captura:
Operações de query do cliente roteadas para nós secundários via
readPreferenceTodas as operações de escrita aplicadas ao banco de dados
localpela replicação primário/secundário
Use Repl Opcounters para verificar a saúde da replicação e identificar amplificação de escrita inesperada em nós secundários.
Operações monitoradas
|
Operação |
Unidade |
Descrição |
|
insert |
Contagem/segundo |
Operações de insert replicadas aplicadas por segundo em nós secundários |
|
query |
Contagem/segundo |
Operações de query roteadas para nós secundários por segundo |
|
update |
Contagem/segundo |
Operações de update replicadas aplicadas por segundo em nós secundários |
|
delete |
Contagem/segundo |
Operações de delete replicadas aplicadas por segundo em nós secundários |
|
getmore |
Contagem/segundo |
Operações de getMore em nós secundários por segundo |
|
command |
Contagem/segundo |
Operações de command replicadas por segundo |
Operações adicionais monitoradas em comparação com Opcounters
Repl Opcounters registra várias operações que Opcounters não registra:
Operações de insert e update acionadas por descarregamentos de sessão
Operações de delete causadas por índices TTL
Exclusões de documentos órfãos (tipicamente com um atraso após a migração de chunk)
Escritas em coleções de sistema, como escritas retryable para
config.transactions. Para detalhes, consulte Retryable Writes.
O ApsaraDB for MongoDB serializa dados de formas diferentes durante a replicação primário/secundário. Portanto, o valor da métrica Repl Opcounters para um nó secundário em uma instância é diferente do valor para o nó primário na instância.
FAQ
Por que o valor de Repl Opcounters em um nó secundário é muito maior que o valor de Opcounters no nó primário?
Operações de múltiplos documentos são registradas como uma única operação em Opcounters no nó primário, mas a replicação aplica cada alteração de documento individualmente. Um único updateMany que modifica quatro documentos incrementa opcounters.update em 1 no primário, mas incrementa opcountersRepl.update em 4 no secundário.
Exemplo — execute updateMany que modifica quatro documentos:
-
Antes da atualização, verifique os contadores:
> db.serverStatus().opcounters.update NumberLong(13) > db.serverStatus().opcountersRepl.update NumberLong(11) -
Execute a atualização em lote:
> db.coll.updateMany({x:2},{$set:{x:3}}) { "acknowledged" : true, "matchedCount" : 4, "modifiedCount" : 4 } -
Verifique os contadores novamente:
> db.serverStatus().opcounters.update NumberLong(14) // +1 (one operation) > db.serverStatus().opcountersRepl.update NumberLong(15) // +4 (four documents replicated individually)
Por que Repl Opcounters mostra muitas operações de insert quando eu apenas executo operações de update?
Isso acontece quando {upsert: true} é usado e o documento de destino não existe. O MongoDB converte a atualização malsucedida em um insert, registra-a como um insert no oplog e replica-a para nós secundários como um insert. Portanto, opcountersRepl.insert é incrementado em vez de opcountersRepl.update.
Exemplo — execute updateOne com {upsert: true} em um documento inexistente:
-
Antes da atualização:
> db.serverStatus().opcounters { "insert": NumberLong(1516), "update": NumberLong(33), ... } > db.serverStatus().opcountersRepl { "insert": NumberLong(1539), "update": NumberLong(24), ... } -
Execute o upsert:
> db.coll.updateOne({x:"a"}, {$set:{x:"b"}}, {upsert:true}) { "acknowledged": true, "matchedCount": 0, "modifiedCount": 0, "upsertedId": ObjectId("64bf72b829907f52b4b363ea") } -
Após a atualização — o primário registra um update (+1), o secundário registra um insert (+1):
> db.serverStatus().opcounters { "insert": NumberLong(1516), "update": NumberLong(34), ... } > db.serverStatus().opcountersRepl { "insert": NumberLong(1540), "update": NumberLong(24), ... }
Por que a contagem de update no primário é muito maior que a contagem de update replicada em nós secundários?
Atualizações no-op — em que o novo valor corresponde ao valor existente — são registradas em Opcounters no primário, mas não são escritas no oplog e, portanto, não são replicadas.
Exemplo — execute updateMany que não corresponde a nenhum documento:
Antes da atualização: update do primário = 34, update do secundário = 24.
-
Execute uma atualização sem documentos correspondentes:
> db.coll.updateMany({x:"ab"},{$set:{x:"cd"}}) { "acknowledged": true, "matchedCount": 0, "modifiedCount": 0 } -
Após a atualização: update do primário = 35 (+1), update do secundário permanece em 24.
> db.serverStatus().opcounters { "update": NumberLong(35), ... } // +1 > db.serverStatus().opcountersRepl { "update": NumberLong(24), ... } // unchanged
Por que vejo operações em Opcounters quando nenhum tráfego de cliente está ativo?
O ApsaraDB for MongoDB gera operações em segundo plano continuamente, mesmo sem atividade do cliente:
Manutenção interna: heartbeats do replica set, sincronização primário/secundário e descarregamentos de sessão
Operações de gerenciamento: detecção, monitoramento e verificações de saúde do plano de controle
Por que os valores de Opcounters diferem das contagens derivadas do campo op do oplog?
No oplog, o campo op usa estes valores:
kCommand: "c"
kInsert: "i"
kUpdate: "u"
kDelete: "d"
kNoop: "n"
Todas as operações dentro de uma transação são registradas com op: "c". As operações individuais de insert, update e delete são armazenadas em o.applyOps, não como entradas de nível superior no oplog. Agregar apenas por op omite escritas transacionadas.
Para contabilizar um tipo de operação específico dentro de transações, conecte-se à instância usando o mongo shell e execute:
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"}
])
Parâmetros:
|
Parâmetro |
Descrição |
|
|
Limite inferior para o campo |
|
|
Tipo de operação da primeira entrada no oplog da transação. Substitua |
|
|
Retorna o número de entradas do oplog correspondentes. Substitua por outros operadores de agregação para análise adicional. |
Exemplo — duas operações insertOne dentro de uma transação incrementam opcounters.insert de 4 para 6:
-
Antes da transação:
> db.serverStatus().opcounters { "insert": NumberLong(4), "query": NumberLong(6723), "update": NumberLong(110489), ... } -
Execute a transação:
session = db.getMongo().startSession({ readPreference: { mode: "primary" } }); coll1 = session.getDatabase("mydb1").foo; coll2 = session.getDatabase("mydb2").bar; session.startTransaction({ readConcern: { level: "local" }, writeConcern: { w: "majority" } }); try { coll1.insertOne({ abc: 1 }); coll2.insertOne({ xyz: 999 }); } catch (error) { session.abortTransaction(); throw error; } session.commitTransaction(); session.endSession(); -
Após a transação — a contagem de insert é 6 (+2):
> db.serverStatus().opcounters { "insert": NumberLong(6), ... }
Para visualizar métricas de transação diretamente no console, consulte a métrica Transaction operations no módulo Monitoring Data. Para obter mais informações, consulte Monitoring items and metrics.