summaryrefslogtreecommitdiff
path: root/ceilometer/compute/notifications.py
diff options
context:
space:
mode:
Diffstat (limited to 'ceilometer/compute/notifications.py')
-rw-r--r--ceilometer/compute/notifications.py51
1 files changed, 41 insertions, 10 deletions
diff --git a/ceilometer/compute/notifications.py b/ceilometer/compute/notifications.py
index 5b59da27..2e243074 100644
--- a/ceilometer/compute/notifications.py
+++ b/ceilometer/compute/notifications.py
@@ -20,9 +20,13 @@
"""Converters for producing compute sample messages from notification events.
"""
+import abc
+import six
+
from oslo.config import cfg
from ceilometer import sample
+from ceilometer.compute import util
from ceilometer import plugin
@@ -50,10 +54,36 @@ class ComputeNotificationBase(plugin.NotificationBase):
]
-class InstanceScheduled(ComputeNotificationBase):
- event_types = ['scheduler.run_instance.scheduled']
+@six.add_metaclass(abc.ABCMeta)
+class UserMetadataAwareInstanceNotificationBase(ComputeNotificationBase):
+ """Consumes notifications containing instance user metadata.
+ """
def process_notification(self, message):
+ instance_properties = self.get_instance_properties(message)
+ if 'metadata' in instance_properties:
+ src_metadata = instance_properties['metadata']
+ del instance_properties['metadata']
+ util.add_reserved_user_metadata(src_metadata, instance_properties)
+ return self.get_sample(message)
+
+ def get_instance_properties(self, message):
+ """Retrieve instance properties from notification payload."""
+ return message['payload']
+
+ @abc.abstractmethod
+ def get_sample(self, message):
+ """Derive sample from notification payload."""
+
+
+class InstanceScheduled(UserMetadataAwareInstanceNotificationBase):
+ event_types = ['scheduler.run_instance.scheduled']
+
+ def get_instance_properties(self, message):
+ """Retrieve instance properties from notification payload."""
+ return message['payload']['request_spec']['instance_properties']
+
+ def get_sample(self, message):
yield sample.Sample.from_notification(
name='instance.scheduled',
type=sample.TYPE_DELTA,
@@ -67,14 +97,15 @@ class InstanceScheduled(ComputeNotificationBase):
message=message)
-class ComputeInstanceNotificationBase(ComputeNotificationBase):
+class ComputeInstanceNotificationBase(
+ UserMetadataAwareInstanceNotificationBase):
"""Convert compute.instance.* notifications into Samples
"""
event_types = ['compute.instance.*']
class Instance(ComputeInstanceNotificationBase):
- def process_notification(self, message):
+ def get_sample(self, message):
yield sample.Sample.from_notification(
name='instance',
type=sample.TYPE_GAUGE,
@@ -87,7 +118,7 @@ class Instance(ComputeInstanceNotificationBase):
class Memory(ComputeInstanceNotificationBase):
- def process_notification(self, message):
+ def get_sample(self, message):
yield sample.Sample.from_notification(
name='memory',
type=sample.TYPE_GAUGE,
@@ -100,7 +131,7 @@ class Memory(ComputeInstanceNotificationBase):
class VCpus(ComputeInstanceNotificationBase):
- def process_notification(self, message):
+ def get_sample(self, message):
yield sample.Sample.from_notification(
name='vcpus',
type=sample.TYPE_GAUGE,
@@ -113,7 +144,7 @@ class VCpus(ComputeInstanceNotificationBase):
class RootDiskSize(ComputeInstanceNotificationBase):
- def process_notification(self, message):
+ def get_sample(self, message):
yield sample.Sample.from_notification(
name='disk.root.size',
type=sample.TYPE_GAUGE,
@@ -126,7 +157,7 @@ class RootDiskSize(ComputeInstanceNotificationBase):
class EphemeralDiskSize(ComputeInstanceNotificationBase):
- def process_notification(self, message):
+ def get_sample(self, message):
yield sample.Sample.from_notification(
name='disk.ephemeral.size',
type=sample.TYPE_GAUGE,
@@ -139,7 +170,7 @@ class EphemeralDiskSize(ComputeInstanceNotificationBase):
class InstanceFlavor(ComputeInstanceNotificationBase):
- def process_notification(self, message):
+ def get_sample(self, message):
instance_type = message.get('payload', {}).get('instance_type')
if instance_type:
yield sample.Sample.from_notification(
@@ -160,7 +191,7 @@ class InstanceDelete(ComputeInstanceNotificationBase):
event_types = ['compute.instance.delete.samples']
- def process_notification(self, message):
+ def get_sample(self, message):
for s in message['payload'].get('samples', []):
yield sample.Sample.from_notification(
name=s['name'],