<?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=Joseph+Davis</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=Joseph+Davis"/>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/wiki/Special:Contributions/Joseph_Davis"/>
		<updated>2026-07-09T03:55:27Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Transform&amp;diff=176525</id>
		<title>Monasca/Transform</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Transform&amp;diff=176525"/>
				<updated>2020-10-16T03:09:40Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: Mon Trans Deprecation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= NOTICE: Monasca Transform has been deprecated =&lt;br /&gt;
&lt;br /&gt;
While Monasca Transform has been a useful utility, its user base has declined and engineers for maintenance have been pulled in other directions.  To make this clear, the monasca-transform repository has been marked as deprecated and content removed from the Wallaby release.  If you still need a release of Monasca Transform, use the Ussuri or older branch. &lt;br /&gt;
&lt;br /&gt;
Reference the commit to clear the content for Wallaby release: https://opendev.org/openstack/monasca-transform/commit/811acd76c9029e175c0a43302386bc7732fcc48e&lt;br /&gt;
&lt;br /&gt;
If you find Monasca Transform to be useful and have a desire to take on maintenance, please post a message to the #openstack-monasca IRC channel, as described on http://eavesdrop.openstack.org/#Monasca_Team_Meeting .&lt;br /&gt;
&lt;br /&gt;
The following content is for historical purposes and describes some of the original motivation and development of Monasca Transform.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== monasca-transform: A transformation and aggregation engine for Monasca ==&lt;br /&gt;
&lt;br /&gt;
Original blueprint - https://blueprints.launchpad.net/monasca/+spec/monasca-transform&lt;br /&gt;
Original Proposal - [[Monasca/Transform-proposal]]&lt;br /&gt;
&lt;br /&gt;
* monasca-transform is a data driven aggregation engine which collects, groups and aggregates existing individual Monasca metrics according to business requirements and publishes new transformed (derived) metrics to the Monasca Kafka queue.&lt;br /&gt;
* Since the new transformed metrics are published as any other metric in Monasca, alarms can be set and triggered on the transformed metric.&lt;br /&gt;
&lt;br /&gt;
=== Problem description ===&lt;br /&gt;
&lt;br /&gt;
There are several use cases which can be addressed by transforming, aggregating and publishing new metrics in Monasca:&lt;br /&gt;
* Aggregate individual metrics&lt;br /&gt;
Metrics that are currently available on a per host or per VM basis, for example mem.total_mb or vm.mem.used_mb, might have to be added up for all hosts or VMs so that cloud operator can know the the total memory available across all hosts and total memory being allocated to all VMs for the entire cloud.&lt;br /&gt;
* Combine multiple metrics to derive a new metric&lt;br /&gt;
There might be a need to derive metrics from one or more metrics, for example cpu.total_logical_cores and cpu.idle_perc are two metrics for a host which can be used to derive a new metric which will give total utilized CPUs.  Also these per host utilized CPUs can be further summed up to find the number of CPUs being utilized across the entire cloud.&lt;br /&gt;
* Find the rate at which a metric changed over a time range&lt;br /&gt;
It might be necessary to calculate the rate at which a metric value is changing over time. For example, to find the rate at which swift disk capacity is increasing over a time range, one would have to find the value of the disk usage at the start of the time interval (say start of the hour) then find the disk usage at the end of the time interval (say end of the hour) in order to determine the rate at which the disk usage increased or decreased during that hour.&lt;br /&gt;
* Deriving metrics using complex business logic&lt;br /&gt;
There might be a need to apply complex business logic on a set of metrics and derive a new metric. For example consider the periodic heart beat metrics which come from a VM indicating what state the VM was in.  One might have to look at how the state of the VM changed over the target time interval and then use some business logic to come up with a new metric which would indicate the amount of time that the VM was in a usable state.&lt;br /&gt;
&lt;br /&gt;
=== How Monasca Transform Operates ===&lt;br /&gt;
&lt;br /&gt;
The monasca-transform component framework fits into the microservices architecture of Monasca. At its core, it collects a set of metrics from Apache Kafka[1] over a configurable time period, then using grouping operations, runs a series of transformation (or aggregation) operations which can consist of simple mathematical operations like sum/max/min/avg or complex operations such as iterating through group using some business rules. The resulting transformed metric or set of transformed metrics are published back to Apache Kafka.&lt;br /&gt;
&lt;br /&gt;
Some design considerations that were essential based on past experience when building a similar aggregation framework to process vast amounts of raw log records from public cloud services:&lt;br /&gt;
&lt;br /&gt;
* Scalable, Fault Tolerant and Highly Available&lt;br /&gt;
Processing of metrics has to be scalable since we will have to collect, aggregate and publish vast amounts of metrics. The processing of data should be able to withstand any hardware failures such as CPU, memory or disk errors. The monasca-transform process is designed to be Highly Available. In case the monasca-transform daemon process goes down on a server because of any software or hardware problem the framework will start processing metrics on a another server.&lt;br /&gt;
* Data driven transformations&lt;br /&gt;
The transformation framework has to be data driven and it should be possible to add new transformations for any new metrics by configuration changes.&lt;br /&gt;
* Reusable components and reusable transformation routines&lt;br /&gt;
The transformation requirements of various metrics can be similar, so once a transformation routine has been implemented it should be possible to re-use the same transformation components and routines for a different set of metrics.&lt;br /&gt;
* Easy to add components&lt;br /&gt;
Adding new transformation components should be easy and straightforward.&lt;br /&gt;
* Flexible to change and adapt&lt;br /&gt;
Over a period of time business requirements and needs can change.  To meet those requirements new transformation components will have to be developed and added or existing ones updated. Monasca Transform makes it possible to add and update new components with minimum effort.&lt;br /&gt;
* Unit Testing&lt;br /&gt;
Though the transformation routines can be complex, there are unit tests for each individual transformation component to be confident of the accuracy of the component.&lt;br /&gt;
&lt;br /&gt;
==== Considered Alternatives ====&lt;br /&gt;
&lt;br /&gt;
To avoid re-inventing the wheel it is desirable to use a framework or tool that provides the ability to process data across a cluster of commodity machines and that features work distribution, fault tolerance and the capability to seamlessly withstand node failures.&lt;br /&gt;
&lt;br /&gt;
Hadoop with MapReduce/Yarn satisfies these requirements but requiring some kind of stable storage, HDFS and relying on temporary files to save intermediate processing states, they can be slow. They also require a number of components to be configured, installed, monitored and maintained across a cluster which is often a challenging and daunting task.  Also it's highly likely that other associated tools like Hive (for sql-like processing of data) and Pig (which would faciliate the expression map reduce jobs as high level constructs) would be entailed. Using additional tools adds to the resource utilization burden as well as increasing development time.&lt;br /&gt;
&lt;br /&gt;
Spark allows jobs to be expressed in Python consequently siting well with the openstack toolset.  It has demonstrated much higher processing rates than Hadoop based tools yet allows existing domain knowledge of mapreduce type tools to be re-purposed.  Spark is gaining momentum and adoption generally and this upward trajectory can be capitalised upon.  It also provides support for streaming data, again meaning that we can concentrate on the task at hand rather than plumbing.  For these reasons it has been selected to provide the processing framework.&lt;br /&gt;
&lt;br /&gt;
There is a non-OpenStack project for those who want a light weight aggregation engine written in Go - [https://github.com/monasca/monasca-aggregator monasca-aggregator].  monasca-aggregator does not have feature parity with monasca-transform and does not have unit tests in place, but is open under the Apache License 2.0 for anyone who wishes to contribute.&lt;br /&gt;
&lt;br /&gt;
=== Architecture ===&lt;br /&gt;
&lt;br /&gt;
monasca-transform is a data driven data processing framework implemented in python and based on Apache Spark[2]. Apache Spark[2] is a highly scalable, fast, in-memory, fault tolerant and parallel data processing framework. All monasca-transform components are implemented in Python and use Spark's Python API to interact with Spark.&lt;br /&gt;
&lt;br /&gt;
To process data, monasca-transform components make use of Spark's transformation operations like groupByKey(), filter(), map(), reduceByKey() on Spark's Resilient Distributed Datasets (also commonly referred to as RDDs). RDD is Spark's basic abstraction for distributed memory.&lt;br /&gt;
&lt;br /&gt;
monasca-transform uses the Spark Steaming direct API  to retrieve Monasca metrics from the Kafka queue. monasca-transform uses Spark Data Frames for processing whenever possible. Spark Data Frames use a new query planner and analyzer called Catalyst and is more efficient and optimized than comparable RDD operations.&lt;br /&gt;
&lt;br /&gt;
Data Frames provide a more SQL-like data manipulation capability which also makes it easy to use from a development point of view. It is possible to convert from a Spark RDD to a Data Frame and vice versa.  Also, Spark provides a common equivalent API for manipulating both an RDD as well as a Data Frame.&lt;br /&gt;
&lt;br /&gt;
In addition to Apache Spark, monasca-transform also relies on MySQL database tables to store processing and configuration information:&lt;br /&gt;
&lt;br /&gt;
* processing information:  Kafka offsets from Spark batch, used to resume processing after a failure or a restart&lt;br /&gt;
* configuration information: Runtime parameters and transformation specifications, used to drive transformation and aggregation of metrics&lt;br /&gt;
&lt;br /&gt;
It is possible to run multiple monasca-transform processes on multiple nodes.  Multiple monasca-transform processes will use zookeeper's leader election capability to elect a master. In case a node on which monasca-transform process is running as a master goes down, another monasca-transform process running on an another node will be elected a leader and start processing data.&lt;br /&gt;
&lt;br /&gt;
Here are the components of  monasca-transform:&lt;br /&gt;
&lt;br /&gt;
[[File:ArchitectureComponents.jpg]]&lt;br /&gt;
&lt;br /&gt;
For an Enterprise deployment, it is recommended to deploy Spark cluster in standalone cluster mode alongside other Monasca components.  In the minimal configuration, say for example in a devstack deployment, both master and worker can be deployed on a single node. Spark can be also deployed on multiple nodes, with multiple masters and workers running on each of the nodes.&lt;br /&gt;
&lt;br /&gt;
=== Logical processing data flow ===&lt;br /&gt;
&lt;br /&gt;
The logical data flow within monasca-transform can be broadly divided into two distinct flows, namely conversion of input metrics into a record store format and transforming of the record store data using series of generic transformation components to derive transformed metric data.&lt;br /&gt;
&lt;br /&gt;
==== Conversion to record store format ====&lt;br /&gt;
&lt;br /&gt;
[[File:LogicalEventBasedFlow1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Conversion of input metrics into the record store format consists of following steps:&lt;br /&gt;
&lt;br /&gt;
'''Identification''': Identify and filter out unnecessary metrics. This is done by comparing input metric names with a list of  metrics to be transformed in the configuration datastore. If an input metric is not recognized, the metric is ignored in further processing.&lt;br /&gt;
&lt;br /&gt;
'''Validation and Field Extraction''': Input data is validated by checking for presence of expected fields in the metric JSON (expected fields are retrieved from the configuration datastore). Assuming the format is valid, the relevant fields are extracted.&lt;br /&gt;
&lt;br /&gt;
'''Record Generator''': Extracted data is then used to generate one or more new internal processing metrics and the associated metadata, this is referred to as Record Store Data. Multiple internal metrics can be generated in the case where the input raw metric has to be aggregated in more than one way.&lt;br /&gt;
&lt;br /&gt;
An advantage of converting the input metrics into internal record store data is that the rest of the processing does not depend on the input metric format. In the future if there is a need to transform and aggregate data coming in new format, new code will have to written to convert the new data format into record store, but the rest of the processing pipeline will be unchanged.&lt;br /&gt;
&lt;br /&gt;
==== Generic transformation (aggregation) to derive and publish new metrics ====&lt;br /&gt;
&lt;br /&gt;
[[File:LogicalEventBasedFlow2.jpg]]&lt;br /&gt;
&lt;br /&gt;
This is the second half of the processing data flow. Record store data is routed to the appropriate processing component based on internal metric type and specifications in the configuration datastore. Additional processing is then performed. Processing includes grouping the data in the record store with various user-defined parameters, setting of the final transformed metric name, and setting appropriate dimensions in the new transformed metric. All these operations are driven from configuration parameters. The resulting new transformed metrics are then published back to Apache Kafka.&lt;br /&gt;
&lt;br /&gt;
=== Data model design ===&lt;br /&gt;
&lt;br /&gt;
[[File:DatastoreSchema.jpg]]&lt;br /&gt;
&lt;br /&gt;
pre_transform_specifications and transform_specifications tables are used in conversion of input metrics into record store format and conversion of record store data into final transformed metrics to be published to Apache Kafka.&lt;br /&gt;
&lt;br /&gt;
kafka_offsets table stores the offset information retrieved by Spark streaming direct Kafka API, when it starts processing a batch. Only if the processing data in a batch succeeds, the latest offset information is updated in kafka_offset table. The last saved offset information is used by the Spark driver on initialization to start processing from where it left off.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
* pre_transform_specifications table&lt;br /&gt;
** event_type: name of the metric to process&lt;br /&gt;
** pre_transform_spec: Specification in JSON format to aid in processing of data to record store format. The JSON specification consists of following fields:&lt;br /&gt;
*** event_type: name of the metric to &lt;br /&gt;
*** event_processing_params: key-value pairs dictionary of parameters to aid in conversion of input metric to record store format. Examples include set_default_region&lt;br /&gt;
** intermediate_id_list: list of internal metrics, represented by their identifiers, that the input metric should be converted into. During record store generation script multiple internal metrics will be generated from the same input metric. Each internal metric can be transformed with a different processing pipeline.&lt;br /&gt;
** required_raw_fields_list: list of JSON path strings, that will be used during validation to check if they exist and are not empty.&lt;br /&gt;
** service_id: service identifier, identifies which service this input metric belongs to.&lt;br /&gt;
&lt;br /&gt;
* transform_specs table&lt;br /&gt;
** metric_id: Identifier representing internal processing metric&lt;br /&gt;
** transform_spec: Specification in JSON format which defines the processing pipeline and runtime parameters to be used by processing pipeline components. The JSON specification consists of following fields:&lt;br /&gt;
*** aggregation_params_map: key-value pairs which represent the processing pipeline and runtime parameters.&lt;br /&gt;
*** aggregation_pipeline: JSON representation of processing pipeline specification and any run time parameters used by components in processing pipeline e.g. aggregation_group_by_list&lt;br /&gt;
* kafka_offsets table&lt;br /&gt;
** topic: Kafka topic for which this offsets are being collected and stored&lt;br /&gt;
** until_offset: end  of the offset range&lt;br /&gt;
** from_offset: start of the offset range&lt;br /&gt;
** app_name: name of the application, on behalf of which these offsets are being stored.&lt;br /&gt;
** partition: partition identifier&lt;br /&gt;
&lt;br /&gt;
=== Design of generic transformation components ===&lt;br /&gt;
&lt;br /&gt;
Generic transformation components will be reusable components that can be assembled into a complex transformation pipeline. Each generic component will be implemented as a python class and can  invoke multiple Spark transformations. Generic components of a same type will implement functions which take standard set of arguments and return a standard Spark RDD.  Source, Usage, Setter and Insert are few generic component types.&lt;br /&gt;
&lt;br /&gt;
All usage components will implement a python function called 'usage' which takes 'transform_context' and 'record_store_dataframe' as arguments and returns an 'instance_usage_dataframe'. Similarly all setter components will implement a function called 'setter' which takes 'transform_context' and 'instance_usage_dataframe' as arguments and returns a modified 'instance_usage_dataframe. Component interfaces are standardized by input and output type to allow plug-ability.&lt;br /&gt;
&lt;br /&gt;
Generic transformation components are extensible and new components can be added when necessary. For example if there is a need for some transformation routine to lookup a value by making a REST API call, a new setter component can be developed which implements the standard &amp;quot;setter&amp;quot; function interface. Since the new setter component adheres to the Setter component interface, it is possible to add this new component after or before any previous setter component. Complex transformation pipelines can be built by using series of these pluggable components via the transformation specification.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Component Type !! Component Short Name !! Component Description !! Arguments !! Returns &lt;br /&gt;
|-&lt;br /&gt;
| Usage || fetch_quantity || Groups record_store_data_frame record represented by intermediate metric id by usage_group_by_list, and then performs operation indicated by usage_fetch_operation parameter. || transform_context, record_store_data_frame || instance_usage_data_frame&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; || fetch_quantity_util || Groups record_store_data_frame records for quantity and utilization percentage  by usage_group_by_list and usage_fetch operation to  find the utilized quantity. || transform_context, record_store_data_frame || instance_usage_data_frame&lt;br /&gt;
|-&lt;br /&gt;
| Setter || rollup_quantity || Groups instance_usage_data_frame data, by setter_group_by_list parameter and then performs operation as indicated by setter_fetch_operation parameter || transform_context, instance_usage_data_frame || instance_usage_data_frame&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; || set_aggregated_metric_name || Iterate through instance_usage_data_frame data and set metric name, indicated by aggregation_uom parameter || transform_context, instance_usage_data_frame || instance_usage_data_frame&lt;br /&gt;
|-&lt;br /&gt;
| Insert || insert_data || Prepares final final transformed metric json by setting dimensions as indicated by setter_dimension_list parameter and publishes the data to Kafka &amp;quot;metrics&amp;quot; topic || transform_context, instance_usage_data_frame || instance_usage_data_frame&lt;br /&gt;
|}&lt;br /&gt;
Generic transform components are easy to write and maintain. Besides being re-usable, these generic transform components can be combined to create complex transformation routines or pipelines. Unit tests in python can be written to test each component individually and also to test a complex transformation routines.&lt;br /&gt;
&lt;br /&gt;
=== Example transformation of input metric ===&lt;br /&gt;
&lt;br /&gt;
Following table lists transformation steps for a input metric&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Step !! Component !! Description !! Spark Transformation !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Retrieve Input Metric&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
('583d49ab6aca482da653dd838deaf538load.avg_5_minhostnamedevstack',&lt;br /&gt;
'{&amp;quot;metric&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;mem.total_mb&amp;quot;,&lt;br /&gt;
            &amp;quot;dimensions&amp;quot;:{&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;
            &amp;quot;timestamp&amp;quot;:1453308000000,&lt;br /&gt;
            &amp;quot;value&amp;quot;:5969.0},&lt;br /&gt;
  &amp;quot;meta&amp;quot;:{&amp;quot;tenantId&amp;quot;:&amp;quot;583d49ab6aca482da653dd838deaf538&amp;quot;,&lt;br /&gt;
          &amp;quot;region&amp;quot;:&amp;quot;useast&amp;quot;},&lt;br /&gt;
  &amp;quot;creation_time&amp;quot;:1453308005}')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|| Incoming Monasca metric tuple pulled from Kafka || -- || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Call Input Metric to Record Store Converter || Converts incoming metric into a record store dataframe || &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//pseudo code&lt;br /&gt;
KafkaUtils.createDirectStream //Spark Streaming API get discretized stream from kafka&lt;br /&gt;
DStream.transform() //to pull offsets&lt;br /&gt;
raw_metrics_df = inputDStreamRDD.map()  //to extract the JSON metric from the tuple, and convert to dataframe&lt;br /&gt;
pre_transform_df = pre_transform_specs.jsonRDD() //convert to pre_transform_specs into data frame&lt;br /&gt;
filtered_metrics_df = raw_metrics_df.join(pre_transform_df).where(event_type=metric_name) //join raw data with pre transform specs df to filter out unwanted raw metrics&lt;br /&gt;
validated_df = filtered_metrics_df.validate() //validate metrics, check for required fields from pre_transform_spec for this event type&lt;br /&gt;
record_store_df = validated_df.explode() //generate multiple records for each intermediate metrics from pre_transform spec's intermediate_metric_id_list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|| Pulls kafka offset information from Kafka DStream, filters, validates and generates records in record store dataframe format&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Process Metrics in record store data || Finds the intermediate metrics from the record store dataframe, and for each metric finds the transformation pipeline from transform specs and invokes each component represented by aggregation_pipeline parameter in the transform spec || -- || Creates a transform_context object, which is contains Kafka offset information, and any configuration properties&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Call fetch quantity usage component || fetch_quantity (latest) finds the latest quantity for an hour || &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fetch_latest(transform_context, record_store_data) {&lt;br /&gt;
   &lt;br /&gt;
    //pseudo code&lt;br /&gt;
                    &lt;br /&gt;
    grouped_sorted_df = record_store_df.groupBy(&amp;quot;host&amp;quot;, &amp;quot;event_date&amp;quot;, &amp;quot;event_hour&amp;quot;) and sort group by timestamp&lt;br /&gt;
    latest_grouped_sorted_df = grouped_sorted_df: get latest in each group&lt;br /&gt;
    instance_usage_df = convert latest_grouped_sorted_df to instance_usage_df&lt;br /&gt;
    return instance_usage_df&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|| &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Call Set Aggregated Metric Name Component || Sets final aggregated metric name || &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set_aggregated_metric_metric_name(transform_context, instance_usage_df) {&lt;br /&gt;
    //pseudo code&lt;br /&gt;
    instance_usage_df = instance_usage_df.map(transform_context.transform_spec.aggregated_uom)&lt;br /&gt;
    return instance_usage_df&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; || &amp;amp;nbsp; &lt;br /&gt;
|-&lt;br /&gt;
| 6 || Call Insert Kafka Component || Converts instance_usage_df to metrics json and publish to Kafka || &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
insert_data(transform_context, instance_usage_df) {&lt;br /&gt;
    //pseudo code&lt;br /&gt;
    //convert to json and set proper dimensions&lt;br /&gt;
    instance_usage_json_list = convert_to_metrics_json(instance_usage_df,&lt;br /&gt;
                                                  transform_context.transform_specs.aggregaton_dimensions)&lt;br /&gt;
    kafka_publisher.publish(instance_usage_json_list) //publish metrics to kafka&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|| &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Impact of deploying Monasca Transform ===&lt;br /&gt;
==== Security impact ====&lt;br /&gt;
monasca-transform uses Spark Streaming to connect to the &amp;quot;metrics&amp;quot; topic in Kafka to retrieve metrics for processing. monasca-transform writes transformed metrics back to Kafka on behalf of the tenant which can be set in a configuration file. The tenant should have appropriate monasca-admin role so that the data gets persisted in the Monasca datastore. The Spark Web user interface and connections between master and worker nodes can be secured using ACL and encryption[4].  Connection to Kafka and encryption is not yet supported, but work is currently underway to provide such a support in Kafka[4].&lt;br /&gt;
&lt;br /&gt;
==== Performance/Scalability Impacts ====&lt;br /&gt;
&lt;br /&gt;
* Since new transformed metrics will be written back to the &amp;quot;metrics&amp;quot; topic in Kafka, it will have some impact in terms of increasing the metrics to be persisted. This should not have any significant impact as transformed/aggregated metrics would necessarily be significantly fewer in number compared to the overall number of incoming metrics being persisted.&lt;br /&gt;
* Given that transformed metrics will be significantly fewer in number they should not have any appreciable impact on data retention policy.&lt;br /&gt;
* Spark master and worker has to be configured and installed on nodes where monasca-transform is deployed (most likely alongside other Monasca components though it's not necessary) and thus has to be allocated resources like CPU and Memory for the Spark master, worker and executor processes. Also, monasca-transform python components have to be configured and deployed. Deploying Spark and monasca-transform will have some impact in terms of increasing load on nodes where it runs. This impact will have to be evaluated.&lt;br /&gt;
* In terms of scalability, Spark worker nodes can be scaled horizontally across additional nodes in case the amount of metrics that have to be processed increases.&lt;br /&gt;
&lt;br /&gt;
==== Other deployer impact ====&lt;br /&gt;
&lt;br /&gt;
monasca-transform will have to be configured via configuration file(s). Configuration options include pointers to Zookeeper, batching interval used by Spark Streaming, tenant id on behalf of which metrics will be submitted to Kafka and Spark Master information so that the monasca-transform can submit jobs to Spark cluster. There will also be configuration options to access the MySQL database to pull in information from the driver tables.&lt;br /&gt;
&lt;br /&gt;
In addition, the deployer which installs monasca-transform will have to install start/stop scripts for the Spark worker, Spark master and monasca-transform processes. The deployer will also have to insert pre-transformation specifications and transformation specifications in the MySQL driver tables.&lt;br /&gt;
&lt;br /&gt;
monasca-transform will be an optional component in Monasca and users can elect to either install it or not. A devstack plugin is being authored which will provide the means to install monasca-transform and Spark and also a tempest test.  This will enable verification that monasca-transform is working.  This can be used in CI/CD processing.&lt;br /&gt;
&lt;br /&gt;
==== Developer impact ====&lt;br /&gt;
&lt;br /&gt;
Developers who want to write their own transformation routines for aggregating new metrics will have to write new pre-transformation specifications in the transformation specifications JSON and add them to driver tables. To add new transformation components, the developers have to write python modules which implement the appropriate interface such as usage, setter, insert, etc. and use Spark transformations to manipulate and/or write data back to Kafka. New components will also have to be added to the setup.cfg so that new components can be loaded and utilized by monasca-transform.&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* Apache Spark 1.6.3 (originally developed against 1.6.0)&lt;br /&gt;
* Zookeeper&lt;br /&gt;
* Relational database - tested with MariaDB 10.2&lt;br /&gt;
* Other Monasca services, including Kafka as used in monasca-common&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
Python unit tests are written to test each component of the overall transformation pipeline individually, as well as to test a part of or whole transformation pipeline. A devstack plugin was developed to install monasca-transform and Spark, allowing a simple way to try out monasca-transform. &lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;br /&gt;
&lt;br /&gt;
1 Apache Kafka [[https://kafka.apache.org]]&lt;br /&gt;
&lt;br /&gt;
2 Apache Spark [[https://spark.apache.org]]&lt;br /&gt;
&lt;br /&gt;
3 Spark Security [[https://spark.apache.org/docs/latest/security.html]]&lt;br /&gt;
&lt;br /&gt;
4 Kafka Security [[https://cwiki.apache.org/confluence/display/KAFKA/Security]]&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Ceilosca&amp;diff=174989</id>
		<title>Ceilosca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Ceilosca&amp;diff=174989"/>
				<updated>2020-06-02T07:41:29Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Overview */ deprecation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DEPRECATION =&lt;br /&gt;
Ceilosca is DEPRECATED as of the Ussuri OpenStack release.&lt;br /&gt;
&lt;br /&gt;
The functionality of Ceilosca is [https://opendev.org/openstack/ceilometer/commit/126350c0ae609c5d35d54556883da2476e81e30e now found in Ceilometer] as the Monasca Publisher option. This closer integration will make it easier to deploy and connect Ceilometer to Monasca. To support older versions and follow OpenStack deprecation policies, this repository will continue to be maintained, but new deployments are encouraged to determine if the metrics required are available directly in Monasca, or use [https://docs.openstack.org/ceilometer/latest/admin/telemetry-data-pipelines.html#pipeline-configuration the Monasca Publisher].&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
Ceilosca is a combination of [[Ceilometer]] and [[Monasca]]. In Ceilosca data collected using the Ceilometer Agents (Notification Agent, Central/Compute Agent) is sent to the Monasca API and retrieved back using the Ceilometer V2 API for backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
Note that the Telemetry project has deprecated the Ceilometer v2 API starting in Newton and the API has been removed in the Queens release of Ceilometer.  Ceilosca continues to support the Ceilometer v2 API through Pike, though users are encouraged to switch to using the Monasca API going forward.  Data gathered through the Ceilometer agents will still continue to be published and stored in Monasca.&lt;br /&gt;
&lt;br /&gt;
=== News ===&lt;br /&gt;
(Oct 2019) With the Ussuri OpenStack Release, Ceilosca will be integrated in the Ceilometer codebase as an official publisher.  This will make it even easier to deploy and use.  Watch commit https://review.opendev.org/#/c/562400/ for the latest status.&lt;br /&gt;
&lt;br /&gt;
= Presentations =&lt;br /&gt;
:'''Tokyo Summit 2015'''&lt;br /&gt;
::Ceilometer+Monasca=Ceilosca&lt;br /&gt;
::Video: https://www.openstack.org/summit/tokyo-2015/videos/presentation/ceilometer-monascaceilosca&lt;br /&gt;
::Slides: https://www.slideshare.net/FabioGiannetti/ceilosca&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* Makes use of existing Ceilometer sample gathering functionality through OpenStack services&lt;br /&gt;
* Leverages the Monasca monitoring setup, thus reducing overall complexity in cloud deployment&lt;br /&gt;
* Integrated with devstack deployment so you can try it out&lt;br /&gt;
&lt;br /&gt;
= Architecture =&lt;br /&gt;
[[File:Ceilosca-Architecture-Train.png|Ceilosca Architecture Component Diagram, Train release]]&lt;br /&gt;
&lt;br /&gt;
In the Rocky release, Ceilosca consists of a '''Monasca Publisher''' component for Ceilometer to send samples to the Monasca API.&lt;br /&gt;
&lt;br /&gt;
Historically, Ceilosca up through the Pike release had two major components: &lt;br /&gt;
* A '''publisher''' component that takes samples from the Ceilometer Agent and publishes them to the Monasca API.&lt;br /&gt;
* A '''storage driver''' component that works with the Ceilometer V2 API to use the Monasca API to retrieve stored samples.&lt;br /&gt;
[[File:Ceilosca-Architecture-recreatedslide.png|Monasca Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
Another [https://alln-extcloud-storage.cisco.com/ciscoblogs/ceilostica_arch-550x265.png Ceilosca Archiecture diagram]&lt;br /&gt;
&lt;br /&gt;
Additionally, the Ceilosca project includes '''testing resources''' and a '''Devstack plugin''' to allow deployment.&lt;br /&gt;
&lt;br /&gt;
= Deployment and Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Deploying ==&lt;br /&gt;
For information on how to deploy Ceilosca, see the [https://git.openstack.org/cgit/openstack/monasca-ceilometer/tree/README.md monasca-ceilometer/README.md] and [https://git.openstack.org/cgit/openstack/monasca-ceilometer/tree/devstack/README.md monasca-ceilometer/devstack/README.md].&lt;br /&gt;
&lt;br /&gt;
In brief, Ceilosca may be overlaid on a devstack deployment which has Ceilometer and Monasca services, or you may use the provided Vagrant file to deploy a complete Ceilosca devstack, or you may use the examples and directions provided to include Ceilosca in your own deployment mechanism.&lt;br /&gt;
&lt;br /&gt;
Note that the README.md has information about how to configure which meters are collected (TL;DR whatever is configured in Ceilometer's polling.yml) and available through the Monasca API.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Common deployment ==&lt;br /&gt;
* Check the Ceilometer services are running&lt;br /&gt;
* Check /etc/ceilometer/pipeline.yaml has a proper publishers: -monasca:// entry&lt;br /&gt;
* Check /etc/ceilometer/pipeline.yaml has meters defined that match what you want to gather&lt;br /&gt;
* Check that /etc/ceilometer/ceilometer.conf has an entry in [database] for metering_connection that specifies a monasca://http: address that points to your monasca instance&lt;br /&gt;
* Look in /var/log/ceilometer.log or /opt/stack/logs/ceilometer.log for errors&lt;br /&gt;
* Look in /var/log/monasca/api/monasca-api.log for connection issues from ceilometer&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Devstack deployment ==&lt;br /&gt;
* Look in  /opt/stack/logs/ceilometer.log for errors&lt;br /&gt;
* The Ceilometer command line client needs to have the correct environment variables set.  If you have trouble connecting to Monasca, try using the default password from Monasca.&lt;br /&gt;
  * export OS_PROJECT_NAME=service&lt;br /&gt;
  * export OS_IDENTITY_API_VERSION=3&lt;br /&gt;
  * export OS_PASSWORD=&amp;lt;password set in local.conf as SERVICE_PASSWORD&amp;gt;&lt;br /&gt;
  * export OS_AUTH_URL=http://&amp;lt;fill in your Keystone ip&amp;gt;/identity/v3/&lt;br /&gt;
  * export OS_USERNAME=ceilometer&lt;br /&gt;
  * export OS_TENANT_NAME=service&lt;br /&gt;
* Check items in the Common deployment section below&lt;br /&gt;
&lt;br /&gt;
= Repositories =&lt;br /&gt;
* OpenStack Git:&lt;br /&gt;
https://git.openstack.org/cgit/openstack/monasca-ceilometer/&lt;br /&gt;
* Github:&lt;br /&gt;
https://github.com/openstack/monasca-ceilometer&lt;br /&gt;
&lt;br /&gt;
= Coding Standards =&lt;br /&gt;
All Python code conforms to the OpenStack standards at http://docs.openstack.org/developer/hacking/.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015-2016 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2017 Hewlett Packard Enterprise Development LP&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Cisco.&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2018 SUSE LLC&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;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Heat-Monasca-Auto-Scaling&amp;diff=172918</id>
		<title>Heat-Monasca-Auto-Scaling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Heat-Monasca-Auto-Scaling&amp;diff=172918"/>
				<updated>2019-10-29T20:53:22Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: train workshop&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
In Liberty, heat has introduced the support for the monasca based auto-scaling, which is similar to the ceilometer based auto-scaling in heat.  To use this feature, please follow the details given below:&lt;br /&gt;
&lt;br /&gt;
== Setup the cloud environment ==&lt;br /&gt;
* Install python-monascaclient [1] in all of the heat-engines, deployed in your cloud environment and restart those heat-engines.&lt;br /&gt;
* Install and configure the monasca-agent [2] to monitor the VMs performance metric&lt;br /&gt;
&lt;br /&gt;
== Create the auto-scale template ==&lt;br /&gt;
Use the monasca template [3] as reference and update the template with required alarm-definition expression. In the expression, its mandatory to mention the 'scale_group' measurement as :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
avg(vm.cpu.utilization_perc{scale_group=XXX})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the same 'scale_group' should be configured as metadata scale group elements (nova instances) as: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
metadata: {&amp;quot;scale_group&amp;quot;: XXX}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will help monasca to aggregate the metrics from all elements in the given scale group and find out whether alarm threshold is reached as defined in the alarm expression.&lt;br /&gt;
In usual practice, scale_group XXX is filled by stack ID or scale group ID, which gives uniqueness.&lt;br /&gt;
&lt;br /&gt;
== Train Workshop ==&lt;br /&gt;
A [https://www.openstack.org/summit/denver-2019/summit-schedule/events/23291/scaling-should-be-easy-and-automatic-heat-and-monasca workshop] demonstrating using auto-scaling with Monasca was presented at the Denver 2019 Summit. [5]&lt;br /&gt;
&lt;br /&gt;
== Mitaka User session ==&lt;br /&gt;
In mitaka summit, monasca based auto-scaling is demonstrated and recorded video is available here [4] &lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
# https://pypi.python.org/pypi/python-monascaclient&lt;br /&gt;
# https://github.com/openstack/monasca-agent&lt;br /&gt;
# https://github.com/openstack/heat-templates/blob/master/hot/monasca/autoscaling.yaml &lt;br /&gt;
# https://www.openstack.org/summit/tokyo-2015/videos/presentation/auto-scaling-cloud-infrastructure-and-applications&lt;br /&gt;
# https://www.openstack.org/summit/denver-2019/summit-schedule/events/23291/scaling-should-be-easy-and-automatic-heat-and-monasca&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Ceilosca&amp;diff=172914</id>
		<title>Ceilosca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Ceilosca&amp;diff=172914"/>
				<updated>2019-10-29T19:48:04Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
Ceilosca is a combination of [[Ceilometer]] and [[Monasca]]. In Ceilosca data collected using the Ceilometer Agents (Notification Agent, Central/Compute Agent) is sent to the Monasca API and retrieved back using the Ceilometer V2 API for backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
Note that the Telemetry project has deprecated the Ceilometer v2 API starting in Newton and the API has been removed in the Queens release of Ceilometer.  Ceilosca continues to support the Ceilometer v2 API through Pike, though users are encouraged to switch to using the Monasca API going forward.  Data gathered through the Ceilometer agents will still continue to be published and stored in Monasca.&lt;br /&gt;
&lt;br /&gt;
=== News ===&lt;br /&gt;
(Oct 2019) With the Ussuri OpenStack Release, Ceilosca will be integrated in the Ceilometer codebase as an official publisher.  This will make it even easier to deploy and use.  Watch commit https://review.opendev.org/#/c/562400/ for the latest status.&lt;br /&gt;
&lt;br /&gt;
= Presentations =&lt;br /&gt;
:'''Tokyo Summit 2015'''&lt;br /&gt;
::Ceilometer+Monasca=Ceilosca&lt;br /&gt;
::Video: https://www.openstack.org/summit/tokyo-2015/videos/presentation/ceilometer-monascaceilosca&lt;br /&gt;
::Slides: https://www.slideshare.net/FabioGiannetti/ceilosca&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* Makes use of existing Ceilometer sample gathering functionality through OpenStack services&lt;br /&gt;
* Leverages the Monasca monitoring setup, thus reducing overall complexity in cloud deployment&lt;br /&gt;
* Integrated with devstack deployment so you can try it out&lt;br /&gt;
&lt;br /&gt;
= Architecture =&lt;br /&gt;
[[File:Ceilosca-Architecture-Train.png|Ceilosca Architecture Component Diagram, Train release]]&lt;br /&gt;
&lt;br /&gt;
In the Rocky release, Ceilosca consists of a '''Monasca Publisher''' component for Ceilometer to send samples to the Monasca API.&lt;br /&gt;
&lt;br /&gt;
Historically, Ceilosca up through the Pike release had two major components: &lt;br /&gt;
* A '''publisher''' component that takes samples from the Ceilometer Agent and publishes them to the Monasca API.&lt;br /&gt;
* A '''storage driver''' component that works with the Ceilometer V2 API to use the Monasca API to retrieve stored samples.&lt;br /&gt;
[[File:Ceilosca-Architecture-recreatedslide.png|Monasca Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
Another [https://alln-extcloud-storage.cisco.com/ciscoblogs/ceilostica_arch-550x265.png Ceilosca Archiecture diagram]&lt;br /&gt;
&lt;br /&gt;
Additionally, the Ceilosca project includes '''testing resources''' and a '''Devstack plugin''' to allow deployment.&lt;br /&gt;
&lt;br /&gt;
= Deployment and Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Deploying ==&lt;br /&gt;
For information on how to deploy Ceilosca, see the [https://git.openstack.org/cgit/openstack/monasca-ceilometer/tree/README.md monasca-ceilometer/README.md] and [https://git.openstack.org/cgit/openstack/monasca-ceilometer/tree/devstack/README.md monasca-ceilometer/devstack/README.md].&lt;br /&gt;
&lt;br /&gt;
In brief, Ceilosca may be overlaid on a devstack deployment which has Ceilometer and Monasca services, or you may use the provided Vagrant file to deploy a complete Ceilosca devstack, or you may use the examples and directions provided to include Ceilosca in your own deployment mechanism.&lt;br /&gt;
&lt;br /&gt;
Note that the README.md has information about how to configure which meters are collected (TL;DR whatever is configured in Ceilometer's polling.yml) and available through the Monasca API.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Common deployment ==&lt;br /&gt;
* Check the Ceilometer services are running&lt;br /&gt;
* Check /etc/ceilometer/pipeline.yaml has a proper publishers: -monasca:// entry&lt;br /&gt;
* Check /etc/ceilometer/pipeline.yaml has meters defined that match what you want to gather&lt;br /&gt;
* Check that /etc/ceilometer/ceilometer.conf has an entry in [database] for metering_connection that specifies a monasca://http: address that points to your monasca instance&lt;br /&gt;
* Look in /var/log/ceilometer.log or /opt/stack/logs/ceilometer.log for errors&lt;br /&gt;
* Look in /var/log/monasca/api/monasca-api.log for connection issues from ceilometer&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Devstack deployment ==&lt;br /&gt;
* Look in  /opt/stack/logs/ceilometer.log for errors&lt;br /&gt;
* The Ceilometer command line client needs to have the correct environment variables set.  If you have trouble connecting to Monasca, try using the default password from Monasca.&lt;br /&gt;
  * export OS_PROJECT_NAME=service&lt;br /&gt;
  * export OS_IDENTITY_API_VERSION=3&lt;br /&gt;
  * export OS_PASSWORD=&amp;lt;password set in local.conf as SERVICE_PASSWORD&amp;gt;&lt;br /&gt;
  * export OS_AUTH_URL=http://&amp;lt;fill in your Keystone ip&amp;gt;/identity/v3/&lt;br /&gt;
  * export OS_USERNAME=ceilometer&lt;br /&gt;
  * export OS_TENANT_NAME=service&lt;br /&gt;
* Check items in the Common deployment section below&lt;br /&gt;
&lt;br /&gt;
= Repositories =&lt;br /&gt;
* OpenStack Git:&lt;br /&gt;
https://git.openstack.org/cgit/openstack/monasca-ceilometer/&lt;br /&gt;
* Github:&lt;br /&gt;
https://github.com/openstack/monasca-ceilometer&lt;br /&gt;
&lt;br /&gt;
= Coding Standards =&lt;br /&gt;
All Python code conforms to the OpenStack standards at http://docs.openstack.org/developer/hacking/.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015-2016 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2017 Hewlett Packard Enterprise Development LP&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Cisco.&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2018 SUSE LLC&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;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Ceilosca&amp;diff=172913</id>
		<title>Ceilosca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Ceilosca&amp;diff=172913"/>
				<updated>2019-10-29T19:44:39Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: Update diagram for Train&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
Ceilosca is a combination of [[Ceilometer]] and [[Monasca]]. In Ceilosca data collected using the Ceilometer Agents (Notification Agent, Central/Compute Agent) is sent to the Monasca API and retrieved back using the Ceilometer V2 API for backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
Note that the Telemetry project has deprecated the Ceilometer v2 API starting in Newton and the API has been removed in the Queens release of Ceilometer.  Ceilosca continues to support the Ceilometer v2 API through Pike, though users are encouraged to switch to using the Monasca API going forward.  Data gathered through the Ceilometer agents will still continue to be published and stored in Monasca.&lt;br /&gt;
&lt;br /&gt;
= Presentations =&lt;br /&gt;
:'''Tokyo Summit 2015'''&lt;br /&gt;
::Ceilometer+Monasca=Ceilosca&lt;br /&gt;
::Video: https://www.openstack.org/summit/tokyo-2015/videos/presentation/ceilometer-monascaceilosca&lt;br /&gt;
::Slides: https://www.slideshare.net/FabioGiannetti/ceilosca&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* Makes use of existing Ceilometer sample gathering functionality through OpenStack services&lt;br /&gt;
* Leverages the Monasca monitoring setup, thus reducing overall complexity in cloud deployment&lt;br /&gt;
* Integrated with devstack deployment so you can try it out&lt;br /&gt;
&lt;br /&gt;
= Architecture =&lt;br /&gt;
[[File:Ceilosca-Architecture-Train.png|Ceilosca Architecture Component Diagram, Train release]]&lt;br /&gt;
&lt;br /&gt;
In the Rocky release, Ceilosca consists of a '''Monasca Publisher''' component for Ceilometer to send samples to the Monasca API.&lt;br /&gt;
&lt;br /&gt;
Historically, Ceilosca up through the Pike release had two major components: &lt;br /&gt;
* A '''publisher''' component that takes samples from the Ceilometer Agent and publishes them to the Monasca API.&lt;br /&gt;
* A '''storage driver''' component that works with the Ceilometer V2 API to use the Monasca API to retrieve stored samples.&lt;br /&gt;
[[File:Ceilosca-Architecture-recreatedslide.png|Monasca Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
Another [https://alln-extcloud-storage.cisco.com/ciscoblogs/ceilostica_arch-550x265.png Ceilosca Archiecture diagram]&lt;br /&gt;
&lt;br /&gt;
Additionally, the Ceilosca project includes '''testing resources''' and a '''Devstack plugin''' to allow deployment.&lt;br /&gt;
&lt;br /&gt;
= Deployment and Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Deploying ==&lt;br /&gt;
For information on how to deploy Ceilosca, see the [https://git.openstack.org/cgit/openstack/monasca-ceilometer/tree/README.md monasca-ceilometer/README.md] and [https://git.openstack.org/cgit/openstack/monasca-ceilometer/tree/devstack/README.md monasca-ceilometer/devstack/README.md].&lt;br /&gt;
&lt;br /&gt;
In brief, Ceilosca may be overlaid on a devstack deployment which has Ceilometer and Monasca services, or you may use the provided Vagrant file to deploy a complete Ceilosca devstack, or you may use the examples and directions provided to include Ceilosca in your own deployment mechanism.&lt;br /&gt;
&lt;br /&gt;
Note that the README.md has information about how to configure which meters are collected (TL;DR whatever is configured in Ceilometer's polling.yml) and available through the Monasca API.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Common deployment ==&lt;br /&gt;
* Check the Ceilometer services are running&lt;br /&gt;
* Check /etc/ceilometer/pipeline.yaml has a proper publishers: -monasca:// entry&lt;br /&gt;
* Check /etc/ceilometer/pipeline.yaml has meters defined that match what you want to gather&lt;br /&gt;
* Check that /etc/ceilometer/ceilometer.conf has an entry in [database] for metering_connection that specifies a monasca://http: address that points to your monasca instance&lt;br /&gt;
* Look in /var/log/ceilometer.log or /opt/stack/logs/ceilometer.log for errors&lt;br /&gt;
* Look in /var/log/monasca/api/monasca-api.log for connection issues from ceilometer&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Devstack deployment ==&lt;br /&gt;
* Look in  /opt/stack/logs/ceilometer.log for errors&lt;br /&gt;
* The Ceilometer command line client needs to have the correct environment variables set.  If you have trouble connecting to Monasca, try using the default password from Monasca.&lt;br /&gt;
  * export OS_PROJECT_NAME=service&lt;br /&gt;
  * export OS_IDENTITY_API_VERSION=3&lt;br /&gt;
  * export OS_PASSWORD=&amp;lt;password set in local.conf as SERVICE_PASSWORD&amp;gt;&lt;br /&gt;
  * export OS_AUTH_URL=http://&amp;lt;fill in your Keystone ip&amp;gt;/identity/v3/&lt;br /&gt;
  * export OS_USERNAME=ceilometer&lt;br /&gt;
  * export OS_TENANT_NAME=service&lt;br /&gt;
* Check items in the Common deployment section below&lt;br /&gt;
&lt;br /&gt;
= Repositories =&lt;br /&gt;
* OpenStack Git:&lt;br /&gt;
https://git.openstack.org/cgit/openstack/monasca-ceilometer/&lt;br /&gt;
* Github:&lt;br /&gt;
https://github.com/openstack/monasca-ceilometer&lt;br /&gt;
&lt;br /&gt;
= Coding Standards =&lt;br /&gt;
All Python code conforms to the OpenStack standards at http://docs.openstack.org/developer/hacking/.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015-2016 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2017 Hewlett Packard Enterprise Development LP&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Cisco.&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2018 SUSE LLC&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;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=File:Ceilosca-Architecture-Train.png&amp;diff=172912</id>
		<title>File:Ceilosca-Architecture-Train.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=File:Ceilosca-Architecture-Train.png&amp;diff=172912"/>
				<updated>2019-10-29T19:42:31Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: Architecture diagram for Ceilosca as of the Train release.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Architecture diagram for Ceilosca as of the Train release.&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170044</id>
		<title>Auto-scaling SIG/Theory of Auto-Scaling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170044"/>
				<updated>2019-05-15T23:37:37Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Considerations and Guidelines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Theory of Auto-Scaling =&lt;br /&gt;
&lt;br /&gt;
== General Description ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fill in&amp;gt;&lt;br /&gt;
&amp;lt;what is the scope of auto-scaling, how does it differ from self-healing, what does it have in common with self-healing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conceptual Diagram ==&lt;br /&gt;
&lt;br /&gt;
[[File:OpenStack-Auto-Scaling.svg|Auto-Scaling Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
== Components of Auto-Scaling ==&lt;br /&gt;
&lt;br /&gt;
OpenStack offers a rich set of services to build, manage, orchestrate, and provision a cloud. This gives administrators some choices in how to best serve their customer's needs.&lt;br /&gt;
&lt;br /&gt;
* Scaling units - There are a number of components that can be controlled with Auto-Scaling.&lt;br /&gt;
** Compute Host&lt;br /&gt;
** VM running on a Compute Host&lt;br /&gt;
** Container running on a Compute Host&lt;br /&gt;
** Network Attached Storage&lt;br /&gt;
** Virtual Network Functions&lt;br /&gt;
* Monitoring Service - either using an agent installed on the Scaling unit, or using a polling method to retrieve metrics&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Monasca Monasca]&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Ceilometer from the Telemetry project]&lt;br /&gt;
** Prometheus&lt;br /&gt;
* Alarming Service&lt;br /&gt;
** Monasca has a built in alarm thresholding service and notification service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Aodh from the Telemetry project]&lt;br /&gt;
* Decision Services - There are a number of services in OpenStack that can interpret metrics and alarms based on configured logic and produce commands to Orchestration Engines&lt;br /&gt;
** Congress&lt;br /&gt;
** Heat&lt;br /&gt;
** Vitrage&lt;br /&gt;
** Watcher&lt;br /&gt;
* Orchestration Engines&lt;br /&gt;
** Heat&lt;br /&gt;
** Senlin is a clustering engine for OpenStack, and can orchestrate auto-scaling&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Tacker Tacker]&lt;br /&gt;
&lt;br /&gt;
== Considerations and Guidelines ==&lt;br /&gt;
* Monitoring takes resources, plan accordingly&lt;br /&gt;
* Avoid scaling too quickly or too often&lt;br /&gt;
* Don't expect instantaneous scaling (see above)&lt;br /&gt;
** Define thresholds to be predictive of scale needs, not reactive to a bad state&lt;br /&gt;
* Be aware of where the logic for scaling is (alarm thresholds, decision services)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anecdotes and Stories ===&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170043</id>
		<title>Auto-scaling SIG/Theory of Auto-Scaling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170043"/>
				<updated>2019-05-15T23:29:46Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Components of Auto-Scaling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Theory of Auto-Scaling =&lt;br /&gt;
&lt;br /&gt;
== General Description ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fill in&amp;gt;&lt;br /&gt;
&amp;lt;what is the scope of auto-scaling, how does it differ from self-healing, what does it have in common with self-healing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conceptual Diagram ==&lt;br /&gt;
&lt;br /&gt;
[[File:OpenStack-Auto-Scaling.svg|Auto-Scaling Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
== Components of Auto-Scaling ==&lt;br /&gt;
&lt;br /&gt;
OpenStack offers a rich set of services to build, manage, orchestrate, and provision a cloud. This gives administrators some choices in how to best serve their customer's needs.&lt;br /&gt;
&lt;br /&gt;
* Scaling units - There are a number of components that can be controlled with Auto-Scaling.&lt;br /&gt;
** Compute Host&lt;br /&gt;
** VM running on a Compute Host&lt;br /&gt;
** Container running on a Compute Host&lt;br /&gt;
** Network Attached Storage&lt;br /&gt;
** Virtual Network Functions&lt;br /&gt;
* Monitoring Service - either using an agent installed on the Scaling unit, or using a polling method to retrieve metrics&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Monasca Monasca]&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Ceilometer from the Telemetry project]&lt;br /&gt;
** Prometheus&lt;br /&gt;
* Alarming Service&lt;br /&gt;
** Monasca has a built in alarm thresholding service and notification service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Aodh from the Telemetry project]&lt;br /&gt;
* Decision Services - There are a number of services in OpenStack that can interpret metrics and alarms based on configured logic and produce commands to Orchestration Engines&lt;br /&gt;
** Congress&lt;br /&gt;
** Heat&lt;br /&gt;
** Vitrage&lt;br /&gt;
** Watcher&lt;br /&gt;
* Orchestration Engines&lt;br /&gt;
** Heat&lt;br /&gt;
** Senlin is a clustering engine for OpenStack, and can orchestrate auto-scaling&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Tacker Tacker]&lt;br /&gt;
&lt;br /&gt;
== Considerations and Guidelines ==&lt;br /&gt;
* Monitoring takes resources, plan accordingly&lt;br /&gt;
* Avoid scaling too quickly or too often&lt;br /&gt;
* Don't expect instantaneous scaling (see above)&lt;br /&gt;
* Be aware of where the logic for scaling is (alarm thresholds, decision services)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anecdotes and Stories ===&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170042</id>
		<title>Auto-scaling SIG/Theory of Auto-Scaling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170042"/>
				<updated>2019-05-15T23:28:22Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Components of Auto-Scaling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Theory of Auto-Scaling =&lt;br /&gt;
&lt;br /&gt;
== General Description ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fill in&amp;gt;&lt;br /&gt;
&amp;lt;what is the scope of auto-scaling, how does it differ from self-healing, what does it have in common with self-healing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conceptual Diagram ==&lt;br /&gt;
&lt;br /&gt;
[[File:OpenStack-Auto-Scaling.svg|Auto-Scaling Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
== Components of Auto-Scaling ==&lt;br /&gt;
&lt;br /&gt;
OpenStack offers a rich set of services to build, manage, orchestrate, and provision a cloud. This gives administrators some choices in how to best serve their customer's needs.&lt;br /&gt;
&lt;br /&gt;
* Scaling units - There are a number of components that can be controlled with Auto-Scaling.&lt;br /&gt;
** Compute Host&lt;br /&gt;
** VM running on a Compute Host&lt;br /&gt;
** Container running on a Compute Host&lt;br /&gt;
** Network Attached Storage&lt;br /&gt;
** Virtual Network Functions&lt;br /&gt;
* Monitoring Service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Monasca Monasca]&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Ceilometer from the Telemetry project]&lt;br /&gt;
** Prometheus&lt;br /&gt;
* Alarming Service&lt;br /&gt;
** Monasca has a built in alarm thresholding service and notification service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Aodh from the Telemetry project]&lt;br /&gt;
* Decision Services - There are a number of services in OpenStack that can interpret metrics and alarms based on configured logic and produce commands to Orchestration Engines&lt;br /&gt;
** Congress&lt;br /&gt;
** Heat&lt;br /&gt;
** Vitrage&lt;br /&gt;
** Watcher&lt;br /&gt;
* Orchestration Engines&lt;br /&gt;
** Heat&lt;br /&gt;
** Senlin is a clustering engine for OpenStack, and can orchestrate auto-scaling&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Tacker Tacker]&lt;br /&gt;
&lt;br /&gt;
== Considerations and Guidelines ==&lt;br /&gt;
* Monitoring takes resources, plan accordingly&lt;br /&gt;
* Avoid scaling too quickly or too often&lt;br /&gt;
* Don't expect instantaneous scaling (see above)&lt;br /&gt;
* Be aware of where the logic for scaling is (alarm thresholds, decision services)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anecdotes and Stories ===&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170041</id>
		<title>Auto-scaling SIG/Theory of Auto-Scaling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170041"/>
				<updated>2019-05-15T23:23:07Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* General Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Theory of Auto-Scaling =&lt;br /&gt;
&lt;br /&gt;
== General Description ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fill in&amp;gt;&lt;br /&gt;
&amp;lt;what is the scope of auto-scaling, how does it differ from self-healing, what does it have in common with self-healing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conceptual Diagram ==&lt;br /&gt;
&lt;br /&gt;
[[File:OpenStack-Auto-Scaling.svg|Auto-Scaling Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
== Components of Auto-Scaling ==&lt;br /&gt;
&lt;br /&gt;
OpenStack offers a rich set of services to build, manage, orchestrate, and provision a cloud. This gives administrators some choices in how to best serve their customer's needs.&lt;br /&gt;
&lt;br /&gt;
* Scaling units - There are a number of components that can be controlled with Auto-Scaling.&lt;br /&gt;
** Compute Host&lt;br /&gt;
** VM running on a Compute Host&lt;br /&gt;
** Container running on a Compute Host&lt;br /&gt;
** Network Attached Storage&lt;br /&gt;
** Virtual Network Functions&lt;br /&gt;
* Monitoring Service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Monasca Monasca]&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Ceilometer from the Telemetry project]&lt;br /&gt;
* Alarming Service&lt;br /&gt;
** Monasca has a built in alarm thresholding service and notification service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Aodh from the Telemetry project]&lt;br /&gt;
* Decision Services - There are a number of services in OpenStack that can interpret metrics and alarms based on configured logic and produce commands to Orchestration Engines&lt;br /&gt;
** Congress&lt;br /&gt;
** Heat&lt;br /&gt;
** Vitrage&lt;br /&gt;
** Watcher&lt;br /&gt;
* Orchestration Engines&lt;br /&gt;
** Heat&lt;br /&gt;
** Senlin is a clustering engine for OpenStack, and can orchestrate auto-scaling&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Tacker Tacker]&lt;br /&gt;
&lt;br /&gt;
== Considerations and Guidelines ==&lt;br /&gt;
* Monitoring takes resources, plan accordingly&lt;br /&gt;
* Avoid scaling too quickly or too often&lt;br /&gt;
* Don't expect instantaneous scaling (see above)&lt;br /&gt;
* Be aware of where the logic for scaling is (alarm thresholds, decision services)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anecdotes and Stories ===&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170040</id>
		<title>Auto-scaling SIG/Theory of Auto-Scaling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170040"/>
				<updated>2019-05-15T23:19:36Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Conceptual Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Theory of Auto-Scaling =&lt;br /&gt;
&lt;br /&gt;
== General Description ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fill in&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conceptual Diagram ==&lt;br /&gt;
&lt;br /&gt;
[[File:OpenStack-Auto-Scaling.svg|Auto-Scaling Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
== Components of Auto-Scaling ==&lt;br /&gt;
&lt;br /&gt;
OpenStack offers a rich set of services to build, manage, orchestrate, and provision a cloud. This gives administrators some choices in how to best serve their customer's needs.&lt;br /&gt;
&lt;br /&gt;
* Scaling units - There are a number of components that can be controlled with Auto-Scaling.&lt;br /&gt;
** Compute Host&lt;br /&gt;
** VM running on a Compute Host&lt;br /&gt;
** Container running on a Compute Host&lt;br /&gt;
** Network Attached Storage&lt;br /&gt;
** Virtual Network Functions&lt;br /&gt;
* Monitoring Service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Monasca Monasca]&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Ceilometer from the Telemetry project]&lt;br /&gt;
* Alarming Service&lt;br /&gt;
** Monasca has a built in alarm thresholding service and notification service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Aodh from the Telemetry project]&lt;br /&gt;
* Decision Services - There are a number of services in OpenStack that can interpret metrics and alarms based on configured logic and produce commands to Orchestration Engines&lt;br /&gt;
** Congress&lt;br /&gt;
** Heat&lt;br /&gt;
** Vitrage&lt;br /&gt;
** Watcher&lt;br /&gt;
* Orchestration Engines&lt;br /&gt;
** Heat&lt;br /&gt;
** Senlin is a clustering engine for OpenStack, and can orchestrate auto-scaling&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Tacker Tacker]&lt;br /&gt;
&lt;br /&gt;
== Considerations and Guidelines ==&lt;br /&gt;
* Monitoring takes resources, plan accordingly&lt;br /&gt;
* Avoid scaling too quickly or too often&lt;br /&gt;
* Don't expect instantaneous scaling (see above)&lt;br /&gt;
* Be aware of where the logic for scaling is (alarm thresholds, decision services)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anecdotes and Stories ===&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170039</id>
		<title>Auto-scaling SIG/Theory of Auto-Scaling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170039"/>
				<updated>2019-05-15T23:19:14Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Components of Auto-Scaling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Theory of Auto-Scaling =&lt;br /&gt;
&lt;br /&gt;
== General Description ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fill in&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conceptual Diagram ==&lt;br /&gt;
&lt;br /&gt;
[[File:OpenStack-Auto-Scaling.svg|Auto-Scaling Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
If you prefer PlantUML&lt;br /&gt;
&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
cloud Cloud\n {&lt;br /&gt;
  rectangle host as &amp;quot;Host&amp;quot; {&lt;br /&gt;
  }&lt;br /&gt;
  rectangle host2 as &amp;quot;Host&amp;quot; {&lt;br /&gt;
    agent VM&lt;br /&gt;
    agent VM2 as &amp;quot;VM&amp;quot;&lt;br /&gt;
    agent Container&lt;br /&gt;
    agent Container2 as &amp;quot;Container&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
agent MS as &amp;quot;Monitoring Service&amp;quot;&lt;br /&gt;
agent DS as &amp;quot;Decision Services\n(Clustering,\nOptimization,\nRoot Cause)&amp;quot;&lt;br /&gt;
agent Heat as &amp;quot;Orchestration \nEngine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
host -down-&amp;gt; MS &lt;br /&gt;
VM -down-&amp;gt; MS &lt;br /&gt;
Container -down-&amp;gt; MS : &amp;quot;Metric \nSamples&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MS -down-&amp;gt; DS : &amp;quot;Alarms&amp;quot;&lt;br /&gt;
MS -down-&amp;gt; Heat : &amp;quot;Alarms&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DS -right-&amp;gt; Heat : &amp;quot;Scaling Commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Heat -up-&amp;gt; host : &amp;quot;Orchestration&amp;quot;&lt;br /&gt;
Heat -up-&amp;gt; VM2 : &amp;quot;Orchestration&amp;quot;&lt;br /&gt;
Heat -up-&amp;gt; Container2 : &amp;quot;Orchestration&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@enduml &lt;br /&gt;
&lt;br /&gt;
== Components of Auto-Scaling ==&lt;br /&gt;
&lt;br /&gt;
OpenStack offers a rich set of services to build, manage, orchestrate, and provision a cloud. This gives administrators some choices in how to best serve their customer's needs.&lt;br /&gt;
&lt;br /&gt;
* Scaling units - There are a number of components that can be controlled with Auto-Scaling.&lt;br /&gt;
** Compute Host&lt;br /&gt;
** VM running on a Compute Host&lt;br /&gt;
** Container running on a Compute Host&lt;br /&gt;
** Network Attached Storage&lt;br /&gt;
** Virtual Network Functions&lt;br /&gt;
* Monitoring Service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Monasca Monasca]&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Ceilometer from the Telemetry project]&lt;br /&gt;
* Alarming Service&lt;br /&gt;
** Monasca has a built in alarm thresholding service and notification service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Aodh from the Telemetry project]&lt;br /&gt;
* Decision Services - There are a number of services in OpenStack that can interpret metrics and alarms based on configured logic and produce commands to Orchestration Engines&lt;br /&gt;
** Congress&lt;br /&gt;
** Heat&lt;br /&gt;
** Vitrage&lt;br /&gt;
** Watcher&lt;br /&gt;
* Orchestration Engines&lt;br /&gt;
** Heat&lt;br /&gt;
** Senlin is a clustering engine for OpenStack, and can orchestrate auto-scaling&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Tacker Tacker]&lt;br /&gt;
&lt;br /&gt;
== Considerations and Guidelines ==&lt;br /&gt;
* Monitoring takes resources, plan accordingly&lt;br /&gt;
* Avoid scaling too quickly or too often&lt;br /&gt;
* Don't expect instantaneous scaling (see above)&lt;br /&gt;
* Be aware of where the logic for scaling is (alarm thresholds, decision services)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anecdotes and Stories ===&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170037</id>
		<title>Auto-scaling SIG/Theory of Auto-Scaling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170037"/>
				<updated>2019-05-15T23:07:00Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Theory of Auto-Scaling */ components&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Theory of Auto-Scaling =&lt;br /&gt;
&lt;br /&gt;
== General Description ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fill in&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conceptual Diagram ==&lt;br /&gt;
&lt;br /&gt;
[[File:OpenStack-Auto-Scaling.svg|Auto-Scaling Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
If you prefer PlantUML&lt;br /&gt;
&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
cloud Cloud\n {&lt;br /&gt;
  rectangle host as &amp;quot;Host&amp;quot; {&lt;br /&gt;
  }&lt;br /&gt;
  rectangle host2 as &amp;quot;Host&amp;quot; {&lt;br /&gt;
    agent VM&lt;br /&gt;
    agent VM2 as &amp;quot;VM&amp;quot;&lt;br /&gt;
    agent Container&lt;br /&gt;
    agent Container2 as &amp;quot;Container&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
agent MS as &amp;quot;Monitoring Service&amp;quot;&lt;br /&gt;
agent DS as &amp;quot;Decision Services\n(Clustering,\nOptimization,\nRoot Cause)&amp;quot;&lt;br /&gt;
agent Heat as &amp;quot;Orchestration \nEngine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
host -down-&amp;gt; MS &lt;br /&gt;
VM -down-&amp;gt; MS &lt;br /&gt;
Container -down-&amp;gt; MS : &amp;quot;Metric \nSamples&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MS -down-&amp;gt; DS : &amp;quot;Alarms&amp;quot;&lt;br /&gt;
MS -down-&amp;gt; Heat : &amp;quot;Alarms&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DS -right-&amp;gt; Heat : &amp;quot;Scaling Commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Heat -up-&amp;gt; host : &amp;quot;Orchestration&amp;quot;&lt;br /&gt;
Heat -up-&amp;gt; VM2 : &amp;quot;Orchestration&amp;quot;&lt;br /&gt;
Heat -up-&amp;gt; Container2 : &amp;quot;Orchestration&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@enduml &lt;br /&gt;
&lt;br /&gt;
== Components of Auto-Scaling ==&lt;br /&gt;
&lt;br /&gt;
OpenStack offers a rich set of services to build, manage, orchestrate, and provision a cloud. This gives administrators some choices in how to best serve their customer's needs.&lt;br /&gt;
&lt;br /&gt;
* Scaling units - There are a number of components that can be controlled with Auto-Scaling.&lt;br /&gt;
** Compute Host&lt;br /&gt;
** VM running on a Compute Host&lt;br /&gt;
** Container running on a Compute Host&lt;br /&gt;
** Network Attached Storage&lt;br /&gt;
** Virtual Network Functions&lt;br /&gt;
* Monitoring Service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Monasca Monasca]&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Ceilometer from the Telemetry project]&lt;br /&gt;
* Alarming Service&lt;br /&gt;
** Monasca has a built in alarm thresholding service and notification service&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Telemetry Aodh from the Telemetry project]&lt;br /&gt;
* Decision Services - There are a number of services in OpenStack that can interpret metrics and alarms based on configured logic and produce commands to Orchestration Engines&lt;br /&gt;
** Congress&lt;br /&gt;
** Heat&lt;br /&gt;
** Tacker&lt;br /&gt;
** Vitrage&lt;br /&gt;
** Watcher&lt;br /&gt;
* Orchestration Engines&lt;br /&gt;
** Heat&lt;br /&gt;
** Senlin is a clustering engine for OpenStack, and can orchestrate auto-scaling&lt;br /&gt;
** [https://wiki.openstack.org/wiki/Tacker Tacker]&lt;br /&gt;
&lt;br /&gt;
== Considerations and Guidelines ==&lt;br /&gt;
* Monitoring takes resources, plan accordingly&lt;br /&gt;
* Avoid scaling too quickly or too often&lt;br /&gt;
* Don't expect instantaneous scaling (see above)&lt;br /&gt;
* Be aware of where the logic for scaling is (alarm thresholds, decision services)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anecdotes and Stories ===&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=File:OpenStack-Auto-Scaling.svg&amp;diff=170036</id>
		<title>File:OpenStack-Auto-Scaling.svg</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=File:OpenStack-Auto-Scaling.svg&amp;diff=170036"/>
				<updated>2019-05-15T22:52:51Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: Overall component diagram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Overall component diagram&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170035</id>
		<title>Auto-scaling SIG/Theory of Auto-Scaling</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG/Theory_of_Auto-Scaling&amp;diff=170035"/>
				<updated>2019-05-15T22:52:05Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: Initial framework&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Theory of Auto-Scaling =&lt;br /&gt;
&lt;br /&gt;
== General Description ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fill in&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conceptual Diagram ==&lt;br /&gt;
&lt;br /&gt;
[[File:OpenStack-Auto-Scaling.svg|Auto-Scaling Architecture Component Diagram]]&lt;br /&gt;
&lt;br /&gt;
If you prefer PlantUML&lt;br /&gt;
&lt;br /&gt;
@startuml&lt;br /&gt;
&lt;br /&gt;
cloud Cloud\n {&lt;br /&gt;
  rectangle host as &amp;quot;Host&amp;quot; {&lt;br /&gt;
  }&lt;br /&gt;
  rectangle host2 as &amp;quot;Host&amp;quot; {&lt;br /&gt;
    agent VM&lt;br /&gt;
    agent VM2 as &amp;quot;VM&amp;quot;&lt;br /&gt;
    agent Container&lt;br /&gt;
    agent Container2 as &amp;quot;Container&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
agent MS as &amp;quot;Monitoring Service&amp;quot;&lt;br /&gt;
agent DS as &amp;quot;Decision Services\n(Clustering,\nOptimization,\nRoot Cause)&amp;quot;&lt;br /&gt;
agent Heat as &amp;quot;Orchestration \nEngine&amp;quot;&lt;br /&gt;
&lt;br /&gt;
host -down-&amp;gt; MS &lt;br /&gt;
VM -down-&amp;gt; MS &lt;br /&gt;
Container -down-&amp;gt; MS : &amp;quot;Metric \nSamples&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MS -down-&amp;gt; DS : &amp;quot;Alarms&amp;quot;&lt;br /&gt;
MS -down-&amp;gt; Heat : &amp;quot;Alarms&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DS -right-&amp;gt; Heat : &amp;quot;Scaling Commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Heat -up-&amp;gt; host : &amp;quot;Orchestration&amp;quot;&lt;br /&gt;
Heat -up-&amp;gt; VM2 : &amp;quot;Orchestration&amp;quot;&lt;br /&gt;
Heat -up-&amp;gt; Container2 : &amp;quot;Orchestration&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@enduml &lt;br /&gt;
&lt;br /&gt;
== Considerations and Guidelines ==&lt;br /&gt;
* Monitoring takes resources, plan accordingly&lt;br /&gt;
* Avoid scaling too quickly or too often&lt;br /&gt;
* Don't expect instantaneous scaling (see above)&lt;br /&gt;
* Be aware of where the logic for scaling is (alarm thresholds, decision services)&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170034</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170034"/>
				<updated>2019-05-15T22:01:23Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Features */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* [[MonascaTrainPTG|Train PTG Summary (Denver)]]&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Requirements ====&lt;br /&gt;
[[Monasca/Requirements]] from design in 2015.&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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, and support for scraping endpoints as Prometheus does.&lt;br /&gt;
&lt;br /&gt;
* Open-source monitoring solution built on open-source technologies.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Monasca API can be integrated with other reporting, visualization, or billing systems, such as [https://wiki.openstack.org/wiki/CloudKitty CloudKitty] or Grafana.&lt;br /&gt;
&lt;br /&gt;
Monasca community is also involved with the [https://wiki.openstack.org/wiki/Self-healing_SIG Self Healing] and [https://wiki.openstack.org/wiki/Auto-scaling_SIG Auto-Scaling] OpenStack SIGs.&lt;br /&gt;
&lt;br /&gt;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]] (to be written)&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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, InfluxDB, and Cassandra 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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
=== Further Reading ===&lt;br /&gt;
* [[Monasca/Message Schema]]&lt;br /&gt;
* Message Schema: A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
* Messages: 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;
* Metrics and Alarms Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
* Config Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Events: 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: Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
* Transform and Aggregation Engine: For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
* Analytics: Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&lt;br /&gt;
&lt;br /&gt;
* Monitoring: 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;
* UI/UX Support: Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&lt;br /&gt;
&lt;br /&gt;
* Post Metric Sequence: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Alarm Managers: see [[Monasca/Architecture Details]] and the official documentation at docs.openstack.org&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;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/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;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170033</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170033"/>
				<updated>2019-05-15T21:38:56Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Comparisons to alternatives */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* [[MonascaTrainPTG|Train PTG Summary (Denver)]]&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Requirements ====&lt;br /&gt;
[[Monasca/Requirements]] from design in 2015.&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
&lt;br /&gt;
Monasca can be integrated with other reporting, visualization, or billing systems, such as CloudKitty or Grafana.&lt;br /&gt;
&lt;br /&gt;
Monasca community is also involved with the [https://wiki.openstack.org/wiki/Self-healing_SIG Self Healing] and [https://wiki.openstack.org/wiki/Auto-scaling_SIG Auto-Scaling] OpenStack SIGs.&lt;br /&gt;
&lt;br /&gt;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]] (to be written)&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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, InfluxDB, and Cassandra 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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
=== Further Reading ===&lt;br /&gt;
* [[Monasca/Message Schema]]&lt;br /&gt;
* Message Schema: A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
* Messages: 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;
* Metrics and Alarms Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
* Config Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Events: 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: Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
* Transform and Aggregation Engine: For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
* Analytics: Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&lt;br /&gt;
&lt;br /&gt;
* Monitoring: 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;
* UI/UX Support: Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&lt;br /&gt;
&lt;br /&gt;
* Post Metric Sequence: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Alarm Managers: see [[Monasca/Architecture Details]] and the official documentation at docs.openstack.org&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;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/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;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170032</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170032"/>
				<updated>2019-05-15T21:37:51Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Requirements */  push down to heading 4&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* [[MonascaTrainPTG|Train PTG Summary (Denver)]]&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Requirements ====&lt;br /&gt;
[[Monasca/Requirements]] from design in 2015.&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
&lt;br /&gt;
Monasca can be integrated with other reporting, visualization, or billing systems, such as CloudKitty or Grafana.&lt;br /&gt;
&lt;br /&gt;
Monasca community is also involved with the [https://wiki.openstack.org/wiki/Self-healing_SIG Self Healing] and [https://wiki.openstack.org/wiki/Auto-scaling_SIG Auto-Scaling] OpenStack SIGs.&lt;br /&gt;
&lt;br /&gt;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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, InfluxDB, and Cassandra 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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
=== Further Reading ===&lt;br /&gt;
* [[Monasca/Message Schema]]&lt;br /&gt;
* Message Schema: A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
* Messages: 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;
* Metrics and Alarms Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
* Config Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Events: 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: Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
* Transform and Aggregation Engine: For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
* Analytics: Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&lt;br /&gt;
&lt;br /&gt;
* Monitoring: 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;
* UI/UX Support: Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&lt;br /&gt;
&lt;br /&gt;
* Post Metric Sequence: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Alarm Managers: see [[Monasca/Architecture Details]] and the official documentation at docs.openstack.org&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;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/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;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170031</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170031"/>
				<updated>2019-05-15T21:36:52Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Requirements */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* [[MonascaTrainPTG|Train PTG Summary (Denver)]]&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
[[Monasca/Requirements]] from design in 2015.&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
&lt;br /&gt;
Monasca can be integrated with other reporting, visualization, or billing systems, such as CloudKitty or Grafana.&lt;br /&gt;
&lt;br /&gt;
Monasca community is also involved with the [https://wiki.openstack.org/wiki/Self-healing_SIG Self Healing] and [https://wiki.openstack.org/wiki/Auto-scaling_SIG Auto-Scaling] OpenStack SIGs.&lt;br /&gt;
&lt;br /&gt;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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, InfluxDB, and Cassandra 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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
=== Further Reading ===&lt;br /&gt;
* [[Monasca/Message Schema]]&lt;br /&gt;
* Message Schema: A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
* Messages: 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;
* Metrics and Alarms Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
* Config Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Events: 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: Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
* Transform and Aggregation Engine: For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
* Analytics: Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&lt;br /&gt;
&lt;br /&gt;
* Monitoring: 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;
* UI/UX Support: Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&lt;br /&gt;
&lt;br /&gt;
* Post Metric Sequence: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Alarm Managers: see [[Monasca/Architecture Details]] and the official documentation at docs.openstack.org&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;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/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;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170030</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170030"/>
				<updated>2019-05-15T21:31:58Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Features */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* [[MonascaTrainPTG|Train PTG Summary (Denver)]]&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&lt;br /&gt;
&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;
&lt;br /&gt;
Monasca can be integrated with other reporting, visualization, or billing systems, such as CloudKitty or Grafana.&lt;br /&gt;
&lt;br /&gt;
Monasca community is also involved with the [https://wiki.openstack.org/wiki/Self-healing_SIG Self Healing] and [https://wiki.openstack.org/wiki/Auto-scaling_SIG Auto-Scaling] OpenStack SIGs.&lt;br /&gt;
&lt;br /&gt;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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, InfluxDB, and Cassandra 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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
=== Further Reading ===&lt;br /&gt;
* [[Monasca/Message Schema]]&lt;br /&gt;
* Message Schema: A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
* Messages: 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;
* Metrics and Alarms Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
* Config Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Events: 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: Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
* Transform and Aggregation Engine: For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
* Analytics: Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&lt;br /&gt;
&lt;br /&gt;
* Monitoring: 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;
* UI/UX Support: Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&lt;br /&gt;
&lt;br /&gt;
* Post Metric Sequence: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Alarm Managers: see [[Monasca/Architecture Details]] and the official documentation at docs.openstack.org&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;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/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;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170029</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=170029"/>
				<updated>2019-05-15T21:31:45Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Features */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* [[MonascaTrainPTG|Train PTG Summary (Denver)]]&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&lt;br /&gt;
&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;
Monasca can be integrated with other reporting, visualization, or billing systems, such as CloudKitty or Grafana.&lt;br /&gt;
&lt;br /&gt;
Monasca community is also involved with the [https://wiki.openstack.org/wiki/Self-healing_SIG Self Healing] and [https://wiki.openstack.org/wiki/Auto-scaling_SIG Auto-Scaling] OpenStack SIGs.&lt;br /&gt;
&lt;br /&gt;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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, InfluxDB, and Cassandra 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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
=== Further Reading ===&lt;br /&gt;
* [[Monasca/Message Schema]]&lt;br /&gt;
* Message Schema: A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
* Messages: 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;
* Metrics and Alarms Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
* Config Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Events: 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: Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
* Transform and Aggregation Engine: For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
* Analytics: Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&lt;br /&gt;
&lt;br /&gt;
* Monitoring: 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;
* UI/UX Support: Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&lt;br /&gt;
&lt;br /&gt;
* Post Metric Sequence: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Alarm Managers: see [[Monasca/Architecture Details]] and the official documentation at docs.openstack.org&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;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/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;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG&amp;diff=170022</id>
		<title>Auto-scaling SIG</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG&amp;diff=170022"/>
				<updated>2019-05-15T16:39:10Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Goals */ (summarized 3 goals from PTG)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Auto-scaling SIG ==&lt;br /&gt;
&lt;br /&gt;
'''Status''': In review&lt;br /&gt;
&lt;br /&gt;
'''Original proposal''': http://lists.openstack.org/pipermail/openstack-discuss/2019-January/001656.html&lt;br /&gt;
&lt;br /&gt;
=== Mission ===&lt;br /&gt;
&lt;br /&gt;
This [[OpenStack_SIGs|SIG]] aims to improve the experience of developing, operating, and using auto-scaling and its related features (like metering, cluster schedule, life cycle management), and to coordinate efforts across projects and communities (like k8s cluster auto-scaling on OpenStack). The SIG also provides a central place to put tests, documentations, and even common libraries for auto-scaling features.&lt;br /&gt;
&lt;br /&gt;
The SIG is expected to focus more on auto-scaling user workloads; however work on auto-scaling infrastructure is also welcome, especially considering that user workloads in an undercloud are actually infrastructure in the corresponding overcloud.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
OpenStack provides multiple methods to auto-scale your cluster (Like using Heat AutoScalingGroup, Senlin Cluster, etc.). However without general coordination across projects, it may not be easy for users and ops to achieve auto-scaling on OpenStack. Developers tend to be focused on individual projects rather than cross-project integration. Most of the components required by auto-scaling already exist within OpenStack, but we need to provide a more simple way for users and ops to adopt auto-scaling. And allowing developers to coordinate together instead of implement something all over again.&lt;br /&gt;
&lt;br /&gt;
=== Goals ===&lt;br /&gt;
* Set up SIG, init doc, meeting, ml&lt;br /&gt;
* Create Forum and Auto-scaling SIG PTG sessions - done, https://etherpad.openstack.org/p/DEN-auto-scaling-SIG&lt;br /&gt;
* Collect use cases for Auto-Scaling in OpenStack&lt;br /&gt;
* Improve documentation for Auto-Scaling features in various OpenStack services&lt;br /&gt;
* Foster cross-project communication and development of Auto-Scaling features&lt;br /&gt;
&lt;br /&gt;
=== Getting Involved ===&lt;br /&gt;
&lt;br /&gt;
We're currently working on a structure to make everyone more easier to getting involved. Our initial git repository, documentation, and other information will be up soon.&lt;br /&gt;
&lt;br /&gt;
=== Community Infrastructure / Resources ===&lt;br /&gt;
&lt;br /&gt;
* Wiki: this page&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project/openstack/auto-scaling-sig SIG StoryBoard] (for an authoritative list of all ongoing work within the SIG)&lt;br /&gt;
* [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list]; use the &amp;lt;code&amp;gt;[auto-scaling]&amp;lt;/code&amp;gt; tag&lt;br /&gt;
* IRC channel: #openstack-auto-scaling on [http://freenode.net/ Freenode] IRC&lt;br /&gt;
* Regular IRC meetings 0900 and 2300 UTC on even weeks on IRC #openstack-auto-scaling [https://review.opendev.org/#/c/656810/] &lt;br /&gt;
* [https://review.openstack.org/#/q/project:openstack/auto-scaling-sig patch reviews] (gerrit)&lt;br /&gt;
* [https://opendev.org/openstack/auto-scaling-sig Git repository for SIG] (more content coming soon)&lt;br /&gt;
&lt;br /&gt;
=== SIG Chairs ===&lt;br /&gt;
&lt;br /&gt;
* Rico Lin&lt;br /&gt;
* Duc Truong&lt;br /&gt;
* Zane Bitter&lt;br /&gt;
&lt;br /&gt;
We welcome anyone who willing to join and help. And we surely are willing to re-elect chairs as soon as we got our init setup done.&lt;br /&gt;
&lt;br /&gt;
=== Upcoming events ===&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
=== Past events ===&lt;br /&gt;
&lt;br /&gt;
* Superuser article, Sept 2018&lt;br /&gt;
** [https://superuser.openstack.org/articles/how-to-auto-scale-a-self-healing-cluster-with-heat/ How to auto scale a self healing cluster with Heat]&lt;br /&gt;
* Events at Berlin Forum, November 2018&lt;br /&gt;
** [https://etherpad.openstack.org/p/autoscaling-integration-and-feedback Autoscaling Integration, improvement, and feedback]&lt;br /&gt;
* Events at Denver OpenInfra Summit and PTG, April 2019&lt;br /&gt;
** [https://www.openstack.org/summit/denver-2019/summit-schedule/events/23379/how-blizzard-entertainment-uses-autoscaling-with-overwatch (presentation) How Blizzard uses Auto-scaling with Overwatch]&lt;br /&gt;
** [https://www.openstack.org/summit/denver-2019/summit-schedule/events/23291/scaling-should-be-easy-and-automatic-heat-and-monasca (workshop) Scaling should be Easy and Automatic]&lt;br /&gt;
** [https://etherpad.openstack.org/p/DEN-auto-scaling-SIG Auto-Scaling SIG PTG etherpad]&lt;br /&gt;
&lt;br /&gt;
=== Project liasons ===&lt;br /&gt;
This is a good idea, but we need some more discussion on who and how we can bridge this system up.&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Migration_from_Ceilometer&amp;diff=169979</id>
		<title>Monasca/Migration from Ceilometer</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Migration_from_Ceilometer&amp;diff=169979"/>
				<updated>2019-05-13T23:27:55Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Considerations for Migration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Migration to Monasca from Ceilometer=&lt;br /&gt;
'''This page is a Work in Progress.'''&lt;br /&gt;
&lt;br /&gt;
With many changes in the Telemetry project, there has been a lot of interest in using Monasca as the monitoring and metrics service in OpenStack. (ref Train PTG notes)&lt;br /&gt;
&lt;br /&gt;
The Monasca and Telemetry projects have both been official OpenStack projects for many years, with some overlap and some complementary features.  With Monasca, it is possible to have the functionality to monitor, meter, alarm, gather logs, and soon to track Events in your OpenStack installation.&lt;br /&gt;
&lt;br /&gt;
== Comparison of Features ==&lt;br /&gt;
(to be filled in.  level of detail a question, but might be nice to have a table listing the options across the top, Ceilometer/Gnocchi, Ceilometer publishing to Monasca, Monasca only)&lt;br /&gt;
&lt;br /&gt;
== Considerations for Migration ==&lt;br /&gt;
(to be filled in.  Likely need to point out that Events are not fully supported yet)&lt;br /&gt;
&lt;br /&gt;
- Data currently stored in Ceilometer will not be migrated to a new Monasca monitoring system.  So plan for a final backup and export of data from Ceilometer, and choose a cut-over date.&lt;br /&gt;
&lt;br /&gt;
=== Supported Use Cases ===&lt;br /&gt;
&lt;br /&gt;
* User wishes to gather monitoring information from their compute nodes (and VMs or Containers)&lt;br /&gt;
* User wishes to gather metering data from their compute nodes for Billing purposes&lt;br /&gt;
* User wishes to visualize their monitoring data (in Grafana)&lt;br /&gt;
* User wishes to export their metering data to CloudKitty for billing&lt;br /&gt;
* User wishes to export their metering data to another billing system (up to them to check on compatibility, but many support Monasca)&lt;br /&gt;
* User wishes to use monitoring data for auto-scaling or self-healing features (Vitrage, Heat, Watcher, etc)&lt;br /&gt;
&lt;br /&gt;
== Recommended Migration Sequence ==&lt;br /&gt;
# Identify which Ceilometer metrics are being actively used and their value to the user.  List the comparable metrics in Monasca.&lt;br /&gt;
# Do a proof of concept install with Monasca.  Configure metrics in Monasca.  Check that metrics in Monasca meet expectations.&lt;br /&gt;
# Verify any billing or external systems that use Ceilometer data work with Monasca data.&lt;br /&gt;
# Notify users of the cut-over date.  This is likely easiest to accomplish coordinated with an OpenStack upgrade.&lt;br /&gt;
# Install Monasca. Shut down Ceilometer.&lt;br /&gt;
# Profit!&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Migration_from_Ceilometer&amp;diff=169978</id>
		<title>Monasca/Migration from Ceilometer</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Migration_from_Ceilometer&amp;diff=169978"/>
				<updated>2019-05-13T23:26:31Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Migration to Monasca from Ceilometer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Migration to Monasca from Ceilometer=&lt;br /&gt;
'''This page is a Work in Progress.'''&lt;br /&gt;
&lt;br /&gt;
With many changes in the Telemetry project, there has been a lot of interest in using Monasca as the monitoring and metrics service in OpenStack. (ref Train PTG notes)&lt;br /&gt;
&lt;br /&gt;
The Monasca and Telemetry projects have both been official OpenStack projects for many years, with some overlap and some complementary features.  With Monasca, it is possible to have the functionality to monitor, meter, alarm, gather logs, and soon to track Events in your OpenStack installation.&lt;br /&gt;
&lt;br /&gt;
== Comparison of Features ==&lt;br /&gt;
(to be filled in.  level of detail a question, but might be nice to have a table listing the options across the top, Ceilometer/Gnocchi, Ceilometer publishing to Monasca, Monasca only)&lt;br /&gt;
&lt;br /&gt;
== Considerations for Migration ==&lt;br /&gt;
(to be filled in.  Likely need to point out that Events are not fully supported yet)&lt;br /&gt;
- Data currently stored in Ceilometer will not be migrated to a new Monasca monitoring system.  So plan for a final backup and export of data from Ceilometer, and choose an cut-over date.&lt;br /&gt;
&lt;br /&gt;
=== Supported Use Cases ===&lt;br /&gt;
&lt;br /&gt;
* User wishes to gather monitoring information from their compute nodes (and VMs or Containers)&lt;br /&gt;
* User wishes to gather metering data from their compute nodes for Billing purposes&lt;br /&gt;
* User wishes to visualize their monitoring data (in Grafana)&lt;br /&gt;
* User wishes to export their metering data to CloudKitty for billing&lt;br /&gt;
* User wishes to export their metering data to another billing system (up to them to check on compatibility, but many support Monasca)&lt;br /&gt;
* User wishes to use monitoring data for auto-scaling or self-healing features (Vitrage, Heat, Watcher, etc)&lt;br /&gt;
&lt;br /&gt;
== Recommended Migration Sequence ==&lt;br /&gt;
# Identify which Ceilometer metrics are being actively used and their value to the user.  List the comparable metrics in Monasca.&lt;br /&gt;
# Do a proof of concept install with Monasca.  Configure metrics in Monasca.  Check that metrics in Monasca meet expectations.&lt;br /&gt;
# Verify any billing or external systems that use Ceilometer data work with Monasca data.&lt;br /&gt;
# Notify users of the cut-over date.  This is likely easiest to accomplish coordinated with an OpenStack upgrade.&lt;br /&gt;
# Install Monasca. Shut down Ceilometer.&lt;br /&gt;
# Profit!&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Migration_from_Ceilometer&amp;diff=169919</id>
		<title>Monasca/Migration from Ceilometer</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Migration_from_Ceilometer&amp;diff=169919"/>
				<updated>2019-05-08T17:43:06Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: start an outline&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Migration to Monasca from Ceilometer=&lt;br /&gt;
This page is a Work in Progress.&lt;br /&gt;
&lt;br /&gt;
With many changes in the Telemetry project, there has been a lot of interest in using Monasca as the monitoring and metrics service in OpenStack. (ref Train PTG notes)&lt;br /&gt;
&lt;br /&gt;
The Monasca and Telemetry projects have both been official OpenStack projects for many years, with some overlap and some complementary features.  With Monasca, it is possible to have the functionality to monitor, meter, alarm, gather logs, and soon to track Events in your OpenStack installation.&lt;br /&gt;
&lt;br /&gt;
== Comparison of Features ==&lt;br /&gt;
(to be filled in.  level of detail a question, but might be nice to have a table listing the options across the top, Ceilometer/Gnocchi, Ceilometer publishing to Monasca, Monasca only)&lt;br /&gt;
&lt;br /&gt;
== Considerations for Migration ==&lt;br /&gt;
(to be filled in.  Likely need to point out that Events are not fully supported yet)&lt;br /&gt;
&lt;br /&gt;
== Supported Use Cases ==&lt;br /&gt;
&lt;br /&gt;
* User wishes to gather monitoring information from their compute nodes (and VMs or Containers)&lt;br /&gt;
* User wishes to gather metering data from their compute nodes for Billing purposes&lt;br /&gt;
* User wishes to visualize their monitoring data (in Grafana)&lt;br /&gt;
* User wishes to export their metering data to CloudKitty for billing&lt;br /&gt;
* User wishes to export their metering data to another billing system (up to them to check on compatibility, but many support Monasca)&lt;br /&gt;
* User wishes to use monitoring data for auto-scaling or self-healing features (Vitrage, Heat, Watcher, etc)&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169918</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169918"/>
				<updated>2019-05-08T17:31:30Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Architecture */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&lt;br /&gt;
&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&lt;br /&gt;
&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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, InfluxDB, and Cassandra 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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
=== Further Reading ===&lt;br /&gt;
* [[Monasca/Message Schema]]&lt;br /&gt;
* Message Schema: A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
* Messages: 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;
* Metrics and Alarms Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
* Config Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Events: 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: Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
* Transform and Aggregation Engine: For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
* Analytics: Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&lt;br /&gt;
&lt;br /&gt;
* Monitoring: 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;
* UI/UX Support: Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&lt;br /&gt;
&lt;br /&gt;
* Post Metric Sequence: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Alarm Managers: see [[Monasca/Architecture Details]] and the official documentation at docs.openstack.org&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;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/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;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169917</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169917"/>
				<updated>2019-05-08T17:29:19Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: &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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&lt;br /&gt;
&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&lt;br /&gt;
&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
=== Further Reading ===&lt;br /&gt;
* [[Monasca/Message Schema]]&lt;br /&gt;
* Message Schema: A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
* Messages: 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;
* Metrics and Alarms Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
* Config Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Events: 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: Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
* Transform and Aggregation Engine: For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
* Analytics: Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&lt;br /&gt;
&lt;br /&gt;
* Monitoring: 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;
* UI/UX Support: Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&lt;br /&gt;
&lt;br /&gt;
* Post Metric Sequence: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Alarm Managers: see [[Monasca/Architecture Details]] and the official documentation at docs.openstack.org&lt;br /&gt;
&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;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/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;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169916</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169916"/>
				<updated>2019-05-08T17:27:42Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: trimming&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
=== Further Reading ===&lt;br /&gt;
* [[Monasca/Message Schema]]&lt;br /&gt;
* Message Schema: A distributed, performant, scalable, HA message queue for distributing metrics, alarms and events in the monitoring system. Currently, based on Kafka.&lt;br /&gt;
* Messages: 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;
* Metrics and Alarms Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
* Config Database: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Events: 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: Support for logging in Monasca is under discussion. For more details see the link at, [[Monasca/Logging]].&lt;br /&gt;
&lt;br /&gt;
* Transform and Aggregation Engine: For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
* Analytics: Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&lt;br /&gt;
&lt;br /&gt;
* Monitoring: 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;
* UI/UX Support: Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&lt;br /&gt;
&lt;br /&gt;
* Post Metric Sequence: see [[Monasca/Architecture Details]]&lt;br /&gt;
&lt;br /&gt;
* Alarm Managers: see [[Monasca/Architecture Details]] and the official documentation at docs.openstack.org&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;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/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;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169915</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169915"/>
				<updated>2019-05-08T17:19:00Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Documentation */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API (and links to other documents): https://docs.openstack.org/monasca-api/latest/&lt;br /&gt;
: Monasca command line interface: https://docs.openstack.org/python-monascaclient/latest/&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169914</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169914"/>
				<updated>2019-05-08T17:15:24Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Development Environment */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Project and Bug tracking&lt;br /&gt;
** Monasca on Storyboard https://storyboard.openstack.org/#!/project/list?q=monasca&lt;br /&gt;
** Monasca on LaunchPad. https://launchpad.net/monasca (history only, Storyboard is the official tracking since 2017)&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169913</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169913"/>
				<updated>2019-05-08T17:08:56Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* License */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169912</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169912"/>
				<updated>2019-05-08T17:08:40Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* License */ add SUSE (need to add Fujitsu, others)&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P.&lt;br /&gt;
(C) Copyright 2019 SUSE LLC&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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169911</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169911"/>
				<updated>2019-05-08T17:07:25Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Technologies */ cass&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database, though no longer commonly used.&lt;br /&gt;
** Cassandra(https://cassandra.apache.org): Cassandra is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169910</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169910"/>
				<updated>2019-05-08T17:05:40Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Technologies */ reformatting, add spark&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party technologies:&lt;br /&gt;
&lt;br /&gt;
* Internal Processing and Middleware&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;
** 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;
** ZooKeeper (http://zookeeper.apache.org/): Used by Kafka and Storm.&lt;br /&gt;
** Apache Spark: Used by Monasca Transform as an aggregation engine.&lt;br /&gt;
&lt;br /&gt;
* Configuration database:&lt;br /&gt;
** MySQL: MySQL is supported as a Config Database.&lt;br /&gt;
** PostgreSQL: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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;
* Time Series Database:&lt;br /&gt;
** InfluxDB (http://influxdb.com/): An open-source distributed time series database with no external dependencies. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
** Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169909</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169909"/>
				<updated>2019-05-08T17:01:26Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Comparisons to alternatives */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
=== Comparisons to alternatives ===&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party 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: MySQL is supported as a Config Database.&lt;br /&gt;
&lt;br /&gt;
* POSTgres: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
* Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169908</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169908"/>
				<updated>2019-05-08T17:00:58Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Requirements */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
[[Monasca/Requirements]].&lt;br /&gt;
&lt;br /&gt;
See also https://opendev.org/openstack/monasca-specs/&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;
== Comparisons to alternatives ==&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party 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: MySQL is supported as a Config Database.&lt;br /&gt;
&lt;br /&gt;
* POSTgres: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
* Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169907</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169907"/>
				<updated>2019-05-08T16:58:37Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Repositories */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Code'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca (old git link)&lt;br /&gt;
:: API: https://opendev.org/openstack/monasca-api&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
: The following repositories are available for deploying Monasca:&lt;br /&gt;
:: Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
:: Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
:: Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
:: Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&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;
== Comparisons to alternatives ==&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party 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: MySQL is supported as a Config Database.&lt;br /&gt;
&lt;br /&gt;
* POSTgres: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
* Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169906</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169906"/>
				<updated>2019-05-08T16:49:08Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Logo */ remove logo section (taking too much space)&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Core'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
The following repositories are available for deploying Monasca:&lt;br /&gt;
* Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
* Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
* Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
* Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&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;
== Comparisons to alternatives ==&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party 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: MySQL is supported as a Config Database.&lt;br /&gt;
&lt;br /&gt;
* POSTgres: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
* Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169905</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169905"/>
				<updated>2019-05-08T16:46:28Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Contribution */&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Logo ====&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal_1color.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.png&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_mascot.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_mascot.png&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical_1color.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.png&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Core'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
The following repositories are available for deploying Monasca:&lt;br /&gt;
* Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
* Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
* Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
* Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&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;
== Comparisons to alternatives ==&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party 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: MySQL is supported as a Config Database.&lt;br /&gt;
&lt;br /&gt;
* POSTgres: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
* Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Architecture_Details&amp;diff=169904</id>
		<title>Monasca/Architecture Details</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Architecture_Details&amp;diff=169904"/>
				<updated>2019-05-08T16:45:32Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: copy over from main page&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;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;The following content is from the older version of the wiki, circa 2015, and is kept for historical reference.&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture (circal 2015) ==&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party 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: MySQL is supported as a Config Database.&lt;br /&gt;
&lt;br /&gt;
* POSTgres: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
* Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169903</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169903"/>
				<updated>2019-05-08T16:41:32Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Architecture */  add link to Architecture Details page&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* {https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Logo ====&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal_1color.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.png&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_mascot.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_mascot.png&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical_1color.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.png&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Core'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
The following repositories are available for deploying Monasca:&lt;br /&gt;
* Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
* Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
* Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
* Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&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;
== Comparisons to alternatives ==&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
Further historical context for the architecture can be found at [[Monasca/Architecture Details]]&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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party 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: MySQL is supported as a Config Database.&lt;br /&gt;
&lt;br /&gt;
* POSTgres: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
* Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169902</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169902"/>
				<updated>2019-05-08T16:34:04Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: add train board, logo&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;
&lt;br /&gt;
[[File:OpenStack_Project_Monasca_vertical.png|thumb|right]]&lt;br /&gt;
&lt;br /&gt;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* {https://storyboard.openstack.org/#!/board/141 Important activities in Train release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
* (coming soon - Train summary)&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Logo ====&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal_1color.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.png&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_mascot.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_mascot.png&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical_1color.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.png&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Core'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
The following repositories are available for deploying Monasca:&lt;br /&gt;
* Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
* Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
* Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
* Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&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;
== Comparisons to alternatives ==&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party 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: MySQL is supported as a Config Database.&lt;br /&gt;
&lt;br /&gt;
* POSTgres: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
* Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=File:OpenStack_Project_Monasca_vertical.png&amp;diff=169901</id>
		<title>File:OpenStack Project Monasca vertical.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=File:OpenStack_Project_Monasca_vertical.png&amp;diff=169901"/>
				<updated>2019-05-08T16:33:02Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: vertical Logo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;vertical Logo&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Events&amp;diff=169900</id>
		<title>Monasca/Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Events&amp;diff=169900"/>
				<updated>2019-05-08T16:21:18Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== News ==&lt;br /&gt;
&amp;lt;big&amp;gt;July 2018&amp;lt;/big&amp;gt; - Work is continuing on Monasca Events with a revision to the architecture and API.  Below information is from before Jan 2017 and back to 2015, but look for upcoming updates as work progresses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Real-time event stream processing in Monasca is work in progress that will allow events from external data sources to be sent to the Monasca API where they can be transformed, stored, queried, filtered, grouped and associated with handlers. Streams can be defined by filtering and grouping events using fields in the event. Handlers can be associated with stream definitions that fire when the stream trigger occurs.&lt;br /&gt;
&lt;br /&gt;
Example of OpenStack events are: instance creation and instance delete. Specific action can follow these events. For example if an instance is deleted then all the alarms related to this instance should be deleted too.&lt;br /&gt;
&lt;br /&gt;
An example use case is to send OpenStack &amp;quot;compute.instance.create.*&amp;quot; events (see https://wiki.openstack.org/wiki/NotificationEventExamples) to the API. A transform on the events could be defined that reduces the number of supplied fields in the source event to a more manageable number of fields as well as normalizing the data. An event stream can be creating by defining a filter to select all &amp;quot;compute.instance.create.*&amp;quot; events and group them by a set of fields in the event, such as &amp;quot;instance_id&amp;quot;. When the &amp;quot;compute.instance.create.end&amp;quot; event occurs a fire criteria can be invoked that processes the stream.&lt;br /&gt;
&lt;br /&gt;
== Events API ==&lt;br /&gt;
=== Events ===&lt;br /&gt;
* POST /v2.0/events: Publish an event.&lt;br /&gt;
* GET /v2.0/events/{event_id}: Get an event with the specific event ID.&lt;br /&gt;
* GET /v2.0/events: List events.&lt;br /&gt;
=== Transforms ===&lt;br /&gt;
* POST /v2.0/events/transforms - Create a transform &lt;br /&gt;
* GET /v2.0/events/transforms - List transforms&lt;br /&gt;
* GET /v2.0/events/transforms/{transform_id} - Get the specified transform&lt;br /&gt;
* DELETE /v2.0/events/transforms/{transform_id}&lt;br /&gt;
&lt;br /&gt;
=== Stream Definition ===&lt;br /&gt;
* POST /v2.0/events/stream-definitions: Creates a stream definition with the following parameters in the JSON body&lt;br /&gt;
** name (string(255), required) - A unique name for the stream.&lt;br /&gt;
** description (string(255), optional) - A description of the stream.&lt;br /&gt;
** select () - Fields of events to filter/match on. For example select all events where the field &amp;quot;event_type&amp;quot; matches &amp;quot;compute.instance.create.*&amp;quot;.&lt;br /&gt;
** group_by () - Fields of events to group on. For all events that match the select criteria group them by the specified criteria. For example, group events by the field &amp;quot;instance_id&amp;quot; or &amp;quot;user_id&amp;quot;.&lt;br /&gt;
** expires (int, required) - Elapsed time in milliseconds from the start of a stream to when the expire actions are invoked if the fire actions haven't occurred yet.&lt;br /&gt;
** fire_actions ([string(50)], optional) - Array of notification method IDs that are invoked when the pipeline fires.&lt;br /&gt;
** expire_actions ([string(50)], optional) - Array of notification method IDs that are invoked when the pipeline expires.&lt;br /&gt;
* GET /v2.0/events/stream-definitions&lt;br /&gt;
* GET /v2.0/events/stream-definitions/{stream-definition-id}&lt;br /&gt;
* DELETE /v2.0/events/stream-definitions/{stream-definition-id}&lt;br /&gt;
&lt;br /&gt;
== Transformation Engine ==&lt;br /&gt;
Consumes events from Kafka, transforms them, and publishes to Kafka.&lt;br /&gt;
&lt;br /&gt;
== Event Engine ==&lt;br /&gt;
Consumes transformed events from Kafka, and uses the Winchester pipeline to process them.&lt;br /&gt;
&lt;br /&gt;
== Distiller ==&lt;br /&gt;
No changes required.&lt;br /&gt;
&lt;br /&gt;
== Winchester ==&lt;br /&gt;
* Add Support for multi-tenancy&lt;br /&gt;
* Dynamically update pipelines.&lt;br /&gt;
* Add and delete pipeline definitions at run-time. Currently, the Winchester pipelines needs to be created at start-up time.&lt;br /&gt;
** Supply pipeline definitions in methods, not yaml files. Winchester currently reads the pipeline configuration information from yaml files at start-up time.&lt;br /&gt;
* Create pipeline handler that publishes notification events such that the Notification Engine can consume them.&lt;br /&gt;
&lt;br /&gt;
== Threshold Engine ==&lt;br /&gt;
Update to generate more general alarm state transition events.&lt;br /&gt;
&lt;br /&gt;
== MySQL ==&lt;br /&gt;
* Initialize Winchester schemas&lt;br /&gt;
* Initialize Monasca transforms and pipeline schemas.&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca/Presentations&amp;diff=169899</id>
		<title>Monasca/Presentations</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca/Presentations&amp;diff=169899"/>
				<updated>2019-05-08T16:17:01Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: Denver 2019&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: '''Denver Summit 2019'''&lt;br /&gt;
:: Scaling should be easy and automatic: Heat and Monasca&lt;br /&gt;
::: Workshop: https://www.openstack.org/summit/denver-2019/summit-schedule/events/23291/scaling-should-be-easy-and-automatic-heat-and-monasca&lt;br /&gt;
:: Monasca Project Update&lt;br /&gt;
::: https://www.openstack.org/summit/denver-2019/summit-schedule/events/23646/monasca-openstack-monitoring&lt;br /&gt;
::Monitoring and Analyzing your OpenStack Cloud&lt;br /&gt;
::: Workshop: https://www.openstack.org/summit/denver-2019/summit-schedule/events/23316/monitoring-and-analyzing-your-openstack-cloud&lt;br /&gt;
:: Monasca and 25,000+ Instances in Production - User Story&lt;br /&gt;
::: https://www.openstack.org/summit/denver-2019/summit-schedule/events/23332/monasca-and-25000-instances-in-production-user-story&lt;br /&gt;
: '''Berlin Summit 2018'''&lt;br /&gt;
:: Monasca Project Update&lt;br /&gt;
::: Video: https://www.openstack.org/videos/summits/berlin-2018/monasca-openstack-monitoring&lt;br /&gt;
:: Monitoring as a Service in the HPC Cloud&lt;br /&gt;
::: Video: https://www.openstack.org/videos/summits/berlin-2018/monitoring-as-a-service-in-the-hpc-cloud&lt;br /&gt;
: '''Sydney Summit 2017'''&lt;br /&gt;
:: Monasca Project Update&lt;br /&gt;
::: Video: https://www.openstack.org/videos/sydney-2017/monasca-project-update&lt;br /&gt;
:: Monitoring Hands-On Workshop&lt;br /&gt;
::: Material: https://github.com/witekest/monasca-bootcamp/ &lt;br /&gt;
:: Use case: Help me from tons of alarms&lt;br /&gt;
::: https://www.openstack.org/videos/sydney-2017/use-case-help-me-from-tons-of-alarms&lt;br /&gt;
:: Proactive Monitoring for OpenStack&lt;br /&gt;
::: Video: https://www.openstack.org/videos/sydney-2017/proactive-monitoring-for-openstack&lt;br /&gt;
: '''Boston Summit 2017'''&lt;br /&gt;
:: Making Monasca Monitor More: Extending Monasca's Data Gathering and Reporting Capabilities&lt;br /&gt;
::: Video: https://www.openstack.org/videos/boston-2017/making-monasca-monitor-more-extending-monascas-data-gathering-and-reporting-capabilities&lt;br /&gt;
:: Monitoring Hands-On Workshop&lt;br /&gt;
::: Material: https://github.com/witekest/monasca-bootcamp/&lt;br /&gt;
:: Show Me My Packet Log: Neutron Packet Logging with Monasca&lt;br /&gt;
::: Video: https://www.openstack.org/videos/boston-2017/show-me-my-packet-log-neutron-packet-logging-with-monasca&lt;br /&gt;
:: A Monitoring Case Study for Monasca: Smart City Infrastructure&lt;br /&gt;
::: Video: https://www.openstack.org/videos/boston-2017/a-monitoring-case-study-for-monasca-smart-city-infrastructure&lt;br /&gt;
: '''Barcelona Summit 2016'''&lt;br /&gt;
:: Monasca: one year later&lt;br /&gt;
::: Video: https://www.openstack.org/videos/barcelona-2016/monasca-one-year-later&lt;br /&gt;
:: Fujitsu: Monasca Monitoring for Kubernetes – Delivered on OpenStack&lt;br /&gt;
::: Video: https://www.openstack.org/videos/barcelona-2016/fujitsu-monasca-monitoring-for-kubernetes-delivered-on-openstack&lt;br /&gt;
: '''Austin Summit 2016'''&lt;br /&gt;
:: Monasca Bootcamp:Hands-on Workshops&lt;br /&gt;
::: Video: https://www.openstack.org/videos/video/monasca-bootcamp&lt;br /&gt;
:: Log Management with Monasca&lt;br /&gt;
::: Video: https://www.openstack.org/videos/video/log-management-with-monasca&lt;br /&gt;
::: Slides: https://github.com/witekest/presentations/blob/master/OpenStack_Summit/2016_04_Austin/Monasca_Logging_OpenStack_Summit_Austin.pdf&lt;br /&gt;
:: Enforcing Application SLAs with Congress and Monasca&lt;br /&gt;
::: Video: https://www.openstack.org/videos/video/enforcing-application-slas-with-congress-and-monasca&lt;br /&gt;
:: Only You Can Prevent Forest Fires - A Proactive Approach to Monitoring Your OpenStack Cloud&lt;br /&gt;
::: https://www.openstack.org/videos/video/only-you-can-prevent-forest-fires-a-proactive-approach-to-monitoring-your-openstack-cloud&lt;br /&gt;
:: Monitoring a Multi-Region Cloud Based on OpenStack: The FIWARE Lab Case Study&lt;br /&gt;
::: Video: https://www.openstack.org/videos/video/monitoring-a-multi-region-cloud-based-on-openstack-the-fiware-lab-case-study&lt;br /&gt;
: '''Tokyo Summit 2015'''&lt;br /&gt;
:: Congrats You Stood up an OpenStack Environment, But Now They Want You to Monitor It. Introducing Using Monasca for Production OpenStack Monitoring&lt;br /&gt;
::: Video: https://www.openstack.org/summit/tokyo-2015/videos/presentation/congrats-you-stood-up-an-openstack-environment-but-now-they-want-you-to-monitor-it-introducing-using-monasca-for-production-openstack-monitoring&lt;br /&gt;
:: Ceilometer+Monasca=Ceilosca&lt;br /&gt;
::: Video: https://www.openstack.org/summit/tokyo-2015/videos/presentation/ceilometer-monascaceilosca&lt;br /&gt;
:: ELK and Monasca Crossing: Logging as an OpenStack Service&lt;br /&gt;
::: Video: https://www.openstack.org/summit/tokyo-2015/videos/presentation/elk-and-monasca-crossing-logging-as-an-openstack-service&lt;br /&gt;
::: Slides: http://www.slideshare.net/mroderus/elk-and-monasca-crossing-logging-as-an-openstack-service&lt;br /&gt;
:: Auto Scaling Cloud Infrastructure and Applications&lt;br /&gt;
::: Video: https://www.openstack.org/summit/tokyo-2015/videos/presentation/auto-scaling-cloud-infrastructure-and-applications&lt;br /&gt;
&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;
:: Slides: https://www.openstack.org/assets/presentation-media/Monasca-Deep-Dive-Paris-Summit.pdf&lt;br /&gt;
&lt;br /&gt;
: '''Colorado OpenStack 5th Birthday Monasca Operations'''&lt;br /&gt;
:: Slides: http://www.slideshare.net/dlfryar/colorado-openstack-5th-birthday-monasca-operations&lt;br /&gt;
:: MeetUp: http://www.meetup.com/OpenStack-Colorado/events/223495998/?a=ea1_grp&amp;amp;rv=ea1&lt;br /&gt;
&lt;br /&gt;
: '''Austin OpenStack OpenStack Monasca Architecture'''&lt;br /&gt;
:: Github: https://github.com/dlfryar/monasca-meetups/tree/master/2015/07/austin/openstack&lt;br /&gt;
:: Slides: https://github.com/dlfryar/monasca-meetups/blob/master/2015/07/austin/openstack/meetup-openstack-austin-2015.pdf&lt;br /&gt;
:: MeetUp: http://www.meetup.com/OpenStack-Austin/events/223068769/&lt;br /&gt;
&lt;br /&gt;
: '''SFBay OpenStack Advanced Track #OSSFO Topic: Monasca and Heat'''&lt;br /&gt;
:: Github: https://github.com/dlfryar/monasca-meetups/tree/master/2015/08/sunnyvale/openstack&lt;br /&gt;
:: Slides: https://github.com/dlfryar/monasca-meetups/blob/master/2015/08/sunnyvale/openstack/meetup-openstack-sfbay-2015.pdf&lt;br /&gt;
:: MeetUp: http://www.meetup.com/openstack/events/215648142/?a=cr2_grp&amp;amp;rv=cr2&amp;amp;_af=event&amp;amp;_af_eid=215648142&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169897</id>
		<title>Monasca</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Monasca&amp;diff=169897"/>
				<updated>2019-05-08T16:11:42Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Presentations */&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;
==== Contribution ====&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project_group/59 Project Group on StoryBoard]&lt;br /&gt;
* [https://storyboard.openstack.org/#!/board/111 Important activities in Stein release]&lt;br /&gt;
* [https://docs.openstack.org/monasca-api/latest/contributor/index.html Contribution Guidelines]&lt;br /&gt;
&lt;br /&gt;
==== Communication and Meetings ====&lt;br /&gt;
* IRC: #openstack-monasca on freenode.net&lt;br /&gt;
* Weekly Meetings:&lt;br /&gt;
** http://eavesdrop.openstack.org/#Monasca_Team_Meeting&lt;br /&gt;
** [[Meetings/Monasca]]&lt;br /&gt;
* Use [Monasca] tag on [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list].&lt;br /&gt;
===== PTG meetings =====&lt;br /&gt;
* [[MonascaSteinPTG|Stein PTG Summary (Denver)]]&lt;br /&gt;
&lt;br /&gt;
==== Documentation ====&lt;br /&gt;
: Monasca API Specification: https://github.com/openstack/monasca-api/blob/master/docs/monasca-api-spec.md&lt;br /&gt;
: Agent Documentation: https://github.com/openstack/monasca-agent&lt;br /&gt;
&lt;br /&gt;
==== Logo ====&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal_1color.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_horizontal.png&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_mascot.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_mascot.png&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical_1color.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.eps&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.jpg&lt;br /&gt;
: https://www.openstack.org/themes/openstack/images/project-mascots/Monasca/OpenStack_Project_Monasca_vertical.png&lt;br /&gt;
&lt;br /&gt;
==== Presentations ====&lt;br /&gt;
There have been many interesting and excellent presentations on Monasca, many given at the OpenStack or OpenInfra Summits.&lt;br /&gt;
: [[Monasca/Presentations]] (updated with Denver 2019 links)&lt;br /&gt;
&lt;br /&gt;
==== Repositories ====&lt;br /&gt;
&lt;br /&gt;
: '''Core'''&lt;br /&gt;
:: Core: https://git.openstack.org/cgit/?q=monasca&lt;br /&gt;
&lt;br /&gt;
: '''Deployment'''&lt;br /&gt;
The following repositories are available for deploying Monasca:&lt;br /&gt;
* Docker: https://github.com/monasca/monasca-docker&lt;br /&gt;
* Kubernetes: https://github.com/monasca/monasca-helm&lt;br /&gt;
* Ansible: https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ansible-monasca&lt;br /&gt;
* Puppet: https://git.openstack.org/openstack/puppet-monasca&lt;br /&gt;
&lt;br /&gt;
==== Bugs ====&lt;br /&gt;
&lt;br /&gt;
===== All open bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/213&lt;br /&gt;
&lt;br /&gt;
===== In Stein triaged bugs =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/worklist/467&lt;br /&gt;
&lt;br /&gt;
===== Bug-fixing progress =====&lt;br /&gt;
: https://storyboard.openstack.org/#!/board/114&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;
== Comparisons to alternatives ==&lt;br /&gt;
[[Monasca/Comparison]]&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;
** The Monasca API has both Java and Python implementations avaialble.&lt;br /&gt;
* Persister (monasca-persister): Consumes metrics and alarm state transitions from the MessageQ and stores them in the Metrics and Alarms database.&lt;br /&gt;
** The Persister has both Java and Python implementations.&lt;br /&gt;
* Transform and Aggregation Engine (monasca-transform): 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. The Anomaly and Prediction Engine is currently in a prototype status.&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;
* Analytics Engine (monasca-analytics): Consumes alarm state transisitions and metrics from the MessageQ and does anomaly detection and alarm clustering/correlation.&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. Support for Cassandra is in progress.&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. Support for PostgreSQL is in progress.&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;
* 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;
== Transform and Aggregation Engine ==&lt;br /&gt;
For more details see the link at, [[Monasca/Transform]].&lt;br /&gt;
&lt;br /&gt;
== Analytics ==&lt;br /&gt;
Support for anomaly detection and alarm clustering/correlation is in progress. For more details see the link at, [[Monasca/Analytics]].&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;
== UI/UX Support ==&lt;br /&gt;
Adding more support for common UI/UX queries is under discussion. For more details see the link at, [[Monasca/UI_UX_Support]]&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;
== Alarm Managers ==&lt;br /&gt;
This section describes the new features including alarm grouping, inhibition and silencing. &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* Silence&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 20:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 22:00:00&amp;quot;}}'&lt;br /&gt;
Two alarm transitions: AT1 and AT2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: AT2 get silenced and AT1 send a notification.&lt;br /&gt;
SilenceRule1 expires after &amp;quot;end_time&amp;quot;=&amp;quot;2017-02-21 22:00:00&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Inhibit&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;], &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;vm is dead&amp;quot;}}}'&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = LOW&lt;br /&gt;
AT1_alarm_name = &amp;quot;cpu high&amp;quot;&lt;br /&gt;
AT2_alarm_name = &amp;quot;memory high&amp;quot;&lt;br /&gt;
AT3_alarm_name = &amp;quot;vm is dead&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is the source alarm which will send a notification. AT2 is the target alarm and will get inhibited. AT3 matches the exclusions and will send a notification immediately. &lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 1&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;exclusions&amp;quot;: {&amp;quot;alarm_name&amp;quot;: &amp;quot;cpu_percent_high&amp;quot;}, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1, AT2 and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_alarm_name = cpu_percent_high&lt;br /&gt;
AT2_alarm_name = cpu_system_perc_high&lt;br /&gt;
AT3_alarm_name = cpu_percent_high&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT1 and AT3 match exclusions and send notifications immediately. Generate a grouped notification “group_notification_rule_1_host1_alarm[1]” and send out using alarm_actions [&amp;quot;cd892&amp;quot;]. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Grouping Scenario 2&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Three alarm transitions: AT1 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;123ab&amp;quot;], AT2 with &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd839&amp;quot;] and AT3&lt;br /&gt;
&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” and “group_notification_rule_2_host2_alarm[1]”. Both using alarm_actions [&amp;quot;cd892&amp;quot;]. Also since AT1 and AT2 has their own alarm actions associated with them, there will be two more notifications sent out.&lt;br /&gt;
&lt;br /&gt;
* Silenced and Grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule1 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;LOW&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;1487269470498&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;1587269470498&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule2 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: &lt;br /&gt;
{&amp;quot;name&amp;quot;: &amp;quot;group_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;,&amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Four alarm transitions: AT1, AT2, AT3 and AT4&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT4_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host1&lt;br /&gt;
AT3_hostname = host2&lt;br /&gt;
AT4_hostname = host1&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT4_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: Generate two grouped notifications “group_notification_rule_2_host1_alarm[2]” using alarm action &amp;quot;cd892&amp;quot; and “group_notification_rule_2_host2_ok[1]” using ok action &amp;quot;ad892&amp;quot;. AT2 is silenced so it isn't include in group_notification_rule_2_host1 count. There are no alarm_actions, ok_actions or undermined_actions associated with the AT1, AT2, AT3, AT4 alarm definitions.&lt;br /&gt;
&lt;br /&gt;
* Silenced and inhibited (source alarm get silenced) &lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Silencing rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
&lt;br /&gt;
Output: no notification sent out. For inhibition, AT1 is the source alarm, AT2 is the target alarm. But at the same time, AT1 get silenced because it matches the silence rule.&lt;br /&gt;
&lt;br /&gt;
* Inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_severity = HIGH&lt;br /&gt;
AT2_severity = LOW&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT1_state = OK&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = ALARM&lt;br /&gt;
&lt;br /&gt;
Output: AT2 gets inhibited because its severity is low. AT3 is the source alarm. Since AT1 is in OK state, it is not a source alarm. For grouping, AT1 and AT3 has the same host name but different state. So there will be two grouped notifications sent out: “group_notification_rule_1_host1_ok[1]” and  “group_notification_rule_1_host1_alarm[1]”.&lt;br /&gt;
&lt;br /&gt;
* Silenced, inhibited and grouped&lt;br /&gt;
&lt;br /&gt;
SilenceRule2 = '{&amp;quot;alarm-silencing-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;silence_rule_2&amp;quot;, &amp;quot;matchers&amp;quot;: {&amp;quot;severity&amp;quot;: &amp;quot;HIGH, &amp;quot;hostname&amp;quot;: &amp;quot;host1&amp;quot;}, &amp;quot;start_time&amp;quot;: &amp;quot;2017-02-21 15:00:00&amp;quot;, &amp;quot;end_time&amp;quot;: &amp;quot;2017-02-21 21:00:00&amp;quot;}}'&lt;br /&gt;
&lt;br /&gt;
InhibitionRule1 = '{&amp;quot;alarm-inhibition-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;inhibit_rule_1&amp;quot;,&amp;quot;source&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;HIGH&amp;quot;},&amp;quot;target&amp;quot;:{&amp;quot;severity&amp;quot;:&amp;quot;LOW&amp;quot;}, &amp;quot;equals&amp;quot;:[&amp;quot;tenantId&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
GroupingRule1 = '{&amp;quot;alarm-grouping-definition-created&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;group_rule_1&amp;quot;, &amp;quot;matchers&amp;quot;: [&amp;quot;hostname&amp;quot;], &amp;quot;id&amp;quot;: &amp;quot;b7163&amp;quot;, &amp;quot;repeat_interval&amp;quot;: &amp;quot;2h&amp;quot;, &amp;quot;group_wait&amp;quot;: &amp;quot;30s&amp;quot;, &amp;quot;tenantId&amp;quot;: &amp;quot; d42bc&amp;quot;, &amp;quot;alarm_actions&amp;quot;: [&amp;quot;cd892&amp;quot;], &amp;quot;ok_actions&amp;quot;: [&amp;quot;ad892&amp;quot;], &amp;quot;undetermined_actions&amp;quot;: [&amp;quot;cf892&amp;quot;]}}'&lt;br /&gt;
&lt;br /&gt;
Alarm transitions: AT1, AT2, AT3 and AT5&lt;br /&gt;
&lt;br /&gt;
Silence rule:&lt;br /&gt;
AT1_severity = HIGH AT1_hostname = host1 (silenced)&lt;br /&gt;
AT2_severity = LOW AT2_hostname = host2&lt;br /&gt;
AT3_severity = HIGH AT3_hostname = host1(silenced)&lt;br /&gt;
AT5_severity = HIGH AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Inhibition rule:&lt;br /&gt;
AT1_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT2_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT3_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT5_tenantId = &amp;quot;d42bc&amp;quot;&lt;br /&gt;
AT1_state = ALARM&lt;br /&gt;
AT2_state = ALARM&lt;br /&gt;
AT3_state = OK&lt;br /&gt;
AT5_state = UNDETERMINED&lt;br /&gt;
AT1_severity = HIGH (source)&lt;br /&gt;
AT2_severity = LOW (target)&lt;br /&gt;
AT3_severity = HIGH&lt;br /&gt;
AT5_severity = HIGH&lt;br /&gt;
&lt;br /&gt;
Grouping rule:&lt;br /&gt;
AT1_hostname = host1&lt;br /&gt;
AT2_hostname = host2&lt;br /&gt;
AT3_hostname = host1&lt;br /&gt;
AT5_hostname = host3&lt;br /&gt;
&lt;br /&gt;
Output: AT1 is in &amp;quot;group_notification_rule_1_host1_alarm&amp;quot; group and silenced. AT3 is in &amp;quot;group_notification_rule_1_host1_ok&amp;quot; group and silenced.  AT2 is in &amp;quot;group_notification_rule_1_host2_alarm&amp;quot; group and inhibited. AT5 is in &amp;quot;group_notification_rule_1_host3_undetermined&amp;quot; group and will send notification “group_notification_rule_1_host3_undetermined[1]” using undetermined action &amp;quot;cf892&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Development Environment =&lt;br /&gt;
&lt;br /&gt;
* Monasca DevStack Plugin:&lt;br /&gt;
** DevStack is the primary developmement environment for OpenStack.&lt;br /&gt;
***See http://docs.openstack.org/developer/devstack/&lt;br /&gt;
** The Monasca DevStack plugin installs the Monasca Service, Agent, Horizon Monitoring Panel, and Grafana&lt;br /&gt;
**  README at, https://github.com/openstack/monasca-api/tree/master/devstack&lt;br /&gt;
** Best way to get started is to use Vagrant with the Vagrantfile at, https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile.&lt;br /&gt;
&lt;br /&gt;
* Monasca on LaunchPad. https://launchpad.net/monasca&lt;br /&gt;
&lt;br /&gt;
* Monasca projects source code. https://git.openstack.org/cgit/?q=monasca&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;
** Note, all components in Monasca, except for the Threshold Engine, have been ported to Python.&lt;br /&gt;
&lt;br /&gt;
* Java: Several of the Monasca components are available as Java. OpenStack does not have any Java coding standards. We've adopted the Google Java Style at, https://google.github.io/styleguide/javaguide.html.&lt;br /&gt;
** The standard says either 80 or 100 length lines. We've adopted 100.&lt;br /&gt;
&lt;br /&gt;
= Technologies =&lt;br /&gt;
&lt;br /&gt;
Monasca uses a number of third-party 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: MySQL is supported as a Config Database.&lt;br /&gt;
&lt;br /&gt;
* POSTgres: Support for POSTgres, via Hibernate and SQLAlchemy, for the Config Database.&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. InfluxDB is supported for the Metrics Database.&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. A free community version of Vertica is available that can store up to 1 TB of data with no time-limit is available at, https://my.vertica.com/community/. Vertica is supported for the Metrics Database.&lt;br /&gt;
&lt;br /&gt;
* Cassandra: Support for Cassandra for the Metrics Database is in progress.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, 2015 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>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG&amp;diff=169869</id>
		<title>Auto-scaling SIG</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG&amp;diff=169869"/>
				<updated>2019-05-06T19:00:39Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Community Infrastructure / Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Auto-scaling SIG ==&lt;br /&gt;
&lt;br /&gt;
'''Status''': In review&lt;br /&gt;
&lt;br /&gt;
'''Original proposal''': http://lists.openstack.org/pipermail/openstack-discuss/2019-January/001656.html&lt;br /&gt;
&lt;br /&gt;
=== Mission ===&lt;br /&gt;
&lt;br /&gt;
This [[OpenStack_SIGs|SIG]] aims to improve the experience of developing, operating, and using auto-scaling and its related features (like metering, cluster schedule, life cycle management), and to coordinate efforts across projects and communities (like k8s cluster auto-scaling on OpenStack). The SIG also provides a central place to put tests, documentations, and even common libraries for auto-scaling features.&lt;br /&gt;
&lt;br /&gt;
The SIG is expected to focus more on auto-scaling user workloads; however work on auto-scaling infrastructure is also welcome, especially considering that user workloads in an undercloud are actually infrastructure in the corresponding overcloud.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
OpenStack provides multiple methods to auto-scale your cluster (Like using Heat AutoScalingGroup, Senlin Cluster, etc.). However without general coordination across projects, it may not be easy for users and ops to achieve auto-scaling on OpenStack. Developers tend to be focused on individual projects rather than cross-project integration. Most of the components required by auto-scaling already exist within OpenStack, but we need to provide a more simple way for users and ops to adopt auto-scaling. And allowing developers to coordinate together instead of implement something all over again.&lt;br /&gt;
&lt;br /&gt;
=== Goals ===&lt;br /&gt;
* Set up SIG, init doc, meeting, ml&lt;br /&gt;
* Create Forum and Auto-scaling SIG PTG sessions&lt;br /&gt;
&lt;br /&gt;
=== Getting Involved ===&lt;br /&gt;
&lt;br /&gt;
We're currently working on a structure to make everyone more easier to getting involved. Our initial git repository, documentation, and other information will be up soon.&lt;br /&gt;
&lt;br /&gt;
=== Community Infrastructure / Resources ===&lt;br /&gt;
&lt;br /&gt;
* Wiki: this page&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project/openstack/auto-scaling-sig SIG StoryBoard] (for an authoritative list of all ongoing work within the SIG)&lt;br /&gt;
* [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list]; use the &amp;lt;code&amp;gt;[auto-scaling]&amp;lt;/code&amp;gt; tag&lt;br /&gt;
* IRC channel: #openstack-auto-scaling on [http://freenode.net/ Freenode] IRC&lt;br /&gt;
* Regular IRC meetings 0900 and 2300 UTC on even weeks on IRC #openstack-auto-scaling [https://review.opendev.org/#/c/656810/] &lt;br /&gt;
* [https://review.openstack.org/#/q/project:openstack/auto-scaling-sig patch reviews] (gerrit)&lt;br /&gt;
* [https://opendev.org/openstack/auto-scaling-sig Git repository for SIG] (more content coming soon)&lt;br /&gt;
&lt;br /&gt;
=== SIG Chairs ===&lt;br /&gt;
&lt;br /&gt;
* Rico Lin&lt;br /&gt;
* Duc Truong&lt;br /&gt;
* Zane Bitter&lt;br /&gt;
&lt;br /&gt;
We welcome anyone who willing to join and help. And we surely are willing to re-elect chairs as soon as we got our init setup done.&lt;br /&gt;
&lt;br /&gt;
=== Upcoming events ===&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
=== Past events ===&lt;br /&gt;
&lt;br /&gt;
* Superuser article, Sept 2018&lt;br /&gt;
** [https://superuser.openstack.org/articles/how-to-auto-scale-a-self-healing-cluster-with-heat/ How to auto scale a self healing cluster with Heat]&lt;br /&gt;
* Events at Berlin Forum, November 2018&lt;br /&gt;
** [https://etherpad.openstack.org/p/autoscaling-integration-and-feedback Autoscaling Integration, improvement, and feedback]&lt;br /&gt;
* Events at Denver OpenInfra Summit and PTG, April 2019&lt;br /&gt;
** [https://www.openstack.org/summit/denver-2019/summit-schedule/events/23379/how-blizzard-entertainment-uses-autoscaling-with-overwatch (presentation) How Blizzard uses Auto-scaling with Overwatch]&lt;br /&gt;
** [https://www.openstack.org/summit/denver-2019/summit-schedule/events/23291/scaling-should-be-easy-and-automatic-heat-and-monasca (workshop) Scaling should be Easy and Automatic]&lt;br /&gt;
** [https://etherpad.openstack.org/p/DEN-auto-scaling-SIG Auto-Scaling SIG PTG etherpad]&lt;br /&gt;
&lt;br /&gt;
=== Project liasons ===&lt;br /&gt;
This is a good idea, but we need some more discussion on who and how we can bridge this system up.&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG&amp;diff=169867</id>
		<title>Auto-scaling SIG</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG&amp;diff=169867"/>
				<updated>2019-05-06T18:52:42Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Past events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Auto-scaling SIG ==&lt;br /&gt;
&lt;br /&gt;
'''Status''': In review&lt;br /&gt;
&lt;br /&gt;
'''Original proposal''': http://lists.openstack.org/pipermail/openstack-discuss/2019-January/001656.html&lt;br /&gt;
&lt;br /&gt;
=== Mission ===&lt;br /&gt;
&lt;br /&gt;
This [[OpenStack_SIGs|SIG]] aims to improve the experience of developing, operating, and using auto-scaling and its related features (like metering, cluster schedule, life cycle management), and to coordinate efforts across projects and communities (like k8s cluster auto-scaling on OpenStack). The SIG also provides a central place to put tests, documentations, and even common libraries for auto-scaling features.&lt;br /&gt;
&lt;br /&gt;
The SIG is expected to focus more on auto-scaling user workloads; however work on auto-scaling infrastructure is also welcome, especially considering that user workloads in an undercloud are actually infrastructure in the corresponding overcloud.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
OpenStack provides multiple methods to auto-scale your cluster (Like using Heat AutoScalingGroup, Senlin Cluster, etc.). However without general coordination across projects, it may not be easy for users and ops to achieve auto-scaling on OpenStack. Developers tend to be focused on individual projects rather than cross-project integration. Most of the components required by auto-scaling already exist within OpenStack, but we need to provide a more simple way for users and ops to adopt auto-scaling. And allowing developers to coordinate together instead of implement something all over again.&lt;br /&gt;
&lt;br /&gt;
=== Goals ===&lt;br /&gt;
* Set up SIG, init doc, meeting, ml&lt;br /&gt;
* Create Forum and Auto-scaling SIG PTG sessions&lt;br /&gt;
&lt;br /&gt;
=== Getting Involved ===&lt;br /&gt;
&lt;br /&gt;
We're currently working on a structure to make everyone more easier to getting involved. Our initial git repository, documentation, and other information will be up soon.&lt;br /&gt;
&lt;br /&gt;
=== Community Infrastructure / Resources ===&lt;br /&gt;
&lt;br /&gt;
* Wiki: this page&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project/openstack/auto-scaling-sig SIG StoryBoard] (for an authoritative list of all ongoing work within the SIG)&lt;br /&gt;
* [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list]; use the &amp;lt;code&amp;gt;[auto-scaling]&amp;lt;/code&amp;gt; tag&lt;br /&gt;
* IRC channel: #openstack-auto-scaling on [http://freenode.net/ Freenode] IRC&lt;br /&gt;
* Regular IRC meetings have not been arranged yet&lt;br /&gt;
* [https://review.openstack.org/#/q/project:openstack/auto-scaling-sig patch reviews] (gerrit)&lt;br /&gt;
&lt;br /&gt;
=== SIG Chairs ===&lt;br /&gt;
&lt;br /&gt;
* Rico Lin&lt;br /&gt;
* Duc Truong&lt;br /&gt;
* Zane Bitter&lt;br /&gt;
&lt;br /&gt;
We welcome anyone who willing to join and help. And we surely are willing to re-elect chairs as soon as we got our init setup done.&lt;br /&gt;
&lt;br /&gt;
=== Upcoming events ===&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
=== Past events ===&lt;br /&gt;
&lt;br /&gt;
* Superuser article, Sept 2018&lt;br /&gt;
** [https://superuser.openstack.org/articles/how-to-auto-scale-a-self-healing-cluster-with-heat/ How to auto scale a self healing cluster with Heat]&lt;br /&gt;
* Events at Berlin Forum, November 2018&lt;br /&gt;
** [https://etherpad.openstack.org/p/autoscaling-integration-and-feedback Autoscaling Integration, improvement, and feedback]&lt;br /&gt;
* Events at Denver OpenInfra Summit and PTG, April 2019&lt;br /&gt;
** [https://www.openstack.org/summit/denver-2019/summit-schedule/events/23379/how-blizzard-entertainment-uses-autoscaling-with-overwatch (presentation) How Blizzard uses Auto-scaling with Overwatch]&lt;br /&gt;
** [https://www.openstack.org/summit/denver-2019/summit-schedule/events/23291/scaling-should-be-easy-and-automatic-heat-and-monasca (workshop) Scaling should be Easy and Automatic]&lt;br /&gt;
** [https://etherpad.openstack.org/p/DEN-auto-scaling-SIG Auto-Scaling SIG PTG etherpad]&lt;br /&gt;
&lt;br /&gt;
=== Project liasons ===&lt;br /&gt;
This is a good idea, but we need some more discussion on who and how we can bridge this system up.&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG&amp;diff=169866</id>
		<title>Auto-scaling SIG</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Auto-scaling_SIG&amp;diff=169866"/>
				<updated>2019-05-06T18:49:43Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* Past events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Auto-scaling SIG ==&lt;br /&gt;
&lt;br /&gt;
'''Status''': In review&lt;br /&gt;
&lt;br /&gt;
'''Original proposal''': http://lists.openstack.org/pipermail/openstack-discuss/2019-January/001656.html&lt;br /&gt;
&lt;br /&gt;
=== Mission ===&lt;br /&gt;
&lt;br /&gt;
This [[OpenStack_SIGs|SIG]] aims to improve the experience of developing, operating, and using auto-scaling and its related features (like metering, cluster schedule, life cycle management), and to coordinate efforts across projects and communities (like k8s cluster auto-scaling on OpenStack). The SIG also provides a central place to put tests, documentations, and even common libraries for auto-scaling features.&lt;br /&gt;
&lt;br /&gt;
The SIG is expected to focus more on auto-scaling user workloads; however work on auto-scaling infrastructure is also welcome, especially considering that user workloads in an undercloud are actually infrastructure in the corresponding overcloud.&lt;br /&gt;
&lt;br /&gt;
=== Background ===&lt;br /&gt;
OpenStack provides multiple methods to auto-scale your cluster (Like using Heat AutoScalingGroup, Senlin Cluster, etc.). However without general coordination across projects, it may not be easy for users and ops to achieve auto-scaling on OpenStack. Developers tend to be focused on individual projects rather than cross-project integration. Most of the components required by auto-scaling already exist within OpenStack, but we need to provide a more simple way for users and ops to adopt auto-scaling. And allowing developers to coordinate together instead of implement something all over again.&lt;br /&gt;
&lt;br /&gt;
=== Goals ===&lt;br /&gt;
* Set up SIG, init doc, meeting, ml&lt;br /&gt;
* Create Forum and Auto-scaling SIG PTG sessions&lt;br /&gt;
&lt;br /&gt;
=== Getting Involved ===&lt;br /&gt;
&lt;br /&gt;
We're currently working on a structure to make everyone more easier to getting involved. Our initial git repository, documentation, and other information will be up soon.&lt;br /&gt;
&lt;br /&gt;
=== Community Infrastructure / Resources ===&lt;br /&gt;
&lt;br /&gt;
* Wiki: this page&lt;br /&gt;
* [https://storyboard.openstack.org/#!/project/openstack/auto-scaling-sig SIG StoryBoard] (for an authoritative list of all ongoing work within the SIG)&lt;br /&gt;
* [http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss openstack-discuss mailing list]; use the &amp;lt;code&amp;gt;[auto-scaling]&amp;lt;/code&amp;gt; tag&lt;br /&gt;
* IRC channel: #openstack-auto-scaling on [http://freenode.net/ Freenode] IRC&lt;br /&gt;
* Regular IRC meetings have not been arranged yet&lt;br /&gt;
* [https://review.openstack.org/#/q/project:openstack/auto-scaling-sig patch reviews] (gerrit)&lt;br /&gt;
&lt;br /&gt;
=== SIG Chairs ===&lt;br /&gt;
&lt;br /&gt;
* Rico Lin&lt;br /&gt;
* Duc Truong&lt;br /&gt;
* Zane Bitter&lt;br /&gt;
&lt;br /&gt;
We welcome anyone who willing to join and help. And we surely are willing to re-elect chairs as soon as we got our init setup done.&lt;br /&gt;
&lt;br /&gt;
=== Upcoming events ===&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
=== Past events ===&lt;br /&gt;
&lt;br /&gt;
* Events at Berlin Forum, November 2018&lt;br /&gt;
** [https://etherpad.openstack.org/p/autoscaling-integration-and-feedback Autoscaling Integration, improvement, and feedback]&lt;br /&gt;
* Events at Denver OpenInfra Summit and PTG, April 2019&lt;br /&gt;
** [https://www.openstack.org/summit/denver-2019/summit-schedule/events/23379/how-blizzard-entertainment-uses-autoscaling-with-overwatch (presentation) How Blizzard uses Auto-scaling with Overwatch]&lt;br /&gt;
** [https://www.openstack.org/summit/denver-2019/summit-schedule/events/23291/scaling-should-be-easy-and-automatic-heat-and-monasca (workshop) Scaling should be Easy and Automatic]&lt;br /&gt;
** [https://etherpad.openstack.org/p/DEN-auto-scaling-SIG Auto-Scaling SIG PTG etherpad]&lt;br /&gt;
&lt;br /&gt;
=== Project liasons ===&lt;br /&gt;
This is a good idea, but we need some more discussion on who and how we can bridge this system up.&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=PTG/Train/Etherpads&amp;diff=169810</id>
		<title>PTG/Train/Etherpads</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=PTG/Train/Etherpads&amp;diff=169810"/>
				<updated>2019-05-02T19:42:29Z</updated>
		
		<summary type="html">&lt;p&gt;Joseph Davis: /* SIG/Theme/Other */ alphabetize SIGs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
This is the list of etherpads for the Projects Team Gathering for the Train release in Denver, 2019. Each team can organize the content on their allocated day(s) in the way that seems to most appropriate to them. We suspect most teams will avoid strict timeboxed slots and will use etherpads to list topics to cover. This page lists those etherpads for easy reference.&lt;br /&gt;
&lt;br /&gt;
For more details on the event, see the [https://www.openstack.org/ptg/ event website].&lt;br /&gt;
&lt;br /&gt;
For what's happening '''right now''' (during the event), see the [http://ptg.openstack.org/ptg.html ptgbot page].&lt;br /&gt;
&lt;br /&gt;
=== Projects ===&lt;br /&gt;
* Blazar - https://etherpad.openstack.org/p/blazar-ptg-train&lt;br /&gt;
* Charms - https://etherpad.openstack.org/p/charms-train-ptg&lt;br /&gt;
* Cinder - https://etherpad.openstack.org/p/cinder-train-ptg-planning&lt;br /&gt;
* Cyborg - https://etherpad.openstack.org/p/cyborg-ptg-train&lt;br /&gt;
* Docs/I18n - https://etherpad.openstack.org/p/docs-i18n-ptg-train&lt;br /&gt;
* Fenix&lt;br /&gt;
** Fenix general - https://etherpad.openstack.org/p/DEN2019-fenix-PTG&lt;br /&gt;
** Fenix - ETSI NFV - https://etherpad.openstack.org/p/DEN2019-fenix-ETSI-NFV-PTG&lt;br /&gt;
* Glance - https://etherpad.openstack.org/p/Glance-Train-PTG-planning&lt;br /&gt;
* Heat - https://etherpad.openstack.org/p/DEN-Train-Heat&lt;br /&gt;
* Horizon - https://etherpad.openstack.org/p/horizon-train-ptg&lt;br /&gt;
* Infra - https://etherpad.openstack.org/p/2019-denver-ptg-infra-planning&lt;br /&gt;
* Ironic - https://etherpad.openstack.org/p/DEN-train-ironic-ptg&lt;br /&gt;
* Keystone - https://etherpad.openstack.org/p/keystone-train-ptg&lt;br /&gt;
* Magnum - https://etherpad.openstack.org/p/magnum-train-ptg&lt;br /&gt;
* Manila&lt;br /&gt;
** Planning: https://etherpad.openstack.org/p/manila-denver-train-ptg-planning&lt;br /&gt;
** Minutes/Proceedings: https://etherpad.openstack.org/p/manila-ptg-train&lt;br /&gt;
* Monasca - https://etherpad.openstack.org/p/monasca-ptg-train&lt;br /&gt;
* Neutron - https://etherpad.openstack.org/p/openstack-networking-train-ptg&lt;br /&gt;
* Nova - https://etherpad.openstack.org/p/nova-ptg-train&lt;br /&gt;
* Octavia - https://etherpad.openstack.org/p/octavia-train-ptg&lt;br /&gt;
* OpenStackAnsible - https://etherpad.openstack.org/p/osa-train-ptg&lt;br /&gt;
* OpenStack Client - https://etherpad.openstack.org/p/train-ptg-osc&lt;br /&gt;
* OpenStack Helm - https://etherpad.openstack.org/p/osh-ptg-train&lt;br /&gt;
* Oslo - https://etherpad.openstack.org/p/oslo-train-topics&lt;br /&gt;
* Placement - https://etherpad.openstack.org/p/placement-ptg-train&lt;br /&gt;
* QA&lt;br /&gt;
** Schedule: https://ethercalc.openstack.org/Train-PTG-QA-Schedule&lt;br /&gt;
** Etherpad: https://etherpad.openstack.org/p/qa-train-ptg&lt;br /&gt;
* Release Team - https://etherpad.openstack.org/p/relmgmt-train-ptg&lt;br /&gt;
* StoryBoard - https://etherpad.openstack.org/p/sb-train-ptg&lt;br /&gt;
* Swift - https://etherpad.openstack.org/p/swift-ptg-train&lt;br /&gt;
* Tripleo &lt;br /&gt;
** Schedule: https://etherpad.openstack.org/p/tripleo-ptg-train&lt;br /&gt;
** Topic Planning: https://etherpad.openstack.org/p/tripleo-train-topics&lt;br /&gt;
* Vitrage - https://etherpad.openstack.org/p/vitrage-train-ptg&lt;br /&gt;
&lt;br /&gt;
=== Cross-Project ===&lt;br /&gt;
* Nova/Cinder - https://etherpad.openstack.org/p/ptg-train-xproj-nova-cinder&lt;br /&gt;
* Nova/Cyborg - https://etherpad.openstack.org/p/ptg-train-xproj-nova-cyborg&lt;br /&gt;
* Nova/Ironic - https://etherpad.openstack.org/p/ptg-train-xproj-nova-ironic&lt;br /&gt;
* Nova/Keystone - https://etherpad.openstack.org/p/ptg-train-xproj-nova-keystone&lt;br /&gt;
* Nova/Neutron - https://etherpad.openstack.org/p/ptg-train-xproj-nova-neutron&lt;br /&gt;
* Nova/Placement - https://etherpad.openstack.org/p/ptg-train-xproj-nova-placement&lt;br /&gt;
* Cyborg/Ironic - https://etherpad.openstack.org/p/ptg-train-xproj-ironic-cyborg&lt;br /&gt;
&lt;br /&gt;
=== SIG/Theme/Other ===&lt;br /&gt;
* API SIG - https://etherpad.openstack.org/p/api-sig-ptg-train&lt;br /&gt;
* Auto-scaling SIG - https://etherpad.openstack.org/p/DEN-auto-scaling-SIG&lt;br /&gt;
* Edge WG - https://etherpad.openstack.org/p/edge-wg-ptg-preparation-denver-2019&lt;br /&gt;
* K8s SIG - https://etherpad.openstack.org/p/k8s-sig-ptg-train&lt;br /&gt;
* Public Cloud SIG - https://etherpad.openstack.org/p/DEN-public-cloud-SIG&lt;br /&gt;
* Scientific SIG - https://etherpad.openstack.org/p/scientific-sig-ptg-train&lt;br /&gt;
* Self-healing SIG - https://etherpad.openstack.org/p/DEN-self-healing-SIG&lt;br /&gt;
* Security SIG - https://etherpad.openstack.org/p/security-sig-ptg-train&lt;br /&gt;
* Technical Committee - https://etherpad.openstack.org/p/tc-train-ptg&lt;br /&gt;
* Upgrades SIG - https://etherpad.openstack.org/p/upgrade-sig-ptg-train&lt;br /&gt;
&lt;br /&gt;
=== Pilot Projects ===&lt;br /&gt;
* Airship - https://etherpad.openstack.org/p/airship-ptg-train&lt;br /&gt;
* StarlingX - https://etherpad.openstack.org/p/stx-ptg-agenda&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;/div&gt;</summary>
		<author><name>Joseph Davis</name></author>	</entry>

	</feed>