Todos os produtos
Search
Central de documentação

ApsaraDB for MongoDB:Métricas Opcounters e Repl Opcounters

Última atualização: Jun 26, 2026

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:

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 local.oplog.rs durante a replicação.

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 config.system.sessions a cada 5 minutos, o que gera operações de insert. Para alterar o intervalo de descarregamento, ajuste o parâmetro logicalSessionRefreshMillis.

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 fullDocument: "updateLookup" em um Change Stream aciona operações de query adicionais.

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 local.oplog.rs. Esta é a principal razão pela qual os valores de getmore podem ser altos mesmo quando a contagem de query do cliente é baixa.

command

Comandos registrados incluem: isMaster e hello (verificações internas de saúde); replSetUpdatePosition (sincronização de replicação); e comandos de monitoramento como serverStatus, listCollections, collStats e replSetGetStatus. Para a referência completa de comandos, consulte Commands.

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.

Repl Opcounters-cn.png

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 readPreference

  • Todas as operações de escrita aplicadas ao banco de dados local pela 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:

  1. Antes da atualização, verifique os contadores:

    > db.serverStatus().opcounters.update
    NumberLong(13)
    
    > db.serverStatus().opcountersRepl.update
    NumberLong(11)
  2. Execute a atualização em lote:

    > db.coll.updateMany({x:2},{$set:{x:3}})
    { "acknowledged" : true, "matchedCount" : 4, "modifiedCount" : 4 }
  3. 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:

  1. Antes da atualização:

    > db.serverStatus().opcounters
    { "insert": NumberLong(1516), "update": NumberLong(33), ... }
    
    > db.serverStatus().opcountersRepl
    { "insert": NumberLong(1539), "update": NumberLong(24), ... }
  2. Execute o upsert:

    > db.coll.updateOne({x:"a"}, {$set:{x:"b"}}, {upsert:true})
    { "acknowledged": true, "matchedCount": 0, "modifiedCount": 0, "upsertedId": ObjectId("64bf72b829907f52b4b363ea") }
  3. 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:

  1. Antes da atualização: update do primário = 34, update do secundário = 24.

  2. Execute uma atualização sem documentos correspondentes:

    > db.coll.updateMany({x:"ab"},{$set:{x:"cd"}})
    { "acknowledged": true, "matchedCount": 0, "modifiedCount": 0 }
  3. 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

Timestamp(1733849400, 0)

Limite inferior para o campo ts. Substitua pelo horário de consulta desejado como um timestamp UNIX ou um valor lido de local.oplog.rs.

"o.applyOps.0.op": "u"

Tipo de operação da primeira entrada no oplog da transação. Substitua "u" por "i" para insert ou "d" para delete.

{$count: "count"}

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:

  1. Antes da transação:

    > db.serverStatus().opcounters
    { "insert": NumberLong(4), "query": NumberLong(6723), "update": NumberLong(110489), ... }
  2. 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();
  3. 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.