<?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=Deklan</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=Deklan"/>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/wiki/Special:Contributions/Deklan"/>
		<updated>2026-06-27T23:04:34Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Freezer&amp;diff=127673</id>
		<title>Freezer</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Freezer&amp;diff=127673"/>
				<updated>2016-07-05T20:50:02Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* Core Team */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:SmallTransparent.png|thumbnail|none|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Freezer is a distributed backup restore and disaster recovery as a service platform. It is designed to be multi OS (Linux, Windows, OSX, *BSD), focused on providing efficiency and flexibility for block based backups, file based incremental backups, point-in-time actions, jobs synchronization (i.e. backup synchronization over multiple nodes) and many other features. It is aimed at being useful for all environments, including large ephemeral Clouds.  Documentation and Code can be found at the following locations:&lt;br /&gt;
&lt;br /&gt;
* [http://git.openstack.org/cgit/openstack/freezer/ freezer-agent and scheduler Source Code]&lt;br /&gt;
* [http://git.openstack.org/cgit/openstack/freezer-api/ freezer-api API Source Code]&lt;br /&gt;
* [http://git.openstack.org/cgit/openstack/freezer-dr/ Freezer Disaster Recovery]&lt;br /&gt;
* [http://git.openstack.org/cgit/openstack/freezer-web-ui/ Freezer Horizon Web UI Source Code]&lt;br /&gt;
* [https://launchpad.net/freezer Launchpad]&lt;br /&gt;
&lt;br /&gt;
== Core Team ==&lt;br /&gt;
&lt;br /&gt;
* Fausto Marzi (daemontool)&lt;br /&gt;
* Fabrizio Fresco (felipe)&lt;br /&gt;
* Guillermo Garcia (m3m0)&lt;br /&gt;
* '''[PTL]''' Pierre-Arthur Mathieu (slashme)&lt;br /&gt;
* Eldar Nugaev (reldan)&lt;br /&gt;
* Fabrizio Vanni (vannif)&lt;br /&gt;
* Jonas Pfannschmidt (jonaspf)&lt;br /&gt;
* Saad Zaher (szaher)&lt;br /&gt;
* Deklan Dieterly (ddieterly)&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|  Meetings&lt;br /&gt;
| https://etherpad.openstack.org/p/freezer_meetings Chairman: m3m0 or ddieterly&lt;br /&gt;
|-&lt;br /&gt;
|  IRC &lt;br /&gt;
| #openstack-freezer on Freenode&lt;br /&gt;
|-&lt;br /&gt;
| Mailing List&lt;br /&gt;
| [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev OpenStack dev] list, prefix with [freezer]&lt;br /&gt;
|-&lt;br /&gt;
|  Milestones  &lt;br /&gt;
| https://launchpad.net/freezer/+milestones&lt;br /&gt;
|-&lt;br /&gt;
|  Integration  &lt;br /&gt;
| [[Freezer/Integration]] - Coming soon&lt;br /&gt;
|-&lt;br /&gt;
|  Bug tracker   &lt;br /&gt;
| https://bugs.launchpad.net/freezer&lt;br /&gt;
|- &lt;br /&gt;
| Blueprints&lt;br /&gt;
| https://blueprints.launchpad.net/freezer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Freezer-getting-started Getting Started]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Freezer-installation Installation]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/FreezerDevStack Running Freezer via DevStack - Coming soon]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Freezer-getting-started-with-freezer Getting Started with Freezer]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Freezer-concepts Freezer Concepts]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Freezer-install Installing Freezer]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Freezer-docs Using Freezer]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Freezer-backup-restore Backup and Restore your data]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Freezer-api Freezer API]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Freezer-web-ui Freezer Web UI]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Python-freezerclient Python Freezer Client]&lt;br /&gt;
&lt;br /&gt;
== Contributing ==&lt;br /&gt;
&lt;br /&gt;
A good place to start is by reading at the [[How_To_Contribute]] to OpenStack page.  For information on contributing to Freezer specifically see the [http://docs.openstack.org/developer/freezer/contribute/getting_involved.html Getting Involved] page in the developer documentation.&lt;br /&gt;
&lt;br /&gt;
== Discussions / Etherpads ==&lt;br /&gt;
* [https://etherpad.openstack.org/p/freezer_meetings Weekly meetings notes]&lt;br /&gt;
&lt;br /&gt;
'''Every Thursday there's a weekly meeting starting from 3:00 p.m. UTC on IRC room: openstack-meeting-alt'''&lt;br /&gt;
&lt;br /&gt;
== Automation Details ==&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.openstack.org/wiki/FreezerAutomation Freezer Automation (Chef) - Coming soon]&lt;br /&gt;
&lt;br /&gt;
== Technical Details ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/openstack/freezer/blob/master/README.rst Architecture]&lt;br /&gt;
* [https://wiki.openstack.org/wiki/FreezerFeatures Detailed features list]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Presentations ==&lt;br /&gt;
&lt;br /&gt;
* https://www.openstack.org/summit/vancouver-2015/summit-videos/presentation/freezer-the-openstack-back-up-as-a-service-platform&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
* [https://wiki.openstack.org/wiki/FreezerRoadmap Freezer Roadmap]&lt;br /&gt;
[[category: Backup]]&lt;br /&gt;
&lt;br /&gt;
== miscellaneous ==&lt;br /&gt;
* [https://wiki.openstack.org/wiki/FreezerLogo Logo]&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=88042</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=88042"/>
				<updated>2015-08-13T20:58:03Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
Monasca is a open-source multi-tenant, highly scalable, performant, fault-tolerant monitoring-as-a-service solution that integrates with OpenStack. It uses a REST API for high-speed metrics processing and querying and has a streaming alarm engine and notification engine.&lt;br /&gt;
&lt;br /&gt;
==== Project Launchpad ====&lt;br /&gt;
: https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
==== Team Launchpad ====&lt;br /&gt;
: https://launchpad.net/~monasca&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Operating Monasca: [[Monasca/Operations]]&lt;br /&gt;
: Monasca API Specification: https://github.com/stackforge/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/stackforge/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
: '''Monasca Deep Dive (Paris Summit)'''&lt;br /&gt;
:: Video: https://www.openstack.org/summit/openstack-paris-summit-2014/session-videos/presentation/monasca-deep-dive-monitoring-at-scale&lt;br /&gt;
:: Pdf: https://www.openstack.org/assets/presentation-media/Monasca-Deep-Dive-Paris-Summit.pdf&lt;br /&gt;
&lt;br /&gt;
==== Demo ====&lt;br /&gt;
:Docker based Image useful for demos or a running API to hit from outside: https://registry.hub.docker.com/u/monasca/demo/&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Core'''&lt;br /&gt;
:: Core: https://github.com/stackforge?query=monasca&lt;br /&gt;
:: Ancillary (grafana, installer, etc.): https://github.com/hpcloud-mon&lt;br /&gt;
:: Vagrant Development Environment: https://github.com/stackforge/monasca-vagrant&lt;br /&gt;
::: Scripts to aid in cloning all of our git repos exist in the monasca-vagrant project, monasca-repos.sh and monasca-ansible-repos.sh&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://github.com/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings [[Meetings/Monasca]]&lt;br /&gt;
* [[Mailing Lists|OpenStack Mailing Lists]] use the topic tag [Monasca] openstack-dev has a topic filter available&lt;br /&gt;
* [https://launchpad.net/~monasca Monasca Team Launchpad] monasca@lists.launchpad.net&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
This section describes the overall features.&lt;br /&gt;
&lt;br /&gt;
* A highly performant, scalable, reliable and fault-tolerant Monitoring as a Service (MONaaS) solution that scales to service provider metrics levels of metrics throughput. Performance, scalability and high-availability have been designed in from the start. Can process 100s of thousands of metrics/sec as well as offer data retention periods of greater than a year with no data loss while still processing interactive queries.&lt;br /&gt;
&lt;br /&gt;
* Rest API for storing and querying  metrics and historical information. Most monitoring solution use special transports and protocols, such as CollectD or NSCA (Nagios). In our solution, http is the only protocol used. This simplifies the overall design and also allows for a much richer way of describing the data via dimensions.&lt;br /&gt;
&lt;br /&gt;
* Multi-tenant and authenticated. Metrics are submitted and authenticated using Keystone and stored associated with a tenant ID.&lt;br /&gt;
&lt;br /&gt;
* Metrics defined using a set of (key, value) pairs called dimensions.&lt;br /&gt;
&lt;br /&gt;
* Real-time thresholding and alarming on metrics.&lt;br /&gt;
&lt;br /&gt;
* Compound alarms described using a simple expressive grammar composed of alarm sub-expressions and logical operators.&lt;br /&gt;
&lt;br /&gt;
* Monitoring agent that supports a number of built-in system and service checks and also supports Nagios checks and statsd.&lt;br /&gt;
&lt;br /&gt;
* Open-source monitoring solution built on open-source technologies.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
[[File:monasca-arch-component-diagram.png|Monasca Architecture Component Diagram]]&lt;br /&gt;
* Monitoring Agent (monasca-agent): A modern Python based monitoring agent that consists of several sub-components and supports system metrics, such as cpu utilization and available memory, Nagios plugins, statsd and many built-in checks for services such as MySQL, RabbitMQ, and many others.&lt;br /&gt;
* Monitoring API (monasca-api): A well-defined and documented RESTful API for monitoring that is primarily focused on the following concepts and areas:&lt;br /&gt;
** Metrics: Store and query massive amounts of metrics in real-time.&lt;br /&gt;
** Statistics: Query statistics for metrics.&lt;br /&gt;
** Alarm Definitions: Create, update, query and delete alarm definitions.&lt;br /&gt;
** Alarms: Query and delete the alarm history.&lt;br /&gt;
***Simple expressive grammar for creating compound alarms composed of alarm subexpressions and logical operators.&lt;br /&gt;
***Alarm severities can be associated with alarms.&lt;br /&gt;
***The complete alarm state transition history is stored and queryable which allows for subsequent root cause analysis (RCA) or advanced analytics.&lt;br /&gt;
**Notification Methods: Create and delete notification methods and associate them with alarms, such as email. Supports the ability to notify users directly via email when an alarm state transitions occur.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database. We will look into converting the Persister to a Python component in the future.&lt;br /&gt;
* Transform and Aggregation Engine: Transform metric names and values, such as delta or time-based derivative calculations, and creates new metrics that are published to the Message Queue. The Transform Engine is not available yet.&lt;br /&gt;
* Anomaly and Prediction Engine: Evaluates prediction and anomalies and generates predicted metrics as well as anomaly likelihood and anomaly scores.&lt;br /&gt;
* Threshold Engine (monasca-thresh): Computes thresholds on metrics and publishes alarms to the MessageQ when exceeded. Based on Apache Storm a free and open distributed real-time computation system.&lt;br /&gt;
* Notification Engine (monasca-notification): Consumes alarm state transition messages from the MessageQ and sends notifications, such as emails for alarms. The Notification Engine is Python based.&lt;br /&gt;
* Message Queue: A third-party component that primarily receives published metrics from the Monitoring API and alarm state transition messages from the Threshold Engine that are consumed by other components, such as the Persister and Notification Engine. The Message Queue is also used to publish and consume other events in the system. Currently, a Kafka based MessageQ is supported. Kafka is a high performance, distributed, fault-tolerant, and scalable message queue with durability built-in. We will look at other alternatives, such as RabbitMQ and in-fact in our previous implementation RabbitMQ was supported, but due to performance, scale, durability and high-availability limitiations with RabbitMQ we have moved to Kafka.&lt;br /&gt;
* Metrics and Alarms Database: A third-party component that primarily stores metrics and the alarm state history. Currently, Vertica and InfluxDB are supported.&lt;br /&gt;
* Config Database: A third-party component that stores a lot of the configuration and other information in the system. Currently, MySQL is supported.&lt;br /&gt;
* Monitoring Client (python-monascaclient): A Python command line client and library that communicates and controls the Monitoring API. The Monitoring Client was written using the OpenStack Heat Python client as a framework. The Monitoring Client also has a Python library, &amp;quot;monascaclient&amp;quot; similar to the other OpenStack clients, that can be used to quickly build additional capabilities. The Monitoring Client library is used by the Monitoring UI, Ceilometer publisher, and other components.&lt;br /&gt;
* Alarm Configuration Manager: A Python process that will detect new metrics and configure alarms based on the configuration. It uses the monitoring client library that communicates with the Monitoring API. The Alarm Configuration Manager is a Python Daemon that runs on a configurable interval and detects new metrics that need to be alarmed and creates the alarms.&lt;br /&gt;
* Monitoring UI: A Horizon dashboard for visualizing the overall health and status of an OpenStack cloud.&lt;br /&gt;
* Ceilometer publisher: A multi-publisher plugin for Ceilometer, not shown, that converts and publishes samples to the Monitoring API.&lt;br /&gt;
Most of the components are described in their respective repositories. However, there aren't any repositories for the third-party components used, so we describe some of the relevant details here.&lt;br /&gt;
&lt;br /&gt;
=== Message Schema ===&lt;br /&gt;
[[Monasca/Message Schema]]&lt;br /&gt;
&lt;br /&gt;
=== Message Queue ===&lt;br /&gt;
A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
&lt;br /&gt;
==== Messages ====&lt;br /&gt;
There are several messages that are published and consumed by various components in Monasca via the MessageQ. See [[Monasca/Message Schema|Message Schema]].&lt;br /&gt;
&lt;br /&gt;
=== Metrics and Alarms Database ===&lt;br /&gt;
&lt;br /&gt;
A high-performance analytics database that can store massive amounts of metrics and alarms in real-time and also support interactive queries. Currently Vertica and InfluxDB are supported.&lt;br /&gt;
&lt;br /&gt;
The SQL schema that is used by Vertica is as follows:&lt;br /&gt;
&lt;br /&gt;
* MonMetrics.Measurements: Stores the actual measurements that are sent.&lt;br /&gt;
** id: An integer ID for the measurement.&lt;br /&gt;
** definition_dimensions_id: A reference to DefinitionDimensions.&lt;br /&gt;
** time_stamp&lt;br /&gt;
** value&lt;br /&gt;
* MonMetrics.DefinitionDimensions&lt;br /&gt;
** id: A sha1 hash of (defintion_id, dimension_set_id)&lt;br /&gt;
** definition_id: A reference to the Definitions.id&lt;br /&gt;
** dimension_set_id: A reference to the Dimensions.dimension_set_id&lt;br /&gt;
* MonMetrics.Definitions&lt;br /&gt;
** id: A sha1 hash of the (name, tenant_id, region)&lt;br /&gt;
** name: Name of the metric.&lt;br /&gt;
** tenant_id: The tenant_id that submitted the metric.&lt;br /&gt;
** region: The region the metric was submitted under.&lt;br /&gt;
* MonMetric.Dimensions&lt;br /&gt;
** dimension_set_id: A sha1 hash of the set of dimenions for a metric.&lt;br /&gt;
** name: Name of dimension.&lt;br /&gt;
** value: Value of dimension.&lt;br /&gt;
&lt;br /&gt;
=== Config Database ===&lt;br /&gt;
The config database store all the configuration information. Currently based on MySQL.&lt;br /&gt;
&lt;br /&gt;
The SQL schema is as follows:&lt;br /&gt;
&lt;br /&gt;
* alarm&lt;br /&gt;
** id&lt;br /&gt;
** tenant_id&lt;br /&gt;
** name&lt;br /&gt;
** description&lt;br /&gt;
** expression&lt;br /&gt;
** state&lt;br /&gt;
** actions_enabled&lt;br /&gt;
** created_at&lt;br /&gt;
** updated_at&lt;br /&gt;
** deleted_at&lt;br /&gt;
* alarm_action&lt;br /&gt;
** alarm_id&lt;br /&gt;
** alarm_state&lt;br /&gt;
** action_id&lt;br /&gt;
* notification_method&lt;br /&gt;
** id&lt;br /&gt;
** tenant_id&lt;br /&gt;
** name&lt;br /&gt;
** type&lt;br /&gt;
** address&lt;br /&gt;
** created_at&lt;br /&gt;
** updated_at&lt;br /&gt;
* sub_alarm&lt;br /&gt;
** id&lt;br /&gt;
** alarm_id&lt;br /&gt;
** function&lt;br /&gt;
** metric_name&lt;br /&gt;
** operator&lt;br /&gt;
** threshold&lt;br /&gt;
** period&lt;br /&gt;
** periods&lt;br /&gt;
** state&lt;br /&gt;
** created_at&lt;br /&gt;
** updated_at&lt;br /&gt;
* sub_alarm_dimension&lt;br /&gt;
** sub_alarm_id&lt;br /&gt;
** dimension_name&lt;br /&gt;
** value&lt;br /&gt;
&lt;br /&gt;
== Events  ==&lt;br /&gt;
Support for real-time event stream processing in Monasca is in progress. For more details see the link at, [[Monasca/Events]].&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
== Monitoring ==&lt;br /&gt;
Enablement and usage for monitoring the status of Monasca is under discussion. For more details see the link at, [[Monasca/Monitoring_Of_Monasca]]&lt;br /&gt;
&lt;br /&gt;
== Value Metadata ==&lt;br /&gt;
Adding Metadata to the value of a measurement in Monasca is under discussion. For more details see the link at, [[Monasca/Value_Metadata]]&lt;br /&gt;
&lt;br /&gt;
== Keystone Requirements ==&lt;br /&gt;
Monasca relies on keystone for running and there are requirements about which keystone configuration must exist.&lt;br /&gt;
&lt;br /&gt;
* The endpoint for the api must be registered in keystone as the 'monasca' service.&lt;br /&gt;
* The api must have an admin token to use in verifying the keystone tokens it receives.&lt;br /&gt;
* For each project which uses Monasca two users must exist, one will be in the 'monasca-agent' role and be used by the monasca-agent's running on machines. The other should not be in that role and can be used logging into the UI, using the CLI or for direct queries against the API. &lt;br /&gt;
&lt;br /&gt;
== Post Metric Sequence ==&lt;br /&gt;
&lt;br /&gt;
This section describes the sequence of operations involved in posting a metric to the Monasca API.&lt;br /&gt;
&lt;br /&gt;
[[File:monasca-arch-post-metric-diagram.png|Monasca Architecture Post Metric Diagram]]&lt;br /&gt;
&lt;br /&gt;
# A metric is posted to the Monasca API.&lt;br /&gt;
# The Monasca API authenticates and validates the request and publishes the metric to the the Message Queue.&lt;br /&gt;
# The Persister consumes the metric from the Message Queue and stores in the Metrics Store.&lt;br /&gt;
# The Transform Engine consumes the metrics from the Message Queue, performs transform and aggregation operations on metrics, and publishes metrics that it creates back to Message Queue.&lt;br /&gt;
# The Threshold Engine consumes metrics from the Message Queue and evaluates alarms. If a state change occurs in an alarm, an &amp;quot;alarm-state-transitioned-event&amp;quot; is published to the Message Queue.&lt;br /&gt;
# The Notification Engine consumes &amp;quot;alarm-state-transitioned-events&amp;quot; from the Message Queue, evaluates whether they have a Notification Method associated with it, and sends the appropriate notification, such as email.&lt;br /&gt;
# The Persister consumes the &amp;quot;alarm-state-transitioned-event&amp;quot; from the Message Queue and stores it in the Alarm State History Store.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Comes with a turn-key development environment based on Vagrant, that can be used for quickly deploying on a client system, such as a MAC OS X based system. See https://github.com/stackforge/monasca-vagrant.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://github.com/search?q=monasca&amp;amp;ref=cmdform&lt;br /&gt;
&lt;br /&gt;
= Coding Standards =&lt;br /&gt;
&lt;br /&gt;
* Python: All Python code conforms to the OpenStack standards at, http://docs.openstack.org/developer/hacking/.&lt;br /&gt;
&lt;br /&gt;
* Java: OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google-styleguide.googlecode.com/svn/trunk/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We are in the process of porting to Python and evaluating the performance for the API layer.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Uses a number of underlying technologies:&lt;br /&gt;
&lt;br /&gt;
* Apache Kafka (http://kafka.apache.org): Apache Kafka is publish-subscribe messaging rethought as a distributed commit log. Kafka is a highly performant, distributed, fault-tolerant, and scalable message queue with durability built-in.&lt;br /&gt;
&lt;br /&gt;
* Apache Storm (http://storm.incubator.apache.org/): Apache Storm is a free and open source distributed realtime computation system. Storm makes it easy to reliably process unbounded streams of data, doing for realtime processing what Hadoop did for batch processing.&lt;br /&gt;
&lt;br /&gt;
* ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
&lt;br /&gt;
* MySQL:&lt;br /&gt;
&lt;br /&gt;
* Vagrant (http://www.vagrantup.com/): Vagrant provides easy to configure, reproducible, and portable work environments built on top of industry-standard technology and controlled by a single consistent workflow to help maximize the productivity and flexibility of you and your team.&lt;br /&gt;
&lt;br /&gt;
* Dropwizard (https://dropwizard.github.io/dropwizard/): Dropwizard pulls together stable, mature libraries from the Java ecosystem into a simple, light-weight package that lets you focus on getting things done. Dropwizard has out-of-the-box support for sophisticated configuration, application metrics, logging, operational tools, and much more, allowing you and your team to ship a production-quality web service in the shortest time possible.&lt;br /&gt;
&lt;br /&gt;
* InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies.&lt;br /&gt;
&lt;br /&gt;
* Vertica (http://www.vertica.com): A commercial Enterprise class SQL analytics database that is highly scalable. It offers built-in automatic high-availability and excels at in-database analytics and compressing and storing massive amounts of data. In the HP Public Cloud we use Vertica in a number of areas such as metrics and many other data streams. Currently, we process around 25 K metrics/sec and store them for &amp;gt; 13 month data retention periods. A free version of Vertica that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
you may not use this file except in compliance with the License.&lt;br /&gt;
You may obtain a copy of the License at&lt;br /&gt;
&lt;br /&gt;
    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
&lt;br /&gt;
Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or&lt;br /&gt;
implied.&lt;br /&gt;
See the License for the specific language governing permissions and&lt;br /&gt;
limitations under the License.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:yklogo.png|200px|thumb|left|Monasca uses YourKit Profiler for Java development]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.yourkit.com/ Visit YourKit website for more information]&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=88039</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=88039"/>
				<updated>2015-08-13T20:27:14Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
Monasca is a open-source multi-tenant, highly scalable, performant, fault-tolerant monitoring-as-a-service solution that integrates with OpenStack. It uses a REST API for high-speed metrics processing and querying and has a streaming alarm engine and notification engine.&lt;br /&gt;
&lt;br /&gt;
==== Project Launchpad ====&lt;br /&gt;
: https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
==== Team Launchpad ====&lt;br /&gt;
: https://launchpad.net/~monasca&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Operating Monasca: [[Monasca/Operations]]&lt;br /&gt;
: Monasca API Specification: https://github.com/stackforge/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/stackforge/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
: '''Monasca Deep Dive (Paris Summit)'''&lt;br /&gt;
:: Video: https://www.openstack.org/summit/openstack-paris-summit-2014/session-videos/presentation/monasca-deep-dive-monitoring-at-scale&lt;br /&gt;
:: Pdf: https://www.openstack.org/assets/presentation-media/Monasca-Deep-Dive-Paris-Summit.pdf&lt;br /&gt;
&lt;br /&gt;
==== Demo ====&lt;br /&gt;
:Docker based Image useful for demos or a running API to hit from outside: https://registry.hub.docker.com/u/monasca/demo/&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Core'''&lt;br /&gt;
:: Core: https://github.com/stackforge?query=monasca&lt;br /&gt;
:: Ancillary (grafana, installer, etc.): https://github.com/hpcloud-mon&lt;br /&gt;
:: Vagrant Development Environment: https://github.com/stackforge/monasca-vagrant&lt;br /&gt;
::: Scripts to aid in cloning all of our git repos exist in the monasca-vagrant project, monasca-repos.sh and monasca-ansible-repos.sh&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://github.com/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings [[Meetings/Monasca]]&lt;br /&gt;
* [[Mailing Lists|OpenStack Mailing Lists]] use the topic tag [Monasca] openstack-dev has a topic filter available&lt;br /&gt;
* [https://launchpad.net/~monasca Monasca Team Launchpad] monasca@lists.launchpad.net&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
This section describes the overall features.&lt;br /&gt;
&lt;br /&gt;
* A highly performant, scalable, reliable and fault-tolerant Monitoring as a Service (MONaaS) solution that scales to service provider metrics levels of metrics throughput. Performance, scalability and high-availability have been designed in from the start. Can process 100s of thousands of metrics/sec as well as offer data retention periods of greater than a year with no data loss while still processing interactive queries.&lt;br /&gt;
&lt;br /&gt;
* Rest API for storing and querying  metrics and historical information. Most monitoring solution use special transports and protocols, such as CollectD or NSCA (Nagios). In our solution, http is the only protocol used. This simplifies the overall design and also allows for a much richer way of describing the data via dimensions.&lt;br /&gt;
&lt;br /&gt;
* Multi-tenant and authenticated. Metrics are submitted and authenticated using Keystone and stored associated with a tenant ID.&lt;br /&gt;
&lt;br /&gt;
* Metrics defined using a set of (key, value) pairs called dimensions.&lt;br /&gt;
&lt;br /&gt;
* Real-time thresholding and alarming on metrics.&lt;br /&gt;
&lt;br /&gt;
* Compound alarms described using a simple expressive grammar composed of alarm sub-expressions and logical operators.&lt;br /&gt;
&lt;br /&gt;
* Monitoring agent that supports a number of built-in system and service checks and also supports Nagios checks and statsd.&lt;br /&gt;
&lt;br /&gt;
* Open-source monitoring solution built on open-source technologies.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
[[File:monasca-arch-component-diagram.png|Monasca Architecture Component Diagram]]&lt;br /&gt;
* Monitoring Agent (monasca-agent): A modern Python based monitoring agent that consists of several sub-components and supports system metrics, such as cpu utilization and available memory, Nagios plugins, statsd and many built-in checks for services such as MySQL, RabbitMQ, and many others.&lt;br /&gt;
* Monitoring API (monasca-api): A well-defined and documented RESTful API for monitoring that is primarily focused on the following concepts and areas:&lt;br /&gt;
** Metrics: Store and query massive amounts of metrics in real-time.&lt;br /&gt;
** Statistics: Query statistics for metrics.&lt;br /&gt;
** Alarm Definitions: Create, update, query and delete alarm definitions.&lt;br /&gt;
** Alarms: Query and delete the alarm history.&lt;br /&gt;
***Simple expressive grammar for creating compound alarms composed of alarm subexpressions and logical operators.&lt;br /&gt;
***Alarm severities can be associated with alarms.&lt;br /&gt;
***The complete alarm state transition history is stored and queryable which allows for subsequent root cause analysis (RCA) or advanced analytics.&lt;br /&gt;
**Notification Methods: Create and delete notification methods and associate them with alarms, such as email. Supports the ability to notify users directly via email when an alarm state transitions occur.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database. We will look into converting the Persister to a Python component in the future.&lt;br /&gt;
* Transform and Aggregation Engine: Transform metric names and values, such as delta or time-based derivative calculations, and creates new metrics that are published to the Message Queue. The Transform Engine is not available yet.&lt;br /&gt;
* Anomaly and Prediction Engine: Evaluates prediction and anomalies and generates predicted metrics as well as anomaly likelihood and anomaly scores.&lt;br /&gt;
* Threshold Engine (monasca-thresh): Computes thresholds on metrics and publishes alarms to the MessageQ when exceeded. Based on Apache Storm a free and open distributed real-time computation system.&lt;br /&gt;
* Notification Engine (monasca-notification): Consumes alarm state transition messages from the MessageQ and sends notifications, such as emails for alarms. The Notification Engine is Python based.&lt;br /&gt;
* Message Queue: A third-party component that primarily receives published metrics from the Monitoring API and alarm state transition messages from the Threshold Engine that are consumed by other components, such as the Persister and Notification Engine. The Message Queue is also used to publish and consume other events in the system. Currently, a Kafka based MessageQ is supported. Kafka is a high performance, distributed, fault-tolerant, and scalable message queue with durability built-in. We will look at other alternatives, such as RabbitMQ and in-fact in our previous implementation RabbitMQ was supported, but due to performance, scale, durability and high-availability limitiations with RabbitMQ we have moved to Kafka.&lt;br /&gt;
* Metrics and Alarms Database: A third-party component that primarily stores metrics and the alarm state history. Currently, Vertica and InfluxDB are supported.&lt;br /&gt;
* Config Database: A third-party component that stores a lot of the configuration and other information in the system. Currently, MySQL is supported.&lt;br /&gt;
* Monitoring Client (python-monascaclient): A Python command line client and library that communicates and controls the Monitoring API. The Monitoring Client was written using the OpenStack Heat Python client as a framework. The Monitoring Client also has a Python library, &amp;quot;monascaclient&amp;quot; similar to the other OpenStack clients, that can be used to quickly build additional capabilities. The Monitoring Client library is used by the Monitoring UI, Ceilometer publisher, and other components.&lt;br /&gt;
* Alarm Configuration Manager: A Python process that will detect new metrics and configure alarms based on the configuration. It uses the monitoring client library that communicates with the Monitoring API. The Alarm Configuration Manager is a Python Daemon that runs on a configurable interval and detects new metrics that need to be alarmed and creates the alarms.&lt;br /&gt;
* Monitoring UI: A Horizon dashboard for visualizing the overall health and status of an OpenStack cloud.&lt;br /&gt;
* Ceilometer publisher: A multi-publisher plugin for Ceilometer, not shown, that converts and publishes samples to the Monitoring API.&lt;br /&gt;
Most of the components are described in their respective repositories. However, there aren't any repositories for the third-party components used, so we describe some of the relevant details here.&lt;br /&gt;
&lt;br /&gt;
=== Message Schema ===&lt;br /&gt;
[[Monasca/Message Schema]]&lt;br /&gt;
&lt;br /&gt;
=== Message Queue ===&lt;br /&gt;
A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
&lt;br /&gt;
==== Messages ====&lt;br /&gt;
There are several messages that are published and consumed by various components in Monasca via the MessageQ. See [[Monasca/Message Schema|Message Schema]].&lt;br /&gt;
&lt;br /&gt;
=== Metrics and Alarms Database ===&lt;br /&gt;
&lt;br /&gt;
A high-performance analytics database that can store massive amounts of metrics and alarms in real-time and also support interactive queries. Currently Vertica and InfluxDB are supported.&lt;br /&gt;
&lt;br /&gt;
The SQL schema that is used by Vertica is as follows:&lt;br /&gt;
&lt;br /&gt;
* MonMetrics.Measurements: Stores the actual measurements that are sent.&lt;br /&gt;
** id: An integer ID for the measurement.&lt;br /&gt;
** definition_dimensions_id: A reference to DefinitionDimensions.&lt;br /&gt;
** time_stamp&lt;br /&gt;
** value&lt;br /&gt;
* MonMetrics.DefinitionDimensions&lt;br /&gt;
** id: A sha1 hash of (defintion_id, dimension_set_id)&lt;br /&gt;
** definition_id: A reference to the Definitions.id&lt;br /&gt;
** dimension_set_id: A reference to the Dimensions.dimension_set_id&lt;br /&gt;
* MonMetrics.Definitions&lt;br /&gt;
** id: A sha1 hash of the (name, tenant_id, region)&lt;br /&gt;
** name: Name of the metric.&lt;br /&gt;
** tenant_id: The tenant_id that submitted the metric.&lt;br /&gt;
** region: The region the metric was submitted under.&lt;br /&gt;
* MonMetric.Dimensions&lt;br /&gt;
** dimension_set_id: A sha1 hash of the set of dimenions for a metric.&lt;br /&gt;
** name: Name of dimension.&lt;br /&gt;
** value: Value of dimension.&lt;br /&gt;
&lt;br /&gt;
=== Config Database ===&lt;br /&gt;
The config database store all the configuration information. Currently based on MySQL.&lt;br /&gt;
&lt;br /&gt;
The SQL schema is as follows:&lt;br /&gt;
&lt;br /&gt;
* alarm&lt;br /&gt;
** id&lt;br /&gt;
** tenant_id&lt;br /&gt;
** name&lt;br /&gt;
** description&lt;br /&gt;
** expression&lt;br /&gt;
** state&lt;br /&gt;
** actions_enabled&lt;br /&gt;
** created_at&lt;br /&gt;
** updated_at&lt;br /&gt;
** deleted_at&lt;br /&gt;
* alarm_action&lt;br /&gt;
** alarm_id&lt;br /&gt;
** alarm_state&lt;br /&gt;
** action_id&lt;br /&gt;
* notification_method&lt;br /&gt;
** id&lt;br /&gt;
** tenant_id&lt;br /&gt;
** name&lt;br /&gt;
** type&lt;br /&gt;
** address&lt;br /&gt;
** created_at&lt;br /&gt;
** updated_at&lt;br /&gt;
* sub_alarm&lt;br /&gt;
** id&lt;br /&gt;
** alarm_id&lt;br /&gt;
** function&lt;br /&gt;
** metric_name&lt;br /&gt;
** operator&lt;br /&gt;
** threshold&lt;br /&gt;
** period&lt;br /&gt;
** periods&lt;br /&gt;
** state&lt;br /&gt;
** created_at&lt;br /&gt;
** updated_at&lt;br /&gt;
* sub_alarm_dimension&lt;br /&gt;
** sub_alarm_id&lt;br /&gt;
** dimension_name&lt;br /&gt;
** value&lt;br /&gt;
&lt;br /&gt;
== Events  ==&lt;br /&gt;
Support for real-time event stream processing in Monasca is in progress. For more details see the link at, [[Monasca/Events]].&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
== Monitoring ==&lt;br /&gt;
Enablement and usage for monitoring the status of Monasca is under discussion. For more details see the link at, [[Monasca/Monitoring_Of_Monasca]]&lt;br /&gt;
&lt;br /&gt;
== Value Metadata ==&lt;br /&gt;
Adding Metadata to the value of a measurement in Monasca is under discussion. For more details see the link at, [[Monasca/Value_Metadata]]&lt;br /&gt;
&lt;br /&gt;
== Keystone Requirements ==&lt;br /&gt;
Monasca relies on keystone for running and there are requirements about which keystone configuration must exist.&lt;br /&gt;
&lt;br /&gt;
* The endpoint for the api must be registered in keystone as the 'monasca' service.&lt;br /&gt;
* The api must have an admin token to use in verifying the keystone tokens it receives.&lt;br /&gt;
* For each project which uses Monasca two users must exist, one will be in the 'monasca-agent' role and be used by the monasca-agent's running on machines. The other should not be in that role and can be used logging into the UI, using the CLI or for direct queries against the API. &lt;br /&gt;
&lt;br /&gt;
== Post Metric Sequence ==&lt;br /&gt;
&lt;br /&gt;
This section describes the sequence of operations involved in posting a metric to the Monasca API.&lt;br /&gt;
&lt;br /&gt;
[[File:monasca-arch-post-metric-diagram.png|Monasca Architecture Post Metric Diagram]]&lt;br /&gt;
&lt;br /&gt;
# A metric is posted to the Monasca API.&lt;br /&gt;
# The Monasca API authenticates and validates the request and publishes the metric to the the Message Queue.&lt;br /&gt;
# The Persister consumes the metric from the Message Queue and stores in the Metrics Store.&lt;br /&gt;
# The Transform Engine consumes the metrics from the Message Queue, performs transform and aggregation operations on metrics, and publishes metrics that it creates back to Message Queue.&lt;br /&gt;
# The Threshold Engine consumes metrics from the Message Queue and evaluates alarms. If a state change occurs in an alarm, an &amp;quot;alarm-state-transitioned-event&amp;quot; is published to the Message Queue.&lt;br /&gt;
# The Notification Engine consumes &amp;quot;alarm-state-transitioned-events&amp;quot; from the Message Queue, evaluates whether they have a Notification Method associated with it, and sends the appropriate notification, such as email.&lt;br /&gt;
# The Persister consumes the &amp;quot;alarm-state-transitioned-event&amp;quot; from the Message Queue and stores it in the Alarm State History Store.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Comes with a turn-key development environment based on Vagrant, that can be used for quickly deploying on a client system, such as a MAC OS X based system. See https://github.com/stackforge/monasca-vagrant.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://github.com/search?q=monasca&amp;amp;ref=cmdform&lt;br /&gt;
&lt;br /&gt;
= Coding Standards =&lt;br /&gt;
&lt;br /&gt;
* Python: All Python code conforms to the OpenStack standards at, http://docs.openstack.org/developer/hacking/.&lt;br /&gt;
&lt;br /&gt;
* Java: OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google-styleguide.googlecode.com/svn/trunk/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We are in the process of porting to Python and evaluating the performance for the API layer.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Uses a number of underlying technologies:&lt;br /&gt;
&lt;br /&gt;
* Apache Kafka (http://kafka.apache.org): Apache Kafka is publish-subscribe messaging rethought as a distributed commit log. Kafka is a highly performant, distributed, fault-tolerant, and scalable message queue with durability built-in.&lt;br /&gt;
&lt;br /&gt;
* Apache Storm (http://storm.incubator.apache.org/): Apache Storm is a free and open source distributed realtime computation system. Storm makes it easy to reliably process unbounded streams of data, doing for realtime processing what Hadoop did for batch processing.&lt;br /&gt;
&lt;br /&gt;
* ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
&lt;br /&gt;
* MySQL:&lt;br /&gt;
&lt;br /&gt;
* Vagrant (http://www.vagrantup.com/): Vagrant provides easy to configure, reproducible, and portable work environments built on top of industry-standard technology and controlled by a single consistent workflow to help maximize the productivity and flexibility of you and your team.&lt;br /&gt;
&lt;br /&gt;
* Dropwizard (https://dropwizard.github.io/dropwizard/): Dropwizard pulls together stable, mature libraries from the Java ecosystem into a simple, light-weight package that lets you focus on getting things done. Dropwizard has out-of-the-box support for sophisticated configuration, application metrics, logging, operational tools, and much more, allowing you and your team to ship a production-quality web service in the shortest time possible.&lt;br /&gt;
&lt;br /&gt;
* InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies.&lt;br /&gt;
&lt;br /&gt;
* Vertica (http://www.vertica.com): A commercial Enterprise class SQL analytics database that is highly scalable. It offers built-in automatic high-availability and excels at in-database analytics and compressing and storing massive amounts of data. In the HP Public Cloud we use Vertica in a number of areas such as metrics and many other data streams. Currently, we process around 25 K metrics/sec and store them for &amp;gt; 13 month data retention periods. A free version of Vertica that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
you may not use this file except in compliance with the License.&lt;br /&gt;
You may obtain a copy of the License at&lt;br /&gt;
&lt;br /&gt;
    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
&lt;br /&gt;
Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or&lt;br /&gt;
implied.&lt;br /&gt;
See the License for the specific language governing permissions and&lt;br /&gt;
limitations under the License.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:yklogo.png|200px|thumb|left|Monasca uses YourKit Profiler for Java development]]&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=File:Yklogo.png&amp;diff=88038</id>
		<title>File:Yklogo.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=File:Yklogo.png&amp;diff=88038"/>
				<updated>2015-08-13T20:23:49Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: YourKit Logo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;YourKit Logo&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71889</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71889"/>
				<updated>2015-01-14T19:52:42Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
We should consider renaming the members. For example, AlarmDefinitionCreatedEvent has member alarmName.&lt;br /&gt;
&lt;br /&gt;
All of the AlarmDefinition*Event currently only hold the data needed by the Threshold Engine. They should be updated to have all the data about what changed, for example the actions&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                          &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                          &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                          &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                          &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                          &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                          &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                      }&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
The AlarmCreatedEvent used to be published by the API when a new Alarm was created. After we added the alarm definition feature alarms were no longer created by the API, but were created by the Threshold Engine instead. However, the Threshold Engine does not publish the AlarmCreatedEvent as it was the only consumer of it. We should probably consider publishing an AlarmCreatedEvent in the Threshold Engine in the future..&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;metric&amp;quot;: {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
          &amp;quot;timestamp&amp;quot;: 1418844000,&lt;br /&gt;
          &amp;quot;value&amp;quot;: 100&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;meta&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;creation_time&amp;quot;: 1418844001&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;04def1c4-b6ee-4d05-8da8-39559a8e2a9e&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;64938145-91de-470f-85b5-2f03730c8560&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
                &amp;quot;df171878-3bcf-4d02-9cbc-d7a7fe2f9965&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.in_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;c5f550a6-0382-4a74-969b-4c92b73e0446&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.out_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;alarmId&amp;quot;: &amp;quot;2a913e31-36a0-4ef7-88c0-4aaa5392273b&amp;quot;,&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;fef92344-7c20-4c83-ae47-e613224b3503&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
              {&lt;br /&gt;
                  &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                  &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                      &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                      &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                      &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
              }&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
              &amp;quot;82c23ead-352b-42a9-aa7f-dff3bf5c30f8&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;AVG&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                          &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                          &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                          &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                      }&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 3,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;avg(monasca.collection_time_sec) &amp;gt; 5.0 times 3&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;alarmState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
          &amp;quot;oldAlarmState&amp;quot;: &amp;quot;OK&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-transitioned&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;80e0426e-3a32-4166-ad2a-d28e4a7bc34b&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;609c2c1a-2e1d-4b0b-9b3a-21ea7f649e1b&amp;quot;,&lt;br /&gt;
            &amp;quot;metrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;load.avg_1_min&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmName&amp;quot;: &amp;quot;high cpu and load&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDescription&amp;quot;: &amp;quot;System CPU Utilization exceeds 1% and Load exceeds 3 per measurement period&amp;quot;,&lt;br /&gt;
            &amp;quot;oldState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
            &amp;quot;newState&amp;quot;: &amp;quot;ALARM&amp;quot;,&lt;br /&gt;
            &amp;quot;actionsEnabled&amp;quot;: true,&lt;br /&gt;
            &amp;quot;stateChangeReason&amp;quot;: &amp;quot;Thresholds were exceeded for the sub-alarms: [max(cpu.system_perc) &amp;gt; 0.0, max(load.avg_1_min{hostname=mini-mon}) &amp;gt; 0.0]&amp;quot;,&lt;br /&gt;
            &amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;,&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421258195&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;metric&amp;quot;: {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
            &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421259363,&lt;br /&gt;
            &amp;quot;value&amp;quot;: 8.01378607749939&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;meta&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;creation_time&amp;quot;: 1421259371&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Note, the Metrics Message is inconsistent with the other messages in that it doesn’t have the type of message in it. This is OK today because it is on a different topic and there are so many of them, but this should probably be resolved.&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== AlarmSeverity ===&lt;br /&gt;
* LOW&lt;br /&gt;
* MEDIUM&lt;br /&gt;
* HIGH&lt;br /&gt;
* CRITICAL&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71888</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71888"/>
				<updated>2015-01-14T19:51:11Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
We should consider renaming the members. For example, AlarmDefinitionCreatedEvent has member alarmName.&lt;br /&gt;
&lt;br /&gt;
All of the AlarmDefinition*Event currently only hold the data needed by the Threshold Engine. They should be updated to have all the data about what changed, for example the actions&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                          &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                          &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                          &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
The AlarmCreatedEvent used to be published by the API when a new Alarm was created. After we added the alarm definition feature alarms were no longer created by the API, but were created by the Threshold Engine instead. However, the Threshold Engine does not publish the AlarmCreatedEvent as it was the only consumer of it. We should probably consider publishing an AlarmCreatedEvent in the Threshold Engine in the future..&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;metric&amp;quot;: {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
          &amp;quot;timestamp&amp;quot;: 1418844000,&lt;br /&gt;
          &amp;quot;value&amp;quot;: 100&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;meta&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;creation_time&amp;quot;: 1418844001&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;04def1c4-b6ee-4d05-8da8-39559a8e2a9e&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;64938145-91de-470f-85b5-2f03730c8560&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
                &amp;quot;df171878-3bcf-4d02-9cbc-d7a7fe2f9965&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.in_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;c5f550a6-0382-4a74-969b-4c92b73e0446&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.out_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;alarmId&amp;quot;: &amp;quot;2a913e31-36a0-4ef7-88c0-4aaa5392273b&amp;quot;,&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;fef92344-7c20-4c83-ae47-e613224b3503&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
              {&lt;br /&gt;
                  &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                  &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                      &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                      &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                      &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
              }&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
              &amp;quot;82c23ead-352b-42a9-aa7f-dff3bf5c30f8&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;AVG&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                          &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                          &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                          &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                      }&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 3,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;avg(monasca.collection_time_sec) &amp;gt; 5.0 times 3&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;alarmState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
          &amp;quot;oldAlarmState&amp;quot;: &amp;quot;OK&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-transitioned&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;80e0426e-3a32-4166-ad2a-d28e4a7bc34b&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;609c2c1a-2e1d-4b0b-9b3a-21ea7f649e1b&amp;quot;,&lt;br /&gt;
            &amp;quot;metrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;load.avg_1_min&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmName&amp;quot;: &amp;quot;high cpu and load&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDescription&amp;quot;: &amp;quot;System CPU Utilization exceeds 1% and Load exceeds 3 per measurement period&amp;quot;,&lt;br /&gt;
            &amp;quot;oldState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
            &amp;quot;newState&amp;quot;: &amp;quot;ALARM&amp;quot;,&lt;br /&gt;
            &amp;quot;actionsEnabled&amp;quot;: true,&lt;br /&gt;
            &amp;quot;stateChangeReason&amp;quot;: &amp;quot;Thresholds were exceeded for the sub-alarms: [max(cpu.system_perc) &amp;gt; 0.0, max(load.avg_1_min{hostname=mini-mon}) &amp;gt; 0.0]&amp;quot;,&lt;br /&gt;
            &amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;,&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421258195&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;metric&amp;quot;: {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
            &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421259363,&lt;br /&gt;
            &amp;quot;value&amp;quot;: 8.01378607749939&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;meta&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;creation_time&amp;quot;: 1421259371&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Note, the Metrics Message is inconsistent with the other messages in that it doesn’t have the type of message in it. This is OK today because it is on a different topic and there are so many of them, but this should probably be resolved.&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== AlarmSeverity ===&lt;br /&gt;
* LOW&lt;br /&gt;
* MEDIUM&lt;br /&gt;
* HIGH&lt;br /&gt;
* CRITICAL&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71886</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71886"/>
				<updated>2015-01-14T19:47:04Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
We should consider renaming the members. For example, AlarmDefinitionCreatedEvent has member alarmName.&lt;br /&gt;
&lt;br /&gt;
All of the AlarmDefinition*Event currently only hold the data needed by the Threshold Engine. They should be updated to have all the data about what changed, for example the actions&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                          &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                          &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                          &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
The AlarmCreatedEvent used to be published by the API when a new Alarm was created. After we added the alarm definition feature alarms were no longer created by the API, but were created by the Threshold Engine instead. However, the Threshold Engine does not publish the AlarmCreatedEvent as it was the only consumer of it. We should probably consider publishing an AlarmCreatedEvent in the Threshold Engine in the future..&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;metric&amp;quot;: {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
          &amp;quot;timestamp&amp;quot;: 1418844000,&lt;br /&gt;
          &amp;quot;value&amp;quot;: 100&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;meta&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;creation_time&amp;quot;: 1418844001&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;04def1c4-b6ee-4d05-8da8-39559a8e2a9e&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;64938145-91de-470f-85b5-2f03730c8560&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
                &amp;quot;df171878-3bcf-4d02-9cbc-d7a7fe2f9965&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.in_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;c5f550a6-0382-4a74-969b-4c92b73e0446&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.out_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;alarmId&amp;quot;: &amp;quot;2a913e31-36a0-4ef7-88c0-4aaa5392273b&amp;quot;,&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;fef92344-7c20-4c83-ae47-e613224b3503&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
              {&lt;br /&gt;
                  &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                  &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                      &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                      &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                      &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
              }&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
              &amp;quot;82c23ead-352b-42a9-aa7f-dff3bf5c30f8&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;AVG&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 3,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;avg(monasca.collection_time_sec) &amp;gt; 5.0 times 3&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;alarmState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
          &amp;quot;oldAlarmState&amp;quot;: &amp;quot;OK&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-transitioned&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;80e0426e-3a32-4166-ad2a-d28e4a7bc34b&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;609c2c1a-2e1d-4b0b-9b3a-21ea7f649e1b&amp;quot;,&lt;br /&gt;
            &amp;quot;metrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;load.avg_1_min&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmName&amp;quot;: &amp;quot;high cpu and load&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDescription&amp;quot;: &amp;quot;System CPU Utilization exceeds 1% and Load exceeds 3 per measurement period&amp;quot;,&lt;br /&gt;
            &amp;quot;oldState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
            &amp;quot;newState&amp;quot;: &amp;quot;ALARM&amp;quot;,&lt;br /&gt;
            &amp;quot;actionsEnabled&amp;quot;: true,&lt;br /&gt;
            &amp;quot;stateChangeReason&amp;quot;: &amp;quot;Thresholds were exceeded for the sub-alarms: [max(cpu.system_perc) &amp;gt; 0.0, max(load.avg_1_min{hostname=mini-mon}) &amp;gt; 0.0]&amp;quot;,&lt;br /&gt;
            &amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;,&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421258195&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;metric&amp;quot;: {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
            &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421259363,&lt;br /&gt;
            &amp;quot;value&amp;quot;: 8.01378607749939&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;meta&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;creation_time&amp;quot;: 1421259371&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Note, the Metrics Message is inconsistent with the other messages in that it doesn’t have the type of message in it. This is OK today because it is on a different topic and there are so many of them, but this should probably be resolved.&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== AlarmSeverity ===&lt;br /&gt;
* LOW&lt;br /&gt;
* MEDIUM&lt;br /&gt;
* HIGH&lt;br /&gt;
* CRITICAL&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71885</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71885"/>
				<updated>2015-01-14T19:46:04Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
We should consider renaming the members. For example, AlarmDefinitionCreatedEvent has member alarmName.&lt;br /&gt;
&lt;br /&gt;
All of the AlarmDefinition*Event currently only hold the data needed by the Threshold Engine. They should be updated to have all the data about what changed, for example the actions&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                          &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                          &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                          &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
The AlarmCreatedEvent used to be published by the API when a new Alarm was created. After we added the alarm definition feature alarms were no longer created by the API, but were created by the Threshold Engine instead. However, the Threshold Engine does not publish the AlarmCreatedEvent as it was the only consumer of it. We should probably consider publishing an AlarmCreatedEvent in the Threshold Engine in the future..&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;metric&amp;quot;: {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
          &amp;quot;timestamp&amp;quot;: 1418844000,&lt;br /&gt;
          &amp;quot;value&amp;quot;: 100&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;meta&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;creation_time&amp;quot;: 1418844001&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;04def1c4-b6ee-4d05-8da8-39559a8e2a9e&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;64938145-91de-470f-85b5-2f03730c8560&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
                &amp;quot;df171878-3bcf-4d02-9cbc-d7a7fe2f9965&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.in_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;c5f550a6-0382-4a74-969b-4c92b73e0446&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.out_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;alarmId&amp;quot;: &amp;quot;2a913e31-36a0-4ef7-88c0-4aaa5392273b&amp;quot;,&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;fef92344-7c20-4c83-ae47-e613224b3503&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
              {&lt;br /&gt;
                  &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                  &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                      &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                      &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                      &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
              }&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
              &amp;quot;82c23ead-352b-42a9-aa7f-dff3bf5c30f8&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;AVG&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 3,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;avg(monasca.collection_time_sec) &amp;gt; 5.0 times 3&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;alarmState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
          &amp;quot;oldAlarmState&amp;quot;: &amp;quot;OK&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-transitioned&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;80e0426e-3a32-4166-ad2a-d28e4a7bc34b&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;609c2c1a-2e1d-4b0b-9b3a-21ea7f649e1b&amp;quot;,&lt;br /&gt;
            &amp;quot;metrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;load.avg_1_min&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmName&amp;quot;: &amp;quot;high cpu and load&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDescription&amp;quot;: &amp;quot;System CPU Utilization exceeds 1% and Load exceeds 3 per measurement period&amp;quot;,&lt;br /&gt;
            &amp;quot;oldState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
            &amp;quot;newState&amp;quot;: &amp;quot;ALARM&amp;quot;,&lt;br /&gt;
            &amp;quot;actionsEnabled&amp;quot;: true,&lt;br /&gt;
            &amp;quot;stateChangeReason&amp;quot;: &amp;quot;Thresholds were exceeded for the sub-alarms: [max(cpu.system_perc) &amp;gt; 0.0, max(load.avg_1_min{hostname=mini-mon}) &amp;gt; 0.0]&amp;quot;,&lt;br /&gt;
            &amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;,&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421258195&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;metric&amp;quot;: {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
            &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421259363,&lt;br /&gt;
            &amp;quot;value&amp;quot;: 8.01378607749939&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;meta&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;creation_time&amp;quot;: 1421259371&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Note, the Metrics Message is inconsistent with the other messages in that it doesn’t have the type of message in it. This is OK today because it is on a different topic and there are so many of them, but this should probably be resolved.&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== AlarmSeverity ===&lt;br /&gt;
* LOW&lt;br /&gt;
* MEDIUM&lt;br /&gt;
* HIGH&lt;br /&gt;
* CRITICAL&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71868</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71868"/>
				<updated>2015-01-14T18:18:21Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* Metrics Message */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;metric&amp;quot;: {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
          &amp;quot;timestamp&amp;quot;: 1418844000,&lt;br /&gt;
          &amp;quot;value&amp;quot;: 100&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;meta&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;creation_time&amp;quot;: 1418844001&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;04def1c4-b6ee-4d05-8da8-39559a8e2a9e&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;64938145-91de-470f-85b5-2f03730c8560&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
                &amp;quot;df171878-3bcf-4d02-9cbc-d7a7fe2f9965&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.in_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;c5f550a6-0382-4a74-969b-4c92b73e0446&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.out_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;alarmId&amp;quot;: &amp;quot;2a913e31-36a0-4ef7-88c0-4aaa5392273b&amp;quot;,&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;fef92344-7c20-4c83-ae47-e613224b3503&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
              {&lt;br /&gt;
                  &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                  &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                      &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                      &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                      &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
              }&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
              &amp;quot;82c23ead-352b-42a9-aa7f-dff3bf5c30f8&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;AVG&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 3,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;avg(monasca.collection_time_sec) &amp;gt; 5.0 times 3&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;alarmState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
          &amp;quot;oldAlarmState&amp;quot;: &amp;quot;OK&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-transitioned&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;80e0426e-3a32-4166-ad2a-d28e4a7bc34b&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;609c2c1a-2e1d-4b0b-9b3a-21ea7f649e1b&amp;quot;,&lt;br /&gt;
            &amp;quot;metrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;load.avg_1_min&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmName&amp;quot;: &amp;quot;high cpu and load&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDescription&amp;quot;: &amp;quot;System CPU Utilization exceeds 1% and Load exceeds 3 per measurement period&amp;quot;,&lt;br /&gt;
            &amp;quot;oldState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
            &amp;quot;newState&amp;quot;: &amp;quot;ALARM&amp;quot;,&lt;br /&gt;
            &amp;quot;actionsEnabled&amp;quot;: true,&lt;br /&gt;
            &amp;quot;stateChangeReason&amp;quot;: &amp;quot;Thresholds were exceeded for the sub-alarms: [max(cpu.system_perc) &amp;gt; 0.0, max(load.avg_1_min{hostname=mini-mon}) &amp;gt; 0.0]&amp;quot;,&lt;br /&gt;
            &amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;,&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421258195&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;metric&amp;quot;: {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
            &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421259363,&lt;br /&gt;
            &amp;quot;value&amp;quot;: 8.01378607749939&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;meta&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;creation_time&amp;quot;: 1421259371&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71867</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71867"/>
				<updated>2015-01-14T18:13:12Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* AlarmStateTransitionedEvent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;metric&amp;quot;: {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
          &amp;quot;timestamp&amp;quot;: 1418844000,&lt;br /&gt;
          &amp;quot;value&amp;quot;: 100&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;meta&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;creation_time&amp;quot;: 1418844001&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;04def1c4-b6ee-4d05-8da8-39559a8e2a9e&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;64938145-91de-470f-85b5-2f03730c8560&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
                &amp;quot;df171878-3bcf-4d02-9cbc-d7a7fe2f9965&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.in_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;c5f550a6-0382-4a74-969b-4c92b73e0446&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.out_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;alarmId&amp;quot;: &amp;quot;2a913e31-36a0-4ef7-88c0-4aaa5392273b&amp;quot;,&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;fef92344-7c20-4c83-ae47-e613224b3503&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
              {&lt;br /&gt;
                  &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                  &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                      &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                      &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                      &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
              }&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
              &amp;quot;82c23ead-352b-42a9-aa7f-dff3bf5c30f8&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;AVG&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 3,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;avg(monasca.collection_time_sec) &amp;gt; 5.0 times 3&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;alarmState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
          &amp;quot;oldAlarmState&amp;quot;: &amp;quot;OK&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-transitioned&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;8ada618268ec43709a2ab8eb8ea7996c&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;80e0426e-3a32-4166-ad2a-d28e4a7bc34b&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;609c2c1a-2e1d-4b0b-9b3a-21ea7f649e1b&amp;quot;,&lt;br /&gt;
            &amp;quot;metrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;devstack&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;load.avg_1_min&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.system_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmName&amp;quot;: &amp;quot;high cpu and load&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmDescription&amp;quot;: &amp;quot;System CPU Utilization exceeds 1% and Load exceeds 3 per measurement period&amp;quot;,&lt;br /&gt;
            &amp;quot;oldState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
            &amp;quot;newState&amp;quot;: &amp;quot;ALARM&amp;quot;,&lt;br /&gt;
            &amp;quot;actionsEnabled&amp;quot;: true,&lt;br /&gt;
            &amp;quot;stateChangeReason&amp;quot;: &amp;quot;Thresholds were exceeded for the sub-alarms: [max(cpu.system_perc) &amp;gt; 0.0, max(load.avg_1_min{hostname=mini-mon}) &amp;gt; 0.0]&amp;quot;,&lt;br /&gt;
            &amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;,&lt;br /&gt;
            &amp;quot;timestamp&amp;quot;: 1421258195&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71862</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71862"/>
				<updated>2015-01-14T17:42:54Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* AlarmUpdatedEvent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;metric&amp;quot;: {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
          &amp;quot;timestamp&amp;quot;: 1418844000,&lt;br /&gt;
          &amp;quot;value&amp;quot;: 100&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;meta&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;creation_time&amp;quot;: 1418844001&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;04def1c4-b6ee-4d05-8da8-39559a8e2a9e&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;64938145-91de-470f-85b5-2f03730c8560&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
                &amp;quot;df171878-3bcf-4d02-9cbc-d7a7fe2f9965&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.in_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;c5f550a6-0382-4a74-969b-4c92b73e0446&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.out_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;alarmId&amp;quot;: &amp;quot;2a913e31-36a0-4ef7-88c0-4aaa5392273b&amp;quot;,&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;fef92344-7c20-4c83-ae47-e613224b3503&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
              {&lt;br /&gt;
                  &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                  &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                      &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                      &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                      &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
              }&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
              &amp;quot;82c23ead-352b-42a9-aa7f-dff3bf5c30f8&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;AVG&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;monasca.collection_time_sec&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 3,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;avg(monasca.collection_time_sec) &amp;gt; 5.0 times 3&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;alarmState&amp;quot;: &amp;quot;UNDETERMINED&amp;quot;,&lt;br /&gt;
          &amp;quot;oldAlarmState&amp;quot;: &amp;quot;OK&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71860</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71860"/>
				<updated>2015-01-14T17:40:04Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* AlarmDeletedEvent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;metric&amp;quot;: {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
          &amp;quot;timestamp&amp;quot;: 1418844000,&lt;br /&gt;
          &amp;quot;value&amp;quot;: 100&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;meta&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;creation_time&amp;quot;: 1418844001&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;alarm-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmId&amp;quot;: &amp;quot;04def1c4-b6ee-4d05-8da8-39559a8e2a9e&amp;quot;,&lt;br /&gt;
            &amp;quot;alarmMetrics&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth0&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {&lt;br /&gt;
                        &amp;quot;component&amp;quot;: &amp;quot;monasca-agent&amp;quot;,&lt;br /&gt;
                        &amp;quot;service&amp;quot;: &amp;quot;monitoring&amp;quot;,&lt;br /&gt;
                        &amp;quot;device&amp;quot;: &amp;quot;eth1&amp;quot;,&lt;br /&gt;
                        &amp;quot;hostname&amp;quot;: &amp;quot;mini-mon&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;64938145-91de-470f-85b5-2f03730c8560&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarms&amp;quot;: {&lt;br /&gt;
                &amp;quot;df171878-3bcf-4d02-9cbc-d7a7fe2f9965&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.in_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.in_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;c5f550a6-0382-4a74-969b-4c92b73e0446&amp;quot;: {&lt;br /&gt;
                    &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                    &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                        &amp;quot;name&amp;quot;: &amp;quot;net.out_errors&amp;quot;,&lt;br /&gt;
                        &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                    &amp;quot;threshold&amp;quot;: 5,&lt;br /&gt;
                    &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                    &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                    &amp;quot;expression&amp;quot;: &amp;quot;max(net.out_errors) &amp;gt; 5.0&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71859</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71859"/>
				<updated>2015-01-14T17:37:21Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* AlarmCreatedEvent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;metric&amp;quot;: {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
          &amp;quot;timestamp&amp;quot;: 1418844000,&lt;br /&gt;
          &amp;quot;value&amp;quot;: 100&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;meta&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;: &amp;quot;useast&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;creation_time&amp;quot;: 1418844001&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71857</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71857"/>
				<updated>2015-01-14T17:32:15Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71855</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71855"/>
				<updated>2015-01-14T17:31:46Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* AlarmDefinitionUpdatedEvent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition-created-event&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-created-event-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
      &amp;quot;alarm-definition-updated&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;severity&amp;quot;: &amp;quot;HIGH&amp;quot;,&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;alarmActionsEnabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;oldAlarmSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;changedSubExpressions&amp;quot;: {},&lt;br /&gt;
          &amp;quot;unchangedSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;newAlarmSubExpressions&amp;quot;: {}&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71854</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71854"/>
				<updated>2015-01-14T17:28:50Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* AlarmDefinitionDeletedEvent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition-created-event&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-created-event-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
        &amp;quot;alarm-definition-deleted&amp;quot;: {&lt;br /&gt;
            &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;19afaacf-35ad-44c0-a02f-96a0a20d6e6d&amp;quot;,&lt;br /&gt;
            &amp;quot;subAlarmMetricDefinitions&amp;quot;: {&lt;br /&gt;
                &amp;quot;c5fa8686-597b-420b-97ed-648637c1f702&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                    &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71853</id>
		<title>Monasca/Message Schema</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Message_Schema&amp;diff=71853"/>
				<updated>2015-01-14T17:24:28Z</updated>
		
		<summary type="html">&lt;p&gt;Deklan: /* AlarmDefinitionCreatedEvent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Monasca supports two primary classification of messages that are published and consumed via the MessageQ:&lt;br /&gt;
&lt;br /&gt;
# Value objects, such as metrics and events, that are sent to the API from some external data source, such as the Monasca Agent.&lt;br /&gt;
# Domain events that represent a change to some entity in the system as follows:&lt;br /&gt;
## An alarm definition being created, updated or deleted by the API.&lt;br /&gt;
## An alarm being updated or deleted by the API.&lt;br /&gt;
## An alarm transitioning in state by the Threshold Engine.&lt;br /&gt;
&lt;br /&gt;
Currently, the message formats that are published and consumed by Monasca have been developed for internal use only. The messages are in a JSON format that was largely developed without a lot of consideration for supporting external or third-party components, applications and services. While the current message format is OK for internal and easy to by external applications, there is a risk to them in doing so.&lt;br /&gt;
&lt;br /&gt;
Consequently, we are in the process of reviewing the messages used by Monasca and creating a formal message schema specification that is used by Monasca, such that external third-party components, applications and services outside of the Monasca system can easily publish and consume from the MessageQ without being concerned about future changes. We plan to define the message schema and treat it as an external specification such that third-parties can work with Monasca without being concerned about future changes. One use case for doing this involve enabling third-party data analytics applications.&lt;br /&gt;
&lt;br /&gt;
The current messages that are published and consumed by various components in the Monasca system via the MessageQ are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Produced By !! Consumed By !! Kafka Topic !! Description&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionCreatedEvent || API || Threshold Engine || events || When an alarm definition is created by the API an AlarmDefinitionCreatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionDeletedEvent || API || Threshold Engine || events || When an alarm definition is deleted by the API an AlarmDefinitionDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDefinitionUpdatedEvent || API || Threshold Engine || events || When an alarm definition is updated by the API an AlarmDefinitionUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmDeletedEvent || API || Threshold Engine || events || When an alarm is deleted by the API an AlarmDeletedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmUpdatedEvent || API || Threshold Engine || events || When an alarm is updated by the API an AlarmUpdatedEvent is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmStateTransitionedEvent || Threshold Engine || Notification Engine, Persister || alarm-state-transitions || When an alarm transitions state, such as from the OK to Alarm or Alarm to OK, this an AlarmStateTransitionedEvent is published to the MessageQ and persisted by the persister and processed by the Notification Engine. The API can query the history of AlarmStateTransitionedEvent.&lt;br /&gt;
|-&lt;br /&gt;
| AlarmNotification || Notification Engine || Persister || alarm-notifications || Currently unsupported This event is published to the MessageQ when the Notification Engine processes an alarm and sends a notification. The alarm notification is persisted by the Persister and can be queried by the API. The database maintains a history of all events.&lt;br /&gt;
|-&lt;br /&gt;
| Metric || API, Transform and Aggregation Engine || Persister, Threshold Engine || metrics || A metric sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ.&lt;br /&gt;
|-&lt;br /&gt;
| Event || API, Transform Engine, Event Engine || Persister, Event Engine || raw-events, transformed-events || An event sent to the API or created by the Transform Engine or Event Engine or is published to the MessageQ.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Alarm Definition Events==&lt;br /&gt;
Alarm Definition Events are created when an alarm definition is created, deleted or updated by the API. These events are meant to be primarily consumed by the Threshold Engine to maintain a synchronized in-memory model of the alarm definitions in the system, without having to query or poll the Config Database. When the Threshold Engine starts up it queries the Config Database for all the alarm definitions to initialize it's internal model of alarm definitions. Subsequently, the Threshold Engine consumes AlarmDefinitionEvents to update it's internal model of the alarm definitions.&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
 &lt;br /&gt;
 {&lt;br /&gt;
      &amp;quot;alarm-definition-created&amp;quot;: {&lt;br /&gt;
          &amp;quot;tenantId&amp;quot;: &amp;quot;69a6aeb64a5f4704b88dcf1985d43184&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDefinitionId&amp;quot;: &amp;quot;0fe0b88f-8b06-459a-8bed-50d114c4f07b&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmName&amp;quot;: &amp;quot;example-alarm-definition-created-event&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmDescription&amp;quot;: &amp;quot;example-alarm-definition-created-event-description&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmExpression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100&amp;quot;,&lt;br /&gt;
          &amp;quot;alarmSubExpressions&amp;quot;: {&lt;br /&gt;
              &amp;quot;7b790964-67de-4f70-b625-cca5da0119d3&amp;quot;: {&lt;br /&gt;
                  &amp;quot;function&amp;quot;: &amp;quot;MAX&amp;quot;,&lt;br /&gt;
                  &amp;quot;metricDefinition&amp;quot;: {&lt;br /&gt;
                      &amp;quot;name&amp;quot;: &amp;quot;cpu.user_perc&amp;quot;,&lt;br /&gt;
                      &amp;quot;dimensions&amp;quot;: {}&lt;br /&gt;
                  },&lt;br /&gt;
                  &amp;quot;operator&amp;quot;: &amp;quot;GT&amp;quot;,&lt;br /&gt;
                  &amp;quot;threshold&amp;quot;: 100,&lt;br /&gt;
                  &amp;quot;period&amp;quot;: 60,&lt;br /&gt;
                  &amp;quot;periods&amp;quot;: 1,&lt;br /&gt;
                  &amp;quot;expression&amp;quot;: &amp;quot;max(cpu.user_perc) &amp;gt; 100.0&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;matchBy&amp;quot;: [&lt;br /&gt;
              &amp;quot;hostname&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionDeletedEvent ===&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, MetricDefinition&amp;gt; subAlarmMetricDefinitions&lt;br /&gt;
&lt;br /&gt;
=== AlarmDefinitionUpdatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* String severity&lt;br /&gt;
* List&amp;lt;String&amp;gt; matchBy&lt;br /&gt;
* boolean alarmActionsEnabled&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; oldAlarmSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; changedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; unchangedSubExpressions&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; newAlarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
== Alarm Events ==&lt;br /&gt;
Alarms are created by the Threshold Engine in response to when there are new metrics sent to the system that match an alarm definition. Currently, AlarmCreatedEvents are not created by the Threshold Engine when this occurs. Note, alarms are not created by the API.&lt;br /&gt;
&lt;br /&gt;
When alarms are deleted or updated by the API an AlarmDeletedEvent and AlarmUpdatedEvent is created. AlarmDeletedEvents and AlarmUpdateEvents are primarily meant to be consumed by the Threshold Engine to delete or update it's internal in-memory model of alarms when they are updated or deleted by the API.&lt;br /&gt;
&lt;br /&gt;
=== AlarmCreatedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmExpression&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; alarmSubExpressions&lt;br /&gt;
&lt;br /&gt;
=== AlarmDeletedEvent ===&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
&lt;br /&gt;
=== AlarmUpdatedEvent ===&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; alarmMetrics&lt;br /&gt;
* Map&amp;lt;String, AlarmSubExpression&amp;gt; subAlarms&lt;br /&gt;
* AlarmState alarmState&lt;br /&gt;
* AlarmState oldAlarmState&lt;br /&gt;
&lt;br /&gt;
=== AlarmStateTransitionedEvent ===&lt;br /&gt;
An AlarmStateTransitionedEvent is created when an alarm state changes. These events are primarily published by the ThresholdEngine and consumed by the Persister and Notification Engine. The AlarmStateTransitionEvent consists of the following:&lt;br /&gt;
&lt;br /&gt;
* String tenantId&lt;br /&gt;
* String alarmId&lt;br /&gt;
* String alarmDefinitionId&lt;br /&gt;
* List&amp;lt;MetricDefinition&amp;gt; metrics&lt;br /&gt;
* String alarmName&lt;br /&gt;
* String alarmDescription&lt;br /&gt;
* AlarmState oldState&lt;br /&gt;
* AlarmState newState&lt;br /&gt;
* boolean actionsEnabled&lt;br /&gt;
* String stateChangeReason&lt;br /&gt;
* String severity&lt;br /&gt;
* long timestamp&lt;br /&gt;
&lt;br /&gt;
=== AlarmNotification ===&lt;br /&gt;
Currently unsupported. This is a placeholder for future development when we add support for storing the notifications that have been sent.&lt;br /&gt;
&lt;br /&gt;
== Metrics Message ==&lt;br /&gt;
A metric that is sent to the API or created by the Transform Engine, Event Engine or Anomaly Engine is published to the MessageQ as a MetricsMessage. A MetricsMessage has the following fields:&lt;br /&gt;
* MetricDefinition metric&lt;br /&gt;
* meta:&lt;br /&gt;
** String tenantId&lt;br /&gt;
** String region: Should remove &amp;quot;region&amp;quot; as this isn't being used.&lt;br /&gt;
* creation_time:&lt;br /&gt;
&lt;br /&gt;
== Event Message ==&lt;br /&gt;
TBD. Currently, there is a proof-of-concept implementation of events in Monasca, but the details haven't been formalized.&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
This section describes the specific types used in messages.&lt;br /&gt;
&lt;br /&gt;
=== AlarmSubExpression ===&lt;br /&gt;
* AggregateFunction function&lt;br /&gt;
* MetricDefinition metricDefinition&lt;br /&gt;
* AlarmOperator operator&lt;br /&gt;
* double threshold threshold&lt;br /&gt;
* int period&lt;br /&gt;
* int periods&lt;br /&gt;
&lt;br /&gt;
=== MetricDefinition ===&lt;br /&gt;
* String name&lt;br /&gt;
* Map&amp;lt;String, String&amp;gt; dimensions&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
=== AlarmState ===&lt;br /&gt;
* UNDETERMINED&lt;br /&gt;
* OK&lt;br /&gt;
* ALARM&lt;br /&gt;
&lt;br /&gt;
=== AggregateFunction ===&lt;br /&gt;
* MIN&lt;br /&gt;
* MAX&lt;br /&gt;
* SUM&lt;br /&gt;
* COUNT&lt;br /&gt;
* AVG&lt;br /&gt;
&lt;br /&gt;
=== AlarmOperator ===&lt;br /&gt;
* LT(&amp;quot;&amp;lt;&amp;quot;)&lt;br /&gt;
* LTE(&amp;quot;&amp;lt;=&amp;quot;)&lt;br /&gt;
* GT(&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
* GTE(&amp;quot;&amp;gt;=&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Deklan</name></author>	</entry>

	</feed>