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

View File

@ -782,6 +782,18 @@ class TestPipeline(base.TestCase):
resource_metadata={'cpu_number': 4,
'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(
name='cpu',
type=type,
@ -794,6 +806,18 @@ class TestPipeline(base.TestCase):
resource_metadata={'cpu_number': 4,
'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,
@ -802,17 +826,24 @@ class TestPipeline(base.TestCase):
pipe.publish_counters(None, counters, None)
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
self.assertEquals(publisher.counters[0], counters[0])
self.assertEquals(publisher.counters[1], counters[1])
for i in xrange(4):
self.assertEquals(publisher.counters[i], counters[i])
pipe.flush(None, None)
self.assertEqual(len(publisher.counters), 3)
cpu_util = publisher.counters[-1]
self.assertEqual(len(publisher.counters), 6)
cpu_util = publisher.counters[4]
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, 'type'), counter.TYPE_GAUGE)
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):
self._do_test_rate_of_change_conversion(120000000000,