monasca-api/monasca_api/tests/test_metrics.py

326 lines
14 KiB
Python

# Copyright 2019 FUJITSU LIMITED
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import json
import falcon
import fixtures
from oslo_config import cfg
from monasca_api.tests import base
from monasca_api.v2.reference import metrics
CONF = cfg.CONF
TENANT_ID = u"fedcba9876543210fedcba9876543210"
class TestMetrics(base.BaseApiTestCase):
def setUp(self):
super(TestMetrics, self).setUp()
self.useFixture(fixtures.MockPatch(
'monasca_api.common.messaging.kafka_publisher.KafkaPublisher'
))
self.metrics_repo_mock = self.useFixture(fixtures.MockPatch(
'monasca_api.common.repositories.influxdb.metrics_repository.MetricsRepository'
)).mock
# [messaging]
self.conf_override(
driver='monasca_api.common.messaging.'
'kafka_publisher:KafkaPublisher',
group='messaging')
self.metrics_resource = metrics.Metrics()
self.app.add_route('/v2.0/metrics',
self.metrics_resource)
def test_list_metrics(self):
expected_elements = \
{'elements': [{'id': '0',
'name': 'mon.fake_metric',
'dimensions':
{'hostname': 'host0',
'db': 'vegeta'}},
{'id': '1',
'name': 'cpu.idle_perc',
'dimensions':
{'hostname': 'host0',
'db': 'vegeta'}}
]}
return_value = self.metrics_repo_mock.return_value
return_value.list_metrics.return_value = expected_elements['elements']
response = self.simulate_request(path='/v2.0/metrics',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID},
method='GET')
self.assertEqual(falcon.HTTP_200, response.status)
self.assertThat(response, base.RESTResponseEquals(expected_elements))
def test_send_metrics(self):
request_body = {
"name": "mon.fake_metric",
"dimensions": {
"hostname": "host0",
"db": "vegeta"
},
"timestamp": 1405630174123,
"value": 1.0,
"value_meta": {
"key1": "value1",
"key2": "value2"
}}
response = self.simulate_request(path='/v2.0/metrics',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID,
'Content-Type': 'application/json'},
body=json.dumps(request_body),
method='POST')
self.assertEqual(falcon.HTTP_204, response.status)
def test_send_incorrect_metric(self):
request_body = {
"name": "mon.fake_metric",
"dimensions": 'oh no',
"timestamp": 1405630174123,
"value": 1.0}
response = self.simulate_request(path='/v2.0/metrics',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID,
'Content-Type': 'application/json'},
body=json.dumps(request_body),
method='POST')
self.assertEqual(falcon.HTTP_422, response.status)
class TestMeasurements(base.BaseApiTestCase):
def setUp(self):
super(TestMeasurements, self).setUp()
self.metrics_repo_mock = self.useFixture(fixtures.MockPatch(
'monasca_api.common.repositories.influxdb.metrics_repository.MetricsRepository'
)).mock
self.metrics_resource = metrics.MetricsMeasurements()
self.app.add_route('/v2.0/metrics/measurements',
self.metrics_resource)
def test_get_measurements(self):
expected_measurements = \
{'elements': [
{u'name': u'mon.fake_metric',
u'columns': [u'timestamp',
u'value',
u'value_meta'],
u'id': '0',
u'dimensions': {
u'hostname': u'devstack',
u'service': u'monitoring'},
u'measurements':
[[u'2019-03-12T12:37:10.106Z', 98.5, {}],
[u'2019-03-12T12:37:23.012Z', 98.8, {}],
[u'2019-03-12T12:37:38.031Z', 68.7, {}],
[u'2019-03-12T12:37:53.046Z', 55.3, {}],
[u'2019-03-12T12:38:08.048Z', 52.8, {}]]}]}
return_value = self.metrics_repo_mock.return_value
return_value.measurement_list.return_value = expected_measurements['elements']
response = self.simulate_request(path='/v2.0/metrics/measurements',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID},
method='GET',
query_string='name=mon.fake_metric&'
'start_time=2015-03-01T00:00:01.000Z')
self.assertEqual(falcon.HTTP_200, response.status)
self.assertThat(response, base.RESTResponseEquals(expected_measurements))
def test_get_measurements_invalid_metric_name(self):
response = self.simulate_request(path='/v2.0/metrics/measurements',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID},
method='GET',
query_string='name=z'
'start_time=2015-03-01T00:00:01.000Z')
self.assertEqual(falcon.HTTP_422, response.status)
def test_get_measurements_missing_start_time(self):
response = self.simulate_request(path='/v2.0/metrics/measurements',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID},
method='GET',
query_string='name=mon.fake_metric')
self.assertEqual(falcon.HTTP_422, response.status)
def test_get_measurements_missing_name(self):
response = self.simulate_request(path='/v2.0/metrics/measurements',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID},
method='GET',
query_string='start_time=2015-03-01T00:00:01.000Z')
self.assertEqual(falcon.HTTP_422, response.status)
class TestStatistics(base.BaseApiTestCase):
def setUp(self):
super(TestStatistics, self).setUp()
self.metrics_repo_mock = self.useFixture(fixtures.MockPatch(
'monasca_api.common.repositories.influxdb.metrics_repository.MetricsRepository'
)).mock
self.metrics_resource = metrics.MetricsStatistics()
self.app.add_route('/v2.0/metrics/statistics',
self.metrics_resource)
def test_get_statistics(self):
expected_statistics = \
{u'elements': [{u'name': u'mon.fake_metric',
u'columns':
[u'timestamp',
u'avg'],
u'id': '0',
u'dimensions':
{u'hostname': u'devstack',
u'service': u'monitoring'},
u'statistics':
[[u'2019-03-12T12:35:00Z', 49.25],
[u'2019-03-12T12:40:00Z', 28.25],
[u'2019-03-12T12:45:00Z', 27.5],
[u'2019-03-12T12:50:00Z', 27],
[u'2019-03-12T12:55:00Z', 28]]}]}
return_value = self.metrics_repo_mock.return_value
return_value.metrics_statistics.return_value = expected_statistics['elements']
response = self.simulate_request(path='/v2.0/metrics/statistics',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID},
method='GET',
query_string='name=mon.fake_metric&'
'start_time=2015-03-01T00:00:01.000Z&'
'statistics=avg')
self.assertEqual(falcon.HTTP_200, response.status)
self.assertThat(response, base.RESTResponseEquals(expected_statistics))
class TestMetricsNames(base.BaseApiTestCase):
def setUp(self):
super(TestMetricsNames, self).setUp()
self.metrics_repo_mock = self.useFixture(fixtures.MockPatch(
'monasca_api.common.repositories.influxdb.metrics_repository.MetricsRepository'
)).mock
self.metrics_resource = metrics.MetricsNames()
self.app.add_route('/v2.0/metrics/names',
self.metrics_resource)
def test_get_metrics_names(self):
expected_metrics_names = \
{u'elements': [
{u'name': u'cpu.frequency_mhz'},
{u'name': u'cpu.idle_perc'},
{u'name': u'cpu.idle_time'},
{u'name': u'cpu.percent'},
{u'name': u'cpu.stolen_perc'},
{u'name': u'cpu.system_perc'},
{u'name': u'cpu.system_time'}]}
return_value = self.metrics_repo_mock.return_value
return_value.list_metric_names.return_value = expected_metrics_names['elements']
response = self.simulate_request(path='/v2.0/metrics/names',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID},
method='GET')
self.assertEqual(falcon.HTTP_200, response.status)
self.assertThat(response, base.RESTResponseEquals(expected_metrics_names))
class TestDimensionNames(base.BaseApiTestCase):
def setUp(self):
super(TestDimensionNames, self).setUp()
self.metrics_repo_mock = self.useFixture(fixtures.MockPatch(
'monasca_api.common.repositories.influxdb.metrics_repository.MetricsRepository'
)).mock
self.metrics_resource = metrics.DimensionNames()
self.app.add_route('/v2.0/metrics/dimensions/names',
self.metrics_resource)
def test_get_dimension_names(self):
expected_dimension_names = \
{u'elements': [
{u'dimension_name': u'component'},
{u'dimension_name': u'consumer_group'},
{u'dimension_name': u'device'},
{u'dimension_name': u'hostname'},
{u'dimension_name': u'mode'}]}
return_value = self.metrics_repo_mock.return_value
return_value.list_dimension_names.return_value = expected_dimension_names['elements']
response = self.simulate_request(path='/v2.0/metrics/dimensions/names',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID},
method='GET')
self.assertEqual(falcon.HTTP_200, response.status)
self.assertThat(response, base.RESTResponseEquals(expected_dimension_names))
class TestDimensionValues(base.BaseApiTestCase):
def setUp(self):
super(TestDimensionValues, self).setUp()
self.metrics_repo_mock = self.useFixture(fixtures.MockPatch(
'monasca_api.common.repositories.influxdb.metrics_repository.MetricsRepository'
)).mock
self.metrics_resource = metrics.DimensionValues()
self.app.add_route('/v2.0/metrics/dimensions/values',
self.metrics_resource)
def test_get_dimension_values(self):
expected_dimension_names = \
{u'elements': [
{u'dimension_value': u'dummy_dimension_value'}]}
return_value = self.metrics_repo_mock.return_value
return_value.list_dimension_values.return_value = expected_dimension_names['elements']
response = self.simulate_request(path='/v2.0/metrics/dimensions/values',
headers={'X-Roles':
CONF.security.default_authorized_roles[0],
'X-Tenant-Id': TENANT_ID},
method='GET',
query_string='dimension_name=dummy_dimension_name')
self.assertEqual(falcon.HTTP_200, response.status)
self.assertThat(response, base.RESTResponseEquals(expected_dimension_names))