133 lines
4.3 KiB
Python
133 lines
4.3 KiB
Python
import os
|
|
import metricbeat
|
|
import redis
|
|
import unittest
|
|
from nose.plugins.attrib import attr
|
|
|
|
REDIS_FIELDS = metricbeat.COMMON_FIELDS + ["redis"]
|
|
|
|
REDIS_INFO_FIELDS = ["clients", "cluster", "cpu", "memory",
|
|
"persistence", "replication", "server", "stats", "slowlog"]
|
|
|
|
REDIS_KEYSPACE_FIELDS = ["keys", "expires", "id", "avg_ttl"]
|
|
|
|
CPU_FIELDS = ["used.sys", "used.sys_children", "used.user",
|
|
"used.user_children"]
|
|
|
|
CLIENTS_FIELDS = ["blocked", "biggest_input_buf",
|
|
"longest_output_list", "connected",
|
|
"max_input_buffer", "max_output_buffer"]
|
|
|
|
|
|
class Test(metricbeat.BaseTest):
|
|
|
|
COMPOSE_SERVICES = ['redis']
|
|
|
|
@unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test")
|
|
@attr('integration')
|
|
def test_info(self):
|
|
"""
|
|
Test redis info metricset
|
|
"""
|
|
self.render_config_template(modules=[{
|
|
"name": "redis",
|
|
"metricsets": ["info"],
|
|
"hosts": self.get_hosts(),
|
|
"period": "5s"
|
|
}])
|
|
proc = self.start_beat()
|
|
self.wait_until(lambda: self.output_lines() > 0)
|
|
proc.check_kill_and_wait()
|
|
self.assert_no_logged_warnings()
|
|
|
|
output = self.read_output_json()
|
|
self.assertEqual(len(output), 1)
|
|
evt = output[0]
|
|
|
|
self.assertItemsEqual(self.de_dot(REDIS_FIELDS), evt.keys())
|
|
redis_info = evt["redis"]["info"]
|
|
self.assertItemsEqual(self.de_dot(REDIS_INFO_FIELDS), redis_info.keys())
|
|
self.assertItemsEqual(self.de_dot(CLIENTS_FIELDS), redis_info["clients"].keys())
|
|
self.assertItemsEqual(self.de_dot(CPU_FIELDS), redis_info["cpu"].keys())
|
|
self.assert_fields_are_documented(evt)
|
|
|
|
@unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test")
|
|
@attr('integration')
|
|
def test_keyspace(self):
|
|
"""
|
|
Test redis keyspace metricset
|
|
"""
|
|
|
|
# At least one event must be inserted so db stats exist
|
|
r = redis.StrictRedis(
|
|
host=self.compose_hosts()[0],
|
|
port=os.getenv('REDIS_PORT', '6379'),
|
|
db=0)
|
|
r.set('foo', 'bar')
|
|
|
|
self.render_config_template(modules=[{
|
|
"name": "redis",
|
|
"metricsets": ["keyspace"],
|
|
"hosts": self.get_hosts(),
|
|
"period": "5s"
|
|
}])
|
|
proc = self.start_beat()
|
|
self.wait_until(lambda: self.output_lines() > 0)
|
|
proc.check_kill_and_wait()
|
|
self.assert_no_logged_warnings()
|
|
|
|
output = self.read_output_json()
|
|
self.assertEqual(len(output), 1)
|
|
evt = output[0]
|
|
|
|
self.assertItemsEqual(self.de_dot(REDIS_FIELDS), evt.keys())
|
|
redis_info = evt["redis"]["keyspace"]
|
|
self.assertItemsEqual(self.de_dot(REDIS_KEYSPACE_FIELDS), redis_info.keys())
|
|
self.assert_fields_are_documented(evt)
|
|
|
|
@unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test")
|
|
@attr('integration')
|
|
def test_module_processors(self):
|
|
"""
|
|
Test local processors for Redis info event.
|
|
"""
|
|
fields = ["clients", "cpu"]
|
|
eventFields = ['beat', 'metricset']
|
|
eventFields += ['redis.info.' + f for f in fields]
|
|
self.render_config_template(modules=[{
|
|
"name": "redis",
|
|
"metricsets": ["info"],
|
|
"hosts": self.get_hosts(),
|
|
"period": "5s",
|
|
"processors": [{
|
|
"include_fields": eventFields,
|
|
}],
|
|
}])
|
|
proc = self.start_beat()
|
|
self.wait_until(lambda: self.output_lines() > 0)
|
|
proc.check_kill_and_wait()
|
|
self.assert_no_logged_warnings()
|
|
|
|
output = self.read_output_json()
|
|
self.assertEqual(len(output), 1)
|
|
evt = output[0]
|
|
|
|
self.assertItemsEqual(self.de_dot(REDIS_FIELDS), evt.keys())
|
|
redis_info = evt["redis"]["info"]
|
|
print(redis_info)
|
|
self.assertItemsEqual(fields, redis_info.keys())
|
|
self.assertItemsEqual(self.de_dot(CLIENTS_FIELDS), redis_info["clients"].keys())
|
|
self.assertItemsEqual(self.de_dot(CPU_FIELDS), redis_info["cpu"].keys())
|
|
|
|
def get_hosts(self):
|
|
return [self.compose_hosts()[0] + ':' +
|
|
os.getenv('REDIS_PORT', '6379')]
|
|
|
|
|
|
class TestRedis4(Test):
|
|
COMPOSE_SERVICES = ['redis_4']
|
|
|
|
|
|
class TestRedis5(Test):
|
|
COMPOSE_SERVICES = ['redis_5']
|