Source code for tensor.sources.riak

"""
.. module:: riak
   :platform: Any
   :synopsis: A source module for Riak metrics

.. moduleauthor:: Jeremy Thurgood <firxen@gmail.com>
"""

import json

from twisted.internet import defer, reactor
from twisted.web.client import Agent
from twisted.web.http_headers import Headers

from zope.interface import implementer

from tensor.interfaces import ITensorSource
from tensor.objects import Source

from tensor.utils import BodyReceiver


@implementer(ITensorSource)
[docs]class RiakStats(Source): """Returns GET/PUT rates for a Riak node **Configuration arguments:** :param url: Riak stats URL :type url: str. :param useragent: User-Agent header to use :type useragent: str. **Metrics:** :(service name).latency: Time to complete request """ @defer.inlineCallbacks def _get_stats_from_node(self): agent = Agent(reactor) url = self.config.get('url', 'http://%s:8098/stats' % self.hostname) ua = self.config.get('useragent', 'Tensor Riak stats checker') headers = Headers({'User-Agent': [ua]}) request = yield agent.request('GET'.encode(), url.encode(), headers) if (request.length) and (request.code == 200): d = defer.Deferred() request.deliverBody(BodyReceiver(d)) b = yield d body = b.read() else: body = "{}" defer.returnValue(json.loads(body)) @defer.inlineCallbacks def get(self): stats = yield self._get_stats_from_node() get_rate = stats['node_gets'] / 60.0 put_rate = stats['node_puts'] / 60.0 defer.returnValue([ self.createEvent( 'ok', 'GETs per second for past minute', get_rate, prefix="gets_per_second"), self.createEvent( 'ok', 'PUTs per second for past minute', put_rate, prefix="puts_per_second"), ])