youtubebeat/vendor/github.com/elastic/beats/metricbeat/tests/system/test_redis.py

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']