<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Monsyne+Dragon</id>
		<title>OpenStack - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Monsyne+Dragon"/>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/wiki/Special:Contributions/Monsyne_Dragon"/>
		<updated>2026-07-13T03:18:15Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Stackforge_Namespace_Retirement&amp;diff=91499</id>
		<title>Stackforge Namespace Retirement</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Stackforge_Namespace_Retirement&amp;diff=91499"/>
				<updated>2015-09-30T20:49:42Z</updated>
		
		<summary type="html">&lt;p&gt;Monsyne Dragon: /* Active Projects to Move */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Background ===&lt;br /&gt;
&lt;br /&gt;
The stackforge/ git namespace is being retired, and active projects are being moved to the openstack/ namespace.  See this mailing list post for [http://lists.openstack.org/pipermail/openstack-dev/2015-August/071816.html full background].  These changes are scheduled to occur on October 17, 2015.&lt;br /&gt;
&lt;br /&gt;
There are two lists below, one for active projects that should be moved, and a second for inactive projects that should become read-only.  Please update them to add your project to the correct list.&lt;br /&gt;
&lt;br /&gt;
=== Active Projects to Move ===&lt;br /&gt;
Active stackforge projects that wish to move into the openstack/ namespace should be added to this list.  Projects in this list will be automatically moved by the Infrastructure team to openstack/ on October 17.  Please note that no other renames can happen during this move -- projects will strictly be moved from stackforge/ to openstack/ with their existing names.  &lt;br /&gt;
&lt;br /&gt;
* aeromancer&lt;br /&gt;
* anvil&lt;br /&gt;
* bansho&lt;br /&gt;
* blazar&lt;br /&gt;
* blazar-nova&lt;br /&gt;
* cathead&lt;br /&gt;
* ceilometer-powervm&lt;br /&gt;
* ceilometer-zvm&lt;br /&gt;
* cerberus&lt;br /&gt;
* cerberus-dashboard&lt;br /&gt;
* cl-openstack-client&lt;br /&gt;
* cloudcafe&lt;br /&gt;
* cloud-init&lt;br /&gt;
* cloudbase-init&lt;br /&gt;
* clouddocs-maven-plugin&lt;br /&gt;
* cloudkitty&lt;br /&gt;
* cloudkitty-dashboard&lt;br /&gt;
* cloudpulse&lt;br /&gt;
* cloudroast&lt;br /&gt;
* cloudv-ostf-adapter&lt;br /&gt;
* cognitive&lt;br /&gt;
* compass-adapters&lt;br /&gt;
* compass-core&lt;br /&gt;
* compass-specs&lt;br /&gt;
* compass-web&lt;br /&gt;
* compute-hyperv&lt;br /&gt;
* designate-msdnsagent&lt;br /&gt;
* devstack-plugin-glusterfs&lt;br /&gt;
* devstack-plugin-sheepdog&lt;br /&gt;
* doc8&lt;br /&gt;
* dox&lt;br /&gt;
* drbd-devstack&lt;br /&gt;
* driverlog&lt;br /&gt;
* ec2-api&lt;br /&gt;
* ec2-driver&lt;br /&gt;
* entropy&lt;br /&gt;
* faafo&lt;br /&gt;
* flame&lt;br /&gt;
* freezer&lt;br /&gt;
* freezer-api&lt;br /&gt;
* freezer-web-ui&lt;br /&gt;
* fuel-agent&lt;br /&gt;
* fuel-astute&lt;br /&gt;
* fuel-dev-tools&lt;br /&gt;
* fuel-devops&lt;br /&gt;
* fuel-docs&lt;br /&gt;
* fuel-library&lt;br /&gt;
* fuel-main&lt;br /&gt;
* fuel-mirror&lt;br /&gt;
* fuel-nailgun-agent&lt;br /&gt;
* fuel-octane&lt;br /&gt;
* fuel-ostf&lt;br /&gt;
* fuel-ostf-plugin&lt;br /&gt;
* fuel-plugin-availability-zones&lt;br /&gt;
* fuel-plugin-calamari&lt;br /&gt;
* fuel-plugin-calico&lt;br /&gt;
* fuel-plugin-ceilometer-redis&lt;br /&gt;
* fuel-plugin-cinder-netapp&lt;br /&gt;
* fuel-plugin-cisco-aci&lt;br /&gt;
* fuel-plugin-contrail&lt;br /&gt;
* fuel-plugin-dbaas-trove&lt;br /&gt;
* fuel-plugin-detach-database&lt;br /&gt;
* fuel-plugin-detach-keystone&lt;br /&gt;
* fuel-plugin-detach-rabbitmq&lt;br /&gt;
* fuel-plugin-elasticsearch-kibana&lt;br /&gt;
* fuel-plugin-external-emc&lt;br /&gt;
* fuel-plugin-external-glusterfs&lt;br /&gt;
* fuel-plugin-external-zabbix&lt;br /&gt;
* fuel-plugin-glance-nfs&lt;br /&gt;
* fuel-plugin-ha-fencing&lt;br /&gt;
* fuel-plugin-influxdb-grafana&lt;br /&gt;
* fuel-plugin-ironic&lt;br /&gt;
* fuel-plugin-ldap&lt;br /&gt;
* fuel-plugin-lma-collector&lt;br /&gt;
* fuel-plugin-lma-infrastructure-alerting&lt;br /&gt;
* fuel-plugin-mellanox&lt;br /&gt;
* fuel-plugin-midonet&lt;br /&gt;
* fuel-plugin-neutron-fwaas&lt;br /&gt;
* fuel-plugin-neutron-lbaas&lt;br /&gt;
* fuel-plugin-neutron-vpnaas&lt;br /&gt;
* fuel-plugin-nova-nfs&lt;br /&gt;
* fuel-plugin-nsxv&lt;br /&gt;
* fuel-plugin-opendaylight&lt;br /&gt;
* fuel-plugin-saltstack&lt;br /&gt;
* fuel-plugin-solidfire-cinder&lt;br /&gt;
* fuel-plugin-swiftstack&lt;br /&gt;
* fuel-plugin-tintri-cinder&lt;br /&gt;
* fuel-plugin-tls&lt;br /&gt;
* fuel-plugin-vmware-dvs&lt;br /&gt;
* fuel-plugin-vxlan&lt;br /&gt;
* fuel-plugin-zabbix-monitoring-emc&lt;br /&gt;
* fuel-plugin-zabbix-monitoring-extreme-networks&lt;br /&gt;
* fuel-plugin-zabbix-snmptrapd&lt;br /&gt;
* fuel-plugins&lt;br /&gt;
* fuel-qa&lt;br /&gt;
* fuel-specs&lt;br /&gt;
* fuel-stats&lt;br /&gt;
* fuel-upgrade&lt;br /&gt;
* fuel-web&lt;br /&gt;
* gce-api&lt;br /&gt;
* gerrit-dash-creator&lt;br /&gt;
* git-upstream&lt;br /&gt;
* golang-client&lt;br /&gt;
* group-based-policy&lt;br /&gt;
* group-based-policy-automation&lt;br /&gt;
* group-based-policy-specs&lt;br /&gt;
* group-based-policy-ui&lt;br /&gt;
* intel-nfv-ci-tests&lt;br /&gt;
* merlin&lt;br /&gt;
* monasca-agent&lt;br /&gt;
* monasca-api&lt;br /&gt;
* monasca-ceilometer&lt;br /&gt;
* monasca-common&lt;br /&gt;
* monasca-log-api&lt;br /&gt;
* monasca-notification&lt;br /&gt;
* monasca-persister&lt;br /&gt;
* monasca-statsd&lt;br /&gt;
* monasca-thresh&lt;br /&gt;
* monasca-ui&lt;br /&gt;
* monasca-vagrant&lt;br /&gt;
* monitoring-for-openstack&lt;br /&gt;
* namos&lt;br /&gt;
* nerd-reviewer&lt;br /&gt;
* networking-6wind&lt;br /&gt;
* networking-bagpipe-l2&lt;br /&gt;
* networking-brocade&lt;br /&gt;
* networking-hyperv&lt;br /&gt;
* networking-ovs-dpdk&lt;br /&gt;
* networking-zvm&lt;br /&gt;
* nova-docker&lt;br /&gt;
* nova-powervm&lt;br /&gt;
* nova-solver-scheduler&lt;br /&gt;
* nova-zvm-virt-driver&lt;br /&gt;
* ooi&lt;br /&gt;
* opencafe&lt;br /&gt;
* ops-tags-team&lt;br /&gt;
* osprofiler&lt;br /&gt;
* ospurge&lt;br /&gt;
* packstack&lt;br /&gt;
* poppy&lt;br /&gt;
* proliantutils&lt;br /&gt;
* puppet-autossh&lt;br /&gt;
* puppet-ceph&lt;br /&gt;
* puppet-n1k-vsm&lt;br /&gt;
* puppet-setproxy&lt;br /&gt;
* puppet-surveil&lt;br /&gt;
* python-blazarclient&lt;br /&gt;
* python-cerberusclient&lt;br /&gt;
* python-cloudkittyclient&lt;br /&gt;
* python-cloudpulseclient&lt;br /&gt;
* python-cognitiveclient&lt;br /&gt;
* python-fuelclient&lt;br /&gt;
* python-group-based-policy-client &lt;br /&gt;
* python-jenkins&lt;br /&gt;
* python-monascaclient&lt;br /&gt;
* python-openstacksdk&lt;br /&gt;
* python-rackclient&lt;br /&gt;
* python-senlinclient&lt;br /&gt;
* python-sticksclient&lt;br /&gt;
* python-surveilclient&lt;br /&gt;
* python-tackerclient&lt;br /&gt;
* python-watcherclient&lt;br /&gt;
* rack&lt;br /&gt;
* requests-mock&lt;br /&gt;
* sahara-ci-config&lt;br /&gt;
* senlin&lt;br /&gt;
* senlin-dashboard&lt;br /&gt;
* shaker&lt;br /&gt;
* sqlalchemy-migrate&lt;br /&gt;
* surveil&lt;br /&gt;
* surveil-specs&lt;br /&gt;
* stackalytics&lt;br /&gt;
* stacktach&lt;br /&gt;
* stacktach-klugman&lt;br /&gt;
* stacktach-notification-utils&lt;br /&gt;
* stacktach-notigen&lt;br /&gt;
* stacktach-quince&lt;br /&gt;
* stacktach-quincy&lt;br /&gt;
* stacktach-sandbox&lt;br /&gt;
* stacktach-shoebox&lt;br /&gt;
* stacktach-simport&lt;br /&gt;
* stacktach-stackdistiller&lt;br /&gt;
* stacktach-timex&lt;br /&gt;
* stacktach-winchester&lt;br /&gt;
* sticks&lt;br /&gt;
* sticks-dashboard&lt;br /&gt;
* swift3&lt;br /&gt;
* swiftonfile&lt;br /&gt;
* swift-ceph-backend&lt;br /&gt;
* tacker&lt;br /&gt;
* tacker-horizon&lt;br /&gt;
* tacker-specs&lt;br /&gt;
* tap-as-a-service&lt;br /&gt;
* telcowg-usecases&lt;br /&gt;
* terracotta&lt;br /&gt;
* third-party-ci-tools&lt;br /&gt;
* tricircle&lt;br /&gt;
* turbo-hipster&lt;br /&gt;
* vmtp&lt;br /&gt;
* watcher&lt;br /&gt;
* wsme&lt;br /&gt;
* xenapi-os-testing&lt;br /&gt;
* xstatic-d3&lt;br /&gt;
* xstatic-angular-sanitize&lt;br /&gt;
* xstatic-bootstrap-datepicker&lt;br /&gt;
* xstatic-angular-gettext &lt;br /&gt;
* xstatic-bootswatch &lt;br /&gt;
* xstatic-angular-cookies &lt;br /&gt;
* xstatic-bootstrap-scss&lt;br /&gt;
* xstatic-angular-smart-table&lt;br /&gt;
* xstatic-angular-fileupload&lt;br /&gt;
* xstatic-angular-bootstrap&lt;br /&gt;
* xstatic-angular&lt;br /&gt;
* xstatic-angular-mock&lt;br /&gt;
* xstatic-angular-lrdragndrop&lt;br /&gt;
* xstatic-roboto-fontface &lt;br /&gt;
* xstatic-jquery.quicksearch&lt;br /&gt;
* xstatic-mdi&lt;br /&gt;
* xstatic-rickshaw&lt;br /&gt;
* xstatic-magic-search &lt;br /&gt;
* xstatic-font-awesome &lt;br /&gt;
* xstatic-hogan &lt;br /&gt;
* xstatic-spin&lt;br /&gt;
* xstatic-jasmine&lt;br /&gt;
* xstatic-jquery-migrate&lt;br /&gt;
* xstatic-jquery-migrate&lt;br /&gt;
* xstatic-jsencrypt&lt;br /&gt;
* yaql&lt;br /&gt;
&lt;br /&gt;
=== Inactive Projects to Retire ===&lt;br /&gt;
Inactive projects that should be retired should be added to this list.  These projects will have a commit merged removing their content and replacing it with a message indicating the project is no longer maintained and will become read-only in Gerrit.&lt;br /&gt;
&lt;br /&gt;
* cachemonkey&lt;br /&gt;
* compass-monit&lt;br /&gt;
* congressmiddleware&lt;br /&gt;
* fuel-provision&lt;br /&gt;
* fuel-tasklib&lt;br /&gt;
* mercador-pub&lt;br /&gt;
* mercador-sub&lt;br /&gt;
* MRaaS&lt;br /&gt;
* networking-portforwarding&lt;br /&gt;
* openstackdroid&lt;br /&gt;
* python-mercadorclient&lt;br /&gt;
* rubick&lt;br /&gt;
* sahara-guestagent&lt;br /&gt;
* libra&lt;br /&gt;
* logaas&lt;br /&gt;
* python-libraclient&lt;br /&gt;
* python-rallyclient&lt;br /&gt;
* cookbook-pacemaker&lt;br /&gt;
* puppet-openstack&lt;br /&gt;
* puppet-openstack_dev_env&lt;br /&gt;
* puppet_openstack_builder&lt;br /&gt;
* puppet-openstack-cloud&lt;br /&gt;
* tripleo-ansible&lt;br /&gt;
* kickstack&lt;br /&gt;
* packstack-vagrant&lt;br /&gt;
* haos&lt;br /&gt;
* novaimagebuilder&lt;br /&gt;
* radar&lt;/div&gt;</summary>
		<author><name>Monsyne Dragon</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Ceilometer/blueprints/event-triggers&amp;diff=31065</id>
		<title>Ceilometer/blueprints/event-triggers</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Ceilometer/blueprints/event-triggers&amp;diff=31065"/>
				<updated>2013-09-30T21:02:32Z</updated>
		
		<summary type="html">&lt;p&gt;Monsyne Dragon: Design of the Event Triggers system for Ceilometer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction: =&lt;br /&gt;
Triggers are designed to make it easy to aggregate data from events that occur over time. Many processes in OpenStack will create Notifications as they proceed. These will be represented as Events within Ceilometer. Such processes may take place over a long period of time, possibly hours, and the notifications may be emitted from many different OpenStack nodes, and even different systems within OpenStack, such as Compute, or Image storage. They may be processed by multiple different Collector nodes in a Ceilometer installation, and due to the trade-offs of reliable messaging within AMQP, may not be received in order.&lt;br /&gt;
&lt;br /&gt;
In order to properly aggregate statistics from these sets of events, we need to collect a set of events we are interested in over time, once we have the ones we need, we need to order them by their timestamps, and process them as a batch. If we never receive all of the events we need, such as when there is a failure in the process we are trying to gather information on, we will need to expire the list we have collected, and possibly perform alternate processing, such as updating failure statistics. &lt;br /&gt;
&lt;br /&gt;
Triggers accomplish this. They allow for collecting a list of relevant events over a period of time, detecting when we have all of the events we need, properly ordering them, then processing them using an event pipeline (as defined in the Event Pipelines blueprint: https://blueprints.launchpad.net/ceilometer/+spec/notification-pipelines). They also allow for processing of what events we may have collected through an alternate event pipeline if we fail to collect all of the events we need in an appropriate period of time. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Terminology: =&lt;br /&gt;
== Trigger definition: ==&lt;br /&gt;
A configuration for a class of triggers. The definition acts as a template that trigger instances are created from. It defines the name, distinguished_by traits, pipelines, expiration, matching criteria, etc.&lt;br /&gt;
&lt;br /&gt;
== Trigger instance: ==&lt;br /&gt;
A specific instance of a trigger, persisted in the datastore, with a list of events. It has:&lt;br /&gt;
&lt;br /&gt;
* '''first_event''': The timestamp of the earliest event in the event list.&lt;br /&gt;
* '''last_event''': The timestamp of the latest event in the event list. This is updated when a new event is matched.&lt;br /&gt;
* '''expire_timestamp''': The actual time when this trigger instance will expire. It is derived from either the first_event timestamp or the last_event timestamp via the time expression set in the definition's expiration field. It is updated if the timestamp it's based on changes.&lt;br /&gt;
* '''fire_timestamp''': The actual time when the trigger will fire. This is set based on the current time, plus any fire_delay, if the trigger's firing criteria are met. &lt;br /&gt;
* '''name''': The name of the trigger from it's definition.&lt;br /&gt;
* '''state''': Triggers can be in ''ACTIVE'', ''READY_TO_FIRE'', ''READY_TO_EXPIRE'', ''FIRING'', ''EXPIRING'', ''ERROR'', or ''EXPIRE_ERROR'' states.&lt;br /&gt;
* and list of '''distinguished_by''' traits and values.&lt;br /&gt;
&lt;br /&gt;
== Time expression: ==&lt;br /&gt;
A simple DSL, like a regex for time comparisons. Time expressions can be absolute like ''first@00:00'' (meaning midnight on the day of the first event), or relative, like ''last+3h ''(3 hours after the last event). They can be based on the last event's timestamp or the first event's timestamp. These can be used to set trigger expiration, or matching values for datetime traits. For matches, you can use a single time expression to match a specific timestamp, or a time range (which is just two time expressions separated by “to”, such as “''first@00:00 to last+2h''” )&lt;br /&gt;
&lt;br /&gt;
== Criteria:  ==&lt;br /&gt;
A description of a pattern to match events against. These are basically a hash which includes: '''event_type''', which can be wildcarded, '''timestamp''', which can be matched with a time expression, and a list of trait names and values, which can be compared to constants, or expressions. Fire criteria can also have '''number''', which is the number of events matching a given criteria that must be in the trigger's list of events for it to fire. Criteria are used for: ''match_criteria'', which determine what events to collect, ''fire_criteria'', which determine when we have the events we need to fire, and ''load_criteria'', which describe historical events we may need to load from the datastore. &lt;br /&gt;
&lt;br /&gt;
== Event pipeline:  ==&lt;br /&gt;
A pipeline for processing events (see [https://blueprints.launchpad.net/ceilometer/+spec/notification-pipelines https://blueprints.launchpad.net/ceilometer/+spec/notification-pipelines]) Once we have the needed events, the event pipelines do the actual processing. Triggers can send events to a pipeline listed as a ''fire_pipeline'', when the triggers fire criteria is matched, or optionally, an ''expire_pipeline'', if the trigger expires without firing. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Defining the triggers: =&lt;br /&gt;
A trigger definition has the following fields:&lt;br /&gt;
&lt;br /&gt;
* '''name''': A unique name to identify the trigger&lt;br /&gt;
* '''distinguished_by''': A list of traits which distinguish this trigger. A unique trigger instance (with it's own list of events) is created for each unique combination of distinguishing traits. If trigger “''instance_create”'' is distinguished by ''instance_id'', then there will be a separate “''instance_create''&amp;quot; trigger instance created for each unique ''instance_id'' in events that match the trigger's criteria. &lt;br /&gt;
* '''expiration''': Time expression, sets when the trigger expires. can be specified relative to the first (earliest) event in the event list or the last (latest) For example, if the expiration is set to &amp;quot;first+4h&amp;quot; , the trigger will expire 4 hours after the first event matching its match criteria is received. If it's set to &amp;quot;last+2h&amp;quot;, the trigger will expire 2 hours after the last event matching it's criteria is received (and it's expiration clock will be reset every time it receives an event)&lt;br /&gt;
* '''fire_delay''': Number of seconds to wait after the trigger is ready to fire, before it actually fires. (This allows collection of any out-of-order 'straggler' events.) Defaults to 0 &lt;br /&gt;
* '''match_criteria''': A list of criteria for events to match. Each matched event will be placed on the trigger's event list. An event matches if it matches any of the criteria. Each criteria consists of:&lt;br /&gt;
:* '''event_type''': Type of event to match. May be wild carded using glob-style wildcards. &lt;br /&gt;
:* '''timestamp''': Time range of event timestamp to match &lt;br /&gt;
:* '''traits''': Hash of traits to match. hash is trait_name: value. Value may be a constant or an expression, such as: &lt;br /&gt;
::* &amp;quot;&amp;gt; 10&amp;quot;  &lt;br /&gt;
::* &amp;lt;nowiki&amp;gt;&amp;quot;&amp;lt; 1&amp;quot; &amp;lt;/nowiki&amp;gt;  &lt;br /&gt;
::* &amp;quot;is NULL&amp;quot; (event does NOT have the trait)  &lt;br /&gt;
::* &amp;quot;is not NULL&amp;quot; (event has the trait, regardless of value)  &lt;br /&gt;
::* a time expression (for date time traits)  &lt;br /&gt;
::* a time range (also for date time traits)&amp;lt;br/&amp;gt; The distinguished_by traits for the trigger are automatically added to each criterion's traits. To match a given criterion, all of an the traits specified must match. &lt;br /&gt;
* '''fire_criteria''': Describes what events must be present in the trigger's event list for the trigger to fire. Similar to the match criteria, but fire criteria has one additional option:&lt;br /&gt;
:* '''number''': There must be at least this many events that match this criterion for the trigger to fire. Defaults to 1.&lt;br /&gt;
* '''load_criteria''': Additional, historical, events may be loaded from the datastore prior to the trigger's running of it's event pipelines, (either firing or expiring). The syntax is the same as for match_criteria. These events will be added to the trigger's event list just before running the pipeline(s)&lt;br /&gt;
* '''fire_pipeline''': Name of an event pipeline to send the events to when the trigger fires. The events in the event list are sorted according to timestamp, and sent to that event pipeline&lt;br /&gt;
* '''expire_pipeline''': An optional name of a pipeline that events will be sent to if the trigger expires. If such a pipeline is listed, then events are sent to that pipeline when the trigger's expiration time has passed. &lt;br /&gt;
&lt;br /&gt;
= Trigger Flow: =&lt;br /&gt;
There are four main processes to the trigger system: Processing incoming events, time-based execution for trigger firing and expiration, running the fire pipeline for firing triggers, and running the expire pipeline for expiring triggers. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Incoming Event: ==&lt;br /&gt;
An Event comes into the system, either from a converted Notification, or from other systems (such as Alarms) that may generate Events. It is passed to the Dispatchers, and the DB dispatcher persists the event to the datastore (rejecting duplicates by message_id along the way). It is then passed to the Trigger Manager. The trigger manager checks the event against the list of trigger definitions to see if the event matches any. For each definition the event matches, the trigger manager then determines the set of distinguishing trait values from that event, and checks the datastore to see if there is an existing, non-expired trigger instance in the ''ACTIVE'' state that matches. If there is no existing trigger instance, one will be created in the ''ACTIVE'' state and persisted to the datastore, with it's distinguishing trait values and first event timestamp derived from the Event. In either case, the Event's id is then added to that trigger instance's event list, and the trigger instance's last event timestamp is set from the event's timestamp. The trigger instance's expire_timestamp will then be (re)calculated based on it's first_event or last_event timestamp, as appropriate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwords, any trigger instances created/changed by the event, that do not already have their fire_timestamp set, are checked to see if their firing criteria is met. For any that have met their firing criteria, the trigger instance's fire_timestamp is set to the current time, plus any fire delay period. Firing of the triggers is done through a timestamp in order to allow for a firing delay to collect any out-of order events. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Time-Based Trigger Firing/Expiration: ==&lt;br /&gt;
The fire/expire job is run as a background thread in the Collector. (or it could be a separate process). It performs two tasks in a loop indefinitely. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First it fires triggers whose fire_timestamp has past. A limited sized batch of triggers whose state is ''ACTIVE'' and whose fire_timestamp is less than the current time are loaded from the datastore. The list of triggers is iterated in random order, each one is set to the ''READY_TO_FIRE'' state, and an rpc cast is made to the collector's fire_trigger method with the trigger's id. An rpc cast is made to spread the work across multiple workers. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, it then expires triggers whose expire time has past. A batch of triggers whose state is ''ACTIVE'', and whose expire time has past (and that have a null fire_timestamp), are loaded, and iterated in random order. Each is set to the ''READY_TO_EXPIRE'' state, and an rpc cast to expire_trigger with the trigger's id is made. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If neither of the jobs two tasks has anything to process, it sleeps for a short period (a second or so). The job is designed so that multiple jobs can run simultaneously, for scaling. Because the trigger states use a mechanism to synchronize between workers (see Trigger States below), the jobs will not step on each other. Also, the methods called via rpc are deliberately designed so that calling expire or fire multiple times on the same trigger will not run its fire or expiration more than once. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Firing trigger: ==&lt;br /&gt;
An rpc request comes in to fire a given trigger instance. The trigger instance is loaded from the datastore, and it is checked to make sure it is in a ''READY_TO_FIRE'' state. (If not, the request is ignored). The trigger instance is set to a ''FIRING'' state. All of the events in the trigger's event list are loaded from the datastore. If there is any load criteria, the criteria is used to construct a query to the datastore to load additional events. The combined list of events is sorted by timestamp, earliest to latest, and any duplicates removed. The firing pipeline is loaded by the Event Pipeline manager, and the combined list of events is sent to that pipeline. Once the events are successfully finished processing through the pipeline, the trigger instance is deleted. If the pipeline throws an error while processing, the error is logged, and the trigger instance is set to an ''ERROR'' state. (An error in the pipeline is likely due to a code error, and should be investigated to file a bug.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Expiring Trigger: ==&lt;br /&gt;
An rpc request is received to expire a given trigger instance. The trigger instance is loaded from the datastore, and checked to make sure it is in the ''READY_TO_EXPIRE'' state. (if not, the request is ignored). The trigger is set to the ''EXPIRING'' state. If there is an expire pipeline, events are loaded from the event list and any load_criteria. The event loading proceeds the same as when firing, and the events are sent to the expire pipeline. If there is an error, the trigger is set to an ''EXPIRE_ERROR'' state. If the trigger is not in an error state, it is then deleted. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Note: Trigger States: ==&lt;br /&gt;
The trigger instance's state is synchronized to prevent multiple workers stepping on each other. This can be done with a simple optimistic locking protocol in the datastore, or through some form of external atomic state machine if a suitable one is available.&lt;/div&gt;</summary>
		<author><name>Monsyne Dragon</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=DuplicateWorkCeilometer&amp;diff=28877</id>
		<title>DuplicateWorkCeilometer</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=DuplicateWorkCeilometer&amp;diff=28877"/>
				<updated>2013-08-26T18:32:55Z</updated>
		
		<summary type="html">&lt;p&gt;Monsyne Dragon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Preventing Duplicate Work in Ceilometer  ==&lt;br /&gt;
=== aka &amp;quot;Retry Semantics&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Or ... &amp;quot;What happens when Step 4 of a 10 Step Pipeline fails?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Here's a common use case in Ceilometer (and, most parts of OpenStack for that matter):&lt;br /&gt;
&lt;br /&gt;
# We have some work to do that will take several steps. We could fail anywhere along the way. &lt;br /&gt;
# If we fail, we may get called again by the service that initiated the action. &lt;br /&gt;
# We don't want to redo the steps we've already done. Instead, we'd like to retry just the part that failed. Redo'ing previous work could have disastrous ramifications: &lt;br /&gt;
:* writing duplicate records to a database, &lt;br /&gt;
:* sending a notice to a downstream user/service thousands of times, &lt;br /&gt;
:* performing an expensive calculation over and over DDOS'ing ourselves, etc.&lt;br /&gt;
&lt;br /&gt;
Currently in CM, we have the the following major components:&lt;br /&gt;
* The collector&lt;br /&gt;
* The dispatcher&lt;br /&gt;
* The pipeline&lt;br /&gt;
* Alarm states&lt;br /&gt;
* and, coming soon, the trigger pipeline&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The problem with the above use case manifests itself in the dispatcher, the pipeline and will in the trigger pipeline. The collector is pretty dumb now thanks to the dispatcher. &lt;br /&gt;
&lt;br /&gt;
The way I was hoping to prevent this problem is:&lt;br /&gt;
# the collector would re-publish to a new CM exchange for each downstream component that needs to do some unit of work. This could be a pipeline plugin, a dispatcher plugin or a trigger pipeline plugin. &lt;br /&gt;
:''dhellmann'' - Does ceilometer need to republish, or should we set up a different queue for each pipeline? That way the message broker will handle the messages and redelivery if the pipeline raises an exception, but the collector won't be a bottleneck to creating those new messages.&lt;br /&gt;
::''swalsh'': depends. If it's the same datatype, there would be 1 queue per notification. If the pipeline component produced a new datatype (like an Event producing 3 new Samples), there would be a publication required for each Sample.&lt;br /&gt;
# Each plugin would do its work and use the normal queue ack(), reject(), requeue() semantics of the queuing engine to deal with failures.&lt;br /&gt;
# This means that each plugin is responsible for detecting if it has already run or not. For some entities, such as events, this is easy since there is a unique message_id per event. But let's say that event generates 10 samples, we would need to repeatably produce a unique id for each sample based on that event id. For things like publishing, that gets very difficult since there is no related database record.&lt;br /&gt;
&lt;br /&gt;
The downside with always going back to the queuing system is the large amount of chatter it will produce. Consider, 1 event that produces 10 meters, each with their own 3-step pipeline doing complex calculations and outbound publishing. That gets expensive quickly. &lt;br /&gt;
&lt;br /&gt;
What we need is some way to say &amp;quot;I've done this step already&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Some possibilities:&lt;br /&gt;
# Each pipeline would manage the retry semantics for the pipeline. If any step fails, the pipeline manager would retry starting at the failed step. This is tricky since we would need to have a context object to persist and pass back to the failed plugin during the retry. &lt;br /&gt;
# Ditch the pipeline model. The collector would call a dispatcher when a particular event comes in. The dispatcher would do some work and either:&lt;br /&gt;
## ack and republish a new event to a new exchange, or&lt;br /&gt;
## requeue the event, or&lt;br /&gt;
## reject the event&lt;br /&gt;
# For non-pipeline stuff (the alarm state), we sort of need a persistent state-machine anyway. Rather than reinvent this for every component a reusable state machine library would be preferred (perhaps like the one the orchestration/state-management team is working on). Something that has schema-defined transitions with proper timeouts &amp;amp; persistence handled along each transition. A collection of enums and a snarl of if-statements is not a good state machine. I think this state machine library could also be used for the pipeline management as well. &lt;br /&gt;
&lt;br /&gt;
:''dhellmann'' - The steps of the pipeline are meant to be relatively inexpensive transformations, not full processing. So each pipeline is massaging the data before taking the final action, which is the thing that might be reasonably expected to fail (publishing, writing to a db, whatever). Do we have (or envision) any transformations that might &amp;quot;fail&amp;quot; if they see the same data twice? Is it good enough to document that they are expected to be implemented in a way so they can avoid such issues?&lt;br /&gt;
::''sandywalsh'' - in our experience the intermediate steps are generally the expensive ones, the final steps are relatively lightweight. We've seen that there are some pretty complex queries involved when a significant event occurs (a .end or the end of a long sequence, for example). These can fail in a number of ways, but db timeouts are common, likewise with uncaught divide-by-zeros, etc. The final step (writing to the db, emailing a summary, etc) are pretty light relatively. That said, I think we have to assume things could fail anywhere for any reason. Currently, I'm happy with it failing and the queue growing until we can figure it out, but as we get more distributed (more collectors, more pipelines to carry the load) things are going to have to self-heal. &lt;br /&gt;
:::''mdragon'' - Having some kind of persistent state machine will definitely be needed for the triggers work, so that will help there.  I see the pipelines (both the current sample pipelines, and the forthcoming event-pipelines) as fairly idempotent up to the point of the final persist/publish step. Basically, you do the various transformations, altering/adding items, and until you persist those changes, they can be redone safely.  Part of the idea of the triggers is to encourage this. Instead of a transformer loading a bunch of related events from a persistant store directly, the trigger waits til you have all of the needed events, loads them from the datastore, and sends them into a processing pipeline as a batch, so you have (hopefully) all of the data there that you need. That said, some of the transformations may be involved. My worry about persisting each step along the way is: What happens if step 5 fails because step 2 screwed up?&lt;br /&gt;
&lt;br /&gt;
A lightweight state machine engine that supports atomic updates is what we need. This could be backed by a database with good transaction support or something like zookeeper. Something like memcache wouldn't have locking we need. Either way the backend for this piece should be pluggable. We should chat with Josh Harlow to find out where they are with their effort and help out there if possible. &lt;br /&gt;
&lt;br /&gt;
Additional problems:&lt;br /&gt;
* the problem of a single  plugin generating N items before failing on the N+1 th item. My gut says we simply need to persist for each step of the generator. :/&lt;/div&gt;</summary>
		<author><name>Monsyne Dragon</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Ceilometer/blueprints/configurable-event-definitions&amp;diff=28631</id>
		<title>Ceilometer/blueprints/configurable-event-definitions</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Ceilometer/blueprints/configurable-event-definitions&amp;diff=28631"/>
				<updated>2013-08-22T22:44:22Z</updated>
		
		<summary type="html">&lt;p&gt;Monsyne Dragon: Created page with &amp;quot;== Introduction ==  Ceilometer's Events are currently fairly limited, as the traits added are pretty minimal, and the conversion is hardcoded, which makes things difficult for...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Ceilometer's Events are currently fairly limited, as the traits added are pretty minimal, and the conversion is hardcoded, which makes things difficult for people deploying Ceilometer, who may have different needs for what data they want to process and store.&lt;br /&gt;
&lt;br /&gt;
In order to make it easier to allow users to extract what they need, we should add a method of converting Notifications to Events that can be driven from a configuration file.&lt;br /&gt;
This will include descriptions of how to map fields in the notification body to Traits, and optional plugins for doing any programmatic translations (splitting a string, forcing case, etc.)&lt;br /&gt;
The mapping of notification to events will be defined per event_type, which can be wildcarded. Traits are added to events if the corresponding fields in the notification exist and are non-null. (As a special case, an empty string is considered null for non-text traits. This is due to some openstack projects (mostly Nova) using empty string for null dates.)&lt;br /&gt;
&lt;br /&gt;
Current behavior is preserved: If the definitions file is not present, a warning will be logged, but an empty set of definitions will be assumed.&lt;br /&gt;
By default, any notifications that do not have an event definition in the definitions file for them will be converted to events with a set of minimal, default traits. &lt;br /&gt;
This can be changed by setting a flag in the ceilometer.conf file. If this is set to True, then any notifications that don't have events defined for them in the file will be dropped. This can be what you want, the notification system is quite chatty by design (notifications philosophy is &amp;quot;tell us everything, we'll ignore what we don't need&amp;quot;), so you may want to ignore the noisier ones if you don't use them.  &lt;br /&gt;
&lt;br /&gt;
There is a set of default traits (all are TEXT type) that will be added to all events if the notification has the relevant data:&lt;br /&gt;
* message_id:   (All notifications should have this) notification's uuid&lt;br /&gt;
* service:  (All notifications should have this) notification's publisher&lt;br /&gt;
* tenant_id&lt;br /&gt;
* request_id&lt;br /&gt;
These do not have to be specified in the event definition, they are automatically added, but their definitions can be overridden for a given event_type.&lt;br /&gt;
&lt;br /&gt;
== Configuration Settings == &lt;br /&gt;
&lt;br /&gt;
There are two configuration settings in ceilometer.conf that affect event conversions:&lt;br /&gt;
* allow_dropping_of_notifications: (Default: False) If set to True, then notifications with no matching event definition will be dropped. (Notifications will '''only''' be dropped if this is True)&lt;br /&gt;
* event_definitions_cfg_file: (Default: &amp;quot;event_definitions.yaml&amp;quot;) Name of event definitions config file (yaml format) &lt;br /&gt;
&lt;br /&gt;
== Definitions file format == &lt;br /&gt;
&lt;br /&gt;
The event definitions file is in YAML format. It consists of a list of event definitions, which are mappings. Order is significant, the list of definitions is scanned in '''reverse''' order (last definition in the file to the first), to find a definition which matches the notification's event_type.  That definition will be used to generate the Event. The reverse ordering is done because it is common to want the have a more general wildcarded definition (such as ''compute.instance.*'' ) with a set of traits common to all of those events, with a few more specific event definitions (like ''compute.instance.exists'') afterward that have all of the above traits, plus a few more. This lets you put the general definition first, followed by the specific ones, and use YAML mapping include syntax to avoid copying all of the trait definitions. &lt;br /&gt;
&lt;br /&gt;
=== Event Definitions ===&lt;br /&gt;
&lt;br /&gt;
Each event definition is a mapping with two keys (both required):&lt;br /&gt;
* '''event_type''':  This is a list (or a string, which will be taken as a 1 element list) of event_types this definition will handle. These can be wildcarded with unix shell glob syntax. An exclusion listing (starting with a '!') will exclude any types listed from matching. If ONLY exclusions are listed, the definition will match anything not matching the exclusions.&lt;br /&gt;
* '''traits''':  This is a mapping, the keys are the trait names, and the values are trait definitions.&lt;br /&gt;
&lt;br /&gt;
=== Trait Definitions ===&lt;br /&gt;
&lt;br /&gt;
Each trait definition is a mapping with the following keys:&lt;br /&gt;
* '''type''' (optional): The data type for this trait. (as a string). Valid options are: ''text'', ''int'', ''float'', and ''datetime''. defaults to ''text'' if not specified.&lt;br /&gt;
* '''fields''':  A path specification for the field(s) in the notification you wish to extract for this trait. Specifications can be written to match multiple possible fields, the value for the trait will be derived from the matching fields that exist and have a non-null values in the notification. By default the value will be the first such field. (plugins can alter that, if they wish). This is nomally a string, but, for convenience, it can be specified as a list of specifications, which will match the fields for all of them. (See Field Path Specifications for more info on this syntax.)&lt;br /&gt;
* '''plugin''' (optional): This is a mapping (For convenience, this value can also be specified as a string, which is interpreted as a the name of a plugin, to be loaded with no parameters) with the following keys:&lt;br /&gt;
** '''name''': (string) name of a plugin to load&lt;br /&gt;
** '''parameters''': (optional) Mapping of keyword arguments to pass to the plugin on initialization. (See documentation on each plugin to see what arguments it accepts.)&lt;br /&gt;
  &lt;br /&gt;
=== Field Path Specifications ===&lt;br /&gt;
&lt;br /&gt;
The path specifications define which fields in the JSON notification body are extracted to provide the value for a given trait.&lt;br /&gt;
The paths can be specified with a dot syntax (e.g. ''payload.host''). Square bracket syntax (e.g. ''payload[host]'') is also supported. In either case, if the key for the field you are looking for contains special characters, like '.', it will need to be quoted (with double or single quotes) like so:&lt;br /&gt;
&lt;br /&gt;
          payload.image_meta.'org.openstack__1__architecture'&lt;br /&gt;
&lt;br /&gt;
The syntax used for the field specification is a variant of JSONPath, and is fairly flexible. (see: https://github.com/kennknowles/python-jsonpath-rw for more info)&lt;br /&gt;
&lt;br /&gt;
=== Example Definitions file ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
- event_type: compute.instance.*&lt;br /&gt;
  traits: &amp;amp;instance_traits&lt;br /&gt;
    user_id:&lt;br /&gt;
      fields: payload.user_id&lt;br /&gt;
    instance_id:&lt;br /&gt;
      fields: payload.instance_id&lt;br /&gt;
    host:&lt;br /&gt;
      fields: publisher_id&lt;br /&gt;
      plugin:&lt;br /&gt;
        name: split&lt;br /&gt;
        parameters:&lt;br /&gt;
          segment: 1&lt;br /&gt;
          max_split: 1&lt;br /&gt;
    service_name:&lt;br /&gt;
      fields: publisher_id&lt;br /&gt;
      plugin: split&lt;br /&gt;
    instance_type_id:&lt;br /&gt;
      type: int&lt;br /&gt;
      fields: payload.instance_type_id&lt;br /&gt;
    os_architecture:&lt;br /&gt;
      fields: payload.image_meta.'org.openstack__1__architecture'&lt;br /&gt;
    launched_at:&lt;br /&gt;
      type: datetime&lt;br /&gt;
      fields: payload.launched_at&lt;br /&gt;
    deleted_at:&lt;br /&gt;
      type: datetime&lt;br /&gt;
      fields: payload.deleted_at&lt;br /&gt;
- event_type: &lt;br /&gt;
    - compute.instance.exists&lt;br /&gt;
    - compute.instance.update&lt;br /&gt;
  traits:&lt;br /&gt;
    &amp;lt;&amp;lt;: *instance_traits&lt;br /&gt;
    audit_period_beginning:&lt;br /&gt;
      type: datetime&lt;br /&gt;
      fields: payload.audit_period_beginning&lt;br /&gt;
    audit_period_ending:&lt;br /&gt;
      type: datetime&lt;br /&gt;
      fields: payload.audit_period_ending&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Trait plugins ==&lt;br /&gt;
&lt;br /&gt;
Trait plugins can be used to do simple programmatic conversions on the value in a notification field, like splitting a string, lowercasing a value, converting a screwball date into ISO format, or the like. They are initialized with the parameters from the trait definition, if any, which can customize their behavior for a given trait. They are called with a list of all matching fields from the notification, so they can derive a value from multiple fields. The plugin will be called even if there is no fields found matching the field path(s), this lets a plugin set a default value, if needed. A plugin can also reject a value by returning ''None'', which will cause the trait not to be added. If the plugin returns anything other than ''None'', the trait's value will be set from whatever the plugin returned (coerced to the appropriate type for the trait).&lt;/div&gt;</summary>
		<author><name>Monsyne Dragon</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=NotificationEventExamples&amp;diff=20232</id>
		<title>NotificationEventExamples</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=NotificationEventExamples&amp;diff=20232"/>
				<updated>2013-04-10T15:56:49Z</updated>
		
		<summary type="html">&lt;p&gt;Monsyne Dragon: /* Periodic Notifications: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Notification Examples and Quick Reference: =&lt;br /&gt;
== Tips: ==&lt;br /&gt;
* Notifications generated by Nova are generated in JSON format, and placed on an AMQP queue.&lt;br /&gt;
* An external app, such as Yagi can format them into ATOM format and publish them as a feed.&lt;br /&gt;
* Notifications can be immediate notifications, which are generated when a specific event happens, or periodic notifications, which cover usage over a period of time.&lt;br /&gt;
* Currently most notifications are immediate, with the &amp;quot;compute.instance.exists&amp;quot; event being the only periodic event so far.&lt;br /&gt;
* Notifications all contain some metadata, (such as event type, and message id), and payload which varies depending on message type.&lt;br /&gt;
* Nova will often emit two immediate notifications for many tasks, one as the beginning of a lengthy task, such as instance create, and one upon successful completion of that task. The event types will distinguish the two.&lt;br /&gt;
&lt;br /&gt;
== Examples: ==&lt;br /&gt;
=== Immediate Notifications: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{&amp;quot;event_type&amp;quot;: &amp;quot;compute.instance.resize.confirm.start&amp;quot;,&lt;br /&gt;
 &amp;quot;timestamp&amp;quot;: &amp;quot;2012-03-12 17:01:29.899834&amp;quot;,&lt;br /&gt;
 &amp;quot;message_id&amp;quot;: &amp;quot;1234653e-ce46-4a82-979f-a9286cac5258&amp;quot;,&lt;br /&gt;
 &amp;quot;priority&amp;quot;: &amp;quot;INFO&amp;quot;,&lt;br /&gt;
 &amp;quot;publisher_id&amp;quot;: &amp;quot;compute.compute-1-2-3-4&amp;quot;,&lt;br /&gt;
 &amp;quot;payload&amp;quot;: {&amp;quot;state_description&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;display_name&amp;quot;: &amp;quot;testserver&amp;quot;,&lt;br /&gt;
            &amp;quot;memory_mb&amp;quot;: 512,&lt;br /&gt;
            &amp;quot;disk_gb&amp;quot;: 20,&lt;br /&gt;
            &amp;quot;tenant_id&amp;quot;: &amp;quot;12345&amp;quot;,&lt;br /&gt;
            &amp;quot;created_at&amp;quot;: &amp;quot;2012-03-12 16:55:17&amp;quot;,&lt;br /&gt;
            &amp;quot;instance_type_id&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;instance_id&amp;quot;: &amp;quot;abcbd165-fd41-4fd7-96ac-d70639a042c1&amp;quot;,&lt;br /&gt;
            &amp;quot;instance_type&amp;quot;: &amp;quot;512MB instance&amp;quot;,&lt;br /&gt;
            &amp;quot;state&amp;quot;: &amp;quot;active&amp;quot;,&lt;br /&gt;
            &amp;quot;user_id&amp;quot;: &amp;quot;67890&amp;quot;,&lt;br /&gt;
            &amp;quot;launched_at&amp;quot;: &amp;quot;2012-03-12 16:57:29&amp;quot;,&lt;br /&gt;
            &amp;quot;image_ref_url&amp;quot;: &amp;quot;http://127.0.0.1:9292/images/a1b2c3b4-575f-4381-9c6d-fcd3b7d07d17&amp;quot;}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{&amp;quot;event_type&amp;quot;: &amp;quot;compute.instance.create.end&amp;quot;,&lt;br /&gt;
 &amp;quot;timestamp&amp;quot;: &amp;quot;2012-03-12 17:00:24.156710&amp;quot;,&lt;br /&gt;
 &amp;quot;message_id&amp;quot;: &amp;quot;00004e00-8da5-4c39-8ffb-c94ed0b5278c&amp;quot;,&lt;br /&gt;
 &amp;quot;priority&amp;quot;: &amp;quot;INFO&amp;quot;,&lt;br /&gt;
 &amp;quot;publisher_id&amp;quot;: &amp;quot;compute.compute-1-5-6-7&amp;quot;,&lt;br /&gt;
 &amp;quot;payload&amp;quot;: {&amp;quot;state_description&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;testserver&amp;quot;,&lt;br /&gt;
             &amp;quot;memory_mb&amp;quot;: 512,&lt;br /&gt;
             &amp;quot;disk_gb&amp;quot;: 20,&lt;br /&gt;
             &amp;quot;tenant_id&amp;quot;: &amp;quot;12345&amp;quot;,&lt;br /&gt;
             &amp;quot;created_at&amp;quot;: &amp;quot;2012-03-12 16:58:32&amp;quot;,&lt;br /&gt;
             &amp;quot;instance_type_id&amp;quot;: 2,&lt;br /&gt;
             &amp;quot;instance_id&amp;quot;: &amp;quot;abcdef01-7b76-4b43-9143-fb2385df48a3&amp;quot;,&lt;br /&gt;
             &amp;quot;instance_type&amp;quot;: &amp;quot;512MB instance&amp;quot;,&lt;br /&gt;
             &amp;quot;state&amp;quot;: &amp;quot;active&amp;quot;,&lt;br /&gt;
             &amp;quot;user_id&amp;quot;: &amp;quot;67890&amp;quot;,&lt;br /&gt;
             &amp;quot;fixed_ips&amp;quot;:&lt;br /&gt;
                 [{&amp;quot;floating_ips&amp;quot;: [],&lt;br /&gt;
                   &amp;quot;meta&amp;quot;: {},&lt;br /&gt;
                   &amp;quot;type&amp;quot;: &amp;quot;fixed&amp;quot;,&lt;br /&gt;
                   &amp;quot;version&amp;quot;: 6,&lt;br /&gt;
                   &amp;quot;address&amp;quot;: &amp;quot;fe80::1234:5678&amp;quot;},&lt;br /&gt;
                  {&amp;quot;floating_ips&amp;quot;: [],&lt;br /&gt;
                   &amp;quot;meta&amp;quot;: {},&lt;br /&gt;
                   &amp;quot;type&amp;quot;: &amp;quot;fixed&amp;quot;,&lt;br /&gt;
                   &amp;quot;version&amp;quot;: 4, &amp;quot;address&amp;quot;: &amp;quot;127.0.1.1&amp;quot;},&lt;br /&gt;
                  {&amp;quot;floating_ips&amp;quot;: [],&lt;br /&gt;
                   &amp;quot;meta&amp;quot;: {},&lt;br /&gt;
                   &amp;quot;type&amp;quot;: &amp;quot;fixed&amp;quot;,&lt;br /&gt;
                   &amp;quot;version&amp;quot;: 4,&lt;br /&gt;
                   &amp;quot;address&amp;quot;: &amp;quot;10.180.0.151&amp;quot;}],&lt;br /&gt;
             &amp;quot;launched_at&amp;quot;: &amp;quot;2012-03-12 17:00:23.998518&amp;quot;,&lt;br /&gt;
             &amp;quot;image_ref_url&amp;quot;: &amp;quot;http://127.0.0.1:9292/images/12345678-201f-4600-b5a1-0b97e2b1cb31&amp;quot;}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Periodic Notifications: ===&lt;br /&gt;
* These notifications cover events, such as usage over a range of time. The period covered by such an event is called the audit period. Generally, these periodic notifications are generated by a a periodic task in the worker process (i.e. nova-compute) or a cronjob once per audit period from cron. Nova has the notion of a system-wide audit period set in it's config file. Nova will collect and aggregate statistics, such as bandwidth usage over that period. When the periodic events are generated, they will be generated for the most recently completed audit period. (Note that the timing of audit periods is *not* affected by when the script or task is run.)&lt;br /&gt;
&lt;br /&gt;
System audit period: This is configured in Novas config file under the &amp;quot;instance_usage_audit_period&amp;quot; option.&lt;br /&gt;
&lt;br /&gt;
* Valid audit periods are:&lt;br /&gt;
  hour     Each hour, for example &amp;quot;2012-03-01 01:00UTC&amp;quot; to &amp;quot;2012-03-01 02:00UTC&amp;quot;.&lt;br /&gt;
* May be suffixed with @&amp;lt;number&amp;gt; to specify minute of hour. (for example hour@30 for 01:30UTC-02:30UTC)&lt;br /&gt;
  day      Daily. For example &amp;quot;2012-03-01 00:00UTC&amp;quot; to &amp;quot;2012-03-02 00:00UTC&amp;quot;&lt;br /&gt;
* May be suffixed with @&amp;lt;number&amp;gt; to specify hour of day. (for example day@6 for &amp;quot;2012-03-01 06:00UTC&amp;quot; to &amp;quot;2012-03-02 06:00UTC&amp;quot;)&lt;br /&gt;
  month    Monthly. For example: &amp;quot;2012-03-01 00:00UTC&amp;quot; to &amp;quot;2012-04-01 00:00UTC&amp;quot;.&lt;br /&gt;
* May be suffixed with @&amp;lt;number&amp;gt; to specify day of month. (for example month@15 for &amp;quot;2012-03-15 00:00UTC&amp;quot; to &amp;quot;2012-04-15 00:00UTC&amp;quot;)&lt;br /&gt;
  year     Yearly. For example: &amp;quot;2011-01-01 00:00UTC&amp;quot; to &amp;quot;2012-01-01 00:00UTC&amp;quot;.&lt;br /&gt;
* May be suffixed with @&amp;lt;number&amp;gt; to specify month. (for example year@4 for &amp;quot;2011-04-01 00:00UTC&amp;quot; to &amp;quot;2012-04-01 00:00UTC&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{&amp;quot;event_type&amp;quot;: &amp;quot;compute.instance.exists&amp;quot;,&lt;br /&gt;
 &amp;quot;timestamp&amp;quot;: &amp;quot;2012-03-13 17:01&amp;quot;,&lt;br /&gt;
 &amp;quot;message_id&amp;quot;: &amp;quot;0ab1ac0a-2867-402d-83c7-d7087262470c&amp;quot;,&lt;br /&gt;
 &amp;quot;priority&amp;quot;: &amp;quot;INFO&amp;quot;,&lt;br /&gt;
 &amp;quot;publisher_id&amp;quot;: &amp;quot;api.node-127-0-1-42&amp;quot;,&lt;br /&gt;
 &amp;quot;payload&amp;quot;: {&amp;quot;state_description&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;testserver&amp;quot;,&lt;br /&gt;
             &amp;quot;memory_mb&amp;quot;: 512,&lt;br /&gt;
             &amp;quot;disk_gb&amp;quot;: 20,&lt;br /&gt;
             &amp;quot;audit_period_beginning&amp;quot;: &amp;quot;2012-03-12 06:00:00&amp;quot;,&lt;br /&gt;
             &amp;quot;audit_period_ending&amp;quot;:   &amp;quot;2012-03-13 06:00:00&amp;quot;,&lt;br /&gt;
             &amp;quot;tenant_id&amp;quot;: &amp;quot;12345&amp;quot;,&lt;br /&gt;
             &amp;quot;created_at&amp;quot;: &amp;quot;2012-03-12 16:55:17&amp;quot;,&lt;br /&gt;
             &amp;quot;instance_type_id&amp;quot;: 2,&lt;br /&gt;
             &amp;quot;bandwidth&amp;quot;: {&amp;quot;public&amp;quot;: {&amp;quot;bw_in&amp;quot;: 12342000, &amp;quot;bw_out&amp;quot;: 987654321},&lt;br /&gt;
                           &amp;quot;private&amp;quot;: {&amp;quot;bw_in&amp;quot;: 0, &amp;quot;bw_out&amp;quot;: 0}},&lt;br /&gt;
             &amp;quot;instance_id&amp;quot;: &amp;quot;8888eeee-f1d0-4fd7-96ac-d70639a042c1&amp;quot;,&lt;br /&gt;
             &amp;quot;instance_type&amp;quot;: &amp;quot;512MB instance&amp;quot;,&lt;br /&gt;
             &amp;quot;state&amp;quot;: &amp;quot;active&amp;quot;,&lt;br /&gt;
             &amp;quot;user_id&amp;quot;: &amp;quot;67890&amp;quot;,&lt;br /&gt;
             &amp;quot;launched_at&amp;quot;: &amp;quot;2012-03-12 16:57:29&amp;quot;,&lt;br /&gt;
             &amp;quot;image_ref_url&amp;quot;: &amp;quot;http://127.0.0.1:9292/images/a3a2a1a0-575f-4381-9c6d-fcd3b7d07d17&amp;quot;}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed explanation of example:&lt;br /&gt;
&lt;br /&gt;
This is a compute.instance.exists event (currently the only periodic event we have).&lt;br /&gt;
&lt;br /&gt;
These are generated periodically, one event for each instance active during the most recently completed audit period.&lt;br /&gt;
&lt;br /&gt;
These can be used to synchronize an external system's picture of what instances a nova installation has running. This info can be obtained from the compute.instance.(create|delete).end events, but exists allows you to do instance accounting without looking at notification data more than 1 audit period old. This event also contains bandwidth usage data.&lt;br /&gt;
&lt;br /&gt;
Some of the data in this specific event:&lt;br /&gt;
&lt;br /&gt;
* '''timestamp''':     This specific event was generated at 17:01 utc on March 13th (presumably when the cronjob ran)&lt;br /&gt;
* '''audit_period_(beginning|ending)''': It covers the audit period from 06:00 utc on March 12th, thru the same time on March 13th. (our example system is set for an audit period of &amp;quot;day@6&amp;quot;)&lt;br /&gt;
* '''created_at''':     Our example instance was requested to be created at 16:55:17 on March 12th&lt;br /&gt;
* '''launched_at''':     It actually booted up at 16:57:29 on March 12th&lt;br /&gt;
* '''bandwidth''':       Our example instance has two virtual network interfaces. In this audit period, the interface plugged into the network named &amp;quot;public&amp;quot; received 12.3MB of traffic. It transmitted 987.6MB. The interface plugged into the network named &amp;quot;private&amp;quot; did not receive or transmit any data.&lt;/div&gt;</summary>
		<author><name>Monsyne Dragon</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=NotificationEventExamples&amp;diff=20231</id>
		<title>NotificationEventExamples</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=NotificationEventExamples&amp;diff=20231"/>
				<updated>2013-04-10T15:54:58Z</updated>
		
		<summary type="html">&lt;p&gt;Monsyne Dragon: /* Periodic Notifications: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Notification Examples and Quick Reference: =&lt;br /&gt;
== Tips: ==&lt;br /&gt;
* Notifications generated by Nova are generated in JSON format, and placed on an AMQP queue.&lt;br /&gt;
* An external app, such as Yagi can format them into ATOM format and publish them as a feed.&lt;br /&gt;
* Notifications can be immediate notifications, which are generated when a specific event happens, or periodic notifications, which cover usage over a period of time.&lt;br /&gt;
* Currently most notifications are immediate, with the &amp;quot;compute.instance.exists&amp;quot; event being the only periodic event so far.&lt;br /&gt;
* Notifications all contain some metadata, (such as event type, and message id), and payload which varies depending on message type.&lt;br /&gt;
* Nova will often emit two immediate notifications for many tasks, one as the beginning of a lengthy task, such as instance create, and one upon successful completion of that task. The event types will distinguish the two.&lt;br /&gt;
&lt;br /&gt;
== Examples: ==&lt;br /&gt;
=== Immediate Notifications: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{&amp;quot;event_type&amp;quot;: &amp;quot;compute.instance.resize.confirm.start&amp;quot;,&lt;br /&gt;
 &amp;quot;timestamp&amp;quot;: &amp;quot;2012-03-12 17:01:29.899834&amp;quot;,&lt;br /&gt;
 &amp;quot;message_id&amp;quot;: &amp;quot;1234653e-ce46-4a82-979f-a9286cac5258&amp;quot;,&lt;br /&gt;
 &amp;quot;priority&amp;quot;: &amp;quot;INFO&amp;quot;,&lt;br /&gt;
 &amp;quot;publisher_id&amp;quot;: &amp;quot;compute.compute-1-2-3-4&amp;quot;,&lt;br /&gt;
 &amp;quot;payload&amp;quot;: {&amp;quot;state_description&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;display_name&amp;quot;: &amp;quot;testserver&amp;quot;,&lt;br /&gt;
            &amp;quot;memory_mb&amp;quot;: 512,&lt;br /&gt;
            &amp;quot;disk_gb&amp;quot;: 20,&lt;br /&gt;
            &amp;quot;tenant_id&amp;quot;: &amp;quot;12345&amp;quot;,&lt;br /&gt;
            &amp;quot;created_at&amp;quot;: &amp;quot;2012-03-12 16:55:17&amp;quot;,&lt;br /&gt;
            &amp;quot;instance_type_id&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;instance_id&amp;quot;: &amp;quot;abcbd165-fd41-4fd7-96ac-d70639a042c1&amp;quot;,&lt;br /&gt;
            &amp;quot;instance_type&amp;quot;: &amp;quot;512MB instance&amp;quot;,&lt;br /&gt;
            &amp;quot;state&amp;quot;: &amp;quot;active&amp;quot;,&lt;br /&gt;
            &amp;quot;user_id&amp;quot;: &amp;quot;67890&amp;quot;,&lt;br /&gt;
            &amp;quot;launched_at&amp;quot;: &amp;quot;2012-03-12 16:57:29&amp;quot;,&lt;br /&gt;
            &amp;quot;image_ref_url&amp;quot;: &amp;quot;http://127.0.0.1:9292/images/a1b2c3b4-575f-4381-9c6d-fcd3b7d07d17&amp;quot;}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{&amp;quot;event_type&amp;quot;: &amp;quot;compute.instance.create.end&amp;quot;,&lt;br /&gt;
 &amp;quot;timestamp&amp;quot;: &amp;quot;2012-03-12 17:00:24.156710&amp;quot;,&lt;br /&gt;
 &amp;quot;message_id&amp;quot;: &amp;quot;00004e00-8da5-4c39-8ffb-c94ed0b5278c&amp;quot;,&lt;br /&gt;
 &amp;quot;priority&amp;quot;: &amp;quot;INFO&amp;quot;,&lt;br /&gt;
 &amp;quot;publisher_id&amp;quot;: &amp;quot;compute.compute-1-5-6-7&amp;quot;,&lt;br /&gt;
 &amp;quot;payload&amp;quot;: {&amp;quot;state_description&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;testserver&amp;quot;,&lt;br /&gt;
             &amp;quot;memory_mb&amp;quot;: 512,&lt;br /&gt;
             &amp;quot;disk_gb&amp;quot;: 20,&lt;br /&gt;
             &amp;quot;tenant_id&amp;quot;: &amp;quot;12345&amp;quot;,&lt;br /&gt;
             &amp;quot;created_at&amp;quot;: &amp;quot;2012-03-12 16:58:32&amp;quot;,&lt;br /&gt;
             &amp;quot;instance_type_id&amp;quot;: 2,&lt;br /&gt;
             &amp;quot;instance_id&amp;quot;: &amp;quot;abcdef01-7b76-4b43-9143-fb2385df48a3&amp;quot;,&lt;br /&gt;
             &amp;quot;instance_type&amp;quot;: &amp;quot;512MB instance&amp;quot;,&lt;br /&gt;
             &amp;quot;state&amp;quot;: &amp;quot;active&amp;quot;,&lt;br /&gt;
             &amp;quot;user_id&amp;quot;: &amp;quot;67890&amp;quot;,&lt;br /&gt;
             &amp;quot;fixed_ips&amp;quot;:&lt;br /&gt;
                 [{&amp;quot;floating_ips&amp;quot;: [],&lt;br /&gt;
                   &amp;quot;meta&amp;quot;: {},&lt;br /&gt;
                   &amp;quot;type&amp;quot;: &amp;quot;fixed&amp;quot;,&lt;br /&gt;
                   &amp;quot;version&amp;quot;: 6,&lt;br /&gt;
                   &amp;quot;address&amp;quot;: &amp;quot;fe80::1234:5678&amp;quot;},&lt;br /&gt;
                  {&amp;quot;floating_ips&amp;quot;: [],&lt;br /&gt;
                   &amp;quot;meta&amp;quot;: {},&lt;br /&gt;
                   &amp;quot;type&amp;quot;: &amp;quot;fixed&amp;quot;,&lt;br /&gt;
                   &amp;quot;version&amp;quot;: 4, &amp;quot;address&amp;quot;: &amp;quot;127.0.1.1&amp;quot;},&lt;br /&gt;
                  {&amp;quot;floating_ips&amp;quot;: [],&lt;br /&gt;
                   &amp;quot;meta&amp;quot;: {},&lt;br /&gt;
                   &amp;quot;type&amp;quot;: &amp;quot;fixed&amp;quot;,&lt;br /&gt;
                   &amp;quot;version&amp;quot;: 4,&lt;br /&gt;
                   &amp;quot;address&amp;quot;: &amp;quot;10.180.0.151&amp;quot;}],&lt;br /&gt;
             &amp;quot;launched_at&amp;quot;: &amp;quot;2012-03-12 17:00:23.998518&amp;quot;,&lt;br /&gt;
             &amp;quot;image_ref_url&amp;quot;: &amp;quot;http://127.0.0.1:9292/images/12345678-201f-4600-b5a1-0b97e2b1cb31&amp;quot;}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Periodic Notifications: ===&lt;br /&gt;
* These notifications cover events, such as usage over a range of time. The period covered by such an event is called the audit period. Generally, these periodic notifications are generated by a a periodic task in the worker process (i.e. nova-compute) or a cronjob once per audit period from cron. Nova has the notion of a system-wide audit period set in it's config file. Nova will collect and aggregate statistics, such as bandwidth usage over that period. When the periodic events are generated, they will be generated for the most recently completed audit period. (Note that the timing of audit periods is *not* affected by when the script or task is run.)&lt;br /&gt;
&lt;br /&gt;
System audit period: This is configured in Novas config file under the &amp;quot;instance_usage_audit_period&amp;quot; option.&lt;br /&gt;
&lt;br /&gt;
* Valid audit periods are:&lt;br /&gt;
** hour     Each hour, for example &amp;quot;2012-03-01 01:00UTC&amp;quot; to &amp;quot;2012-03-01 02:00UTC&amp;quot;.&lt;br /&gt;
*** May be suffixed with @&amp;lt;number&amp;gt; to specify minute of hour. (for example hour@30 for 01:30UTC-02:30UTC)&lt;br /&gt;
  day      Daily. For example &amp;quot;2012-03-01 00:00UTC&amp;quot; to &amp;quot;2012-03-02 00:00UTC&amp;quot;&lt;br /&gt;
* May be suffixed with @&amp;lt;number&amp;gt; to specify hour of day. (for example day@6 for &amp;quot;2012-03-01 06:00UTC&amp;quot; to &amp;quot;2012-03-02 06:00UTC&amp;quot;)&lt;br /&gt;
  month    Monthly. For example: &amp;quot;2012-03-01 00:00UTC&amp;quot; to &amp;quot;2012-04-01 00:00UTC&amp;quot;.&lt;br /&gt;
* May be suffixed with @&amp;lt;number&amp;gt; to specify day of month. (for example month@15 for &amp;quot;2012-03-15 00:00UTC&amp;quot; to &amp;quot;2012-04-15 00:00UTC&amp;quot;)&lt;br /&gt;
  year     Yearly. For example: &amp;quot;2011-01-01 00:00UTC&amp;quot; to &amp;quot;2012-01-01 00:00UTC&amp;quot;.&lt;br /&gt;
* May be suffixed with @&amp;lt;number&amp;gt; to specify month. (for example year@4 for &amp;quot;2011-04-01 00:00UTC&amp;quot; to &amp;quot;2012-04-01 00:00UTC&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{&amp;quot;event_type&amp;quot;: &amp;quot;compute.instance.exists&amp;quot;,&lt;br /&gt;
 &amp;quot;timestamp&amp;quot;: &amp;quot;2012-03-13 17:01&amp;quot;,&lt;br /&gt;
 &amp;quot;message_id&amp;quot;: &amp;quot;0ab1ac0a-2867-402d-83c7-d7087262470c&amp;quot;,&lt;br /&gt;
 &amp;quot;priority&amp;quot;: &amp;quot;INFO&amp;quot;,&lt;br /&gt;
 &amp;quot;publisher_id&amp;quot;: &amp;quot;api.node-127-0-1-42&amp;quot;,&lt;br /&gt;
 &amp;quot;payload&amp;quot;: {&amp;quot;state_description&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
             &amp;quot;display_name&amp;quot;: &amp;quot;testserver&amp;quot;,&lt;br /&gt;
             &amp;quot;memory_mb&amp;quot;: 512,&lt;br /&gt;
             &amp;quot;disk_gb&amp;quot;: 20,&lt;br /&gt;
             &amp;quot;audit_period_beginning&amp;quot;: &amp;quot;2012-03-12 06:00:00&amp;quot;,&lt;br /&gt;
             &amp;quot;audit_period_ending&amp;quot;:   &amp;quot;2012-03-13 06:00:00&amp;quot;,&lt;br /&gt;
             &amp;quot;tenant_id&amp;quot;: &amp;quot;12345&amp;quot;,&lt;br /&gt;
             &amp;quot;created_at&amp;quot;: &amp;quot;2012-03-12 16:55:17&amp;quot;,&lt;br /&gt;
             &amp;quot;instance_type_id&amp;quot;: 2,&lt;br /&gt;
             &amp;quot;bandwidth&amp;quot;: {&amp;quot;public&amp;quot;: {&amp;quot;bw_in&amp;quot;: 12342000, &amp;quot;bw_out&amp;quot;: 987654321},&lt;br /&gt;
                           &amp;quot;private&amp;quot;: {&amp;quot;bw_in&amp;quot;: 0, &amp;quot;bw_out&amp;quot;: 0}},&lt;br /&gt;
             &amp;quot;instance_id&amp;quot;: &amp;quot;8888eeee-f1d0-4fd7-96ac-d70639a042c1&amp;quot;,&lt;br /&gt;
             &amp;quot;instance_type&amp;quot;: &amp;quot;512MB instance&amp;quot;,&lt;br /&gt;
             &amp;quot;state&amp;quot;: &amp;quot;active&amp;quot;,&lt;br /&gt;
             &amp;quot;user_id&amp;quot;: &amp;quot;67890&amp;quot;,&lt;br /&gt;
             &amp;quot;launched_at&amp;quot;: &amp;quot;2012-03-12 16:57:29&amp;quot;,&lt;br /&gt;
             &amp;quot;image_ref_url&amp;quot;: &amp;quot;http://127.0.0.1:9292/images/a3a2a1a0-575f-4381-9c6d-fcd3b7d07d17&amp;quot;}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed explanation of example:&lt;br /&gt;
&lt;br /&gt;
This is a compute.instance.exists event (currently the only periodic event we have).&lt;br /&gt;
&lt;br /&gt;
These are generated periodically, one event for each instance active during the most recently completed audit period.&lt;br /&gt;
&lt;br /&gt;
These can be used to synchronize an external system's picture of what instances a nova installation has running. This info can be obtained from the compute.instance.(create|delete).end events, but exists allows you to do instance accounting without looking at notification data more than 1 audit period old. This event also contains bandwidth usage data.&lt;br /&gt;
&lt;br /&gt;
Some of the data in this specific event:&lt;br /&gt;
&lt;br /&gt;
* '''timestamp''':     This specific event was generated at 17:01 utc on March 13th (presumably when the cronjob ran)&lt;br /&gt;
* '''audit_period_(beginning|ending)''': It covers the audit period from 06:00 utc on March 12th, thru the same time on March 13th. (our example system is set for an audit period of &amp;quot;day@6&amp;quot;)&lt;br /&gt;
* '''created_at''':     Our example instance was requested to be created at 16:55:17 on March 12th&lt;br /&gt;
* '''launched_at''':     It actually booted up at 16:57:29 on March 12th&lt;br /&gt;
* '''bandwidth''':       Our example instance has two virtual network interfaces. In this audit period, the interface plugged into the network named &amp;quot;public&amp;quot; received 12.3MB of traffic. It transmitted 987.6MB. The interface plugged into the network named &amp;quot;private&amp;quot; did not receive or transmit any data.&lt;/div&gt;</summary>
		<author><name>Monsyne Dragon</name></author>	</entry>

	</feed>