Skip to content

Commit 735ebc8

Browse files
author
Sam Clements
committed
Added support for Riemann event attributes (closes #2)
Includes many more tests, and which have been moved to a new directory
1 parent de1b933 commit 735ebc8

6 files changed

Lines changed: 214 additions & 93 deletions

File tree

riemann_client/client.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ def create_event(data):
2929
event = riemann_client.riemann_pb2.Event()
3030
event.host = socket.gethostname()
3131
event.tags.extend(data.pop('tags', []))
32+
33+
for key, value in data.pop('attributes', {}).items():
34+
attribute = event.attributes.add()
35+
attribute.key, attribute.value = key, value
36+
3237
for name, value in data.items():
3338
if value is not None:
3439
setattr(event, name, value)
@@ -55,6 +60,7 @@ def create_dict(event):
5560
'service': event.service,
5661
'tags': list(event.tags),
5762
'ttl': event.ttl,
63+
'attributes': dict(((a.key, a.value) for a in event.attributes)),
5864
'metric_f': event.metric_f,
5965
'metric_d': event.metric_d,
6066
'metric_sint64': event.metric_sint64

riemann_client/test_riemann_client.py

Lines changed: 0 additions & 91 deletions
This file was deleted.

riemann_client/tests/conftest.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from __future__ import absolute_import, unicode_literals
2+
3+
import StringIO
4+
5+
import py.test
6+
7+
import riemann_client.transport
8+
9+
10+
class StringTransport(riemann_client.transport.Transport):
11+
def connect(self):
12+
self.string = StringIO.StringIO()
13+
14+
def send(self, message):
15+
self.string.write(message.SerializeToString())
16+
message.ok = True
17+
return message
18+
19+
def disconnect(self):
20+
self.string.close()
21+
22+
23+
@py.test.fixture
24+
def string_transport():
25+
return StringTransport()
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
from __future__ import absolute_import, unicode_literals
2+
3+
import socket
4+
import uuid
5+
6+
import py.test
7+
8+
import riemann_client.client
9+
import riemann_client.riemann_pb2
10+
import riemann_client.transport
11+
12+
13+
@py.test.fixture
14+
def client(request, string_transport):
15+
client = riemann_client.client.Client(transport=string_transport)
16+
client.transport.connect()
17+
18+
@request.addfinalizer
19+
def disconnect():
20+
client.transport.disconnect()
21+
22+
return client
23+
24+
25+
@py.test.fixture
26+
def unique():
27+
return str(uuid.uuid4())
28+
29+
30+
class TestClient(object):
31+
def test_service(self, client):
32+
client.event(service='test event')
33+
assert 'test event' in client.transport.string.getvalue()
34+
35+
def test_default_hostname(self, client, event):
36+
event = client.event().events[0]
37+
assert socket.gethostname() == event.host
38+
assert socket.gethostname() in client.transport.string.getvalue()
39+
40+
def test_custom_hostname(self, client):
41+
event = client.event(host="test.example.com").events[0]
42+
assert "test.example.com" == event.host
43+
assert "test.example.com" in client.transport.string.getvalue()
44+
45+
def test_tags(self, client, unique):
46+
client.event(tags=[unique])
47+
assert unique in client.transport.string.getvalue()
48+
49+
def test_attributes(self, client, unique):
50+
client.event(attributes={'key': unique})
51+
assert unique in client.transport.string.getvalue()
52+
53+
def test_event_cls(self, event):
54+
assert isinstance(event, riemann_client.riemann_pb2.Event)
55+
56+
def test_query(self, client):
57+
assert client.query('true') == []
58+
59+
def test_udp_query(self):
60+
transport = riemann_client.transport.UDPTransport()
61+
client = riemann_client.client.Client(transport)
62+
63+
with py.test.raises(Exception):
64+
client.query('true')
65+
66+
67+
@py.test.fixture
68+
def event(unique):
69+
return riemann_client.client.Client.create_event({
70+
'host': 'test.example.com',
71+
'tags': [unique],
72+
'attributes': {
73+
unique: unique
74+
}
75+
})
76+
77+
78+
class TestCreateEvent(object):
79+
def test_host(self, event):
80+
assert event.host == 'test.example.com'
81+
82+
def test_tags(self, event, unique):
83+
assert unique in event.tags
84+
85+
def test_attributes(self, event, unique):
86+
assert event.attributes[0].key == unique
87+
assert event.attributes[0].value == unique
88+
89+
90+
@py.test.fixture
91+
def event_as_dict(event):
92+
return riemann_client.client.Client.create_dict(event)
93+
94+
95+
class TestCreateDict(object):
96+
def test_host(self, event, event_as_dict):
97+
assert event.host == event_as_dict['host']
98+
99+
def test_host_type(self, event_as_dict):
100+
assert isinstance(event_as_dict['host'], basestring)
101+
102+
def test_tags(self, event, event_as_dict):
103+
for tag in event.tags:
104+
assert tag in event_as_dict['tags']
105+
106+
def test_tags_type(self, event_as_dict):
107+
assert isinstance(event_as_dict['tags'], list)
108+
109+
def test_attibutes(self, event, event_as_dict):
110+
for attr in event.attributes:
111+
assert event_as_dict['attributes'][attr.key] == attr.value
112+
113+
def test_attibutes_type(self, event_as_dict):
114+
assert isinstance(event_as_dict['attributes'], dict)
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from __future__ import absolute_import, unicode_literals
2+
3+
import py.test
4+
5+
import riemann_client.client
6+
import riemann_client.riemann_pb2
7+
import riemann_client.transport
8+
9+
10+
@py.test.fixture
11+
def queued_client(request, string_transport):
12+
"""A Riemann client using the StringIO transport and QueuedClient"""
13+
client = riemann_client.client.QueuedClient(transport=string_transport)
14+
client.transport.connect()
15+
16+
@request.addfinalizer
17+
def disconnect():
18+
client.transport.disconnect()
19+
20+
return client
21+
22+
23+
@py.test.fixture
24+
def using_simple_queue(queued_client):
25+
"""An event queue with a single event"""
26+
queued_client.event(service='test')
27+
28+
29+
@py.test.fixture
30+
def large_queue(queued_client):
31+
"""An event queue with 100 events"""
32+
items = ['-->{0}<--'.format(i) for i in range(0, 1000)]
33+
for description in items:
34+
queued_client.event(service='queue', description=description)
35+
return items
36+
37+
38+
def test_simple_queue_event(queued_client, using_simple_queue):
39+
assert queued_client.queue.events[0].service == 'test'
40+
41+
42+
def test_simple_queue_length(queued_client, using_simple_queue):
43+
assert len(queued_client.queue.events) == 1
44+
45+
46+
def test_simple_queue_event_not_sent(queued_client, using_simple_queue):
47+
assert "test" not in queued_client.transport.string.getvalue()
48+
49+
50+
def test_simple_queue_event_sent(queued_client, using_simple_queue):
51+
queued_client.flush()
52+
assert "test" in queued_client.transport.string.getvalue()
53+
54+
55+
def test_deciqueue_length(queued_client, large_queue):
56+
assert len(queued_client.queue.events) == len(large_queue)
57+
58+
59+
def test_deciqueue_output(queued_client, large_queue):
60+
queued_client.flush()
61+
for description in large_queue:
62+
assert description in queued_client.transport.string.getvalue()
63+
64+
65+
def test_deciqueue_flush(queued_client, large_queue):
66+
queued_client.flush()
67+
assert len(queued_client.queue.events) == 0

tox.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tox]
22
minversion=1.6.0
3-
envlist=py26,py27,py26-flake8
3+
envlist=py26,py27,py26-flake8,py26-coverage
44

55
[testenv]
66
commands=py.test riemann_client
@@ -43,7 +43,7 @@ omit=
4343
exclude_lines=
4444
def __repr__
4545
raise NotImplementedError
46-
class NullHandler
46+
pass
4747

4848
[html]
4949
title=riemann-client coverage report

0 commit comments

Comments
 (0)