MongoDB registra tutte le query

La domanda è tanto semplice quanto semplice … Come si registrano tutte le query in un file di log in grado di “coda” in mongodb?

Ho provato:

  • impostazione del livello di profilazione
  • impostazione del parametro ms lento che inizia
  • mongod con l’opzione -vv

/Var/log/mongodb/mongodb.log continua a mostrare solo il numero corrente di connessioni attive …

È ansible registrare tutte le query:

$ mongo MongoDB shell version: 2.4.9 connecting to: test > use myDb switched to db myDb > db.getProfilingLevel() 0 > db.setProfilingLevel(2) { "was" : 0, "slowms" : 1, "ok" : 1 } > db.getProfilingLevel() 2 > db.system.profile.find().pretty() 

Fonte: http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/

db.setProfilingLevel(2) significa “registra tutte le operazioni”.

Ho finito per risolvere questo iniziando mongod come questo (martellato e brutto, sì … ma funziona per l’ambiente di sviluppo):

 mongod --profile=1 --slowms=1 & 

Ciò consente la profilatura e imposta la soglia per le “query lente” come 1ms, causando il log delle query come “query lente” al file:

 /var/log/mongodb/mongodb.log 

Ora ottengo uscite log continue usando il comando:

 tail -f /var/log/mongodb/mongodb.log 

Un log di esempio:

 Mon Mar 4 15:02:55 [conn1] query dendro.quads query: { graph: "u:http://example.org/people" } ntoreturn:0 ntoskip:0 nscanned:6 keyUpdates:0 locks(micros) r:73163 nreturned:6 reslen:9884 88ms 

Perché la sua prima risposta su Google …
Per la versione 3

 $ mongo MongoDB shell version: 3.0.2 connecting to: test > use myDb switched to db > db.setLogLevel(1) 

http://docs.mongodb.org/manual/reference/method/db.setLogLevel/

Ho creato uno strumento da riga di comando per triggersre l’attività del profiler e vedere i log in modo “tail” in grado : “mongotail” .

Ma la caratteristica più interessante (anche come tail ) è vedere i cambiamenti in “tempo reale” con l’opzione -f , e occasionalmente filtrare il risultato con grep per trovare un’operazione particolare.

Vedere la documentazione e le istruzioni di installazione in: https://github.com/mrsarm/mongotail

MongoDB ha una funzione sofisticata di profilazione. La registrazione avviene nella raccolta system.profile . I registri possono essere visti da:

 db.system.profile.find() 

Ci sono 3 livelli di registrazione ( fonte ):

  • Livello 0 : il profiler è distriggersto, non raccoglie alcun dato. mongod scrive sempre le operazioni più lunghe della soglia slowOpThresholdMs nel suo log. Questo è il livello predefinito del profiler.
  • Livello 1 : raccoglie i dati di profilo solo per operazioni lente. Di default le operazioni lente sono quelle più lente di 100 millisecondi. È ansible modificare la soglia per le operazioni “lente” con l’opzione di runtime slowOpThresholdMs o il comando setParameter. Vedere la sezione Specificare la soglia per operazioni lente per ulteriori informazioni.
  • Livello 2 : raccoglie i dati di profilazione per tutte le operazioni del database.

Per vedere in che livello di profiling viene eseguito il database, utilizzare

 db.getProfilingLevel() 

e per vedere lo stato

 db.getProfilingStatus() 

Per modificare lo stato del profilo, utilizzare il comando

 db.setProfilingLevel(level, milliseconds) 

Dove level riferisce al livello di profilazione e milliseconds è il ms di quale durata le query devono essere registrate. Per distriggersre la registrazione, utilizzare

 db.setProfilingLevel(0) 

La query per cercare nella raccolta del profilo di sistema per tutte le query che hanno richiesto più di un secondo, ordinata per data e ora decrescente sarà

 db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } ) 

I dati del profiler vengono scritti in una raccolta nel DB, non nel file. Vedi http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

Consiglierei di utilizzare il servizio MMS di 10gen e di fornire i dati di sviluppo del profilatore lì, dove puoi filtrarlo e ordinarlo nell’interfaccia utente.

Una volta impostato il livello di profilo, utilizzare db.setProfilingLevel(2) .

Il comando sottostante stamperà l’ultima query eseguita.
Puoi anche modificare il limite (5) per vedere meno / più query.
$ nin: filtrerà il profilo e indicizzerà le query
Inoltre, utilizza la query projection {‘query’: 1} solo per visualizzare il campo di query

 db.system.profile.find( { ns: { $nin : ['meteor.system.profile','meteor.system.indexes'] } } ).limit(5).sort( { ts : -1 } ).pretty() 

Registra con la sola proiezione di query

 db.system.profile.find( { ns: { $nin : ['meteor.system.profile','meteor.system.indexes'] } }, {'query':1} ).limit(5).sort( { ts : -1 } ).pretty() 

Penso che mentre non è elegante, l’ oplog potrebbe essere parzialmente utilizzato per questo scopo: registra tutte le scritture – ma non le letture …

Devi abilitare replicatoon, se ho ragione. Le informazioni provengono da questa risposta da questa domanda: come ascoltare le modifiche a una raccolta MongoDB?

Impostare profilinglevel su 2 è un’altra opzione per registrare tutte le query.

Raccomando di controllare mongosniff. Questo strumento può fare tutto quello che vuoi e altro ancora. Soprattutto può aiutare a diagnosticare problemi con sistemi mongo su larga scala e come le query vengono indirizzate e da dove provengono, poiché funziona ascoltando l’interfaccia di rete per tutte le comunicazioni relative a mongo.

http://docs.mongodb.org/v2.2/reference/mongosniff/

Ho scritto uno script che stamperà il log di sistema.profile in tempo reale con l’arrivo delle query. Devi prima abilitare la registrazione come indicato in altre risposte. Avevo bisogno di questo perché sto usando Windows Subsystem per Linux, per il quale tail non funziona ancora.

https://github.com/dtruel/mongo-live-logger