If monascastatsd is installed, the current implementation will always open a socket when starting designate, even if metrics is disabled in the configuration. This patch changes this by changing the way the timer was implemented, making sure that the metrics implemention is only loaded when needed. * Made the error message obvious when metrics is disabled, and when we are missing the monasca-statsd client. * Removed support for the timed decorator. Change-Id: I508269ae3baac9882a51fb61ce55d6169ffddad3
126 lines
4.4 KiB
Python
126 lines
4.4 KiB
Python
#
|
|
# Copyright (C) 2016 Red Hat, Inc.
|
|
#
|
|
# 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 time
|
|
|
|
import mock
|
|
import monascastatsd
|
|
from oslo_config import cfg
|
|
from oslo_config import fixture as cfg_fixture
|
|
|
|
from designate import metrics
|
|
from designate.metrics_client import noop
|
|
from designate.tests import TestCase
|
|
from designate.tests import fixtures
|
|
|
|
|
|
class TestNoopMetrics(TestCase):
|
|
def setUp(self):
|
|
super(TestCase, self).setUp()
|
|
self.stdlog = fixtures.StandardLogging()
|
|
self.useFixture(self.stdlog)
|
|
self.CONF = self.useFixture(cfg_fixture.Config(cfg.CONF)).conf
|
|
self.CONF.set_override('enabled', False, 'monasca:statsd')
|
|
|
|
def test_monasca_metrics_disabled(self):
|
|
self.metrics = metrics.Metrics()
|
|
self.assertIsInstance(self.metrics.client, noop.Client)
|
|
self.assertIn('Statsd disabled', self.stdlog.logger.output)
|
|
|
|
def test_noop_metrics_client_getters(self):
|
|
self.metrics = metrics.Metrics()
|
|
self.assertIsInstance(self.metrics.counter('name'), noop.NoopCounter)
|
|
self.assertIsInstance(self.metrics.gauge(), noop.NoopGauge)
|
|
self.assertIsInstance(self.metrics.timer(), noop.NoopTimer)
|
|
self.assertIsNotNone(self.metrics.timer.__self__)
|
|
|
|
def test_noop_metrics_client_timed(self):
|
|
self.metrics = metrics.Metrics()
|
|
timer = self.metrics.client.get_timer()
|
|
|
|
def func(a):
|
|
start_time = time.time()
|
|
try:
|
|
return a
|
|
finally:
|
|
timer.timing('mdns.xfr.zone_sync', time.time() - start_time)
|
|
|
|
result = func(1)
|
|
self.assertEqual(result, 1)
|
|
|
|
|
|
class TestMonascaMetrics(TestCase):
|
|
def setUp(self):
|
|
super(TestCase, self).setUp()
|
|
self.stdlog = fixtures.StandardLogging()
|
|
self.useFixture(self.stdlog)
|
|
self.CONF = self.useFixture(cfg_fixture.Config(cfg.CONF)).conf
|
|
self.CONF.set_override('enabled', True, 'monasca:statsd')
|
|
|
|
@mock.patch('socket.socket.connect')
|
|
def test_monasca_metrics_enabled(self, conn_mock):
|
|
self.metrics = metrics.Metrics()
|
|
|
|
self.assertIsInstance(self.metrics.client, monascastatsd.client.Client)
|
|
self.assertIn('Statsd reports to 127.0.0.1:8125',
|
|
self.stdlog.logger.output)
|
|
self.assertTrue(conn_mock.called)
|
|
|
|
@mock.patch('socket.socket.connect')
|
|
def test_monasca_metrics_client_getters(self, conn_mock):
|
|
self.metrics = metrics.Metrics()
|
|
|
|
self.assertIsInstance(self.metrics.counter('name'),
|
|
monascastatsd.counter.Counter)
|
|
self.assertIsInstance(self.metrics.gauge(),
|
|
monascastatsd.gauge.Gauge)
|
|
self.assertIsInstance(self.metrics.timer(),
|
|
monascastatsd.timer.Timer)
|
|
self.assertIsNotNone(self.metrics.timer.__self__)
|
|
|
|
self.assertTrue(conn_mock.called)
|
|
|
|
@mock.patch('socket.socket.send')
|
|
@mock.patch('socket.socket.connect')
|
|
def test_monasca_metrics_client_timed(self, conn_mock, send_mock):
|
|
self.metrics = metrics.Metrics()
|
|
timer = self.metrics.client.get_timer()
|
|
|
|
def func(a):
|
|
start_time = time.time()
|
|
try:
|
|
return a
|
|
finally:
|
|
timer.timing('mdns.xfr.zone_sync', time.time() - start_time)
|
|
|
|
result = func(1)
|
|
self.assertEqual(result, 1)
|
|
self.assertTrue(conn_mock.called)
|
|
self.assertTrue(send_mock.called)
|
|
|
|
def test_monasca_enabled_but_client_not_installed(self):
|
|
restore = metrics.monascastatsd
|
|
try:
|
|
metrics.monascastatsd = None
|
|
self.metrics = metrics.Metrics()
|
|
self.assertIsInstance(self.metrics.client, noop.Client)
|
|
self.assertIn(
|
|
'monasca-statsd client not installed. '
|
|
'Metrics will be ignored.',
|
|
self.stdlog.logger.output
|
|
)
|
|
finally:
|
|
metrics.monascastatsd = restore
|