def test_grant_limit(self): grant = 'photo_res_max' limit = 3 metric = {grant: {'style': 'grant'}} db_session = database.get_session(db_url=self.config.DB_URL) response = self.call_endpoint('/grant', 'post', data=dict( name=grant, value=str(limit), uid=self.test_uid)) self.assertEqual(response.status_code, 201) with self.config_overrides(metrics=metric): self.authorize(new_session=True) for count in range(limit): self.assertTrue( Metrics( uid=self.test_uid, db_session=db_session).store(grant)) response = self.call_endpoint( '/metric?filter={"name":"%s","uid":"%s"}' % (grant, self.test_uid), 'get') self.assertEqual(response.status_code, 200) self.assertEqual(response.get_json().get('items'), [ dict(labels=['uid=%s' % self.test_uid], name=grant, value=0)]) self.assertFalse( Metrics(uid=self.test_uid, db_session=db_session).store(grant))
def test_check_store_invalid(self): with self.assertRaises(AssertionError): Metrics().check('bogus_metric') with self.assertRaises(AssertionError): Metrics().check('api_calls_total') with self.assertRaises(AssertionError): Metrics().store('bogus_metric') with self.assertRaises(AssertionError): Metrics().store('api_key_auth_total', value=u'stringsdisallowed')
def collect(**kwargs): """Collect metrics in prometheus-compatible format Args: kwargs: as defined in openapi.yaml """ return Metrics().collect(**kwargs)
def find(**kwargs): """Find multiple metrics Args: kwargs: as defined in openapi.yaml """ return Metrics().find(**kwargs)
def test_integer_increment(self): response = self.call_endpoint('/metric?name=api_calls_total&filter=' '{"label":"resource=settings"}', 'get') self.assertEqual(response.status_code, 200) result = response.get_json() self.assertEqual(result['count'], 1) value = result['items'][0]['value'] # Make another call and verify it gets counted response = self.call_endpoint('/settings/x-75023275', 'get') self.assertEqual(response.status_code, 200) response = self.call_endpoint( '/metric?filter={"name":"api_calls_total",' '"label":"resource=settings"}', 'get') self.assertEqual(response.status_code, 200) self.assertEqual(response.get_json()['items'][0]['value'], value + 1) # Double-increment also works Metrics().store('api_calls_total', labels=['resource=settings'], value=2) response = self.call_endpoint( '/metric?filter={"name":"api_calls_total",' '"label":"resource=settings"}', 'get') self.assertEqual(response.status_code, 200) self.assertEqual(response.get_json()['items'][0]['value'], value + 3)
def test_warn_threshold_50(self): grant = 'photo_daily_total' limit = 4 metric = {grant: {'style': 'grant', 'notify': 50}} db_session = database.get_session(db_url=self.config.DB_URL) response = self.call_endpoint('/grant', 'post', data=dict( name=grant, value=str(limit), uid=self.test_uid)) self.assertEqual(response.status_code, 201) with self.config_overrides(metrics=metric): self.authorize(new_session=True) for count in range(limit): self.assertTrue( Metrics(uid=self.test_uid, db_session=db_session, func_send=self.mock_messaging).store(grant)) self.mock_messaging.assert_called_once_with( to_uid=self.test_uid, template='usage_notify', period='day', percent=metric[grant]['notify'], resource=grant) response = self.call_endpoint( '/metric?filter={"name":"%s","uid":"%s"}' % ( grant, self.test_uid), 'get') self.assertEqual(response.status_code, 200) self.assertEqual(response.get_json().get('items'), [ dict(labels=['uid=%s' % self.test_uid], name=grant, value=0)])
def test_check_limit_decrement(self): grant = 'sms_monthly_total' db_session = database.get_session(db_url=self.config.DB_URL) metrics = Metrics(uid=self.test_uid, db_session=db_session) current = metrics.check(grant) metrics.store(grant) next = metrics.check(grant) self.assertEqual(next, current - 1) db_session.remove()
def test_find_several(self): response = self.call_endpoint('/metric?offset=2&limit=5', 'get') self.assertEqual(response.status_code, 200) self.assertEqual(response.get_json().get('count'), 5) response = self.call_endpoint('/metric?filter={"uid":""}', 'get') self.assertEqual(response.status_code, 200) # this is just to ensure at least one user metric db_session = database.get_session(db_url=self.config.DB_URL) Metrics(uid=self.test_uid, db_session=db_session).store( 'video_daily_total') db_session.remove() self.assertGreaterEqual(response.get_json().get('count'), 1)
def create(body): """add to list if specified""" list_id = body.get('list_id') # TODO use many-to-many table instead, once UI is fixed # body.pop('list_id', None) body['sender_id'] = uid = AccessControl().uid if not Metrics(uid=uid, db_session=g.db).store('message_daily_total'): return dict(message=_(u'daily limit exceeded')), 405 retval = super(MessageController, MessageController).create(body) if retval[1] == 201 and list_id: message_id = retval[0]['id'] g.db.add(ListMessage(list_id=list_id, message_id=message_id)) g.db.commit() return retval
from apicrud.messaging.send import Messaging import celeryconfig import models app = celery.Celery() app.config_from_object(celeryconfig) path = os.path.dirname(os.path.abspath(__file__)) config = ServiceConfig( reset=True, models=models, file=os.path.join(path, 'config.yaml'), template_folders=[os.path.join(path, 'templates')]).config @app.task(name='tasks.messaging.send_contact') def send_contact(frm=None, to=None, to_uid=None, template=None, **kwargs): """ Args: frm (uid): person to (Contact): recipient template (str): jinja2 template name kwargs: kv pairs Raises: SendException """ Messaging().send( frm=frm, to=to, to_uid=to_uid, template=template, **kwargs) # Register send_contact, for usage-alert notifications Metrics(func_send=send_contact.delay)