Skip to content

Commit

Permalink
Added command-line options to allow running the scripts against datab…
Browse files Browse the repository at this point in the history
…ases on remote hosts.

Additionally, the output from psutils is only displayed if the scripts
are run on localhost. Otherwise it doesn't make much sense.
  • Loading branch information
nheudecker authored and jwilder committed Oct 1, 2012
1 parent 8aa3aae commit 5d3ca66
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 22 deletions.
55 changes: 46 additions & 9 deletions mongodbtools/collection_stats.py
Expand Up @@ -9,8 +9,7 @@
import psutil
from pymongo import Connection
from pymongo import ReadPreference

connection = Connection(read_preference=ReadPreference.SECONDARY)
from optparse import OptionParser

def compute_signature(index):
signature = index["ns"]
Expand All @@ -22,6 +21,33 @@ def get_collection_stats(database, collection):
print "Checking DB: %s" % collection.full_name
return database.command("collstats", collection.name)

def get_cli_options():
parser = OptionParser(usage="usage: python %prog [options]",
description="""This script prints some basic collection stats about the size of the collections and their indexes.""")

parser.add_option("-H", "--host",
dest="host",
default="localhost",
metavar="HOST",
help="MongoDB host")
parser.add_option("-p", "--port",
dest="port",
default=27017,
metavar="PORT",
help="MongoDB port")
parser.add_option("-d", "--database",
dest="database",
default="",
metavar="DATABASE",
help="Target database to generate statistics. All if omitted.")

(options, args) = parser.parse_args()

return options

def get_connection(host, port):
return Connection(host, port, read_preference=ReadPreference.SECONDARY)

# From http://www.5dollarwhitebox.org/drupal/node/84
def convert_bytes(bytes):
bytes = float(bytes)
Expand All @@ -41,16 +67,24 @@ def convert_bytes(bytes):
size = '%.2fb' % bytes
return size

def main():
def main(options):
summary_stats = {
"count" : 0,
"size" : 0,
"indexSize" : 0
}
all_stats = []

connection = get_connection(options.host, options.port)

all_db_stats = {}
for db in connection.database_names():

if options.database:
databases.append(options.database)
else:
databases = connection.database_names()

for db in databases:
# FIXME: Add an option to include oplog stats.
if db == "local":
continue
Expand Down Expand Up @@ -94,10 +128,13 @@ def main():
print "Total Data Size:", convert_bytes(summary_stats["size"])
print "Total Index Size:", convert_bytes(summary_stats["indexSize"])

ram_headroom = psutil.phymem_usage()[0] - summary_stats["indexSize"]
print "RAM Headroom:", convert_bytes(ram_headroom)
print "RAM Used: %s (%s%%)" % (convert_bytes(psutil.phymem_usage()[1]), psutil.phymem_usage()[3])
print "Available RAM Headroom:", convert_bytes((100 - psutil.phymem_usage()[3]) / 100 * ram_headroom)
# this is only meaningful if we're running the script on localhost
if options.host == "localhost":
ram_headroom = psutil.phymem_usage()[0] - summary_stats["indexSize"]
print "RAM Headroom:", convert_bytes(ram_headroom)
print "RAM Used: %s (%s%%)" % (convert_bytes(psutil.phymem_usage()[1]), psutil.phymem_usage()[3])
print "Available RAM Headroom:", convert_bytes((100 - psutil.phymem_usage()[3]) / 100 * ram_headroom)

if __name__ == "__main__":
main()
options = get_cli_options()
main(options)
56 changes: 48 additions & 8 deletions mongodbtools/index_stats.py
Expand Up @@ -9,8 +9,7 @@
import psutil
from pymongo import Connection
from pymongo import ReadPreference

connection = Connection(read_preference=ReadPreference.SECONDARY)
from optparse import OptionParser

def compute_signature(index):
signature = index["ns"]
Expand Down Expand Up @@ -41,16 +40,53 @@ def convert_bytes(bytes):
size = '%.2fb' % bytes
return size

def main():
def get_cli_options():
parser = OptionParser(usage="usage: python %prog [options]",
description="""This script prints some basic collection stats about the size of the collections and their indexes.""")

parser.add_option("-H", "--host",
dest="host",
default="localhost",
metavar="HOST",
help="MongoDB host")
parser.add_option("-p", "--port",
dest="port",
default=27017,
metavar="PORT",
help="MongoDB port")
parser.add_option("-d", "--database",
dest="database",
default="",
metavar="DATABASE",
help="Target database to generate statistics. All if omitted.")

(options, args) = parser.parse_args()

return options

def get_connection(host, port):
return Connection(host, port, read_preference=ReadPreference.SECONDARY)

def main(options):
summary_stats = {
"count" : 0,
"size" : 0,
"indexSize" : 0
}
all_stats = []

connection = get_connection(options.host, options.port)

all_db_stats = {}
for db in connection.database_names():

databases = []

if options.database:
databases.append(options.database)
else:
databases = connection.database_names()

for db in databases:
# FIXME: Add an option to include oplog stats.
if db == "local":
continue
Expand Down Expand Up @@ -112,9 +148,13 @@ def main():
print "Total Data Size:", convert_bytes(summary_stats["size"])
print "Total Index Size:", convert_bytes(summary_stats["indexSize"])

ram_headroom = psutil.phymem_usage()[0] - summary_stats["indexSize"]
print "RAM Headroom:", convert_bytes(ram_headroom)
print "Available RAM Headroom:", convert_bytes((100 - psutil.phymem_usage()[3]) / 100 * ram_headroom)
# this is only meaningful if we're running the script on localhost
if options.host == "localhost":
ram_headroom = psutil.phymem_usage()[0] - summary_stats["indexSize"]
print "RAM Headroom:", convert_bytes(ram_headroom)
print "RAM Used: %s (%s%%)" % (convert_bytes(psutil.phymem_usage()[1]), psutil.phymem_usage()[3])
print "Available RAM Headroom:", convert_bytes((100 - psutil.phymem_usage()[3]) / 100 * ram_headroom)

if __name__ == "__main__":
main()
options = get_cli_options()
main(options)
46 changes: 41 additions & 5 deletions mongodbtools/redundant_indexes.py
Expand Up @@ -7,9 +7,39 @@
indexes the necessary fields.
"""
from pymongo import Connection
from pymongo import ReadPreference
from optparse import OptionParser

def main():
connection = Connection()

def get_cli_options():
parser = OptionParser(usage="usage: python %prog [options]",
description="""This script prints some basic collection stats about the size of the collections and their indexes.""")

parser.add_option("-H", "--host",
dest="host",
default="localhost",
metavar="HOST",
help="MongoDB host")
parser.add_option("-p", "--port",
dest="port",
default=27017,
metavar="PORT",
help="MongoDB port")
parser.add_option("-d", "--database",
dest="database",
default="",
metavar="DATABASE",
help="Target database to generate statistics. All if omitted.")

(options, args) = parser.parse_args()

return options

def get_connection(host, port):
return Connection(host, port, read_preference=ReadPreference.SECONDARY)

def main(options):
connection = get_connection(options.host, options.port)

def compute_signature(index):
signature = index["ns"]
Expand Down Expand Up @@ -38,9 +68,15 @@ def report_redundant_indexes(current_db):
index_map[signature]["name"],
index_map[other_sig]["ns"],
index_map[other_sig]["name"])

for db in connection.database_names():

if options.database:
databases.append(options.database)
else:
databases = connection.database_names()

for db in databases:
report_redundant_indexes(connection[db])

if __name__ == "__main__":
main()
options = get_cli_options()
main(options)

0 comments on commit 5d3ca66

Please sign in to comment.