Registrar todas las consultas en MongoDB

Tahseen Tauseef 15 febrero 2024
  1. el comando getLog en MongoDB
  2. Niveles de verbosidad para el registro de consultas en MongoDB
  3. Registrar operaciones lentas en MongoDB
  4. Filtrar los resultados de las consultas de registro dentro de mongosh
  5. Filtrar los resultados de las consultas de registro fuera de mongosh con jq
Registrar todas las consultas en MongoDB

En este artículo, aprenderá a registrar consultas en MongoDB. Además, se explican en detalle los operadores utilizados para registrar consultas en MongoDB.

el comando getLog en MongoDB

El comando de administrador getLog recupera las 1024 ocurrencias mongod registradas más recientes. El comando getLog no recupera datos de registro del archivo de registro mongod; en cambio, obtiene información de un caché de RAM de los eventos mongod registrados.

Utilice la función db.adminCommand() para ejecutar getLog. getLog entrega datos de registro en formato JSON extendido relajado v2.0 con escape a partir de MongoDB 4.4. Los datos de registro se entregaban anteriormente en texto sin formato.

La sintaxis del comando getLog es la siguiente:

db.adminCommand( { getLog: <value> } )

Los valores posibles para getLog son:

Valor Descripción
* Devuelve una lista de los valores disponibles para el comando getLog.
global Devuelve la salida combinada de todas las entradas de registro.
startupwarnings Devuelve las entradas de registro del registro de MongoDB que pueden incluir errores o advertencias cuando se inició el proceso actual. Este filtro podría devolver una matriz vacía si mongod se inició sin signos.

Si se proporciona *, el comando devuelve un documento que contiene los nombres de los otros valores válidos. De lo contrario, el comando produce un documento con los siguientes campos:

  1. un campo totalLinesWritten que contiene el número de eventos de registro;
  2. campo log que contiene una matriz de eventos de registro;
  3. un documento de respuesta que proporciona información sobre el estado y la marca de tiempo de db.adminCommand().

Comportamiento de truncamiento de línea del comando getLog en MongoDB

A partir de MongoDB 4.2, getLog trunca cualquier evento con más de 1024 caracteres. En versiones anteriores, se trunca después de 512 caracteres.

Comportamiento de evasión de caracteres del comando getLog en MongoDB

A partir de MongoDB 4.4, getLog entrega datos de registro en formato JSON extendido relajado v2.0 con escape, utilizando las secuencias de escape que se enumeran a continuación para transformar la salida del registro como JSON válido:

Personaje representado Secuencia de escape
Barra invertida (\) \\
Comillas (") \"
Avance de formulario (0x0C) \f
Retroceso (0x08) \b
Retorno de carro (0x0D) \r
Pestaña horizontal (0x09) \t
Nueva línea (0x0A) \n

Los caracteres de control no mencionados anteriormente se escapan con uXXXX,, donde XXXX es el punto de código hexadecimal para el punto de código Unicode. Los bytes con codificación UTF-8 incorrecta se sustituyen con el carácter de reemplazo Unicode ufffd.

Niveles de verbosidad para el registro de consultas en MongoDB

Puede cambiar el nivel de detalle del registro para aumentar o disminuir la cantidad de mensajes de registro producidos por MongoDB. La verbosidad se puede modificar para todos los componentes colectivamente o identificar componentes por separado.

Solo las entradas de registro en las categorías de gravedad Informativo y Depuración se ven afectadas por la verbosidad. Por encima de estos niveles, siempre se muestran las categorías de gravedad.

Establezca la configuración de verbosidad en un valor alto para un registro extenso durante la depuración o el desarrollo o en un número bajo para limitar las escrituras de registro en una implementación de producción validada.

Examinar el nivel de verbosidad del registro actual en MongoDB

Utilice la función db.getLogComponents() para ver los niveles de verbosidad actuales:

db.getLogComponents()

Su salida podría parecerse a la siguiente:

Consultas de registro de MongoDB - Resultado

La primera entrada, verbosidad, es el nivel de verbosidad global para todos los componentes. Los componentes nombrados posteriormente, como accessControl,, indican el nivel de detalle específico para ese componente, anulando el nivel de detalle global si se establece.

Un valor de -1 muestra que el componente heredará el nivel de verbosidad del padre si tiene uno de los niveles de verbosidad globales si no lo tiene (como con comando).

Configurar los niveles de verbosidad del registro en MongoDB

systemLog.verbosity y systemLog.component.name>.verbosity establecen el argumento logComponentVerbosity, y la función db.setLogLevel() se puede usar para cambiar la cantidad de verbosidad.

Use la configuración de verbosidad systemLog para controlar el nivel

Utilice el parámetro systemLog.verbosity para especificar el nivel de registro predeterminado para todos los componentes. Use la configuración systemLog.component.name>.verbosity para controlar el nivel de ciertos componentes.

La siguiente configuración, por ejemplo, establece systemLog.verbosity en 1, systemLog.component.query.verbosity en 2, systemLog.component.storage.verbosity en 2 y systemLog. componente.almacenamiento.diario.verbosidad a 1:

systemLog:
   verbosity: 1
   component:
      query:
         verbosity: 2
      storage:
         verbosity: 2
         journal:
            verbosity: 1

Para su instancia mongod o mongos, especifique estos ajustes en el archivo de configuración o en la línea de comando.

El nivel de verbosidad de todos los componentes no especificados explícitamente en la configuración es -1. Indica que toman el nivel de verbosidad de su padre si tienen uno de los niveles de verbosidad globales.

Modificar el parámetro logComponentVerbosity

Pase un documento que contenga la configuración de verbosidad para modificar la opción logComponentVerbosity.

El siguiente comando, por ejemplo, cambia el nivel de verbosidad predeterminado a 2, la consulta a 3, el almacenamiento a 4 y el almacenamiento.diario a 1.

db.adminCommand( {
   setParameter: 1,
   logComponentVerbosity: {
      verbosity: 2,
      query: {
         verbosity: 3
      },
      storage: {
         verbosity: 4,
         journal: {
            verbosity: 1
         }
      }
   }
} )

Puede establecer estos valores desde mongosh..

Utilice db.setLogLevel() para cambiar el nivel de registro en MongoDB

Para cambiar el nivel de registro de un solo componente, utilice la función db.setLogLevel(). Puede definir un nivel de verbosidad de 0 a 5 para un componente o especificar -1 para heredar la verbosidad del padre.

Por ejemplo, establecer systemLog.component.query.verbosity en su nivel de detalle principal (es decir, nivel de detalle predeterminado) es el siguiente:

db.setLogLevel(-1, "query")

Puede establecer este valor desde mongosh..

Registrar operaciones lentas en MongoDB

Las operaciones del cliente (como las consultas) se registran si tardan más que el umbral de operación lenta o si el nivel de detalle del registro se establece en 1 o superior.

Para las operaciones de lectura/escritura, a partir de MongoDB 4.2, las entradas del perfilador y los mensajes de registro de diagnóstico (es decir, los mensajes de registro mongod/mongos) incluyen:

  1. queryHash, una función que puede detectar búsquedas lentas con el mismo formulario de consulta;
  2. planCacheKey brinda información adicional sobre el caché del plan de consulta para consultas lentas.

Los mensajes de registro de operación lenta ahora incluyen una columna “remota” que especifica la dirección IP del cliente a partir de MongoDB 5.0.

El resultado de ejemplo proporcionado incluye información sobre una operación de agregación lenta:

{"t":{"$date":"2020-05-20T20:10:08.731+00:00"},"s":"I",  "c":"COMMAND",  "id":51803,   "ctx":"conn281","msg":"Slow query","attr":{"type":"command","ns":"stocks.trades","appName":"MongoDB Shell","command":{"aggregate":"trades","pipeline":[{"$project":{"ticker":1.0,"price":2.0,"priceGTE110":{"$gte":["$price",111.0]},"_id":0.0}},{"$sort":{"price":-1.0}}],"allowDiskUse":true,"cursor":{},"lsid":{"id":{"$uuid":"fa658f9e-9cd6-42d4-b1c8-c9160fabf2a2"}},"$clusterTime":{"clusterTime":{"$timestamp":{"t":1590005405,"i":1}},"signature":{"hash":{"$binary":{"base64":"AAAAAAAAAAAAAAAAAAAAAAAAAAA=","subType":"0"}},"keyId":0}},"$db":"test"},"planSummary":"COLLSCAN","cursorid":1912190691485054730,"keysExamined":0,"docsExamined":1000001,"hasSortStage":true,"usedDisk":true,"numYields":1002,"nreturned":101,"reslen":17738,"locks":{"ReplicationStateTransition":{"acquireCount":{"w":1119}},"Global":{"acquireCount":{"r":1119}},"Database":{"acquireCount":{"r":1119}},"Collection":{"acquireCount":{"r":1119}},"Mutex":{"acquireCount":{"r":117}}},"storage":{"data":{"bytesRead":232899899,"timeReadingMicros":186017},"timeWaitingMicros":{"cache":849}},"remote": "192.168.14.15:37666","protocol":"op_msg","durationMillis":22427}}

Obtener tiempo de espera para fragmentos en el campo remoteOpWaitMillis

Puede obtener el tiempo de espera (en milisegundos) para los resultados de fragmentos utilizando el campo de registro remoteOpWaitMillis a partir de MongoDB 5.0.

Solo se informan los siguientes valores para remoteOpWaitMillis:

  1. Si las operaciones son lentas, el registro está habilitado.
  2. Sobre el fragmento, o mongos,, que combina los resultados

Compare las columnas de tiempo durationMillis y remoteOpWaitMillis en el registro para ver si una operación de fusión o un problema de fragmento está causando la consulta lenta. durationMillis es la cantidad total de tiempo que tardó en finalizar la consulta.

Específicamente,

  1. Si durationMillis supera a remoteOpWaitMillis, la mayor parte del tiempo se pasó esperando una respuesta del fragmento. Por ejemplo, durationMillis de 18 y remoteOpWaitMillis de 15 son valores aceptables.
  2. Si durationMillis es significativamente mayor que remoteOpWaitMillis, la mayor parte del tiempo se dedicó a la fusión. Por ejemplo, durationMillis de 150 y remoteOpWaitMillis de 15.

Filtrar los resultados de las consultas de registro dentro de mongosh

La salida de getLog se puede filtrar para que los resultados sean más fáciles de leer o para que coincidan con criterios específicos.

El siguiente comando imprime solo el campo log (que contiene una matriz de todos los eventos de registro actuales) mientras elimina el carácter que se escapa de cada mensaje de registro:

db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})

En esta operación, la salida de getLog se presenta en el mismo formato que el archivo de registro de MongoDB.

PRECAUCIÓN: getLog solo muestra los últimos 1024 eventos mongod registrados y no pretende reemplazar el archivo de registro de MongoDB.

Filtrar los resultados de las consultas de registro fuera de mongosh con jq

El programa de línea de comandos jq de terceros es útil cuando se trata del registro estructurado de MongoDB. Permite una impresión rápida y bonita de las entradas de registro y una coincidencia y un filtrado robustos basados en claves.

jq es un analizador JSON gratuito y de código abierto para Linux, Windows y macOS.

Debe usar la opción -eval para mongosh para utilizar jq con la salida getLog. La siguiente acción emplea jq para filtrar el componente REPL para que solo se muestren los mensajes de registro relacionados con la replicación:

mongosh --quiet --eval "db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})" | jq -c '. | select(.c=="REPL")'

Tenga cuidado de darle a mongosh cualquier argumento específico de conexión que requiera, como -host o -port..

mongosh --quiet --eval "db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})" | jq -r ".msg" | sort | uniq -c | sort -rn | head -10

Recuperar filtros de registro disponibles

La siguiente operación, ejecutada desde mongosh, devuelve los filtros de registro disponibles para pasar a getLog:

db.adminCommand( { getLog: "" } )

La operación devuelve el siguiente documento:

{ "names" : [ "global", "startupWarnings" ], "ok" : 1 }

Recuperar eventos recientes del registro

El siguiente comando, ejecutado desde mongosh, obtiene los eventos globales más recientes de mongod:

db.adminCommand( { getLog : "global" } )

La operación produce un documento que se ve así:

Consultas de registro de MongoDB - Resultado 1

Artículo relacionado - MongoDB Query