198 lines
7.0 KiB
Python
198 lines
7.0 KiB
Python
![]() |
import unittest
|
||
|
import logging
|
||
|
import subprocess
|
||
|
from tempfile import mkdtemp
|
||
|
import time
|
||
|
import socket
|
||
|
|
||
|
import pymongo
|
||
|
|
||
|
from tests.common import load_check
|
||
|
|
||
|
PORT1 = 37017
|
||
|
PORT2 = 37018
|
||
|
MAX_WAIT = 150
|
||
|
|
||
|
class TestMongo(unittest.TestCase):
|
||
|
def wait4mongo(self, process, port):
|
||
|
# Somehow process.communicate() hangs
|
||
|
out = process.stdout
|
||
|
loop = 0
|
||
|
while True:
|
||
|
l = out.readline()
|
||
|
if l.find("[initandlisten] waiting for connections on port") > -1:
|
||
|
break
|
||
|
else:
|
||
|
time.sleep(0.1)
|
||
|
loop += 1
|
||
|
if loop >= MAX_WAIT:
|
||
|
break
|
||
|
|
||
|
def setUp(self):
|
||
|
self.agentConfig = {
|
||
|
'version': '0.1',
|
||
|
'api_key': 'toto'
|
||
|
}
|
||
|
|
||
|
# Initialize the check from checks.d
|
||
|
self.check = load_check('mongo', {'init_config': {}, 'instances': {}}, self.agentConfig)
|
||
|
|
||
|
# Start 2 instances of Mongo in a replica set
|
||
|
dir1 = mkdtemp()
|
||
|
dir2 = mkdtemp()
|
||
|
try:
|
||
|
self.p1 = subprocess.Popen(["mongod", "--dbpath", dir1, "--port", str(PORT1), "--replSet", "testset/%s:%d" % (socket.gethostname(), PORT2), "--rest"],
|
||
|
executable="mongod",
|
||
|
stdout=subprocess.PIPE,
|
||
|
stderr=subprocess.PIPE)
|
||
|
# Sleep until mongo comes online
|
||
|
self.wait4mongo(self.p1, PORT1)
|
||
|
if self.p1:
|
||
|
# Set up replication
|
||
|
c1 = pymongo.Connection('localhost:%s' % PORT1, slave_okay=True)
|
||
|
self.p2 = subprocess.Popen(["mongod", "--dbpath", dir2, "--port", str(PORT2), "--replSet", "testset/%s:%d" % (socket.gethostname(), PORT1), "--rest"],
|
||
|
executable="mongod",
|
||
|
stdout=subprocess.PIPE,
|
||
|
stderr=subprocess.PIPE)
|
||
|
self.wait4mongo(self.p2, PORT2)
|
||
|
# Waiting before all members are online
|
||
|
time.sleep(15)
|
||
|
c1.admin.command("replSetInitiate")
|
||
|
# Sleep for 15s until replication is stable
|
||
|
time.sleep(30)
|
||
|
x = c1.admin.command("replSetGetStatus")
|
||
|
assert pymongo.Connection('localhost:%s' % PORT2)
|
||
|
except Exception:
|
||
|
logging.getLogger().exception("Cannot instantiate mongod properly")
|
||
|
|
||
|
def tearDown(self):
|
||
|
try:
|
||
|
if "p1" in dir(self): self.p1.terminate()
|
||
|
if "p2" in dir(self): self.p2.terminate()
|
||
|
except Exception:
|
||
|
logging.getLogger().exception("Cannot terminate mongod instances")
|
||
|
|
||
|
def testMongoCheck(self):
|
||
|
self.config = {
|
||
|
'instances': [{
|
||
|
'server': "mongodb://localhost:%s/test" % PORT1
|
||
|
},
|
||
|
{
|
||
|
'server': "mongodb://localhost:%s/test" % PORT2
|
||
|
}]
|
||
|
}
|
||
|
|
||
|
# Test mongodb with checks.d
|
||
|
self.check = load_check('mongo', self.config, self.agentConfig)
|
||
|
|
||
|
# Run the check against our running server
|
||
|
self.check.check(self.config['instances'][0])
|
||
|
# Sleep for 1 second so the rate interval >=1
|
||
|
time.sleep(1)
|
||
|
# Run the check again so we get the rates
|
||
|
self.check.check(self.config['instances'][0])
|
||
|
|
||
|
# Metric assertions
|
||
|
metrics = self.check.get_metrics()
|
||
|
assert metrics
|
||
|
self.assertTrue(type(metrics) == type([]))
|
||
|
self.assertTrue(len(metrics) > 0)
|
||
|
|
||
|
metric_val_checks = {
|
||
|
'mongodb.connections.current': lambda x: x >= 1,
|
||
|
'mongodb.connections.available': lambda x: x >= 1,
|
||
|
'mongodb.uptime': lambda x: x >= 0,
|
||
|
'mongodb.mem.resident': lambda x: x > 0,
|
||
|
'mongodb.mem.virtual': lambda x: x > 0
|
||
|
}
|
||
|
|
||
|
for m in metrics:
|
||
|
metric_name = m[0]
|
||
|
if metric_name in metric_val_checks:
|
||
|
self.assertTrue( metric_val_checks[metric_name]( m[2] ) )
|
||
|
|
||
|
# Run the check against our running server
|
||
|
self.check.check(self.config['instances'][1])
|
||
|
# Sleep for 1 second so the rate interval >=1
|
||
|
time.sleep(1)
|
||
|
# Run the check again so we get the rates
|
||
|
self.check.check(self.config['instances'][1])
|
||
|
|
||
|
# Metric assertions
|
||
|
metrics = self.check.get_metrics()
|
||
|
assert metrics
|
||
|
self.assertTrue(type(metrics) == type([]))
|
||
|
self.assertTrue(len(metrics) > 0)
|
||
|
|
||
|
for m in metrics:
|
||
|
metric_name = m[0]
|
||
|
if metric_name in metric_val_checks:
|
||
|
self.assertTrue( metric_val_checks[metric_name]( m[2] ) )
|
||
|
|
||
|
def testMongoOldConfig(self):
|
||
|
self.agentConfig1 = {
|
||
|
'mongodb_server': "mongodb://localhost:%s/test" % PORT1,
|
||
|
'version': '0.1',
|
||
|
'api_key': 'toto'
|
||
|
}
|
||
|
conf1 = self.check.parse_agent_config(self.agentConfig1)
|
||
|
self.agentConfig2 = {
|
||
|
'mongodb_server': "mongodb://localhost:%s/test" % PORT2,
|
||
|
'version': '0.1',
|
||
|
'api_key': 'toto'
|
||
|
}
|
||
|
conf2 = self.check.parse_agent_config(self.agentConfig2)
|
||
|
|
||
|
# Test the first mongodb instance
|
||
|
self.check = load_check('mongo', conf1, self.agentConfig1)
|
||
|
|
||
|
# Run the check against our running server
|
||
|
self.check.check(conf1['instances'][0])
|
||
|
# Sleep for 1 second so the rate interval >=1
|
||
|
time.sleep(1)
|
||
|
# Run the check again so we get the rates
|
||
|
self.check.check(conf1['instances'][0])
|
||
|
|
||
|
# Metric assertions
|
||
|
metrics = self.check.get_metrics()
|
||
|
assert metrics
|
||
|
self.assertTrue(type(metrics) == type([]))
|
||
|
self.assertTrue(len(metrics) > 0)
|
||
|
|
||
|
metric_val_checks = {
|
||
|
'mongodb.connections.current': lambda x: x >= 1,
|
||
|
'mongodb.connections.available': lambda x: x >= 1,
|
||
|
'mongodb.uptime': lambda x: x >= 0,
|
||
|
'mongodb.mem.resident': lambda x: x > 0,
|
||
|
'mongodb.mem.virtual': lambda x: x > 0
|
||
|
}
|
||
|
|
||
|
for m in metrics:
|
||
|
metric_name = m[0]
|
||
|
if metric_name in metric_val_checks:
|
||
|
self.assertTrue( metric_val_checks[metric_name]( m[2] ) )
|
||
|
|
||
|
# Test the second mongodb instance
|
||
|
self.check = load_check('mongo', conf2, self.agentConfig2)
|
||
|
|
||
|
# Run the check against our running server
|
||
|
self.check.check(conf2['instances'][0])
|
||
|
# Sleep for 1 second so the rate interval >=1
|
||
|
time.sleep(1)
|
||
|
# Run the check again so we get the rates
|
||
|
self.check.check(conf2['instances'][0])
|
||
|
|
||
|
# Metric assertions
|
||
|
metrics = self.check.get_metrics()
|
||
|
assert metrics
|
||
|
self.assertTrue(type(metrics) == type([]))
|
||
|
self.assertTrue(len(metrics) > 0)
|
||
|
|
||
|
for m in metrics:
|
||
|
metric_name = m[0]
|
||
|
if metric_name in metric_val_checks:
|
||
|
self.assertTrue( metric_val_checks[metric_name]( m[2] ) )
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|