Merge "Update compute disk I/O pollster to use cache"
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import collections
|
||||
import copy
|
||||
import datetime
|
||||
|
||||
@@ -144,6 +145,12 @@ class InstancePollster(plugin.ComputePollster):
|
||||
volume=1)
|
||||
|
||||
|
||||
DiskIOData = collections.namedtuple(
|
||||
'DiskIOData',
|
||||
'r_bytes r_requests w_bytes w_requests',
|
||||
)
|
||||
|
||||
|
||||
class DiskIOPollster(plugin.ComputePollster):
|
||||
|
||||
LOG = log.getLogger(__name__ + '.diskio')
|
||||
@@ -164,14 +171,16 @@ class DiskIOPollster(plugin.ComputePollster):
|
||||
'disk.write.requests',
|
||||
'disk.write.bytes']
|
||||
|
||||
def get_counters(self, manager, cache, instance):
|
||||
instance_name = _instance_name(instance)
|
||||
try:
|
||||
CACHE_KEY_DISK = 'diskio'
|
||||
|
||||
def _populate_cache(self, inspector, cache, instance, instance_name):
|
||||
i_cache = cache.setdefault(self.CACHE_KEY_DISK, {})
|
||||
if instance_name not in i_cache:
|
||||
r_bytes = 0
|
||||
r_requests = 0
|
||||
w_bytes = 0
|
||||
w_requests = 0
|
||||
for disk, info in manager.inspector.inspect_disks(instance_name):
|
||||
for disk, info in inspector.inspect_disks(instance_name):
|
||||
self.LOG.info(self.DISKIO_USAGE_MESSAGE,
|
||||
instance, disk.device, info.read_requests,
|
||||
info.read_bytes, info.write_requests,
|
||||
@@ -180,29 +189,46 @@ class DiskIOPollster(plugin.ComputePollster):
|
||||
r_requests += info.read_requests
|
||||
w_bytes += info.write_bytes
|
||||
w_requests += info.write_requests
|
||||
i_cache[instance_name] = DiskIOData(
|
||||
r_bytes=r_bytes,
|
||||
r_requests=r_requests,
|
||||
w_bytes=w_bytes,
|
||||
w_requests=w_requests,
|
||||
)
|
||||
return i_cache[instance_name]
|
||||
|
||||
def get_counters(self, manager, cache, instance):
|
||||
instance_name = _instance_name(instance)
|
||||
c_data = self._populate_cache(
|
||||
manager.inspector,
|
||||
cache,
|
||||
instance,
|
||||
instance_name,
|
||||
)
|
||||
try:
|
||||
yield make_counter_from_instance(instance,
|
||||
name='disk.read.requests',
|
||||
type=counter.TYPE_CUMULATIVE,
|
||||
unit='request',
|
||||
volume=r_requests,
|
||||
volume=c_data.r_requests,
|
||||
)
|
||||
yield make_counter_from_instance(instance,
|
||||
name='disk.read.bytes',
|
||||
type=counter.TYPE_CUMULATIVE,
|
||||
unit='B',
|
||||
volume=r_bytes,
|
||||
volume=c_data.r_bytes,
|
||||
)
|
||||
yield make_counter_from_instance(instance,
|
||||
name='disk.write.requests',
|
||||
type=counter.TYPE_CUMULATIVE,
|
||||
unit='request',
|
||||
volume=w_requests,
|
||||
volume=c_data.w_requests,
|
||||
)
|
||||
yield make_counter_from_instance(instance,
|
||||
name='disk.write.bytes',
|
||||
type=counter.TYPE_CUMULATIVE,
|
||||
unit='B',
|
||||
volume=w_bytes,
|
||||
volume=c_data.w_bytes,
|
||||
)
|
||||
except Exception as err:
|
||||
self.LOG.warning('Ignoring instance %s: %s',
|
||||
|
||||
@@ -156,8 +156,11 @@ class TestDiskIOPollster(TestPollsterBase):
|
||||
|
||||
mgr = manager.AgentManager()
|
||||
pollster = pollsters.DiskIOPollster()
|
||||
counters = list(pollster.get_counters(mgr, {}, self.instance))
|
||||
cache = {}
|
||||
counters = list(pollster.get_counters(mgr, cache, self.instance))
|
||||
assert counters
|
||||
assert pollster.CACHE_KEY_DISK in cache
|
||||
assert self.instance.name in cache[pollster.CACHE_KEY_DISK]
|
||||
|
||||
self.assertEqual(set([c.name for c in counters]),
|
||||
set(pollster.get_counter_names()))
|
||||
@@ -173,6 +176,40 @@ class TestDiskIOPollster(TestPollsterBase):
|
||||
_verify_disk_metering('disk.write.requests', 4L)
|
||||
_verify_disk_metering('disk.write.bytes', 3L)
|
||||
|
||||
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
|
||||
def test_get_counters_cache(self):
|
||||
self.mox.ReplayAll()
|
||||
|
||||
mgr = manager.AgentManager()
|
||||
pollster = pollsters.DiskIOPollster()
|
||||
cache = {
|
||||
pollster.CACHE_KEY_DISK: {
|
||||
self.instance.name: pollsters.DiskIOData(
|
||||
r_bytes=-1,
|
||||
r_requests=-2,
|
||||
w_bytes=-3,
|
||||
w_requests=-4,
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
counters = list(pollster.get_counters(mgr, cache, self.instance))
|
||||
assert counters
|
||||
|
||||
self.assertEqual(set([c.name for c in counters]),
|
||||
set(pollster.get_counter_names()))
|
||||
|
||||
def _verify_disk_metering(name, expected_volume):
|
||||
match = [c for c in counters if c.name == name]
|
||||
self.assertEquals(len(match), 1, 'missing counter %s' % name)
|
||||
self.assertEquals(match[0].volume, expected_volume)
|
||||
self.assertEquals(match[0].type, 'cumulative')
|
||||
|
||||
_verify_disk_metering('disk.read.requests', -2L)
|
||||
_verify_disk_metering('disk.read.bytes', -1L)
|
||||
_verify_disk_metering('disk.write.requests', -4L)
|
||||
_verify_disk_metering('disk.write.bytes', -3L)
|
||||
|
||||
|
||||
class TestNetPollster(TestPollsterBase):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user