class TestMetlogClientFilters(object): logger = 'tests' timer_name = 'test' def setUp(self): self.sender = DebugCaptureSender() self.client = MetlogClient(self.sender, self.logger) def tearDown(self): del self.sender del self.client def test_severity_max(self): from metlog.filters import severity_max_provider self.client.filters = [severity_max_provider(severity=SEVERITY.ERROR)] payload = 'foo' self.client.debug(payload) self.client.info(payload) self.client.warn(payload) self.client.error(payload) self.client.exception(payload) self.client.critical(payload) # only half of the messages should have gone out eq_(len(self.sender.msgs), 3) # make sure it's the right half for json_msg in self.sender.msgs: msg = json.loads(json_msg) ok_(msg['severity'] <= SEVERITY.ERROR) def test_type_blacklist(self): from metlog.filters import type_blacklist_provider type_blacklist = type_blacklist_provider(types=set(['foo'])) self.client.filters = [type_blacklist] choices = ['foo', 'bar'] notfoos = 0 for i in range(10): choice = random.choice(choices) if choice != 'foo': notfoos += 1 self.client.metlog(choice, payload='msg') eq_(len(self.sender.msgs), notfoos) def test_type_whitelist(self): from metlog.filters import type_whitelist_provider type_whitelist = type_whitelist_provider(types=set(['foo'])) self.client.filters = [type_whitelist] choices = ['foo', 'bar'] foos = 0 for i in range(10): choice = random.choice(choices) if choice == 'foo': foos += 1 self.client.metlog(choice, payload='msg') eq_(len(self.sender.msgs), foos) def test_type_severity_max(self): from metlog.filters import type_severity_max_provider config = {'types': {'foo': {'severity': 3}, 'bar': {'severity': 5}, }, } type_severity_max = type_severity_max_provider(**config) self.client.filters = [type_severity_max] for msgtype in ['foo', 'bar']: for sev in range(8): self.client.metlog(msgtype, severity=sev, payload='msg') eq_(len(self.sender.msgs), 10) msgs = [json.loads(msg) for msg in self.sender.msgs] foos = [msg for msg in msgs if msg['type'] == 'foo'] eq_(len(foos), 4) bars = [msg for msg in msgs if msg['type'] == 'bar'] eq_(len(bars), 6)
#!/usr/bin/env python from metlog.senders import ZmqPubSender from metlog.client import MetlogClient import time sender = ZmqPubSender('tcp://127.0.0.1:5565') client = MetlogClient(sender, 'testy') while True: time.sleep(1) client.metlog('cmd', payload='come in here watson, I need you!')
class TestMetlogClient(object): logger = 'tests' timer_name = 'test' def setUp(self): self.mock_sender = Mock() self.client = MetlogClient(self.mock_sender, self.logger) # overwrite the class-wide threadlocal w/ an instance one # so values won't persist btn tests self.timer_ob = self.client.timer(self.timer_name) self.timer_ob.__dict__['_local'] = threading.local() def tearDown(self): del self.timer_ob.__dict__['_local'] del self.mock_sender def _extract_full_msg(self): return self.mock_sender.send_message.call_args[0][0] def test_metlog_bare(self): payload = 'this is a test' before = datetime.utcnow().isoformat() msgtype = 'testtype' self.client.metlog(msgtype, payload=payload) after = datetime.utcnow().isoformat() full_msg = self._extract_full_msg() # check the payload eq_(full_msg['payload'], payload) # check the various default values ok_(before < full_msg['timestamp'] < after) eq_(full_msg['type'], msgtype) eq_(full_msg['severity'], self.client.severity) eq_(full_msg['logger'], self.logger) eq_(full_msg['metlog_pid'], os.getpid()) eq_(full_msg['metlog_hostname'], socket.gethostname()) eq_(full_msg['env_version'], self.client.env_version) def test_metlog_full(self): metlog_args = dict(payload='this is another test', timestamp=datetime.utcnow(), logger='alternate', severity=2, fields={'foo': 'bar', 'boo': 'far'}) msgtype = 'bawlp' self.client.metlog(msgtype, **metlog_args) actual_msg = self._extract_full_msg() metlog_args.update({'type': msgtype, 'env_version': self.client.env_version, 'metlog_pid': os.getpid(), 'metlog_hostname': socket.gethostname(), 'timestamp': metlog_args['timestamp'].isoformat()}) eq_(actual_msg, metlog_args) def test_oldstyle(self): payload = 'debug message' self.client.debug(payload) full_msg = self._extract_full_msg() eq_(full_msg['payload'], payload) eq_(full_msg['severity'], SEVERITY.DEBUG) def test_oldstyle_args(self): payload = '1, 2: %s\n3, 4: %s' args = ('buckle my shoe', 'shut the door') self.client.warn(payload, *args) full_msg = self._extract_full_msg() eq_(full_msg['payload'], payload % args) def test_oldstyle_mapping_arg(self): payload = '1, 2: %(onetwo)s\n3, 4: %(threefour)s' args = {'onetwo': 'buckle my shoe', 'threefour': 'shut the door'} self.client.warn(payload, args) full_msg = self._extract_full_msg() eq_(full_msg['payload'], payload % args) def test_oldstyle_exc_info(self): payload = 'traceback ahead -->' try: a = b # NOQA except NameError: self.client.error(payload, exc_info=True) full_msg = self._extract_full_msg() ok_(full_msg['payload'].startswith(payload)) ok_("NameError: global name 'b' is not defined" in full_msg['payload']) ok_('test_client.py' in full_msg['payload']) def test_oldstyle_exc_info_auto(self): payload = 'traceback ahead -->' try: a = b # NOQA except NameError: self.client.exception(payload) full_msg = self._extract_full_msg() ok_(full_msg['payload'].startswith(payload)) ok_("NameError: global name 'b' is not defined" in full_msg['payload']) ok_('test_client.py' in full_msg['payload']) def test_oldstyle_exc_info_passed(self): def name_error(): try: a = b # NOQA except NameError: return sys.exc_info() ei = name_error() payload = 'traceback ahead -->' self.client.critical(payload, exc_info=ei) full_msg = self._extract_full_msg() ok_(full_msg['payload'].startswith(payload)) ok_("NameError: global name 'b' is not defined" in full_msg['payload']) ok_('test_client.py' in full_msg['payload']) def test_timer_contextmanager(self): name = self.timer_name with self.client.timer(name) as timer: time.sleep(0.01) ok_(timer.result >= 10) full_msg = self._extract_full_msg() eq_(full_msg['payload'], str(timer.result)) eq_(full_msg['type'], 'timer') eq_(full_msg['fields']['name'], name) eq_(full_msg['fields']['rate'], 1) def test_timer_decorator(self): @self.client.timer(self.timer_name) def timed(): time.sleep(0.01) ok_(not self.mock_sender.send_message.called) timed() full_msg = self._extract_full_msg() ok_(int(full_msg['payload']) >= 10) eq_(full_msg['type'], 'timer') eq_(full_msg['fields']['name'], self.timer_name) eq_(full_msg['fields']['rate'], 1) def test_timer_with_rate(self): name = self.timer_name @self.client.timer(name, rate=0.01) def timed(): time.sleep(0.001) for i in range(10): timed() # this is a weak test, but not quite sure how else to # test explicitly random behaviour ok_(self.mock_sender.send_message.call_count < 10) def test_incr(self): name = 'incr' self.client.incr(name) full_msg = self._extract_full_msg() eq_(full_msg['type'], 'counter') eq_(full_msg['logger'], self.logger) eq_(full_msg['fields']['name'], name) # You have to have a rate set here eq_(full_msg['fields']['rate'], 1) eq_(full_msg['payload'], '1') self.client.incr(name, 10) full_msg = self._extract_full_msg() eq_(full_msg['payload'], '10')
class TestMetlogClient(object): logger = 'tests' timer_name = 'test' def setUp(self): self.mock_sender = Mock() self.client = MetlogClient(self.mock_sender, self.logger) # overwrite the class-wide threadlocal w/ an instance one # so values won't persist btn tests self.timer_ob = self.client.timer(self.timer_name) self.timer_ob.__dict__['_local'] = threading.local() def tearDown(self): del self.timer_ob.__dict__['_local'] del self.mock_sender def _extract_full_msg(self): return self.mock_sender.send_message.call_args[0][0] def test_metlog_bare(self): payload = 'this is a test' before = datetime.utcnow().isoformat() msgtype = 'testtype' self.client.metlog(msgtype, payload=payload) after = datetime.utcnow().isoformat() full_msg = self._extract_full_msg() # check the payload eq_(full_msg['payload'], payload) # check the various default values ok_(before < full_msg['timestamp'] < after) eq_(full_msg['type'], msgtype) eq_(full_msg['severity'], self.client.severity) eq_(full_msg['logger'], self.logger) eq_(full_msg['metlog_pid'], os.getpid()) eq_(full_msg['metlog_hostname'], socket.gethostname()) eq_(full_msg['env_version'], self.client.env_version) def test_metlog_full(self): metlog_args = dict(payload='this is another test', timestamp=datetime.utcnow(), logger='alternate', severity=2, fields={'foo': 'bar', 'boo': 'far'}) msgtype = 'bawlp' self.client.metlog(msgtype, **metlog_args) actual_msg = self._extract_full_msg() metlog_args.update({'type': msgtype, 'env_version': self.client.env_version, 'metlog_pid': os.getpid(), 'metlog_hostname': socket.gethostname(), 'timestamp': metlog_args['timestamp'].isoformat()}) eq_(actual_msg, metlog_args) def test_timer_contextmanager(self): name = self.timer_name with self.client.timer(name) as timer: time.sleep(0.01) ok_(timer.result >= 10) full_msg = self._extract_full_msg() eq_(full_msg['payload'], str(timer.result)) eq_(full_msg['type'], 'timer') eq_(full_msg['fields']['name'], name) eq_(full_msg['fields']['rate'], 1) def test_timer_decorator(self): @self.client.timer(self.timer_name) def timed(): time.sleep(0.01) ok_(not self.mock_sender.send_message.called) timed() full_msg = self._extract_full_msg() ok_(int(full_msg['payload']) >= 10) eq_(full_msg['type'], 'timer') eq_(full_msg['fields']['name'], self.timer_name) eq_(full_msg['fields']['rate'], 1) def test_timer_with_rate(self): name = self.timer_name @self.client.timer(name, rate=0.01) def timed(): time.sleep(0.001) for i in range(10): timed() # this is a weak test, but not quite sure how else to # test explicitly random behaviour ok_(self.mock_sender.send_message.call_count < 10) def test_incr(self): name = 'incr' self.client.incr(name) full_msg = self._extract_full_msg() eq_(full_msg['type'], 'counter') eq_(full_msg['logger'], self.logger) eq_(full_msg['fields']['name'], name) # You have to have a rate set here eq_(full_msg['fields']['rate'], 1) eq_(full_msg['payload'], '1') self.client.incr(name, 10) full_msg = self._extract_full_msg() eq_(full_msg['payload'], '10')
class TestMetlogClient(object): logger = 'tests' timer_name = 'test' def setUp(self): self.mock_sender = Mock() self.client = MetlogClient(self.mock_sender, self.logger) # overwrite the class-wide threadlocal w/ an instance one # so values won't persist btn tests self.timer_ob = self.client.timer(self.timer_name) self.timer_ob.__dict__['_local'] = threading.local() def tearDown(self): del self.timer_ob.__dict__['_local'] del self.mock_sender def _extract_full_msg(self): return self.mock_sender.send_message.call_args[0][0] def test_metlog_bare(self): payload = 'this is a test' before = datetime.utcnow().isoformat() msgtype = 'testtype' self.client.metlog(msgtype, payload=payload) after = datetime.utcnow().isoformat() full_msg = self._extract_full_msg() # check the payload eq_(full_msg['payload'], payload) # check the various default values ok_(before < full_msg['timestamp'] < after) eq_(full_msg['type'], msgtype) eq_(full_msg['severity'], self.client.severity) eq_(full_msg['logger'], self.logger) eq_(full_msg['metlog_pid'], os.getpid()) eq_(full_msg['metlog_hostname'], socket.gethostname()) eq_(full_msg['env_version'], self.client.env_version) def test_metlog_full(self): metlog_args = dict(payload='this is another test', logger='alternate', severity=2, fields={'foo': 'bar', 'boo': 'far'}) msgtype = 'bawlp' self.client.metlog(msgtype, **metlog_args) actual_msg = self._extract_full_msg() metlog_args.update({'type': msgtype, 'env_version': self.client.env_version, 'metlog_pid': os.getpid(), 'metlog_hostname': socket.gethostname(), 'timestamp': actual_msg['timestamp']}) eq_(actual_msg, metlog_args) def test_oldstyle(self): payload = 'debug message' self.client.debug(payload) full_msg = self._extract_full_msg() eq_(full_msg['payload'], payload) eq_(full_msg['severity'], SEVERITY.DEBUG) def test_oldstyle_args(self): payload = '1, 2: %s\n3, 4: %s' args = ('buckle my shoe', 'shut the door') self.client.warn(payload, *args) full_msg = self._extract_full_msg() eq_(full_msg['payload'], payload % args) def test_oldstyle_mapping_arg(self): payload = '1, 2: %(onetwo)s\n3, 4: %(threefour)s' args = {'onetwo': 'buckle my shoe', 'threefour': 'shut the door'} self.client.warn(payload, args) full_msg = self._extract_full_msg() eq_(full_msg['payload'], payload % args) def test_oldstyle_exc_info(self): payload = 'traceback ahead -->' try: a = b # NOQA except NameError: self.client.error(payload, exc_info=True) full_msg = self._extract_full_msg() ok_(full_msg['payload'].startswith(payload)) ok_("NameError: global name 'b' is not defined" in full_msg['payload']) ok_('test_client.py' in full_msg['payload']) def test_oldstyle_exc_info_auto(self): payload = 'traceback ahead -->' try: a = b # NOQA except NameError: self.client.exception(payload) full_msg = self._extract_full_msg() ok_(full_msg['payload'].startswith(payload)) ok_("NameError: global name 'b' is not defined" in full_msg['payload']) ok_('test_client.py' in full_msg['payload']) def test_oldstyle_exc_info_passed(self): def name_error(): try: a = b # NOQA except NameError: return sys.exc_info() ei = name_error() payload = 'traceback ahead -->' self.client.critical(payload, exc_info=ei) full_msg = self._extract_full_msg() ok_(full_msg['payload'].startswith(payload)) ok_("NameError: global name 'b' is not defined" in full_msg['payload']) ok_('test_client.py' in full_msg['payload']) def test_timer_contextmanager(self): name = self.timer_name with self.client.timer(name) as timer: time.sleep(0.01) ok_(timer.result >= 10) full_msg = self._extract_full_msg() eq_(full_msg['payload'], str(timer.result)) eq_(full_msg['type'], 'timer') eq_(full_msg['fields']['name'], name) eq_(full_msg['fields']['rate'], 1) def test_timer_decorator(self): @self.client.timer(self.timer_name) def timed(): time.sleep(0.01) ok_(not self.mock_sender.send_message.called) timed() full_msg = self._extract_full_msg() ok_(int(full_msg['payload']) >= 10) eq_(full_msg['type'], 'timer') eq_(full_msg['fields']['name'], self.timer_name) eq_(full_msg['fields']['rate'], 1) def test_timer_with_rate(self): name = self.timer_name @self.client.timer(name, rate=0.01) def timed(): time.sleep(0.001) # leverage chance by using a large sample # instead of just 10 samples for i in range(1000): timed() # this is a weak test, but not quite sure how else to # test explicitly random behaviour ok_(self.mock_sender.send_message.call_count < 100) def test_incr(self): name = 'incr' self.client.incr(name) full_msg = self._extract_full_msg() eq_(full_msg['type'], 'counter') eq_(full_msg['logger'], self.logger) eq_(full_msg['fields']['name'], name) # You have to have a rate set here eq_(full_msg['fields']['rate'], 1) eq_(full_msg['payload'], '1') self.client.incr(name, 10) full_msg = self._extract_full_msg() eq_(full_msg['payload'], '10')
from metlog.client import MetlogClient from metlog.senders import ZmqPubSender from metlog.backchannel import ZmqBackchannel import time import os SUB_BIND, PUB_BIND = "ipc:///tmp/feeds/1", "ipc:///tmp/feeds/2" bc = ZmqBackchannel(SUB_BIND, PUB_BIND) sender = ZmqPubSender("ipc:///tmp/feeds/0") client = MetlogClient(sender, back_channel=bc) while True: time.sleep(1) client.metlog("msg_type", payload="pid [%d]" % os.getpid()) print "send messages"
class TestMetlogClientFilters(object): logger = 'tests' timer_name = 'test' def setUp(self): self.sender = DebugCaptureSender() self.client = MetlogClient(self.sender, self.logger) def tearDown(self): del self.sender del self.client def test_severity_max(self): from metlog.filters import severity_max_provider self.client.filters = [severity_max_provider(severity=SEVERITY.ERROR)] payload = 'foo' self.client.debug(payload) self.client.info(payload) self.client.warn(payload) self.client.error(payload) self.client.exception(payload) self.client.critical(payload) # only half of the messages should have gone out eq_(len(self.sender.msgs), 3) # make sure it's the right half for json_msg in self.sender.msgs: msg = json.loads(json_msg) ok_(msg['severity'] <= SEVERITY.ERROR) def test_type_blacklist(self): from metlog.filters import type_blacklist_provider type_blacklist = type_blacklist_provider(types=set(['foo'])) self.client.filters = [type_blacklist] choices = ['foo', 'bar'] notfoos = 0 for i in range(10): choice = random.choice(choices) if choice != 'foo': notfoos += 1 self.client.metlog(choice, payload='msg') eq_(len(self.sender.msgs), notfoos) def test_type_whitelist(self): from metlog.filters import type_whitelist_provider type_whitelist = type_whitelist_provider(types=set(['foo'])) self.client.filters = [type_whitelist] choices = ['foo', 'bar'] foos = 0 for i in range(10): choice = random.choice(choices) if choice == 'foo': foos += 1 self.client.metlog(choice, payload='msg') eq_(len(self.sender.msgs), foos) def test_type_severity_max(self): from metlog.filters import type_severity_max_provider config = { 'types': { 'foo': { 'severity': 3 }, 'bar': { 'severity': 5 }, }, } type_severity_max = type_severity_max_provider(**config) self.client.filters = [type_severity_max] for msgtype in ['foo', 'bar']: for sev in range(8): self.client.metlog(msgtype, severity=sev, payload='msg') eq_(len(self.sender.msgs), 10) msgs = [json.loads(msg) for msg in self.sender.msgs] foos = [msg for msg in msgs if msg['type'] == 'foo'] eq_(len(foos), 4) bars = [msg for msg in msgs if msg['type'] == 'bar'] eq_(len(bars), 6)