More efficient event stats query
This commit is contained in:
parent
f57bc6a95f
commit
fef0458472
@ -470,12 +470,22 @@ def get_event_stats(request):
|
|||||||
when_max = utils.str_time_to_unix(request.GET['when_max'])
|
when_max = utils.str_time_to_unix(request.GET['when_max'])
|
||||||
filters['when__lte'] = when_max
|
filters['when__lte'] = when_max
|
||||||
|
|
||||||
if 'event' in request.GET:
|
|
||||||
filters['event'] = request.GET['event']
|
|
||||||
|
|
||||||
service = request.GET.get("service", "nova")
|
service = request.GET.get("service", "nova")
|
||||||
rawdata = _rawdata_factory(service)
|
rawdata = _rawdata_factory(service)
|
||||||
return {'stats': {'count': rawdata.filter(**filters).count()}}
|
if filters:
|
||||||
|
rawdata = rawdata.filter(**filters)
|
||||||
|
events = rawdata.values('event').annotate(event_count=Count('event'))
|
||||||
|
events = list(events)
|
||||||
|
|
||||||
|
if 'event' in request.GET:
|
||||||
|
event_filter = request.GET['event']
|
||||||
|
event_count = {'event': event_filter, 'event_count': 0}
|
||||||
|
for event in events:
|
||||||
|
if event['event'] == event_filter:
|
||||||
|
event_count['event_count'] = event['event_count']
|
||||||
|
events = [event_count, ]
|
||||||
|
|
||||||
|
return {'stats': events}
|
||||||
except (KeyError, TypeError):
|
except (KeyError, TypeError):
|
||||||
raise BadRequestException(message="Invalid/absent query parameter")
|
raise BadRequestException(message="Invalid/absent query parameter")
|
||||||
except (ValueError, AttributeError):
|
except (ValueError, AttributeError):
|
||||||
|
@ -43,10 +43,13 @@ class DBAPITestCase(StacktachBaseTestCase):
|
|||||||
self.mox = mox.Mox()
|
self.mox = mox.Mox()
|
||||||
dne_exception = models.InstanceExists.DoesNotExist
|
dne_exception = models.InstanceExists.DoesNotExist
|
||||||
mor_exception = models.InstanceExists.MultipleObjectsReturned
|
mor_exception = models.InstanceExists.MultipleObjectsReturned
|
||||||
|
self.mox.StubOutWithMock(models, 'RawData',
|
||||||
|
use_mock_anything=True)
|
||||||
self.mox.StubOutWithMock(models, 'InstanceExists',
|
self.mox.StubOutWithMock(models, 'InstanceExists',
|
||||||
use_mock_anything=True)
|
use_mock_anything=True)
|
||||||
self.mox.StubOutWithMock(models, 'ImageExists',
|
self.mox.StubOutWithMock(models, 'ImageExists',
|
||||||
use_mock_anything=True)
|
use_mock_anything=True)
|
||||||
|
models.RawData.objects = self.mox.CreateMockAnything()
|
||||||
models.InstanceExists._meta = self.mox.CreateMockAnything()
|
models.InstanceExists._meta = self.mox.CreateMockAnything()
|
||||||
models.ImageExists._meta = self.mox.CreateMockAnything()
|
models.ImageExists._meta = self.mox.CreateMockAnything()
|
||||||
models.InstanceExists.objects = self.mox.CreateMockAnything()
|
models.InstanceExists.objects = self.mox.CreateMockAnything()
|
||||||
@ -1103,26 +1106,71 @@ class DBAPITestCase(StacktachBaseTestCase):
|
|||||||
self.assertEqual(expected_response, response.content)
|
self.assertEqual(expected_response, response.content)
|
||||||
self.mox.VerifyAll()
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
def test_get_verified_count(self):
|
def test_get_event_stats(self):
|
||||||
fake_request = self.mox.CreateMockAnything()
|
fake_request = self.mox.CreateMockAnything()
|
||||||
fake_request.method = 'GET'
|
fake_request.method = 'GET'
|
||||||
fake_request.GET = {'when_min': "2014-02-26 00:00:00",
|
fake_request.GET = {'service': "nova"}
|
||||||
'when_max': "2014-02-27 00:00:00",
|
|
||||||
'service': "nova",
|
|
||||||
'event': 'compute.instance.exists.verified'}
|
|
||||||
mock_query = self.mox.CreateMockAnything()
|
mock_query = self.mox.CreateMockAnything()
|
||||||
self.mox.StubOutWithMock(models.RawData.objects, "filter")
|
models.RawData.objects.values('event').AndReturn(mock_query)
|
||||||
models.RawData.objects.filter(event='compute.instance.exists.verified',
|
events = [
|
||||||
when__gte=Decimal('1393372800'),
|
{'event': 'compute.instance.exists.verified', 'event_count': 100},
|
||||||
when__lte=Decimal('1393459200')).\
|
{'event': 'compute.instance.exists', 'event_count': 100}
|
||||||
AndReturn(mock_query)
|
]
|
||||||
mock_query.count().AndReturn(100)
|
mock_query.annotate(event_count=mox.IsA(Count)).AndReturn(events)
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
response = dbapi.get_event_stats(fake_request)
|
response = dbapi.get_event_stats(fake_request)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertEqual(json.loads(response.content),
|
self.assertEqual(response.content,
|
||||||
{'stats': {'count': 100}})
|
json.dumps({'stats': events}))
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_get_event_stats_date_range(self):
|
||||||
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
fake_request.method = 'GET'
|
||||||
|
start = "2014-02-26 00:00:00"
|
||||||
|
end = "2014-02-27 00:00:00"
|
||||||
|
fake_request.GET = {'when_min': start,
|
||||||
|
'when_max': end,
|
||||||
|
'service': "nova"}
|
||||||
|
mock_query = self.mox.CreateMockAnything()
|
||||||
|
filters = {
|
||||||
|
'when__gte': stacktach_utils.str_time_to_unix(start),
|
||||||
|
'when__lte': stacktach_utils.str_time_to_unix(end)
|
||||||
|
}
|
||||||
|
models.RawData.objects.filter(**filters).AndReturn(mock_query)
|
||||||
|
mock_query.values('event').AndReturn(mock_query)
|
||||||
|
events = [
|
||||||
|
{'event': 'compute.instance.exists.verified', 'event_count': 100},
|
||||||
|
{'event': 'compute.instance.exists', 'event_count': 100}
|
||||||
|
]
|
||||||
|
mock_query.annotate(event_count=mox.IsA(Count)).AndReturn(events)
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
response = dbapi.get_event_stats(fake_request)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(response.content,
|
||||||
|
json.dumps({'stats': events}))
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_get_verified_count(self):
|
||||||
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
fake_request.method = 'GET'
|
||||||
|
fake_request.GET = {'service': "nova",
|
||||||
|
'event': 'compute.instance.exists.verified'}
|
||||||
|
mock_query = self.mox.CreateMockAnything()
|
||||||
|
models.RawData.objects.values('event').AndReturn(mock_query)
|
||||||
|
events = [
|
||||||
|
{'event': 'compute.instance.exists.verified', 'event_count': 100},
|
||||||
|
{'event': 'compute.instance.exists', 'event_count': 100}
|
||||||
|
]
|
||||||
|
mock_query.annotate(event_count=mox.IsA(Count)).AndReturn(events)
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
response = dbapi.get_event_stats(fake_request)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(response.content,
|
||||||
|
json.dumps({'stats': [events[0]]}))
|
||||||
self.mox.VerifyAll()
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
def test_get_verified_count_wrong_date_format_returns_400(self):
|
def test_get_verified_count_wrong_date_format_returns_400(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user