Avoid dropping cpu_util for multiple instances.

Fixes bug 1202756

When multiple instances exist, the ordering of pipleline
handle_sample() and flush() calls on the transformer caused
cpu_util samples for subsequent instances to be dropped.

Change-Id: I1d8198c0c12d99a2ffde11e4321d29723c947178
This commit is contained in:
Eoghan Glynn 2013-07-18 16:53:26 +00:00
parent 8539cfbd90
commit 879a4cc032
2 changed files with 40 additions and 9 deletions

View File

@ -66,7 +66,7 @@ class ScalingTransformer(transformer.TransformerBase):
self.source = source self.source = source
self.target = target self.target = target
self.replace = replace self.replace = replace
self.preserved = None self.preserved = []
LOG.debug(_('scaling conversion transformer with source:' LOG.debug(_('scaling conversion transformer with source:'
' %(source)s target: %(target)s replace:' ' %(source)s target: %(target)s replace:'
' %(replace)s') % locals()) ' %(replace)s') % locals())
@ -106,7 +106,7 @@ class ScalingTransformer(transformer.TransformerBase):
if self.replace: if self.replace:
counter = transformed counter = transformed
else: else:
self.preserved = transformed self.preserved.append(transformed)
return counter return counter
def handle_sample(self, context, counter, source): def handle_sample(self, context, counter, source):
@ -124,8 +124,8 @@ class ScalingTransformer(transformer.TransformerBase):
""" """
counters = [] counters = []
if self.preserved: if self.preserved:
counters.append(self.preserved) counters.extend(self.preserved)
self.preserved = None self.preserved = []
return counters return counters

View File

@ -782,6 +782,18 @@ class TestPipeline(base.TestCase):
resource_metadata={'cpu_number': 4, resource_metadata={'cpu_number': 4,
'user_metadata': um}, 'user_metadata': um},
), ),
counter.Counter(
name='cpu',
type=type,
volume=prev,
unit='ns',
user_id='test_user',
project_id='test_proj',
resource_id='test_resource2',
timestamp=now.isoformat(),
resource_metadata={'cpu_number': 2,
'user_metadata': um},
),
counter.Counter( counter.Counter(
name='cpu', name='cpu',
type=type, type=type,
@ -794,6 +806,18 @@ class TestPipeline(base.TestCase):
resource_metadata={'cpu_number': 4, resource_metadata={'cpu_number': 4,
'user_metadata': um}, 'user_metadata': um},
), ),
counter.Counter(
name='cpu',
type=type,
volume=curr,
unit='ns',
user_id='test_user',
project_id='test_proj',
resource_id='test_resource2',
timestamp=later.isoformat(),
resource_metadata={'cpu_number': 2,
'user_metadata': um},
),
] ]
pipeline_manager = pipeline.PipelineManager(self.pipeline_cfg, pipeline_manager = pipeline.PipelineManager(self.pipeline_cfg,
@ -802,17 +826,24 @@ class TestPipeline(base.TestCase):
pipe.publish_counters(None, counters, None) pipe.publish_counters(None, counters, None)
publisher = pipeline_manager.pipelines[0].publishers[0] publisher = pipeline_manager.pipelines[0].publishers[0]
self.assertEqual(len(publisher.counters), 2) self.assertEqual(len(publisher.counters), 4)
# original counters are passed thru' unmolested # original counters are passed thru' unmolested
self.assertEquals(publisher.counters[0], counters[0]) for i in xrange(4):
self.assertEquals(publisher.counters[1], counters[1]) self.assertEquals(publisher.counters[i], counters[i])
pipe.flush(None, None) pipe.flush(None, None)
self.assertEqual(len(publisher.counters), 3) self.assertEqual(len(publisher.counters), 6)
cpu_util = publisher.counters[-1] cpu_util = publisher.counters[4]
self.assertEquals(getattr(cpu_util, 'name'), 'cpu_util') self.assertEquals(getattr(cpu_util, 'name'), 'cpu_util')
self.assertEquals(getattr(cpu_util, 'resource_id'), 'test_resource')
self.assertEquals(getattr(cpu_util, 'unit'), '%') self.assertEquals(getattr(cpu_util, 'unit'), '%')
self.assertEquals(getattr(cpu_util, 'type'), counter.TYPE_GAUGE) self.assertEquals(getattr(cpu_util, 'type'), counter.TYPE_GAUGE)
self.assertEquals(getattr(cpu_util, 'volume'), expected) self.assertEquals(getattr(cpu_util, 'volume'), expected)
cpu_util = publisher.counters[5]
self.assertEquals(getattr(cpu_util, 'name'), 'cpu_util')
self.assertEquals(getattr(cpu_util, 'resource_id'), 'test_resource2')
self.assertEquals(getattr(cpu_util, 'unit'), '%')
self.assertEquals(getattr(cpu_util, 'type'), counter.TYPE_GAUGE)
self.assertEquals(getattr(cpu_util, 'volume'), expected * 2)
def test_rate_of_change_conversion(self): def test_rate_of_change_conversion(self):
self._do_test_rate_of_change_conversion(120000000000, self._do_test_rate_of_change_conversion(120000000000,