Merge "Update compute disk I/O pollster to use cache"

This commit is contained in:
Jenkins
2013-07-11 13:39:03 +00:00
committed by Gerrit Code Review
2 changed files with 72 additions and 9 deletions

View File

@@ -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',

View File

@@ -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):