Jump to: navigation, search

Difference between revisions of "Trove/trove-notifications-v2"

(Task Manager Events)
 
(15 intermediate revisions by the same user not shown)
Line 14: Line 14:
 
         This adds the ability to send usage events to an Instance object.
 
         This adds the ability to send usage events to an Instance object.
 
         """
 
         """
  def send_stack_usage_even(self, event_type, **kwargs):
+
        def send_stack_usage_even(self, event_type, **kwargs):
        az = kwargs.pop('az')
+
                az = kwargs.pop('az')
        name = kwargs.pop('name')
+
                name = kwargs.pop('name')
        event_type = 'trove.instance.%s' % event_type
+
                event_type = 'trove.instance.%s' % event_type
        publisher_id = CONF.host
+
                publisher_id = CONF.host
        created_time = timeutils.isotime(self.db_info.created)
+
                created_time = timeutils.isotime(self.db_info.created)
        compute_instance_id = kwargs.pop('compute_instance_id')
+
                compute_instance_id = kwargs.pop('compute_instance_id')
        payload = {'availability_zone': az,
+
                payload = {'availability_zone': az,
                          'created_at': created_time,
+
                                  'created_at': created_time,
                          'name': name,
+
                                  'name': name,
                          'instance_id': self.id,
+
                                  'instance_id': self.id,
                          'instance_name': name,
+
                                  'instance_name': name,
                          'flavor_name': self.new_flavor['name'],
+
                                  'flavor_name': self.new_flavor['name'],
                          'flavor_id': self.new_flavor['id'],
+
                                  'flavor_id': self.new_flavor['id'],
                          'launched_at': created_time,
+
                                  'launched_at': created_time,
                          'compute_instance_id': compute_instance_id,
+
                                  'compute_instance_id': compute_instance_id,
                          'region': CONF.region,
+
                                  'region': CONF.region,
                          'state_description': self.status.description,
+
                                  'state_description': self.status.description,
                          'state': self.status,
+
                                  'state': self.status,
                          'tenant_id': self.tenant_id,
+
                                  'tenant_id': self.tenant_id,
                          'user_id': self.context.user,
+
                                  'user_id': self.context.user,
                          'service_id': self._get_service_id(self.datastore_version.manager, CONF.notification_service_id)}
+
                                  'service_id': self._get_service_id(
 +
                                                self.datastore_version.manager,  
 +
                                                CONF.notification_service_id)}
  
        if CONF.trove_volume_support:
+
                if CONF.trove_volume_support:
                  payload.update({
+
                          payload.update({
                          'volume_size': self.db_info.volume_size,
+
                                  'volume_size': self.db_info.volume_size,
                          'volume_id': self.db_info.volume_id
+
                                  'volume_id': self.db_info.volume_id
                  })
+
                          })
+
                # Update payload with all other kwargs
        # Update payload with all other kwargs
+
                payload.update(kwargs)
        payload.update(kwargs)
+
                LOG.debug(_('Sending event: %(event_type)s, %(payload)s') %
        LOG.debug(_('Sending event: %(event_type)s, %(payload)s') %
+
                                    {'event_type': event_type, 'payload': payload})
        {'event_type': event_type, 'payload': payload})
+
                notifier.notify(self.context, publisher_id, event_type, 'INFO', payload)
        notifier.notify(self.context, publisher_id, event_type, 'INFO', payload)
 
 
</pre>
 
</pre>
  
Line 56: Line 57:
 
Create Events are emitted when a resource is created:
 
Create Events are emitted when a resource is created:
  
<pre>self.send_usage_event('create', instance_size=flavor_ram)</pre>
+
<pre>self.send_usage_event('create', az, flavor, compute_instance_id, name, volume_size)</pre>
  
 
Sample Message:
 
Sample Message:
Line 63: Line 64:
 
{
 
{
 
       'event_type': 'trove.instance.create',
 
       'event_type': 'trove.instance.create',
       'instance_size': 512,
+
       'flavor_name': m1.small,
 +
      'flavor_id': <UUID> or <Integer>,
 
       'tenant_id': <UUID>,
 
       'tenant_id': <UUID>,
 
       'instance_id': <UUID>,
 
       'instance_id': <UUID>,
Line 69: Line 71:
 
       'created_at': UTCDATE,
 
       'created_at': UTCDATE,
 
       'launched_at': UTCDATE,
 
       'launched_at': UTCDATE,
       'nova_instance_id': <UUID>,
+
       'compute_instance_id': <UUID>,
 
       'volume_size': 1,
 
       'volume_size': 1,
       'nova_volume_id': <UUID>
+
       'volume_id': <UUID>,
 +
      'state_description': <String>,
 +
      'state': <String>,
 +
      'user_id': <String>,
 +
      'service_id': <UUID>
 
}
 
}
 
</pre>
 
</pre>
Line 83: Line 89:
 
<pre>
 
<pre>
 
{
 
{
       'event_type': 'trove.instance.modify_volume',
+
       'event_type': 'trove.instance.create',
       'instance_size': 512,
+
       'flavor_name': m1.small,
 +
      'flavor_id': <UUID> or <Integer>,
 
       'tenant_id': <UUID>,
 
       'tenant_id': <UUID>,
 
       'instance_id': <UUID>,
 
       'instance_id': <UUID>,
Line 90: Line 97:
 
       'created_at': UTCDATE,
 
       'created_at': UTCDATE,
 
       'launched_at': UTCDATE,
 
       'launched_at': UTCDATE,
       'modify_at': UTCDATE,
+
       'compute_instance_id': <UUID>,
       'nova_instance_id': <UUID>,
+
       'volume_size': NEW_SIZE,
       'volume_size': 2,
+
      'volume_id': <UUID>,
       'nova_volume_id': <UUID>
+
       'state_description': <String>,
 +
      'state': <String>,
 +
      'user_id': <String>,
 +
       'service_id': <UUID>
 
}
 
}
 
</pre>
 
</pre>
Line 99: Line 109:
 
=== Modify Size (Resize) ===
 
=== Modify Size (Resize) ===
  
<pre>self.instance.send_usage_event('modify_flavor', instance_size=self.new_flavor['ram'], launched_at=self.db_info.created_at, modify_at=self.db_info.modified_at)</pre>
+
<pre>self.instance.send_usage_event('modify_flavor', flavor, launched_at=NOW, modify_at=NOW)</pre>
  
 
Sample::
 
Sample::
Line 105: Line 115:
 
<pre>
 
<pre>
 
{
 
{
       'event_type': 'trove.instance.modify_flavor',
+
       'event_type': 'trove.instance.create',
       'instance_ram': 1024,
+
       'flavor_name': m1.small,
 +
      'flavor_id': <UUID> or <Integer>,
 
       'tenant_id': <UUID>,
 
       'tenant_id': <UUID>,
 
       'instance_id': <UUID>,
 
       'instance_id': <UUID>,
Line 112: Line 123:
 
       'created_at': UTCDATE,
 
       'created_at': UTCDATE,
 
       'launched_at': UTCDATE,
 
       'launched_at': UTCDATE,
      'modify_at': UTCDATE,
 
 
       'compute_instance_id': <UUID>,
 
       'compute_instance_id': <UUID>,
       'volume_size': 2,
+
       'volume_size': NEW_SIZE,
       'volume_id': <UUID>
+
       'volume_id': <UUID>,
 +
      'state_description': <String>,
 +
      'state': <String>,
 +
      'user_id': <String>,
 +
      'service_id': <UUID>
 
}
 
}
 
</pre>
 
</pre>
 
: ''QESTION:'' Do we really need to send [https://github.com/openstack/trove/blob/master/trove/taskmanager/models.py#L102-L116 AZ] inside each notification?
 
 
  
 
=== Delete Event ===
 
=== Delete Event ===
Line 126: Line 137:
 
Delete Events are emitted when a resource is deleted:
 
Delete Events are emitted when a resource is deleted:
  
<pre>self.send_usage_event('delete', deleted_at=self.db_info.deleted_at)</pre>
+
<pre>self.send_usage_event('delete', deleted_at=DELETE_AD)</pre>
  
 
Sample:
 
Sample:
Line 132: Line 143:
 
<pre>
 
<pre>
 
{
 
{
       'event_type': 'trove.instance.delete',
+
       'event_type': 'trove.instance.create',
       'instance_ram': 1024,
+
       'flavor_name': m1.small,
 +
      'flavor_id': <UUID> or <Integer>,
 
       'tenant_id': <UUID>,
 
       'tenant_id': <UUID>,
 
       'instance_id': <UUID>,
 
       'instance_id': <UUID>,
Line 139: Line 151:
 
       'created_at': UTCDATE,
 
       'created_at': UTCDATE,
 
       'launched_at': UTCDATE,
 
       'launched_at': UTCDATE,
      'deleted_at': UTCDATE,
 
 
       'compute_instance_id': <UUID>,
 
       'compute_instance_id': <UUID>,
       'volume_size': 2,
+
       'volume_size': NEW_SIZE,
       'volume_id': <UUID>
+
       'volume_id': <UUID>,
 +
      'state_description': <String>,
 +
      'state': <String>,
 +
      'user_id': <String>,
 +
      'service_id': <UUID>
 +
      'delete_at': UTCDATE
 
}
 
}
 
</pre>
 
</pre>
Line 153: Line 169:
  
 
<pre>
 
<pre>
{    
+
{
       'event_type': 'trove.instance.exists',
+
       'event_type': 'trove.instance.create',
       'instance_ram': 512,
+
       'flavor_name': m1.small,
 +
      'flavor_id': <UUID> or <Integer>,
 
       'tenant_id': <UUID>,
 
       'tenant_id': <UUID>,
 
       'instance_id': <UUID>,
 
       'instance_id': <UUID>,
       'instance_name': 'MyDB',
+
       'instance_name': 'MyDB,
 
       'created_at': UTCDATE,
 
       'created_at': UTCDATE,
 
       'launched_at': UTCDATE,
 
       'launched_at': UTCDATE,
 
       'compute_instance_id': <UUID>,
 
       'compute_instance_id': <UUID>,
       'volume_size': 1,
+
       'volume_size': NEW_SIZE,
       'volume_id': <UUID>
+
       'volume_id': <UUID>,
 +
      'state_description': <String>,
 +
      'state': <String>,
 +
      'user_id': <String>,
 +
      'service_id': <UUID>
 
}
 
}
 
</pre>
 
</pre>

Latest revision as of 10:31, 23 May 2014

Trove Notifications

Trove will emit events for resources as they are manipulated. These events can be used to meter the service and possibly used to calculate bills.

Task Manager Events

Trove taskmanager is responsible for dispatching tasks and sending notification events. Here is a typical example:

    from trove.openstack.common.notifier import api as notifier
    from trove.openstack.common import timeutils
    class NotifyMixin(object):
        """Notification Mixin
        This adds the ability to send usage events to an Instance object.
         """
        def send_stack_usage_even(self, event_type, **kwargs):
                 az = kwargs.pop('az')
                 name = kwargs.pop('name')
                 event_type = 'trove.instance.%s' % event_type
                 publisher_id = CONF.host
                 created_time = timeutils.isotime(self.db_info.created)
                 compute_instance_id = kwargs.pop('compute_instance_id')
                 payload = {'availability_zone': az,
                                   'created_at': created_time,
                                   'name': name,
                                   'instance_id': self.id,
                                   'instance_name': name,
                                   'flavor_name': self.new_flavor['name'],
                                   'flavor_id': self.new_flavor['id'],
                                   'launched_at': created_time,
                                   'compute_instance_id': compute_instance_id,
                                   'region': CONF.region,
                                   'state_description': self.status.description,
                                   'state': self.status,
                                   'tenant_id': self.tenant_id,
                                   'user_id': self.context.user,
                                   'service_id': self._get_service_id(
                                                self.datastore_version.manager, 
                                                CONF.notification_service_id)}

                 if CONF.trove_volume_support:
                          payload.update({
                                   'volume_size': self.db_info.volume_size,
                                   'volume_id': self.db_info.volume_id
                          })
                 # Update payload with all other kwargs
                 payload.update(kwargs)
                 LOG.debug(_('Sending event: %(event_type)s, %(payload)s') %
                                     {'event_type': event_type, 'payload': payload})
                 notifier.notify(self.context, publisher_id, event_type, 'INFO', payload)


Create Event

Create Events are emitted when a resource is created:

self.send_usage_event('create', az, flavor, compute_instance_id, name, volume_size)

Sample Message:

{
      'event_type': 'trove.instance.create',
      'flavor_name': m1.small,
      'flavor_id': <UUID> or <Integer>,
      'tenant_id': <UUID>,
      'instance_id': <UUID>,
      'instance_name': 'MyDB,
      'created_at': UTCDATE,
      'launched_at': UTCDATE,
      'compute_instance_id': <UUID>,
      'volume_size': 1,
      'volume_id': <UUID>,
      'state_description': <String>,
      'state': <String>,
      'user_id': <String>,
      'service_id': <UUID>
}

Modify Volume Size

self.send_usage_event('modify_volume', launched_at=timeutils.isotime(), modify_at=timeutils.isotime(), volume_size=new_size)

Sample::

{
      'event_type': 'trove.instance.create',
      'flavor_name': m1.small,
      'flavor_id': <UUID> or <Integer>,
      'tenant_id': <UUID>,
      'instance_id': <UUID>,
      'instance_name': 'MyDB,
      'created_at': UTCDATE,
      'launched_at': UTCDATE,
      'compute_instance_id': <UUID>,
      'volume_size': NEW_SIZE,
      'volume_id': <UUID>,
      'state_description': <String>,
      'state': <String>,
      'user_id': <String>,
      'service_id': <UUID>
}

Modify Size (Resize)

self.instance.send_usage_event('modify_flavor', flavor, launched_at=NOW, modify_at=NOW)

Sample::

{
      'event_type': 'trove.instance.create',
      'flavor_name': m1.small,
      'flavor_id': <UUID> or <Integer>,
      'tenant_id': <UUID>,
      'instance_id': <UUID>,
      'instance_name': 'MyDB,
      'created_at': UTCDATE,
      'launched_at': UTCDATE,
      'compute_instance_id': <UUID>,
      'volume_size': NEW_SIZE,
      'volume_id': <UUID>,
      'state_description': <String>,
      'state': <String>,
      'user_id': <String>,
      'service_id': <UUID>
}

Delete Event

Delete Events are emitted when a resource is deleted:

self.send_usage_event('delete', deleted_at=DELETE_AD)

Sample:

{
      'event_type': 'trove.instance.create',
      'flavor_name': m1.small,
      'flavor_id': <UUID> or <Integer>,
      'tenant_id': <UUID>,
      'instance_id': <UUID>,
      'instance_name': 'MyDB,
      'created_at': UTCDATE,
      'launched_at': UTCDATE,
      'compute_instance_id': <UUID>,
      'volume_size': NEW_SIZE,
      'volume_id': <UUID>,
      'state_description': <String>,
      'state': <String>,
      'user_id': <String>,
      'service_id': <UUID>
      'delete_at': UTCDATE
}

Exists Event

Exists Events are emitted periodically signifying that the resource exists.

Sample:

{
      'event_type': 'trove.instance.create',
      'flavor_name': m1.small,
      'flavor_id': <UUID> or <Integer>,
      'tenant_id': <UUID>,
      'instance_id': <UUID>,
      'instance_name': 'MyDB,
      'created_at': UTCDATE,
      'launched_at': UTCDATE,
      'compute_instance_id': <UUID>,
      'volume_size': NEW_SIZE,
      'volume_id': <UUID>,
      'state_description': <String>,
      'state': <String>,
      'user_id': <String>,
      'service_id': <UUID>
}