Use Mongosniff to Clarify what your MongoDB is Hearing and Saying
Join the DZone community and get the full member experience.
Join For FreeIt comes with the binary distribution, so if you have mongod you should have mongosniff.
To try it out, first start up an instance of mongod normally:
$ ./mongod
When you start up mongosniff you have to tell it to listen on the loopback (localhost) interface. This interface is usually called “lo”, but my Mac calls it “lo0″, so run ifconfig to make sure you have the name right. Now run:
$ sudo ./mongosniff --source NET lo sniffing... 27017
Note the “sudo”: this has never worked for me from my user account, probably because of some stupid network permissions thing.
Now start up the mongo shell and try inserting something:
> db.foo.insert({x:1})
If you look at mongosniff‘s output, you’ll see:
127.0.0.1:57856 -->> 127.0.0.1:27017 test.foo 62 bytes id:430131ca 1124151754 insert: { _id: ObjectId('4c7fb007b5d697849addc650'), x: 1.0 } 127.0.0.1:57856 -->> 127.0.0.1:27017 test.$cmd 76 bytes id:430131cb 1124151755 query: { getlasterror: 1.0, w: 1.0 } ntoreturn: -1 ntoskip: 0 127.0.0.1:27017 <<-- 127.0.0.1:57856 76 bytes id:474447bf 1195657151 - 1124151755 reply n:1 cursorId: 0 { err: null, n: 0, wtime: 0, ok: 1.0 }
There are three requests here, all for one measly insert. Dissecting the first request, we can learn:
- source -->> destination
- Our client, mongo in this case, is running on port 57856 and has sent a message to the database (127.0.0.1:27017).
- db.collection
- This request is for the “test” database’s “foo” collection.
- length bytes
- The length of the request is 62 bytes. This can be handy to know if your requests are edging towards the maximum request length (16 MB).
- id:hex-id id
- This is the request id in hexadecimal and decimal (in case you don’t have a computer handy, apparently). Every request to and from the database has a unique id associated with it for tax purposes.
- op: content
- This is the actual meat of the request: we’re inserting this document. Notice that it’s inserting the float value 1.0, even though we typed 1 in the shell. This is because JavaScript only has one number type, so every number typed in the shell is converted to a double.
The next request in the mongosniff output is a database command: it checks to make sure the insert succeeded (the shell always does safe inserts).
The last message sniffed is a little different: it is going from the database to the shell. It is the database response to the getlasterror command. It shows that there was only one document returned (reply n:1) and that there are no more results waiting at the database (cursorId: 0). If this were a “real” query and there was another batch of results to be sent from the database, cursorId would be non-zero.
Hopefully this will help some people decipher what the hell is going on!
Published at DZone with permission of Kristina Chodorow, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments