Skip to content
This repository was archived by the owner on Oct 27, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions go_http/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,39 @@ def get_metric(self, metric, start, interval, nulls):
"nulls": nulls
}
return self._api_request("GET", "metrics/", payload)

def fire(self, metrics):
"""
Fire metrics.

:param dict metrics:
A mapping of metric names to floating point metric values.

When metrics are fired they must specify an aggregator. The
aggregation method is determined by the suffix of the metric name.
For example, ``foo.last`` fires a metric that uses the ``last``
aggregation method.

If a metric name does not end in a valid aggregator name, firing
the set of metrics will fail.

The available aggregators are:

:Average:
``avg``. Aggregates by averaging the values in each time period.
:Sum:
``sum``. Aggregates by summing all the values in each time period.
:Maximum:
``max``. Aggregates by choosing the maximum value in each time
period.
:Minimum:
``min``. Aggregates by choosing the minimum value in each time
period.
:Last:
``last``. Aggregates by choosing the last value in each time
period.

Note that metrics can also be fired via an HTTP conversation API.
See :meth:`go_http.send.HttpApiSender.fire_metric`.
"""
return self._api_request("POST", "metrics/", metrics)
3 changes: 3 additions & 0 deletions go_http/send.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ def fire_metric(self, metric, value, agg="last"):
:param str agg:
Aggregation type. Defaults to ``'last'``. Other allowed values are
``'sum'``, ``'avg'``, ``'max'`` and ``'min'``.

Note that metrics can also be fired via the metrics API.
See :meth:`go_http.metrics.MetricsApiClient.fire`.
"""
data = [
[
Expand Down
34 changes: 29 additions & 5 deletions go_http/tests/test_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ def send(self, request, *args, **kw):
return super(RecordingAdapter, self).send(request, *args, **kw)


class TestMetricApiReader(TestCase):
class TestMetricApiClient(TestCase):

def setUp(self):
self.session = TestSession()
self.sender = MetricsApiClient(
self.client = MetricsApiClient(
auth_token="auth-token",
api_url="http://example.com/api/v1/go",
session=self.session)
Expand All @@ -43,13 +43,17 @@ def test_default_api_url(self):
self.assertEqual(client.api_url,
"https://go.vumi.org/api/v1/go")

def check_request(self, request, method, headers=None):
def check_request(self, request, method, data=None, headers=None):
self.assertEqual(request.method, method)
if headers is not None:
for key, value in headers.items():
self.assertEqual(request.headers[key], value)
if data is None:
self.assertEqual(request.body, None)
else:
self.assertEqual(json.loads(request.body), data)

def test_send_request(self):
def test_get_metric(self):
response = {u'stores.store_name.metric_name.agg':
[{u'x': 1413936000000,
u'y': 88916.0},
Expand All @@ -67,9 +71,29 @@ def test_send_request(self):
"metrics/?m=stores.store_name.metric_name.agg"
"&interval=1d&from=-30d&nulls=omit", adapter)

result = self.sender.get_metric(
result = self.client.get_metric(
"stores.store_name.metric_name.agg", "-30d", "1d", "omit")
self.assertEqual(result, response)
self.check_request(
adapter.request, 'GET',
headers={"Authorization": u'Bearer auth-token'})

def test_fire(self):
response = [{
'name': 'foo.last',
'value': 3.1415,
'aggregator': 'last',
}]
adapter = RecordingAdapter(json.dumps(response))
self.session.mount(
"http://example.com/api/v1/go/"
"metrics/", adapter)

result = self.client.fire({
"foo.last": 3.1415,
})
self.assertEqual(result, response)
self.check_request(
adapter.request, 'POST',
data={"foo.last": 3.1415},
headers={"Authorization": u'Bearer auth-token'})