Todos los productos
Search
Centro de documentos

ApsaraDB for MongoDB:Métricas Opcounters y Repl Opcounters

Última actualización: Sep 03, 2026

ApsaraDB for MongoDB proporciona las métricas Opcounters y Repl Opcounters para el monitoreo del rendimiento de la base de datos. Este tema describe dichas métricas y responde a las preguntas frecuentes.

Para obtener información sobre los tipos de instancia que admiten las métricas Opcounters y Repl Opcounters, consulte Monitoring items and metrics.

Métricas Opcounters

ApsaraDB for MongoDB ofrece las métricas Opcounters en la consola:

Esta métrica reporta la cantidad de operaciones de cada tipo que ha realizado un proceso mongod o mongos desde su último inicio.

Métrica

Unidad

Descripción

insert

Count/second

Número de operaciones de inserción por segundo.

query

Count/second

Número de operaciones de consulta por segundo.

update

Count/second

Número de operaciones de actualización por segundo.

delete

Count/second

Número de operaciones de eliminación por segundo.

getmore

Count/second

Número de operaciones getmore por segundo.

command

Count/second

Número de operaciones de comando por segundo.

Además de las operaciones iniciadas por el cliente, Opcounters también registra las operaciones internas de la base de datos.

Métrica

Descripción

insert

  • Durante una migración de chunk, el nodo primario del shard receptor registra estas operaciones de inserción.

  • Los miembros de un conjunto de réplicas guardan las sesiones en memoria en la colección config.system.sessions cada 5 minutos. Esta acción genera operaciones de inserción. Puede ajustar este intervalo mediante el parámetro logicalSessionRefreshMillis.

query

  • Si la función Mirrored Reads está habilitada (de forma predeterminada en MongoDB 4.4 y versiones posteriores), los nodos secundarios también realizan algunas operaciones de consulta.

  • Si un change stream se configura con fullDocument: "updateLookup", se generan operaciones de consulta adicionales.

update

Al igual que con el tipo de operación insert, también se registran las operaciones update correspondientes cuando se actualizan las sesiones en memoria.

delete

  • Las operaciones de eliminación activadas por un índice TTL no se registran.

  • Las operaciones para eliminar un documento huérfano tras una migración de chunk no se registran.

getmore

Durante la sincronización primaria/secundaria, también se registran las operaciones getmore en la colección local.oplog.rs.

command

  • Registra todos los comandos excepto los de escritura (insert, update, delete) y los de lectura (query, getmore).

  • Registra los comandos isMaster y hello que se utilizan para las comprobaciones de estado internas.

  • Registra los comandos utilizados para la sincronización primaria/secundaria, como replSetUpdatePosition.

  • Registra los comandos utilizados para el monitoreo, como serverStatus, listCollections, collStats y replSetGetStatus.

Para obtener más información, consulte Database Commands.

Métricas Repl Opcounters

ApsaraDB for MongoDB proporciona las métricas Repl Opcounters en el módulo Monitoring Data. Por lo general, solo es necesario monitorear las métricas Repl Opcounters en los nodos secundarios.

Repl Opcounters-cn.png

También puede consultar la métrica Opcounters en un nodo secundario. Esta métrica se compone de las siguientes dos partes:

  • Consultas de clientes ejecutadas en el nodo secundario, según la preferencia de lectura especificada.

  • Todas las operaciones de escritura replicadas desde el nodo primario mediante la sincronización primaria/secundaria.

Al igual que Opcounters, la métrica Repl Opcounters consta de los tipos de operación insert, query, update, delete, getmore y command. Esta métrica resume las operaciones de replicación por tipo desde el último inicio del proceso mongod.

Métrica

Unidad

Descripción

insert

Count/second

Número de operaciones de inserción por segundo.

query

Count/second

Número de operaciones de consulta por segundo.

update

Count/second

Número de operaciones de actualización por segundo.

delete

Count/second

Número de operaciones de eliminación por segundo.

getmore

Count/second

Número de operaciones getmore por segundo.

command

Count/second

Número de operaciones de comando por segundo.

La métrica Repl Opcounters cuenta todas las operaciones de escritura que se aplican en un nodo secundario. Además de las operaciones mencionadas en la sección Opcounters metrics, también incluye lo siguiente:

  • Operaciones insert y update activadas por actualizaciones de sesión.

  • Operaciones delete activadas por un índice TTL.

  • Operaciones delete activadas por la eliminación de un documento huérfano, lo cual suele ocurrir con retraso después de una migración de chunk.

  • Operaciones de escritura en colecciones del sistema. Por ejemplo, las Retryable Writes implican operaciones de escritura en la colección config.transactions.

Los valores de Repl Opcounters en un nodo secundario no coinciden con los valores de Opcounters en el nodo primario porque MongoDB serializa las operaciones de manera diferente durante la replicación.

Preguntas frecuentes

¿Por qué los valores de Repl Opcounters en secundarios son mayores que los de Opcounters en primarios?

Las operaciones que afectan a varios documentos, como una inserción por lotes o una actualización o eliminación de múltiples documentos, se cuentan como una sola operación en el nodo primario. Cuando una operación que afecta a varios documentos se replica en los nodos secundarios, el proceso de replicación se basa en documentos. Como resultado, el valor de Repl Opcounters en un nodo secundario puede ser mayor que el valor de Opcounters en el nodo primario.

El siguiente ejemplo muestra este comportamiento:

  1. Antes de la actualización, compruebe los contadores de operaciones.

    • El contador update de Opcounters en el nodo primario es 13.

      > db.serverStatus().opcounters.update
      NumberLong(13)
    • El contador update de Repl Opcounters en el nodo secundario es 11.

      > db.serverStatus().opcountersRepl.update
      NumberLong(11)
  2. Ejecute una actualización por lotes en el nodo primario. El campo modifiedCount devuelto indica que esta actualización por lotes modificó cuatro documentos.

    > db.coll.updateMany({x:2},{$set:{x:3}})
    { "acknowledged" : true, "matchedCount" : 4, "modifiedCount" : 4 }
  3. Después de la actualización, compruebe nuevamente los contadores de operaciones.

    • El contador update de Opcounters en el nodo primario ahora es 14.

      > db.serverStatus().opcounters.update
      NumberLong(14)
    • El contador update de Repl Opcounters en el nodo secundario ahora es 15.

      > db.serverStatus().opcountersRepl.update
      NumberLong(15)

¿Por qué Repl Opcounters muestra inserciones durante las actualizaciones?

Esto puede deberse a que su operación de actualización especifica la opción {upsert:true}. Si el documento que desea update no existe, MongoDB convierte la operación en una operación insert. Si el oplog registra una operación insert, la replicación también aplica una operación insert en el nodo secundario. Por lo tanto, Repl Opcounters registra la operación insert correspondiente.

El siguiente ejemplo muestra este comportamiento:

  1. Antes de la actualización, compruebe los contadores de operaciones.

    • En el nodo primario, Opcounters muestra update: 33 e insert: 1516.

      > db.serverStatus().opcounters
      {
        "insert" : NumberLong(1516),
        "query" : NumberLong(70),
        "update" : NumberLong(33),
        "delete" : NumberLong(1043),
        "getmore" : NumberLong(2662),
        "command" : NumberLong(4000)
      }
    • En el nodo secundario, Repl Opcounters muestra update: 24 e insert: 1539.

      > db.serverStatus().opcountersRepl
      {
        "insert" : NumberLong(1539),
        "query" : NumberLong(0),
        "update" : NumberLong(24),
        "delete" : NumberLong(6),
        "getmore" : NumberLong(0),
        "command" : NumberLong(26)
      }
  2. En el nodo primario, ejecute una operación de actualización con la opción {upsert:true}. El campo upsertedId devuelto indica que se insertó un documento.

    > db.coll.updateOne({x:"a"}, {$set:{x:"b"}}, {upsert:true})
    {
      "acknowledged" : true,
      "matchedCount" : 0,
      "modifiedCount" : 0,
      "upsertedId" : ObjectId("64bf72b829907f52b4b363ea")
    }
  3. Después de la actualización, compruebe nuevamente los contadores de operaciones.

    • En el nodo primario, el contador update de Opcounters ahora es 34 y el contador insert sigue siendo 1516.

      > db.serverStatus().opcounters
      {
        "insert" : NumberLong(1516),
        "query" : NumberLong(70),
        "update" : NumberLong(34),   // Note the change in this counter.
        "delete" : NumberLong(1043),
        "getmore" : NumberLong(2706),
        "command" : NumberLong(4286)
      }
    • En el nodo secundario, el contador insert de Repl Opcounters ahora es 1540 y el contador update sigue siendo 24.

      > db.serverStatus().opcountersRepl
      {
        "insert" : NumberLong(1540), // Note the change in this counter.
        "query" : NumberLong(0),
        "update" : NumberLong(24),
        "delete" : NumberLong(6),
        "getmore" : NumberLong(0),
        "command" : NumberLong(26)
      }

¿Por qué el recuento de actualizaciones en el primario es mayor que en el secundario?

Esto puede deberse a que la lógica de su aplicación incluye operaciones update repetitivas. Si una operación update repetida no cambia realmente ningún dato, no se replica en los nodos secundarios. Por lo tanto, la cantidad de operaciones update registradas en los nodos secundarios es menor.

El siguiente ejemplo muestra este comportamiento:

  1. Antes de la actualización, compruebe los contadores de operaciones.

    • El recuento de update en Opcounters del nodo primario es 34.

      > db.serverStatus().opcounters
      {
        "insert" : NumberLong(1516),
        "query" : NumberLong(70),
        "update" : NumberLong(34),
        "delete" : NumberLong(1043),
        "getmore" : NumberLong(2760),
        "command" : NumberLong(4609)
      }
    • El recuento de update en Repl Opcounters del nodo secundario es 24.

      > db.serverStatus().opcountersRepl
      {
        "insert" : NumberLong(1540),
        "query" : NumberLong(0),
        "update" : NumberLong(24),
        "delete" : NumberLong(6),
        "getmore" : NumberLong(0),
        "command" : NumberLong(26)
      }
  2. Ejecute una operación de actualización en el nodo primario. La información devuelta indica que no se produjo ninguna modificación real.

    > db.coll.updateMany({x:"ab"},{$set:{x:"cd"}})
    { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }
  3. Después de la actualización, compruebe nuevamente los contadores de operaciones.

    • El recuento de update en Opcounters del nodo primario ahora es 35.

      > db.serverStatus().opcounters
      {
        "insert" : NumberLong(1516),
        "query" : NumberLong(70),
        "update" : NumberLong(35),    // Note the change in this counter.
        "delete" : NumberLong(1043),
        "getmore" : NumberLong(2778),
        "command" : NumberLong(4729)
      }
    • El recuento de update en Repl Opcounters del nodo secundario sigue siendo 24.

      > db.serverStatus().opcountersRepl
      {
        "insert" : NumberLong(1540),
        "query" : NumberLong(0),
        "update" : NumberLong(24),
        "delete" : NumberLong(6),
        "getmore" : NumberLong(0),
        "command" : NumberLong(26)
      }

¿Por qué hay actividad en Opcounters con la base de datos inactiva?

Incluso sin tráfico de usuarios, los datos de monitoreo siguen reportando una pequeña cantidad de operaciones. Estas consisten en lo siguiente:

  • Operaciones internas básicas que mantienen en funcionamiento la base de datos MongoDB, como los heartbeats del conjunto de réplicas, la sincronización primaria/secundaria y las actualizaciones de sesión.

  • Operaciones rutinarias de los componentes de gestión de ApsaraDB for MongoDB, como comprobaciones de estado, monitoreo y escucha de eventos.

¿Por qué difieren las métricas Opcounters de las agregaciones del oplog?

En el oplog, puede usar el campo op para distinguir entre tipos de operaciones. Los valores comunes incluyen:

kCommand: "c"
kInsert: "i"
kUpdate: "u"
kDelete: "d"
kNoop: "n"

Las transacciones se registran en el oplog con un tipo de operación op: "c". Las operaciones individuales de insert, update y delete dentro de la transacción se almacenan internamente en el campo o.applyOps. Si agrega resultados basándose únicamente en el campo op de nivel superior del oplog, sus resultados no coincidirán con las métricas Opcounters en escenarios que impliquen transacciones. Para obtener más información sobre el formato del oplog, consulte Analysis of oplog fields.

Para contar los tipos específicos de operaciones dentro de una transacción, conéctese a su instancia de MongoDB mediante mongo shell y ejecute el siguiente comando.

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"}])

A continuación se describen los parámetros de este comando:

  • Timestamp(1733849400,0): Límite inferior para la marca de tiempo ts en la consulta del oplog. Reemplace este valor con la hora de consulta deseada. Puede leer esta marca de tiempo desde local.oplog.rs o usar una marca de tiempo UNIX estándar.

  • "o.applyOps.0.op":"u": Especifica que la primera operación en el oplog de la transacción es una actualización. Puede reemplazar esto con otros tipos de operaciones. Por ejemplo, si la primera operación es una inserción, use "o.applyOps.0.op":"i".

  • {$count:"count"}: Cuenta solo el número de entradas del oplog que coinciden. Puede usar otros operadores de agregación para otros tipos de análisis.

Para ver las métricas de monitoreo relacionadas con transacciones, vaya a la página Monitoring Information en la consola de ApsaraDB for MongoDB y consulte la métrica Transaction Operands. Para obtener más información sobre esta métrica, consulte Monitoring items and metrics.

El siguiente ejemplo muestra este comportamiento:

  1. Antes de la actualización, compruebe Opcounters.

    > db.serverStatus().opcounters
    {
      "insert" : NumberLong(4), 
      "query" : NumberLong(6723),
      "update" : NumberLong(110489),
      "delete" : NumberLong(3065),
      "getmore" : NumberLong(222670),
      "command" : NumberLong(1917525)
    }
  2. En el nodo primario, ejecute una operación de escritura dentro de una transacción.

    // Start a session.
    session = db.getMongo().startSession( { readPreference: { mode: "primary" } } );
    coll1 = session.getDatabase("mydb1").foo;
    coll2 = session.getDatabase("mydb2").bar;
    // Start a transaction.
    session.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } );
    // Execute two insert operations in the transaction.
    try {
       coll1.insertOne( { abc: 1 } );
       coll2.insertOne( { xyz: 999 } );
    } catch (error) {
       // Abort the transaction if an error occurs.
       session.abortTransaction();
       throw error;
    }
    // Commit the transaction.
    session.commitTransaction();
    session.endSession();
  3. Después de la actualización, compruebe nuevamente Opcounters. El recuento de insert en Opcounters cambió de 4 a 6.

    > db.serverStatus().opcounters
    {
      "insert" : NumberLong(6),   // Note the change in this counter.
      "query" : NumberLong(6728),
      "update" : NumberLong(110532),
      "delete" : NumberLong(3067),
      "getmore" : NumberLong(222823),
      "command" : NumberLong(1918887)
    }