class XMPPKeepAliveSupervisor(Supervisor, Subject): name = 'XMPP_KEEPALIVE_SUPERVISOR' log = getLoggerAdapter(log, id=name) def __init__(self): Supervisor.__init__(self) Subject.__init__(self) self.lastTime = datetime.utcnow() self.metric = Metric(name='elapsed_time', value=None, unit='msec', source=self.name, scale=1000, sampling=True) def perform_keep_alive(self): self.lastTime = datetime.utcnow() self.notifyObservers() elapsedTime = datetime.utcnow() - self.lastTime usecs = elapsedTime.seconds * 1000000 + elapsedTime.microseconds self.log.info('Finished XMPP_KEEP_ALIVE. Elapsed %s usecs', usecs) self.metric.add(usecs) def startService(self): Supervisor.startService(self) if conf.XMPP_KEEP_ALIVE_TIME > 0: t = LoopingCall(self.perform_keep_alive) self.registerTask(t) t.start(conf.XMPP_KEEP_ALIVE_TIME, now=False)
class BaseHandlerNoLog(cyclone.web.Application, RedisMixin): def __init__(self): handlers = [ (r"/1/google/messages/(.+)", v1.handlers.GoogleMessagesHandler), (r"/1/google/contacts/(.+)", v1.handlers.GoogleContactsHandler), (r"/1/google/(.+)", v1.handlers.GoogleHandler) ] settings = dict(debug=conf.CYCLONE_DEBUG, ) cyclone.web.Application.__init__(self, handlers, **settings) self.log = getLoggerAdapter(log) self.metric = Metric(name='time', value=None, unit=v1.handlers.METRIC_UNIT_TIME, source=v1.handlers.METRIC_SOURCE, sampling=True) self.metric_response_codes = { 1: Metric(name='response_1XX', value=None, unit='requests', source=v1.handlers.METRIC_SOURCE), 2: Metric(name='response_2XX', value=None, unit='requests', source=v1.handlers.METRIC_SOURCE), 3: Metric(name='response_3XX', value=None, unit='requests', source=v1.handlers.METRIC_SOURCE), 4: Metric(name='response_4XX', value=None, unit='requests', source=v1.handlers.METRIC_SOURCE), 5: Metric(name='response_5XX', value=None, unit='requests', source=v1.handlers.METRIC_SOURCE) } @IncrementMetric(name='total', unit=v1.handlers.METRIC_UNIT, source=v1.handlers.METRIC_SOURCE) def log_request(self, handler): self._request_time = 1000 * handler.request.request_time() self.metric.add(self._request_time) status_metric = self.metric_response_codes.get( handler.get_status() / 100, None) if not status_metric is None: status_metric.add(1) metric = getattr(handler, 'metric', None) if metric: metric.add(self._request_time)
class RedisMetrics(Observer): SOURCE='REDIS' UNIT='keys' def __init__(self): self._connection = RedisMixin.redis_conn self._keys=Metric(name="keys", value=None, unit=self.UNIT, source=self.SOURCE) failed_queue_name = FailedQueue().name self._items={conf.DIST_QUEUE_LOGIN: Metric(name='queue_%s'%(conf.DIST_QUEUE_LOGIN), value=None, unit=self.UNIT, source=self.SOURCE), conf.DIST_QUEUE_PUSH: Metric(name='queue_%s'%(conf.DIST_QUEUE_PUSH), value=None, unit=self.UNIT, source=self.SOURCE), conf.DIST_QUEUE_RELOGIN: Metric(name='queue_%s'%(conf.DIST_QUEUE_RELOGIN), value=None, unit=self.UNIT, source=self.SOURCE), failed_queue_name: Metric(name='queue_%s'%(failed_queue_name), value=None, unit=self.UNIT, source=self.SOURCE) } @defer.inlineCallbacks def notify(self): keys = yield self._connection.dbsize() self._keys.add(keys) for key in self._items: queue = Queue(name=key, connection=self._connection) items = yield queue.count self._items[key].add(items)