<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"><channel><title>telemetry-specs</title><link>https://specs.openstack.org/openstack/telemetry-specs</link><description /><language>en</language><copyright>2022, OpenStack Foundation</copyright><item><title>Network Statistics From OpenDaylight</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/pike/network-statistics-from-opendaylight.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/network-statistics-from-opendaylight"&gt;https://blueprints.launchpad.net/ceilometer/+spec/network-statistics-from-opendaylight&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This feature proposes to add a ceilometer driver to collect network
statistics information using REST APIs exposed by network-statistics module
in OpenDaylight.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;OpenDaylight collects and stores network statistics information and exposes
the same via its northbound REST APIs. An example of such statistics is
number of packets received or transmitted by a port which may be created
through neutron service.&lt;/p&gt;
&lt;p&gt;A large portion of the network configuration received by OpenDaylight is
from OpenStack. It will be good to have the network statistics readable from
OpenDaylight via ceilometer APIs in a OpenStack-OpenDaylight deployment.&lt;/p&gt;
&lt;p&gt;A driver already exists in ceilometer which collects statistics from
OpenDaylight. But that ODL REST APIs used by the driver have been
unfortunately removed or less maintained in current release of OpenDaylight
which is Carbon.&lt;/p&gt;
&lt;p&gt;We propose a v2 version of the driver which will utilize a new statistics
module in OpenDaylight. To start with the v2 version of the driver will
currently support only a subset of counters that were supported by old
driver. Eventually this driver can be enhanced to support all counters.
This v2 OpenDaylight ceilometer driver will enable counters to be stored with
either MongoDB (or) with the Gnochhi collector thereby supporting both
backends for ceilometer.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We propose to create a new driver in networking-odl in
networking_odl/ceilometer/network/statistics/opendaylight_v2/&lt;/p&gt;
&lt;p&gt;The driver will communicate with OpenDaylight to fetch statistics through
REST APIs.&lt;/p&gt;
&lt;p&gt;We wil support following meters:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uptime&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drops&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transmit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;packets&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;packets&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transmit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uptime&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drops&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transmit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;packets&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;packets&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transmit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;New resource types will be added to /etc/ceilometer/gnocchi_resources.yaml:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;resource_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;
  &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.ports'&lt;/span&gt;
  &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;resource_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;switch_port&lt;/span&gt;
  &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.port'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.port.uptime'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.port.receive.drops'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.port.receive.errors'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.port.transmit.packets'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.port.receive.packets'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.port.transmit.bytes'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.port.receive.bytes'&lt;/span&gt;
  &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;switch&lt;/span&gt;
    &lt;span class="n"&gt;port_number_on_switch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port_number_on_switch&lt;/span&gt;
    &lt;span class="n"&gt;neutron_port_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;neutron_port_id&lt;/span&gt;
    &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;resource_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;
  &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'port'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'port.uptime'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'port.receive.drops'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'port.receive.errors'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'port.transmit.packets'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'port.receive.packets'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'port.transmit.bytes'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'port.receive.bytes'&lt;/span&gt;
  &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;resource_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;switch_table&lt;/span&gt;
  &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'switch.table.active.entries'&lt;/span&gt;
  &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;
    &lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;switch&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;Users will have to configure OpenDaylight REST API endpoint information in
resources attribute in configuration file of ceilometer ie
/etc/ceilometer/polling.yaml. For eg:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;sources:
  - name: odl_source
    interval: 600
    resources:
      - opendaylight.v2://127.0.0.1:8080/controller/statistics?
          auth=basic&amp;amp;user=admin&amp;amp;password=admin&amp;amp;scheme=http
    meters:
      - "switch"
      - "switch.ports"
      - "switch.port"
      - "switch.port.uptime"
      - "switch.port.receive.drops"
      - "switch.port.receive.errors"
      - "switch.port.transmit.packets"
      - "switch.port.receive.packets"
      - "switch.port.transmit.bytes"
      - "switch.port.receive.bytes"
      - "port"
      - "port.uptime"
      - "port.receive.drops"
      - "port.receive.errors"
      - "port.transmit.packets"
      - "port.receive.packets"
      - "port.transmit.bytes"
      - "port.receive.bytes"
      - "switch.table.active.entries"
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Deepthi V V&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Deepthi V V&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new ceilometer driver for OpenDaylight in networking-odl&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for new driver in devstack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide support for switch.* meters for gnocchi as backend in ceilometer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit tests for new driver&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Statistics module should be available in OpenDaylight Nitrogen release.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit Tests will be added to test the new driver.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/admin-guide-cloud/telemetry-measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/network-statistics-from-opendaylight"&gt;https://blueprints.launchpad.net/ceilometer/+spec/network-statistics-from-opendaylight&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://git.opendaylight.org/gerrit/#/c/59283/"&gt;https://git.opendaylight.org/gerrit/#/c/59283/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 13 Jun 2017 00:00:00 </pubDate></item><item><title>Track cinder capacity notifications</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/newton/cinder-capacity-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/cinder-capacity-notifications"&gt;https://blueprints.launchpad.net/ceilometer/+spec/cinder-capacity-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The goal of this blueprint is to capture the capacity notifications emitted
by cinder service when it notifies storage capacity information to ceilometer.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Cinder service collects storage capacity information about each pool/backend.
These includes total/free/allocated/provisioned/virtual_free capacity info.
Cinder service emits the formatted information as notifications periodically.&lt;/p&gt;
&lt;p&gt;It’s better for ceilometer service to add a notification plugin to listen to
the topic. If the information payload can be consumed and transformed into
samples, it will be helpful for admin users to have an estimation of the future
capacity planning.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add new metrics for different capacity information carried by capacity payload
from notifications emitted by Cinder. They will include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;CapacityTotalSize
It is the total physical capacity of a pool/backend.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CapacityFreeSize
It is the real physical available capacity of a pool/backend.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CapacityAllocatedSize
It is the physical capacity allocated directly thru Cinder.
Note: The capacity which is not allocated thru Cinder is not included in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CapacityProvisionedSize
It is the capacity which has been provisioned in a pool/backend.&lt;/p&gt;
&lt;p&gt;Note: It includes the capacity both allocated directly thru Cinder and not.
The provisioned capacity size is equal or greater than the allocated size.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CapacityVirtualfreeSize
It is the apparent available virtual capacity means how much capacity can
still provision besides the capacity which has been provisioned already
in the pool/backend.&lt;/p&gt;
&lt;p&gt;Note: It is different from free capacity, free capacity is related to real
available physical capacity. For thin provisioning support, due to the
max_over_subscription_ratio, the provisioned capacity can be much larger
than the real physical capacity.&lt;/p&gt;
&lt;p&gt;Please reference &lt;a class="reference external" href="https://review.openstack.org/#/c/129342/"&gt;https://review.openstack.org/#/c/129342/&lt;/a&gt; to get the detail
explanation of above terminology.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each metric extracts the capacity information which it is interested in from the
notification payload. The admin users can utilize ceilometer statistics API to
get the sum of each kind of capacity. Also they can utilize the horizon resource
usage page to get the chart of the trend of each kind of capacity information.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;No new impacts. Pre-existing concerns with capacity at the notification and
storage handling layers remain.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;XinXiaohui&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;XinXiaohui&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add capacity.total.size metric&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add capacity.free.size metric&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add capacity.allocated.size metric&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add capacity.provisioned.size metric&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add capacity.virtual_free.size metric&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test coverage for the above metrics and samples validation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;In the future new types of capacity notifications maybe expected from the
Cinder service to account for the statistics data. These will need to be
handled later.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit and integration Tests will be added to cover the necessary metrics
and validate samples generated.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/admin-guide-cloud/telemetry-measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/kilo-cinder-capacity-headroom"&gt;https://etherpad.openstack.org/p/kilo-cinder-capacity-headroom&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/170380"&gt;https://review.openstack.org/#/c/170380&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Apr 2016 00:00:00 </pubDate></item><item><title>Event To Sample Publisher</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/newton/event-to-sample-publisher.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/event-to-sample-publisher"&gt;https://blueprints.launchpad.net/ceilometer/+spec/event-to-sample-publisher&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Bracket events like compute.instance.create.latency created from BP:
Transformers for events pipeline
&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/events-pipeline-transformers"&gt;https://blueprints.launchpad.net/ceilometer/+spec/events-pipeline-transformers&lt;/a&gt;
need to be published and stored as sample.&lt;/p&gt;
&lt;p&gt;The bracket events created from transformers in events pipeline are new
events/metrics with any kind of latency time spans like time.instance.creation
or time.instance.life that is a delta time between
compute.instance.create.start/end, compute.instance.create.end/delete.end, etc.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add a new notifier publisher and use this publisher in event transformer,
when there is a new transformed event from events pipeline
transformers, convert it to notification, send it back to ceilometer notification listener,
the notification payload is generated from event traits,
then the sample pipeline will convert and publish it into sample.&lt;/p&gt;
&lt;p&gt;For example, for compute.instance.create.latency event,
Firstly, add this publisher(for example: tosamplenotifier://)
to sink in event transformer for this event&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;instance_create_bracketer_sink&lt;/span&gt;
  &lt;span class="n"&gt;transformers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bracket"&lt;/span&gt;
        &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="o"&gt;........&lt;/span&gt;
  &lt;span class="n"&gt;publishers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tosamplenotifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;then, add meter schema in meters.yaml&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;- name: 'compute.instance.create.latency'
  event_type:
    - 'compute.instance.create.latency'
  type: 'gauge'
  unit: 's'
  volume: $.payload.latency
  user_id: $.payload.user_id
  project_id: $.payload.tenant_id
  resource_id: $.payload.instance_id
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl&gt;
&lt;dt&gt;The notification payload send back to message bus is generated from event traits, will be like this ::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;{‘latency’: 0.355098, ‘user_id’: u’0f1b1e94ec2045af9f49f9b7e1d6b409’, ‘service’: u’network.yuntong-ThinkStation’,
‘resource_id’: u’67d1c4b3-84aa-42d1-a857-2d1481fe21dd’, ‘tenant_id’: u’c8ce7938e38b4612a8b3daab441b804c’,
‘request_id’: u’req-597a85ec-ebab-492f-8288-b6b72fc476b5’, ‘project_id’: u’c8ce7938e38b4612a8b3daab441b804c’,
‘publisher_id’: ‘compute.yuntong-ThinkStation’}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;and finally, the compute.instance.create.latency sample will be like this ::&lt;/dt&gt;&lt;dd&gt;&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Resource ID&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Volume&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Unit&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Timestamp&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;e8e8adf5-8ba1-4247-b1af-1e8c928563e7&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;compute.instance.create.latency&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;gauge&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;7.133763&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;s&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2015-09-16T07:04:58.540929&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;This spec proposes additional publisher for event transformers
in event_pipeline.yaml&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Configuration options in event_pipeline.yaml.
Configuration options in meter.yaml.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;yuntongjin&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;yuntongjin&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add a new publisher that will send the convert notification to sample listener.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Transformers for events pipeline &lt;a class="reference external" href="https://review.openstack.org/#/c/162167/"&gt;https://review.openstack.org/#/c/162167/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Extend messaging publisher testing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Capture new meters which from event brackelet transformers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/events-pipeline-transformers"&gt;https://blueprints.launchpad.net/ceilometer/+spec/events-pipeline-transformers&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Apr 2016 00:00:00 </pubDate></item><item><title>Unify the timestamp of samples generated by polling agents</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/newton/unify-timestamp-of-polled-data.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/unify-timestamp-of-polled-data"&gt;https://blueprints.launchpad.net/ceilometer/+spec/unify-timestamp-of-polled-data&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Many of the pollsters define the timestamp individually for each generated
sample, which should really be timestamping based on when the data was polled
and not when each sample is generated. We need to set the timestamp of the
polled data to the timestamp when the polling starts for unity.&lt;/p&gt;
&lt;p&gt;This should save overhead of calculating timestamp each sample and also allow
for easier grouping of polled data.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Modify ceilometer.agent.manager.PollingTask.poll_and_notify method to set the
timestamp of samples to the time when the data was polled:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;# Get the timestamp when pollster starts to work&lt;/span&gt;
&lt;span class="n"&gt;polling_timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_get_current_timestamp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;samples&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pollster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_samples&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;polling_resources&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="c1"&gt;# Unify the timestamp of polled samples&lt;/span&gt;
&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;polling_timestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Drop all the timestamp generations when we build samples via pollsters, like:
&lt;a class="reference external" href="https://github.com/openstack/ceilometer/blob/6.0.0.0b2/ceilometer/image/glance.py#L113"&gt;https://github.com/openstack/ceilometer/blob/6.0.0.0b2/ceilometer/image/glance.py#L113&lt;/a&gt;&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Save overhead of calculating timestamp each sample.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;yuywz&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Update ceilometer.agent.manager.PollingTask.poll_and_notify method.&lt;/p&gt;
&lt;p&gt;Drop all the timestamp generations when we build samples via pollsters.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Add unit test to test:
The timestamp of samples generated during a polling cycle is unified.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Originally reported as a bug: &lt;a class="reference external" href="https://bugs.launchpad.net/ceilometer/+bug/1491509"&gt;https://bugs.launchpad.net/ceilometer/+bug/1491509&lt;/a&gt;
Blueprint: &lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/unify-timestamp-of-polled-data"&gt;https://blueprints.launchpad.net/ceilometer/+spec/unify-timestamp-of-polled-data&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Sun, 24 Apr 2016 00:00:00 </pubDate></item><item><title>Add pagination support for Aodh</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/newton/add-pagination-support-for-aodh.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/aodh/+spec/support-pagination"&gt;https://blueprints.launchpad.net/aodh/+spec/support-pagination&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This BP proposed to add pagination support for Aodh. User can use this
feature to set limit, marker and sort when they query their alarm and
alarm history.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently when list alarm and alarm history, all the existed alarm and
history will return at one time, and it is really not user friendly for
users.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Allow Aodh user to use  the general pagination mechanism with the help of
&lt;cite&gt;limit&lt;/cite&gt;, &lt;cite&gt;marker&lt;/cite&gt;, &lt;cite&gt;sort_key&lt;/cite&gt;, &lt;cite&gt;sort_dir&lt;/cite&gt; optional parameters to list alarm
and alarm history.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;sort_key&lt;/strong&gt;: Key used to determine sort order&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;sort_dir&lt;/strong&gt;: Direction for with the associated sort key (“asc” or “desc”)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;marker&lt;/strong&gt;: The last alarm ID of the previous page. Displays list of
alarms after “marker”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;limit&lt;/strong&gt;: Maximum number of alarms to display. If limit == -1,
all alarms will be displayed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Keep the current anti-friendly situation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;New optional parameters &lt;cite&gt;limit&lt;/cite&gt;, &lt;cite&gt;marker&lt;/cite&gt;, &lt;cite&gt;sort_key&lt;/cite&gt;, &lt;cite&gt;sort_dir&lt;/cite&gt;
will be added to GET /v2/alarms and GET /v2/query/alarms/history&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Zhenyu Zheng&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liusheng&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add pagination support for alarm and alarm history;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the related support in alarm client.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Related tests will be added.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;References about how to use pagination will be added.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/section&gt;
</description><pubDate>Thu, 31 Mar 2016 00:00:00 </pubDate></item><item><title>‘Big Data’ SQL part two</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/big-data-sql-v2.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/bigger-data-sql"&gt;https://blueprints.launchpad.net/ceilometer/+spec/bigger-data-sql&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In step 1 of sql refactoring, we denormalised the data to capture and store
data as close to its raw form as possible. This removed all the overhead
caused by deprecated data design requirements. This blueprint further
refactors the data model to organise data closer to api model.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, the Metering data model is completely denormalised. We store
Samples, which are the raw data points, and Meters, which are the definition
of said data points. This optimisation allows for good write performance but
due to size of Sample table, can cause issues with read performance
particularly with get_meter and get_resources. Specifically, joins can cause
performance issues.&lt;/p&gt;
&lt;p&gt;The current schema is as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="n"&gt;incoming&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;meter_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;meter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;project_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;resource_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;source_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="n"&gt;dictionaries&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;message_signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;message_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The proposed change is to re-implement a normalised model that is tailored to
current API requirements. This means grouping Resource specific data in
Resource table and Meter specific data in Meter Table.&lt;/p&gt;
&lt;p&gt;the proposed schema is as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;internal_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="n"&gt;assumption&lt;/span&gt; &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt;
                   &lt;span class="n"&gt;unique&lt;/span&gt; &lt;span class="n"&gt;ie&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="n"&gt;per&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;resource_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;project_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;source_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;resource_metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="n"&gt;dictionary&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;metadata_hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;allow&lt;/span&gt; &lt;span class="n"&gt;comparison&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="n"&gt;incoming&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;meter_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;meter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;resource_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;internal_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;message_signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;message_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;As a schema can be defined in quite a few ways, there are many alternatives in
that sense.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;Api model will remain unchanged. the sql backend model will change to proposal
described above:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;creating a new Resource table&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;moving appropriate values from sample table to resource table&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These changes will require database migration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;We will need to adapt existing api model to interface with new backend schema
but from user POV, there will be no change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None, we will continue to store a new resource per sample&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;The read performance should improve as we will not have a giant Sample
table anymore but smaller, tailored Resource, Meter, and Sample tables.
The write performance is not expected to degrade noticeably.&lt;/p&gt;
&lt;p&gt;It is expected any degradation in write performance would be caught by
existing tempest tests.&lt;/p&gt;
&lt;p&gt;Use of Ilya’s performance tool will be used to verify there is improved read
performance and negligible write performance degradation.[1]&lt;/p&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://github.com/ityaptin/ceilometer/blob/master/tools/sample-generator.py"&gt;https://github.com/ityaptin/ceilometer/blob/master/tools/sample-generator.py&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None, just a new schema to learn about&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Migration script to add new attributes to Meter table and new Resource table&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify impl_sqlalchemy get_meters, get_resource, record_metering_data,
expirer and any other affected methods to use new schema&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Most contributors know the sql backend to some degree. The community will
maintain until v3 backend is phased in.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Existing test cases should cover change&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tempest test cases should cover performance degradation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need to add test to handle data expiration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Discussion with Mike Bayer:
&lt;a class="reference external" href="https://etherpad.openstack.org/p/ceilometer-sqlalchemy-mike-bayer"&gt;https://etherpad.openstack.org/p/ceilometer-sqlalchemy-mike-bayer&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Grenade Resource Survivability</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/grenade-resource-survivability.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/grenade-resource-survivability"&gt;https://blueprints.launchpad.net/ceilometer/+spec/grenade-resource-survivability&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Integrated projects are required to participate in the &lt;a class="reference external" href="https://github.com/openstack-dev/grenade"&gt;Grenade&lt;/a&gt; upgrade
testing harness. In addition to testing the upgrades themselves Grenade has
facilities, called javelin, for testing survivability of resources through the
upgrade process. Ceilometer needs to participate in this testing.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;To be certain that Ceilometer is robust across an upgrade it must be possible
to process metrics and events from resources that exist before and after
the upgrade. Grenade provides a feature named javelin which is designed
to allow assertions that confirm resource A, present prior to the upgrade,
is present after the upgrade.&lt;/p&gt;
&lt;p&gt;In the Juno cycle Grenade is being updated to &lt;a class="reference external" href="https://review.openstack.org/#/c/96445/"&gt;support javelin2&lt;/a&gt; which, unlike
the original javelin, should work well and has a declarative syntax for making
assertions.&lt;/p&gt;
&lt;p&gt;A &lt;a class="reference external" href="https://github.com/openstack/ceilometer-specs/blob/master/specs/juno/grenade-upgrade-testing.rst"&gt;previous spec&lt;/a&gt; describes adding basic Ceilometer support to Grenade. This
spec is specifically about adding testing via javelin2.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add support for Ceilometer resource checking to javelin2. This involves two
types of changes (detailed below): Adding support for Ceilometer queries in
the &lt;a class="reference external" href="https://github.com/openstack/tempest/blob/master/tempest/cmd/javelin.py"&gt;javelin code&lt;/a&gt; and adding Ceilometer specific entries to the resource
definitions.&lt;/p&gt;
&lt;p&gt;The main check that will be facilitated by javelin2 is ensuring the sanity of
api queries with a time range that spans the entire window of time within which
the Grenade test runs (e.g. -+12 hours from now).&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;It may be that Ceilometer queries do not map well to the resource model in use
in javelin2. If this is the case then it might make sense to architect some
other kind of before and after upgrade test specifically for Ceilometer. Doing
so would be a shame, though. Better to make javelin2 more flexible.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;While Ceilometer has something of a reputation in this area, because it will
already be running in the Grenade environment, no additional impact is expected
by adding javelin tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;As Ceilometer features grow or change, adjustments in the javelin2 check tests
may need to be made.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Who is leading the writing of the code? Or is this a blueprint where you’re
throwing it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;emilienm&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Determine optimal form for handling ceilometer queries within javelin2. At a
gross level there are two options: 1) Including the ceilometer queries as
code within &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tempest.cmd.javelin&lt;/span&gt;&lt;/code&gt; itself, either built in or as plugin.
2) Representing the queries declaratively in a checks section of the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resources.yaml&lt;/span&gt;&lt;/code&gt; file that could potenetially be used by other projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the queries (as described in &lt;a class="reference internal" href="#proposed-change"&gt;Proposed change&lt;/a&gt;) in whatever form is
chosen.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a first pass, option 1 above is most expedient. If chosen the other options
and the related &lt;a class="reference external" href="https://review.openstack.org/#/c/100575/"&gt;review discussion&lt;/a&gt; should be considered for the future.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Ongoing maintenance of the Ceilometer portions of the javelin2 tests will be
the responsibility of the Ceilometer project team.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;These changes require &lt;a class="reference external" href="https://blueprints.launchpad.net/tempest/+spec/javelin2"&gt;javelin2&lt;/a&gt; which was merged into Tempest on 30, May
2014.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Est quod est.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Ceilometer blueprint for &lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/grenade-upgrade-testing"&gt;Grenade Upgrade Testing&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Javelin 2 &lt;a class="reference external" href="https://blueprints.launchpad.net/tempest/+spec/javelin2"&gt;blueprint&lt;/a&gt;, &lt;a class="reference external" href="https://review.openstack.org/#/c/96445"&gt;spec&lt;/a&gt; and &lt;a class="reference external" href="https://github.com/openstack/tempest/blob/master/tempest/cmd/javelin.py"&gt;code&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Grenade Upgrade Testing - Phase 1</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/grenade-upgrade-testing.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/grenade-upgrade-testing"&gt;https://blueprints.launchpad.net/ceilometer/+spec/grenade-upgrade-testing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Integrated projects are required to participate in the &lt;a class="reference external" href="https://github.com/openstack-dev/grenade"&gt;grenade&lt;/a&gt; upgrade
testing harness. Ceilometer was integrated before these requirements were
added but the requirements apply retroactively. Therefore, ceilometer must be
added to the harness.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Testing with grenade involves:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Installing a basic DevStack of the old version, confirming it
with smoke and scenario &lt;a class="reference external" href="https://github.com/openstack/tempest"&gt;tempest&lt;/a&gt; tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Establishing a javelin project which makes assertions about
resources in the project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shutting down the original installation, upgrading to the new
version of the code but not configuration, applying the relevant
database migrations to update the schema, and repeating the
&lt;a class="reference external" href="https://github.com/openstack/tempest"&gt;tempest&lt;/a&gt; tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testing the javelin project again to assert the integrity of
resources across the upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This document considers the upgrade and &lt;a class="reference external" href="https://github.com/openstack/tempest"&gt;tempest&lt;/a&gt; testing but not the javelin
testing. Javelin will be addressed in another (forthcoming) document.&lt;/p&gt;
&lt;p&gt;Prior to the Juno cycle ceilometer was neither a default service in DevStack
nor enabled in tempest. The relevant configuration must be changed to allow
testing in Grenade.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Enable ceilometer in Grenade (see Work Items for details).&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Given the commitment to Grenade and the project graduation requirements, this
is the way to go.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;These changes will mean a more positive upgrade experience for end users.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;There have been concerns that running ceilometer in the gate will negatively
impact performance there. This had been true but recent changes in the
sqlalchemy driver and database schema have shown enough improvement that
ceilometer can be turned on.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Active testing will mean the discovery of bugs that someone will have to fix.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Who is leading the writing of the code? Or is this a blueprint where you’re
throwing it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;emilienm&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;vrovachev
dbelova&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add upgrade calls to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;grenade.sh&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add ceilometer upgrade scripts to grenade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add ceilometer directories to grenade cleanup procedures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure ceilometer data dumped between upgrades.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: These work items are captured in a &lt;a class="reference external" href="https://review.openstack.org/#/c/94468/"&gt;pending patchset&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;As/when ceilometer expands to include additional services, it will be necessary
to adjust devstack and grenade to manage (stop, start, cleanup) those services.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Other than those listed above, no additional dependencies.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;These changes improve testing and will be validated there.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Ironic Notifications</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/ironic-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ironic-notifications"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ironic-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Work is &lt;a class="reference external" href="https://blueprints.launchpad.net/ironic/+spec/send-data-to-ceilometer"&gt;in progress&lt;/a&gt; to get Ironic to emit notifications from data provided by
IPMI sensors (such as cpu temp and voltage). Ceilometer needs to be updated to
consume, transform and record these notifications.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The Ironic project is doing work to emit notifications on the message bus
containing IPMI sensor data. If Ceilometer processes these notifications other
services will be able use queries and alarms to monitor and scale as required.&lt;/p&gt;
&lt;p&gt;It is not possible to simply dump a message on the bus and for Ceilometer to
handle it. Instead a notification plugin is required, in Ceilometer, to
hear notifications at an exchange and topic and transform them into samples.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add a new notification plugin for Ironic to transform sensor data into samples,
using existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;NotficationBase&lt;/span&gt;&lt;/code&gt; implementations as a model. To do this
effectively a complete sample of the expected sensor data is required to
determine the relevant types of samples.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Handling notifications is the standard and preferred method for gathering data
into Ceilometer. The other option is polling which has known scalability
issues, including over-frequent &lt;a class="reference external" href="http://lists.openstack.org/pipermail/openstack-dev/2014-March/031101.html"&gt;polling of IPMI&lt;/a&gt;. If Ironic is sending
notifications it can continue to own the credentials for the IPMI access and
also control the cadence with which sensors are polled. Using notifications also
allows other services to consume the sensor data.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;There will be additional valid values in query parameters but no changes to API
endpoints.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;Unknown. The data being provided by the Ironic notifier is still being decided.
Only when it is available will it be possible to determine what, if any,
transformations may be usefully done in the pipeline.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;No new impacts. Pre-existing concerns with capacity at the notification and
storage handling layers remain.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Who is leading the writing of the code? Or is this a blueprint where you’re
throwing it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;whaom&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Establish expected data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create tests of transformation of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sensordata&lt;/span&gt;&lt;/code&gt; to samples.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create notification plugin to consume &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sensordata&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create tests of notifications across fake bus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create sample query tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;In the future new types of notifications are expected from the Ironic
controller. These will need to be handled either by additional notification
plugins or (hopefully) generic notification handling. The Ceilometer team will
be responsible for collaborating with the Ironic team to ensure these are
handled smoothly.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The primary dependency is work described in an &lt;a class="reference external" href="https://blueprints.launchpad.net/ironic/+spec/send-data-to-ceilometer"&gt;Ironic spec&lt;/a&gt;. Once
that is implemented, notifications will be present on the bus.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;In addition to unit tests, Tempest tests which confirm that Ceilometer consumes
notifications produced by Ironic would be useful. Such tests depend on there
being a tool to provide sensor data in the testing environment. Such a tool
would be similar to &lt;a class="reference external" href="https://github.com/tripleo/bm_poseur"&gt;bm_poseur&lt;/a&gt; which fakes baremetal instances in devstack.
In the event that such a tool is not available as long as the sample data used
in unit tests is sufficiently representative then the tests themselves ought
to be as well.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ironic/+spec/send-data-to-ceilometer"&gt;Ironic spec&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/72538/"&gt;Review in progress&lt;/a&gt; for sending notification from Ironic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://paste.openstack.org/show/85053/"&gt;Sample data&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Alarm quotas</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/quotas-on-alarms.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/quotas-on-alarms"&gt;https://blueprints.launchpad.net/ceilometer/+spec/quotas-on-alarms&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently, it is possible to create an unlimited number of alarms in
Ceilometer. It would be useful to be able to specify a maximum number of
alarms allowed per user or project in order to have some control and
limit on the computing power required by Ceilometer.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Presently, due to alarm evaluation process, the large number of alarms
affects the performance of Ceilometer, but improvements to reduce this
issue are underway with blueprint &lt;a class="footnote-reference brackets" href="#id3" id="id1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Even if performance wasn’t an issue, in order to prevent abuse from end users,
the alarm quota mechanism must be implemented.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The proposed change will allow to express maximum number of alarms that
can be set by user or project. These limits, if enforced,
could be specified in Ceilometer’s configuration file (alarm section):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;alarm&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;user_alarm_quota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;project_alarm_quota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When a user adds an alarm, the following checks would occur:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Has the user filled his alarms quota ? If yes, the query is rejected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is the user’s project’s alarms quota filled ? If yes,
the query is rejected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the alarm.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Quotas don’t have to be set at every level. For example,
setting a limit only at the project level will allow users to create as many
alarms as they want as long as the sum of alarms for their specific project
is less than the limit.&lt;/p&gt;
&lt;p&gt;In order to provide backward compatibility, the default value for alarm
quotas will be set to None.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;An alternative solution, storing project/user quota in Keystone for
all Openstack resources, was proposed during Havana development cycle &lt;a class="footnote-reference brackets" href="#id4" id="id2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.
This solution was since abandoned in favor of letting each component manage
quotas on their own.&lt;/p&gt;
&lt;p&gt;An alternative solution to implement quotas in Ceilometer would be
to use the same mechanism that other Openstack components are using. This
will imply the addition of an OS-QUOTAS API extension in Ceilometer,
that will be used by the cloud operator for project/user specific quota
assignments. These specific project/user quotas must be stored in Ceilometer
backend, implying several backend specific quota storage implementations.&lt;/p&gt;
&lt;p&gt;This alternative solution is more complex and could be implemented in future
release cycles.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;p&gt;No API method is either added or changed. Nevertheless, the new error http
response code (HTTP 403) will be returned when the alarm quotas are exceeded.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;The impact of this feature for Heat Alarm and AutoScaling resources
will be evaluated and fixed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;The deployer can now define alarm quota in configuration file (alarm
section):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;alarm&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;quota_user_alarm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;quota_project_alarm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;arezmerita&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mhu-s&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement the alarm quota mechanism&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test the feature in unit tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;As mentioned in alternatives section, API extension for dynamic quota
management can be implemented in future release cycles.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Tempest tests will be added to tests this feature&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Ceilometer installation documentation will be updated&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="id3" role="note"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/95418/"&gt;https://review.openstack.org/#/c/95418/&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="id4" role="note"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id2"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/40568/"&gt;https://review.openstack.org/#/c/40568/&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Ceilometer API RBAC - Granular Role-based Access Control</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/ceilometer-rbac.html</link><description>
 
&lt;p&gt;Current access control for the API presents a clear lack of granularity. In
fact it is possible to have a “global” admin role or a simple “user” within the
project and nothing in between.&lt;/p&gt;
&lt;p&gt;With upcoming Keystone v3 enhancements we can expand the granularity of access
control to allow non “global” admins, i.e. Domain Admins or Parent Project
admins.&lt;/p&gt;
&lt;p&gt;We will accomplish this by using a decorator on the API functions. The
decorator will control access based on user/project roles and rules specified
in the policy json file.&lt;/p&gt;
&lt;p&gt;acl.py could be deprecated since its only function is to determine if a user is
admin, and the decorator accomplishes this.&lt;/p&gt;
&lt;p&gt;Example policy expansions:&lt;/p&gt;
&lt;p&gt;Current policy.json only verifies user is admin:&lt;/p&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"/&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"context_is_admin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"role:admin"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="w"/&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"/&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;New rules allow separation of access control by method and expanded roles. Also
compatible with Keystone v3 expanded functionality where domains are supported.&lt;/p&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"/&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;"context_is_admin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"role:admin"&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;&lt;span class="w"/&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;"admin_or_cloud_admin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"rule:context_is_admin"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"/&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"rule:admin_and_matching_project_domain_id"&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;&lt;span class="w"/&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nt"&gt;"telemetry:alarm_delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"rule:admin_or_cloud_admin"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="w"/&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"/&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Ceilometer API currently supports all or nothing authentication for API calls.&lt;/p&gt;
&lt;p&gt;This limits the functionality of the reporting API as managers of more than one
project must either be given the admin role or re-scope each request to view
multiple projects.&lt;/p&gt;
&lt;p&gt;Use cases where this limits functionality include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Resellers managing more than one project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Domain administrators managing more than one project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support personnel who manage above cases&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We propose to solve the problem by moving access control from calls to the ACL
to applying a decorator to the API methods.  Each publicly accessible API
method would have a decorator pointing to a new RBAC module.  The RBAC module
decorator would use rules defined in policy.json to determine accessibility of
methods by a caller.&lt;/p&gt;
&lt;p&gt;This would allow fine-grained, role-dependent, method-specific access control.&lt;/p&gt;
&lt;p&gt;It would also align Ceilometer API wit the Keystone V3 Domain capabilities as
well as the hierarchical project proposal since both domain or project could
be used in rule creation.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;It would be possible to place an RBAC filter in front of the Pecan webserver.
This filter would implement RBAC through calls to Keystone to verify roles,
projects and domains.&lt;/p&gt;
&lt;p&gt;While we believe this is a reasonable solution, it diverges from the way
Ceilometer API is currently implemented.  It would require insertion of an
access control filter between the middleware and Pecan.  It would also require
significant code changes to the current RBAC scheme which handles access
control within the API.&lt;/p&gt;
&lt;p&gt;The proposed model will minimize code changes.  It would simply add decorator
statements to the external API methods, create an additional module, and add
configuration changes to policy.json&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;The new model would improve security because access control would become
centralized in the decorator module.  After ensuring each external method has a
default decorator call, access control would remain as admin or project-only
unless changed in the policy configuration file (policy.json).&lt;/p&gt;
&lt;p&gt;The current model places calls to the ACL module in varying locations
throughout the API code.  For example, GET methods call _query_to_kwargs which
eventually calls the ACL, and PUT methods call the ACL directly.  This could
lead to confusion on how to handle access control in new methods or how to
change it for existing ones.&lt;/p&gt;
&lt;p&gt;Security improvements include the ability to allow user/project combinations to
be granted roles other than the powerful admin role and still accomplish
meaningful activities.  Removal of the maximum-privilege admin role and
limiting access to the least possible set of operations is an improvement.&lt;/p&gt;
&lt;p&gt;Possible security impacts involve the fact that this approach is more
role-dependent.  If complex rules are specified but the Keystone role granting
privileges are not tightly controlled, there are more opportunities to grant
unwarranted access to users.&lt;/p&gt;
&lt;p&gt;In other words, with more roles and access schemes available there is more to
manage.&lt;/p&gt;
&lt;p&gt;We believe this risk is mitigated by the ability to ship the basic code with
only the current context_is_admin rule enabled.  Such configuration would not
allow additional Keystone roles to grant new privileges unless the system
operators explicitly added new rules to the policy file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;This will have no direct impact on on python-ceilometerclient as roles and
their associated rules would be established in keystone and interpreted by
Ceilometer API. Nevertheless, the python-ceilometerclient will benefit from the
increase security provided by the new policy support. For instance, collector
agent (or any other ceilometer service) can have a special role associated
with it disallowing other services (with admin status) to post data in the
database.&lt;/p&gt;
&lt;p&gt;If end users were to take advantage of the expanded RBAC capabilities, there
would be end user impacts in securing appropriate user and project roles to
match those defined in the policy file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;By default there will be no impact during deployment.  The change will ship
with a configuration that preserves the current access control behavior.  The
operator can simply leave everything as is and expect the system to behave as
it did before this change.&lt;/p&gt;
&lt;p&gt;There will be an option to define and use different policy files if the
operator wants to take advantage of the expanded access control capabilities
offered by this fix.  This fix will also offer compatibility with Keystone v3
features (again, optional not out of the box).&lt;/p&gt;
&lt;p&gt;Deployment options:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Optional policy configuration changes to enable expanded access control&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change must be explicitly enabled to allow expanded access control, otherwise
it defaults to current access control behavior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No changes in the package deployment are required.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Existing policy definition files will continue to work as they currently do
without any special changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Developers adding new Ceilometer API endpoints will need to add the appropriate
access control mechanisms to exposed API methods.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eap-x, fabgia&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eap-x, srinivas-sakhamuri&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;fabgia, srinivas-sakhamuri&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Work items:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement RBAC validation module&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply decorators to all external Ceilometer API methods (such as v2/meters,
etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deprecate acl.py usage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make policy.json rule additions if desired (optional)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;The HP Ceilometer development team is actively interested in improving and
maintaining API access control.  We foresee a need by commercial cloud
providers to configure access control for reselling and for private cloud
management.&lt;/p&gt;
&lt;p&gt;We would like to be actively engaged in cotinued development and maintenance of
this feature for many cycles.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Keystone v3 adoption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No new libraries or programs required&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No external dependencies&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Existing API tests will ensure current access control functionality is
preserved.  New unit tests will cover expanded functionality.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation around enabling the expanded RBAC features will be required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Keystone V3 Policy:
&lt;a class="reference external" href="https://github.com/openstack/keystone/blob/master/etc/policy.v3cloudsample.json"&gt;https://github.com/openstack/keystone/blob/master/etc/policy.v3cloudsample.json&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Ceph object storage meters</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/ceilometer_ceph_integration.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ceph-ceilometer-integration"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ceph-ceilometer-integration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec proposes to add ceph object storage metering support to Ceilometer
by polling mechanism, using the ceph radosgw (rados gateway) APIs, when the
ceph is used as object storage, instead of swift.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, ceilometer doesn’t has the capability to get the meters from ceph
object storage, when the ceph is used as an object storage, instead of swift
object storage).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Ceph object storage (i.e ragosgw) provide a few REST APIs to get the meters
like object/container list, object/container size, etc. Ceilometer can use
these REST APIs to get the needful metering information.&lt;/p&gt;
&lt;p&gt;In Ceilometer - polling mechanism is required, to get the meter details from
the ceph object storage. This polling method could be similar to swift polling
mechanism.&lt;/p&gt;
&lt;p&gt;Add new pollster classes for ceph object storage to get object storage meter
information into sample-list, using existing &lt;cite&gt;storage.objects&lt;/cite&gt; implementation
as a model used with swift object storage.&lt;/p&gt;
&lt;p&gt;The ceph object storage poller names have the following pattern:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ceph.storage.objects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph.storage.objects.size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph.storage.objects.containers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph.storage.containers.objects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph.storage.containers.objects.size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ceph.storage.api.request&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To implement the above - we will call the ceph object storage (i.e radosgw)
REST APIs.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Ceph object storage can push the notifications for the meters to ceilometer,
but currently ceph doesn’t support the push notifications support, so its a
complex alternative to use ATM.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;swamireddy&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;swamireddy&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Configure the setup (i.e setup.cfg) file based on the object storage used
to get the metering information. If swift used, use swift collectors to get
the metering information. If ceph used, use ceph collectors to get the
metering information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the ceph object storage (radosgw) APIs calls for appropriately
for each metering item. Here, the python swfitclient will be used to
interact with ceph rados gateway.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Currently, ceph support the keystone authentication. To check if it works
with ceilometer also.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update/modify the ceph radosgw REST APIs appropriately, based on ceilometer
requirements. But at present, planned to use the currently supported APIs
from ceph radosgw, without major changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add test coverage for the above pollster classes and meter samples validation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;In this spec, we have dealt with meters, which can be supported using the
polling mechanism. But a few meters like object input/output bytes size
need the push notifications support from ceph. If the push notifications
supports in ceph, we add these meters also in ceilometer in future.&lt;/p&gt;
&lt;p&gt;In the future new types of metering items are expected from the ceph object
storage to account for the statistics data. These will need to be handled
separately.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Ceph - radosgw REST APIs support required to do this. If ceph API is not
supported, we may need to implement it in ceph - radosgw.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added to cover the necessary pollster classes and validate
them with appropriate meter samples generated.&lt;/p&gt;
&lt;p&gt;The integration tests will be performed with help of 3rd party CI setup.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Middleware-specific Ceilometer Package</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/ceilometermiddleware.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ceilometermiddleware"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ceilometermiddleware&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The swift middleware packaged in Ceilometer enables the generation of swift
metrics which can be used to properly meter Swift activity. This cross
project dependency causes issues during the upgrade chain.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently the swift middleware exists in the Ceilometer package as it leverages
the functionality of the pipeline. This process is rather heavyweight as it
moves a lot of the processing (building samples, republishing to correct
targets) to the Swift service where as it should really exist on Ceilometer’s.
Additionally, having the middleware live in the Ceilometer package brings in
a lot of additional dependencies unrelated to the middleware which is causing
upgrade issues[1].&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This spec is to propose branching off swift middleware into its own library:
ceilometermiddleware. This work is similar to the keystonemiddleware library
which split the auth_token middleware into its own library to avoid additional
requirements of a larger package.&lt;/p&gt;
&lt;p&gt;Additionally, the middleware will be modified to solely compute the required
metric values as it does now and publish a single notification straight to the
message queue rather than loading in the Ceilometer pipeline and pusblishing 3
separate samples as it currently does.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;We can continue to publish via the pipeline but it is far too verbose and
will not solve all dependency issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Have swift own its own metrics and have it exist swift package. This is
dependent on swift accepting something not completely scoped to swift
internal functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drop support of swift middleware meters (ie. we won’t test it but it’ll just
existed if a deployer does want to try to use it)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;We need to capture swift meters in notification agent.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;There should be a performance increase we’d be using notifications which are
async and we’d just be sending one notification (which would be picked up by a
listener in ceilometer and parsed into the 3 samples we expect). this moves all
the processing overhead to ceilometer’s services (where it should be)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;New middleware should be place in new library&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;osanai-hisashi&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create ceilometermiddleware library&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;move edited swift middleware to new lib&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add listener to ceilometer to pick up new notification and parse into
three samples&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create shell in middlware that exists in ceilometer to use new lib&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update devstack to use new lib&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;look at statsd approach.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new tests to ceilometermiddleware&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;continue to leverage existing tempest tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;reference new middleware&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://bugs.launchpad.net/ceilometer/+bug/1403024"&gt;https://bugs.launchpad.net/ceilometer/+bug/1403024&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Declarative HTTP API Tests</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/declarative-http-tests.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/declarative-http-tests"&gt;https://blueprints.launchpad.net/ceilometer/+spec/declarative-http-tests&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec proposes a suite of “grey-box” tests for the Ceilometer HTTP
API that are driven by one or several human-readable text files that
declare URL requests alongside expected responses. These tests will
provide end to end tests of API endpoints that in addition to confirming
the functionality of the API will provide a cogent and readable overview
of the HTTP API.&lt;/p&gt;
&lt;p&gt;The suite of tests augments rather than replaces existing tests
presuming that several small tools, each doing a focused job, are more
effective than one job doing everything. In this case the balance of the
focus is on traversing the breadth of the HTTP API to confirm it is in
rude health and demonstrating expected behaviors, not validation of data
provided by the API (unit tests ought to do that).&lt;/p&gt;
&lt;p&gt;Transparency over the API ought to lead to better testing and
ultimately better APIs.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Existing Ceilometer &lt;a class="reference external" href="https://github.com/openstack/ceilometer/tree/master/ceilometer/tests/api"&gt;HTTP API&lt;/a&gt; unit tests are enshrouded by and
encumbered with Python code and traditional unit test infrastructure.
These amount to noise when the purpose of a test is both to test &lt;em&gt;and&lt;/em&gt;
to make visible the testing of the HTTP API. What should be most visible
is HTTP and the API. When these things are not visible, the
effectiveness of the tests as tools for discovery by a developer who
needs to make changes is limited.&lt;/p&gt;
&lt;p&gt;The integration testing harness, &lt;a class="reference external" href="https://github.com/openstack/tempest"&gt;Tempest&lt;/a&gt;, suffers from some of
the same problems as above while also undergoing a refinement in purpose.
Rather than testing &lt;em&gt;all&lt;/em&gt; the things, the future Tempest will evolve
to efficiently test the integration of &lt;em&gt;most&lt;/em&gt; things. In this future
projects which wish to affirm their systems in detail will need to
do that testing themselves.&lt;/p&gt;
&lt;p&gt;Tempest also more strictly requires that testcases have no knowledge
of the internals. This proposal would be free of such
constraints, which may prove convenient for test setup mechanics.&lt;/p&gt;
&lt;p&gt;In addition, Tempest is now “branchless”, so that the same test
branch is run against stable/{icehouse|juno} and master. This
requires that tests for newly testable features either discover the
availability of such features dynamically, or are explicitly
configured to be skipped depending on the branch Tempest is being
run against (neither option being ideal). This proposal would be free of
such complications, as the tests would live in-tree and thus be branched
in the same way as the rest of the codebase.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;To address the shortcomings in HTTP testing (readability and
completeness) a new target for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox&lt;/span&gt;&lt;/code&gt; will be defined that runs a
suite of HTTP tests which are expressed as HTTP requests with
expected responses. The exact format should be determined from
discussion as these sorts of things always cause a lot of
contention. Best to get that out of the way early.&lt;/p&gt;
&lt;p&gt;This same suite of tests will also be registered as a check job to
be run against patches proposed to the code review process.&lt;/p&gt;
&lt;p&gt;In the ideal form the tests will run all the usual HTTP methods
against every URL made available by all the active endpoints
presented over HTTP by Ceilometer. This means that it should cover
both the pending v3 API that will be presented by Gnocchi as well as
the soon to deprecated older APIs.&lt;/p&gt;
&lt;p&gt;To ensure the tests are lightweight and fast no web server will be used
and only one of whichever lightweight datastore (mongo, sqlite3) for
limited persistence. These tests are for testing the HTTP API aspect of
Ceilometer and as such are not scenario tests: We don’t need to run
these tests against every available datastore.&lt;/p&gt;
&lt;p&gt;“No web server” can be achieved by using &lt;a class="reference external" href="https://pypi.python.org/pypi/wsgi_intercept"&gt;wsgi-intercept&lt;/a&gt;,
&lt;a class="reference external" href="http://webtest.readthedocs.org/"&gt;WebTest&lt;/a&gt; or similar. The choice of tool should be driven by
determining which is best able to facilitate easy translation from
the declarative format to tests that can be handled by the runner.&lt;/p&gt;
&lt;p&gt;The declarative format of the tests need to balance between easy for
a human to write and read and easy for a computer to parse. There
are two general classes of style:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Something that looks a bit like the output of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-v&lt;/span&gt;&lt;/code&gt;. This
has the advantage of looking just like HTTP on the wire but the
disadvantage that it is hard to express partial expectations or
partial requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A list of dictionaries that represent requests and expected
responses. This is easy to express in a common format like
YAML, can deal with partial information well, and handle a form of
inheritance. The author has some &lt;a class="reference external" href="https://github.com/tiddlyweb/tiddlyweb/blob/master/test/httptest.yaml"&gt;good success&lt;/a&gt; with this format
so tends to prefer it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assuming the latter format a possible implementation would include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A test runner that parses YAML files to generate tests which will
be captured by the testing harness. This runner, besides making
the HTTP requests and processing responses, will be responsible
for setup: establishing the necessary services and other
prerequisites of the tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A directory including multiple YAML files each representing a
transaction/scenario of some kind in the API &lt;em&gt;or&lt;/em&gt; all the routes
in one version of the API.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that this proposal makes no mention of client code because it is
direct HTTP requests that are being tested, not calls to a client
library. This is entirely the point: a client library hides HTTP and
what we are trying to do here is expose HTTP interactions to the harsh
light of review.&lt;/p&gt;
&lt;p&gt;There are a few questions which will need to be resolved to reach a
complete solution. It should be possible to resolve these in flight.
The questions include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;What format for the tests?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to handle authN and authZ in a minimal fashion? Ideally keystone
won’t be running. If that’s the case, what needs to be done?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to aggregate request and response groups into single tests?
One option is for each YAML file to be treated as a single test.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;There are several alternative options to a standalone suite of
declarative HTTP tests within the Ceilometer code tree:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Propose a spec &lt;a class="reference external" href="https://github.com/openstack/qa-specs"&gt;to qa&lt;/a&gt; for building a general purpose solution to
the problem of declarative HTTP tests in-tree. Long term this
would be a great outcome, but this outcome seems more likely if
people are able to see a working version against which
improvements can be made.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t use a standalone suite, have the tests integrated with a
larger set of in-tree functional and/or integration tests. While
this may be a good idea from a management of complexity standpoint
it has limited value in ensuring the tight focus of purpose that
is required for something to be good at its purpose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t use declarative tests, instead continue with
object-oriented &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;unittests&lt;/span&gt;&lt;/code&gt; style that is the norm throughout many
tests. Doing this will defeat the purpose of the proposal (exposing
and expressing HTTP) so is not recommended.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the tests against various storage and web server scenarios to
achieve maximum coverage across a variety of situations. While
this may have value, it would lead to slow tests and increase
complexity of the harness significantly. Slow tests discourage people
running them and complexity leads to breakage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do nothing. Use existing unit tests and tempests test. This is
not a good option as neither the existing unit tests nor Tempest tests
present good (and readable) coverage.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None. The data model should be invisible to these tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;These tests will not add to the API, but with luck will improve it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;Writing and running these tests may demonstrate that the API is
confusing and hard to use which may then lead to making it better.
This would be awesome.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;The additional gate check job may have some impact on performance there
but these changes are not expected to impact the performance of
Ceilometer itself.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;If a developer adds to or changes the HTTP API those changes will need
to reflected in this test suite.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;dbelova&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Decide on the declarative format.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine extent or depth of testing (are web servers being used?
other data store?).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write harness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write first round of tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate with tox and testr.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create gate job.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;As features are added and removed to and from the API tests for
those features will need to be changed in this suite. Most of the
time that should be done by the implementor of the feature but there
will be times that larger cleanups are required.&lt;/p&gt;
&lt;p&gt;Similarly if storage handling becomes a part of the test suite, then
as new storage systems are implemented (or removed), they will need
to be handled.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;This work is self-contained but may add to the libraries required
for testing (e.g. wsgi-intercept).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;As a suite of tests, this system will test itself. It should,
however, include some sanity tests within itself to make sure it is
behaving.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;See links above and:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.python.org/moin/PythonTestingToolsTaxonomy"&gt;https://wiki.python.org/moin/PythonTestingToolsTaxonomy&lt;/a&gt; for prior
art and potential formats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://lists.openstack.org/pipermail/openstack-dev/2014-October/049056.html"&gt;http://lists.openstack.org/pipermail/openstack-dev/2014-October/049056.html&lt;/a&gt;
related mailing list thread.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Dedicated Event Database</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/dedicated-event-db.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/dedicated-event-db"&gt;https://blueprints.launchpad.net/ceilometer/+spec/dedicated-event-db&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ceilometer provides the ability for metering, alarming, and eventing. As
Ceilometer tracks more and more data, scalability issues will arise.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, metering and event data coexists on the same database. While
related, there’s a logical separation in the metering and event models
where the data in each model has its own unique data and structure; the
metering model can be best described as a time series while the event model is
closer to an entity attribute model. As the models are different in what they
capture, it makes sense that deployers may choose to use different storage
drivers to store each data set.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Similar to the work done to split alarming into its own database, this
blueprint is to allow for event related data to be stored in its own database.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Continue on as status quo.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None, the model remains the same.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None, the api will remain the same. The only change is the api will now
read from events database when event api is called.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;Policies and permissions will remain unchanged. The API will continue to
function as before and give the same amount of access to data. To that effect,
users will require an admin role to have access to data.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;The end user will now be able to store event data in a different database from
metering data. Alternatively, they can continue on as how Ceilometer currently
functions and store event and metering data in the same database.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;This will probably improve scalability as it allows deployers to split event
and metering data so a single database is not flooded by queries against
disconnected data sets. There also remains the ability to write to the same
db so the currently design/performance can continue as well.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;A config option to specify an event database is added:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;metering_connection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hbase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="n"&gt;alarm_connection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sqlite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;event_connection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mongodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Future event related work should be done in event submodule.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Move event models to event submodule&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for event_connection option and create framework for drivers
in event submodule&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move over event related code for each driver from storage module to event
submodule&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;There is common code shared between alarm, event, and metering backends which
can be refactored.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Existing testing should be sufficient. The only additional tests required are
test the ability to define separate backends for each data set (alarm, event,
metering) and to ensure the capabilities of each backend return the correct set
of capabilities.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;We need to update docs to highlight how to enable event specific backend.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;dedicated alarm database blueprint: &lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/dedicated-alarm-database"&gt;https://blueprints.launchpad.net/ceilometer/+spec/dedicated-alarm-database&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>ElasticSearch backend for Events</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/elasticsearch-event-db.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/elasticsearch-driver"&gt;https://blueprints.launchpad.net/ceilometer/+spec/elasticsearch-driver&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As we split our backends to store segregated data (alarm, metering, events), we
have to ability to choose backends tailored to store said data.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;While SQL is able to store unstructured data, it’s true use case is to
effectively store data in a defined schema and it’s relationships so that
it’s easily queryable.&lt;/p&gt;
&lt;p&gt;Events in OpenStack are for the most part schema-free; each notification
message may contain any combination of attributes based on when and where the
message originated from.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;ElasticSearch is designed primarily to store unstructured real time data flows,
similar to the events in OpenStack and has worked with relative success in
other projects[1].&lt;/p&gt;
&lt;p&gt;ElasticSearch will be added in as an alternative backend to the current
offerings of HBase, MongoDB, and SQL. The current implementation of filtering
attributes using a definition file will continue to be used. A Logstash
implementation of capturing and processing events is not in the scope of this
blueprint[2]&lt;/p&gt;
&lt;p&gt;Additionally, the api will continue to match the events api currently offered
rather than implementing logstash.&lt;/p&gt;
&lt;p&gt;Samples backend is not in the scope of this patch as TSDBs offer arguably
better support for capturing measurements. That said, alarms database could be
feasible and may be included in subsequent patches.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;As mentioned, existing solutions using MongoDB, HBase, and SQL exists. They
will continue to be viable options.&lt;/p&gt;
&lt;p&gt;Using Kibana to retrieve/analyze data will not be the default solution to query
data. That said, deployers should be able to bypass Ceilometer’s api and use
Kibana if desired.&lt;/p&gt;
&lt;p&gt;It should be noted, ElasticSearch currently isn’t recommended as a primary
storage engine [3][4]. There is debate around how consistent it is.&lt;/p&gt;
&lt;p&gt;There is another solution to use Mongodb as a primary storage and pipe data
to ElasticSearch for better querying.[5]&lt;/p&gt;
&lt;p&gt;ElasticSearch parallels MongoDB as it is also based on JSON. The reason for
having ElasticSearch as an alternative is because it allows us to create
indices based on time so we can effectivley shard data as well as expire data.
Also, in addition to INFO notifications, services also emit ERROR notifications
which can be richer in textual information, and ElasticSearch is designed
specifically for such cases.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;No data model changes are required. Events will continue to have the following
attributes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;message_id&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;traits&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;Nothing new&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None, unless ElasticSearch is chosen as the backend. Then ElasticSearch will
need to be configured accordingly.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None, as it’s an optional backend. ElasticSearch has the ability to cluster to
provide HA and it is built to scale horizontally[6]&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;The ElasticSearch storage driver is to have feature parity with the rest of
the currently available event driver backends. It will add an elasticsearch-py
client dependency should the driver be selected.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Devs will need to use ElasticSearch client when modifying ElasticSearch driver&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;write equivalent event driver functions and test.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Depending on evolution of events in Ceilometer, ElasticSearch driver will need
to be updated to support new features (if feasible/logical). ElasticSearch may
be extended to cover alarms (and samples) but is not currently in scope because
time series databases are probably a better solution for measurements.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;elasticsearch-py client library&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;testing will need to be done against a mocked db or a real ElasticSearch database&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Update driver docs&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="http://www.elasticsearch.org/case-studies/"&gt;http://www.elasticsearch.org/case-studies/&lt;/a&gt;
[2] &lt;a class="reference external" href="http://logstash.net/docs/1.4.2/"&gt;http://logstash.net/docs/1.4.2/&lt;/a&gt;
[3] &lt;a class="reference external" href="http://www.bigdatamontreal.org/?p=305"&gt;http://www.bigdatamontreal.org/?p=305&lt;/a&gt; - elasticsearch employee
[4] &lt;a class="reference external" href="http://aphyr.com/posts/317-call-me-maybe-elasticsearch"&gt;http://aphyr.com/posts/317-call-me-maybe-elasticsearch&lt;/a&gt;
[5] &lt;a class="reference external" href="http://stackoverflow.com/questions/20080189/index-mongodb-with-elasticsearch/20120927#20120927"&gt;http://stackoverflow.com/questions/20080189/index-mongodb-with-elasticsearch/20120927#20120927&lt;/a&gt;
[6] &lt;a class="reference external" href="http://www.elasticsearch.org/overview/elasticsearch"&gt;http://www.elasticsearch.org/overview/elasticsearch&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Adds disk IOPS metrics implementation in the Hyper-V Inspector</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/hyper-v-disk-iops-metrics.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/hyper-v-disk-iops-metrics"&gt;https://blueprints.launchpad.net/ceilometer/+spec/hyper-v-disk-iops-metrics&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;High latency between I/O requests can be signs of issues. Collecting disk
latency metrics can help us detect those issues. Hyper-V Inspector can collect
those metrics.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, when inspecting disk metrics, the Hyper-V Inspector cannot post
any values for read_requests or write_requests, since this kind of metrics is
not supported by Hyper-V. Instead, the Hyper-V Inspector can collect disk IOPS
metrics, which will give users a useful alternative.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add DiskIOPSPollster and PerDeviceDiskIOPSPollster pollsters, which create
samples having the properties:
* name: ‘disk.iops’
* type: ‘gauge’
* unit: ‘count/second’&lt;/p&gt;
&lt;p&gt;Create the named tuple DiskIOPSStats, containing the field ‘iops_count’.&lt;/p&gt;
&lt;p&gt;Add the method ‘inspect_disk_iops’ in the Inspector and implement it in the
HyperVInspector. The method will return a DiskIOPSStats object.&lt;/p&gt;
&lt;p&gt;The metric value will be fetched from Hyper-V VMs, located in the
Msvm_AggregationMetricValue object (further referred to as metric object)
associated with the VMs. The metric object’s ‘MetricDefinitionId’ must be
equal to the ‘Id’ of Msvm_AggregationMetricDefinition object having the
Caption ‘Average Normalized Disk Throughput’.&lt;/p&gt;
&lt;p&gt;Hyper-V disk metrics were introduced in Windows / Hyper-V Server 2012 R2
(kernel version 6.3). They are not supported in the previous versions.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;Users will have to add the meter ‘disk.iops’ in the disk_source source in
pipeline.yaml instead of ‘disk.read.requests’ and ‘disk.write.requests’.&lt;/p&gt;
&lt;p&gt;Having ‘disk.read.requests’ and ‘disk.write.requests’ in pipeline.yaml has no
effect, the HyperVInspector will return zeroes for those metrics since Hyper-V
cannot collect those metrics, hence the need for ‘disk.iops’ metrics.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;By default, the disk usage metrics collection is enabled in Nova, we just need
to collect the data from the Hyper-V API.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;&lt;a class="reference external" href="mailto:cbelu%40cloudbasesolutions.com"&gt;cbelu&lt;span&gt;@&lt;/span&gt;cloudbasesolutions&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Adds the DiskIOPSPollster and PerDeviceDiskIOPSPollster pollsters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adds the ‘iops_count’ in DiskStats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adds the ‘DiskIOPSStats’ named tuple, having the field ‘iops_count’.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adds the ‘inspect_disk_iops’ method in the Inspector and implement it in
the HyperVInspector. This method will return a DiskIOPSStats object.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adds related unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates ceilometer measurements document.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Once this feature is enabled, it needs tests and bug fixing in the next
2 releases to avoid regression.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests are needed to test the new pollsters and the implementation on
the Hyper-V side.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Integrating Kafka Publisher into Ceilometer Publisher</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/kafka-publisher.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/kafka-publisher"&gt;https://blueprints.launchpad.net/ceilometer/+spec/kafka-publisher&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apache kafka is messaging broker which enables the ability to publish real-time
metering data to applications outside of OpenStack Projects with low-latency
and high-throughput.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Ceilometer monitors and collects data from OpenStack via notifications sent
from existing services or by polling the infrastructure. These real-time
collected data have great potential to be used for various kind of analysis.
There are many external projects which analyze, serialize, and visualize these
metering data, for example, Storm, Elastic Search, Mahout, Jubatus etc. In
OpenStack, oslo.messaging library provides nice communication paths, however
these communication paths are not so general especially in external to
OpenStack projects. Thus, this blueprint is trying to publish ceilometer
metering data to such external projects using Kafka, distributed messaging
system, and achieve the full potential of ceilometer metering data.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;To reduce the cost of implementing a Kafka publisher independently,
Ceilometer has to provide the kafka publisher as a publisher plugin.
This automates publishing metering data, and developers only have to
configure the kafka publisher plugin in pipeline.yaml file like:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;publisher:
    - kafka://&amp;lt;broker_ip&amp;gt;?topic=&amp;lt;topic_name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This way any application that is trying to consume streaming ceilometer
metrics via Kafka, can directly consume the ceilometer samples. For example,
projects like monasca - &lt;a class="reference external" href="https://github.com/stackforge/monasca-thresh"&gt;https://github.com/stackforge/monasca-thresh&lt;/a&gt; can consume
the ceilometer metrics that are published by the Ceilometer Kafka publisher.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Inside of the OpenStack, to communicate with each modules is achieved by
oslo.messaging, however defacto usage of oslo.messaging is for OpenStack projects
and Kafka is supporting for more general usages.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;Current security support of Kafka is none. Authentication of clients and ecrypting
connections are under implementation. More information can be found in the references.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;Provide new options to specify kafka publisher as a ceilometer publisher&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;The paper related to Kafka says that producers can publish about 50,000
messages/sec on the condition that message size is 200 byte and messages are
sent one by one. However, this number is affected by parameters such as message
size, the number of replication, batch size (kafka can send multiple messages
together), and environments. Roughly, RabbitMQ can publish about 10,000
messages/sec, it means this kafka publihser might not be the bottleneck of
performance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;kshimamu&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;yudupi&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;kshimamu&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;adding a kafka publisher as a ceilometer publisher&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Kafka python package&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.python.org/pypi/kafka-python"&gt;https://pypi.python.org/pypi/kafka-python&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Apache Kafka Project&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://kafka.apache.org/"&gt;http://kafka.apache.org/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kafka: a Distributed Messaging System for Log Processing&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://research.microsoft.com/en-us/um/people/srikanth/netdb11/netdb11papers/netdb11-final12.pdf"&gt;http://research.microsoft.com/en-us/um/people/srikanth/netdb11/netdb11papers/netdb11-final12.pdf&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kafka Security&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://cwiki.apache.org/confluence/display/KAFKA/Security"&gt;https://cwiki.apache.org/confluence/display/KAFKA/Security&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;KAFKA 0.8 PRODUCER PERFORMANCE&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://blog.liveramp.com/2013/04/08/kafka-0-8-producer-performance-2/"&gt;http://blog.liveramp.com/2013/04/08/kafka-0-8-producer-performance-2/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Performance of Kafka&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://kafka.apache.org/07/performance.html"&gt;http://kafka.apache.org/07/performance.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RabbitMQ Performance Benchmarks&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://blogs.vmware.com/vfabric/2013/04/how-fast-is-a-rabbit-basic-rabbitmq-performance-benchmarks.html"&gt;http://blogs.vmware.com/vfabric/2013/04/how-fast-is-a-rabbit-basic-rabbitmq-performance-benchmarks.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Track Network Services Notifications</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/network-services-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/network-services-notifications"&gt;https://blueprints.launchpad.net/ceilometer/+spec/network-services-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The goal of this blueprint is to capture the notification events emitted by neutron
network services during create, update and delete operations.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Neutron emits notifications from the data provided by the network services plugin
and agent components. These in particular are for FWaaS, LBaaS and VPNaaS. Ceilometer
needs to be updated to consume and record these notifications. If Ceilometer processes
these notifications other services will be able use queries and alarms to monitor and
scale as required.&lt;/p&gt;
&lt;p&gt;A notification plugin is required, in Ceilometer, to hear notifications at an exchange
and topic and transform them into samples. We can leverage the existing Network Notification
plugins and build on top of it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add a new listener classes for Network Services to transform neutron event data into samples,
using existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;NetworkNotificationBase&lt;/span&gt;&lt;/code&gt; implementations as a model. These listeners
include create, update and delete events emitted by neutron for specific components of
firewall, VPN or a Loadbalancer.&lt;/p&gt;
&lt;p&gt;The Neutron event topic names have the following pattern,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&amp;lt;resource&amp;gt;.create.start&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&amp;lt;resource&amp;gt;.create.end&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&amp;lt;resource&amp;gt;.update.start&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&amp;lt;resource&amp;gt;.update.end&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&amp;lt;resource&amp;gt;.delete.start&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&amp;lt;resource&amp;gt;.delete.end&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For this implementation we will track the end events as those give us the most information
with respect to event payload. Also end events are more informative to track the existence
of a resource and its usage over time.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;No new impacts. Pre-existing concerns with capacity at the notification and
storage handling layers remain.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;pkilambi&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;pkilambi&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Load Balancer Listener class to process create/update/delete events for
pool, vip, member, health_monitor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Firewall Listener class to process create/update/delete events for
firewall, policy and rule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VPN listener class to process create/update/delete events for
vpnservice, ipsec_policy, ike_policy, ipsec_site_connections.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test coverage for the above listener classes and sample validation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;In the future new types of notifications are expected from the Neutron services to
account for the statistics data. These will need to be handled separately.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit and integration Tests will be added to cover the necessary notification listener
classes and validate samples generated.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Rally Gate Check</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/rally-check-gate.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/rally-gate-check"&gt;https://blueprints.launchpad.net/ceilometer/+spec/rally-gate-check&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Rally"&gt;Rally&lt;/a&gt; provides support for what it calls &lt;a class="reference external" href="https://wiki.openstack.org/wiki/Rally/RallyGates"&gt;rally-gate&lt;/a&gt; jobs. These
automate a set of non-voting, custom benchmark scenarios that
effectively make it possible to observe the performance impact of
changes. Ceilometer’s overall performance is the result of complex
interactions in several systems, automating benchmarks of these
systems will save time and provide useful information.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;At this time there are no generally available automated benchmarks
for Ceilometer performance. Both developers and deployers would
appreciate knowing if code changes will improve or damage
performance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;A non-voting gate check job will be created to run a set of
benchmark scenarios against each Ceilometer patchset. This job is
controlled through multiple changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rally-scenarios&lt;/span&gt;&lt;/code&gt; directory in the Ceilometer code tree
containing a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceilometer.yaml&lt;/span&gt;&lt;/code&gt; file that describes the Rally
scenarios to be used in the job.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An addition to &lt;a class="reference external" href="https://github.com/openstack-infra/project-config/blob/master/jenkins/jobs/projects.yaml"&gt;projects.yaml&lt;/a&gt; that adds &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rally-jobs&lt;/span&gt;&lt;/code&gt; to the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;jobs&lt;/span&gt;&lt;/code&gt; list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An update to &lt;a class="reference external" href="https://github.com/openstack-infra/project-config/blob/master/zuul/layout.yaml"&gt;zuul layout&lt;/a&gt; that adds
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;gate-rally-dsvm-fake-ceilometer&lt;/span&gt;&lt;/code&gt; to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;check&lt;/span&gt;&lt;/code&gt; list of the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack/ceilometer&lt;/span&gt;&lt;/code&gt; section.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rally includes a suite of pre-built scenarios which can run against
Ceilometer. At the moment these primarily interact with Ceilometer
over the API. This is not a requirement. Scenarios can do as much or
as little as required and can be added as necessary as plugins in the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rally-scenarios&lt;/span&gt;&lt;/code&gt; directory. As long the code is properly decorated
by Rally code, the scenarios can be measured.&lt;/p&gt;
&lt;p&gt;Initially this change will implement the basic structure for doing
benchmarks, using simple API tests to flesh out and confirm the
setup.&lt;/p&gt;
&lt;p&gt;Once confirmed, additional scenarios will be created to measure:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Latency in polling and notification agents (getting samples into the
pipeline).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Latency in ingestion (getting samples into the data store).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These latter measurements will require more complex scenario code that
is responsible for creating and destroying VMs, volumes and other
resources.&lt;/p&gt;
&lt;p&gt;Scenario code which proves effective should migrate from plugins to
the Rally codebase to allow general use.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Alternatives include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The Rally team is automating performance checking to gather historical
performance data to share with projects.  This serves a similar but not
identical purpose to the changes propsed here: it would help to evaluate
the improvement of Ceilometer at large but not specific changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Rally job as an experimental job, only run when a “check
experimental” comment is left in gerrit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once this initial spec has been implemented and the principles
involved validated in the ceilometer context, it may be worthwhile
to implement what are called “SLA checks” via Rally. These allow a
check job which can fail based on a severe degradation in
performance. These are not being done now to first gain experience
with Rally as well as to compartmentalize work in actionable
chunks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;Some end users may be able to use the benchmark information to make
decisions about how they configure their installations. It seems
unlikely, however, that they will want to review this data from
gerrit.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;These tests will provide a safety net to guard against
degradations in performance and provide data to identify which
changes have caused issues if there is degradation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;As features are added, the Rally scenarios may be insufficient and need
to be updated. Ideally the scenarios will be high-level enough that this
will be rare. When they are not it will be up to the feature developer
to update the Rally scenarios and, as necessary, add Rally plugins.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;boris-42, rediskin, sileht&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;In addition to the steps listed in the Proposed Solution section
above the major chunk of work is in selecting and/or creating the
necessary Rally tasks. Rally itself includes many sample scenarios
and runners and includes a &lt;a class="reference external" href="https://github.com/stackforge/rally/tree/master/rally-scenarios"&gt;gate check&lt;/a&gt; in its own tree which
includes several Ceilometer checks that may be used as starting
point.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;As stated in “Developer Impact” new features may require new
scenarios.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Rally.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The proposal adds a new (non-voting) gate job which will act as its
own test.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;An existing related patchset: &lt;a class="reference external" href="https://review.openstack.org/#/c/132649/"&gt;https://review.openstack.org/#/c/132649/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>API No Pipeline</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/api-no-pipeline.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/api-no-pipeline"&gt;https://blueprints.launchpad.net/ceilometer/+spec/api-no-pipeline&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The ceilometer API server allows new samples to be posted via the
API. These are then processed through the pipeline and then
dispatched as required. This means the API server must use the
pipeline code and have a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt; file, raising the
complexity of the code and the testing and install profile of the API.
An alternative would be for the API server to publish notifications
for the meters it receives which would then be processed by the
notification agent (which has a pipeline of its own) and then
dispatched.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Including the transformation pipeline in the API server increases
complexity on at least three dimensions for a single feature in the
API (creating samples) which is not commonly used (most samples are
produced via polling agents and notifications).&lt;/p&gt;
&lt;p&gt;The use of the pipeline creates dependencies in code, testing and
installation that could be avoided. In code we must include the
pipeline modules and classes. In testing and installation we must
have a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In the installation case, if there are multiple API servers, the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt; must be kept in sync across the hosts on which
those servers are installed. That’s an unnecessary burden.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;One way to resolve this complexity is to not use the pipeline in the
API server at all. Instead when new samples are posted, format them
as notifications and push them onto the notification bus to be
retrieved by the notification agent. The pipeline within that agent
will then do any expected transformations.&lt;/p&gt;
&lt;p&gt;For convenience of testing, an optional flag will be add that can enable
posting samples directly to storage to avoid notification-agent process.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;An alternative which accomplishes the state goal would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A more complex solution would be create notifications on the bus
that are targeted to a specific transformation service. Such a
service would only listen for ceilometer generated measurement
notifications, transform them according to a pipeline description
and then dispatch them onward to storage or other processing. This
model would skip the notification agent entirely.&lt;/p&gt;
&lt;p&gt;Pro: extends the long term plan of decomposing to smaller pieces.
Con: adds to the complexity of this change, increasing time to
completion and risk of error.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another alternative which are related but not quite the same include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The issues with testing of the API requiring a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt;
could be addressed by having a code-based set of pipeline defaults
which are used in the absence of a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt; file (and
could also be used to generated the default &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;The proposal does not impact the structure of the data, but it would
impact the flow of the data. Testing will be required to see what
kind of impact this will have on the timeliness of data acquisition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;Samples created via the API will take a slightly different path between
the API and their eventual storage.&lt;/p&gt;
&lt;p&gt;An optional boolean parameter ‘direct’ will be added to the post-samples API
that allow users posting samples directly to storage and avoid notification
agent processing(will skip pipeline), this is mainly used for testing.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None beyond existing concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;Pipeline transformations that had been happening in the api server
will happen in the notification agent.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;This will potentially introduce some latency in the time between
when a sample is posted to the API and when it lands in the
data store.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Deployers of the API server will no longer need to deploy a
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt; alongside the API server.&lt;/p&gt;
&lt;p&gt;And deployers need to config the ‘notification_driver’ in ceilometer.conf if
need posting samples through notification-agent, such as:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;notification_driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;messaging&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;This change may increase the amount of asynchrony in some tests.
For example, the time between posting a sample and being able to
retrieve that sample may become more unpredictable. As it is already
unpredictable any tests which rely on immediate retrieval are bad
anyway, so we should fix that.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liusheng&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liusheng, chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Ensure existence of robust tests of posting meters that are transformed by
the pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replace pipeline-based publishing in the API code with a notifier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update API tests to deal with things like mocked pipelines that no
longer exist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API option to perform direct writing to storage&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;The members of the Telemetry program will do any required ongoing
maintenance for this feature.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;No new dependencies.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;In addition to existing unit tests of the API, the new &lt;a class="reference external" href="https://github.com/openstack/ceilometer-specs/blob/master/specs/kilo/declarative-http-tests.rst"&gt;declarative
http tests&lt;/a&gt; can be used to confirm that posted samples continue to
have expected transformations.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Deployment documentation may need some slight updates to indicate
the change in configuration file requirements for the api server.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Add the function of deleting alarm history</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/delete-alarmhistory.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/delete-alarmhistory"&gt;https://blueprints.launchpad.net/ceilometer/+spec/delete-alarmhistory&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently the ceilometer-expirer doesn’t delete expired AlarmChanges.
Remained AlarmChanges would be cause of wasted disk-space and slow response.
This blueprint adds the function of deleting alarm history.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently the ceilometer-expirer doesn’t delete expired AlarmChanges.
So we need to add the function of deleting alarm history.&lt;/p&gt;
&lt;p&gt;For doing so, a time-to-live (TTL) value needs to be specified.
Currently the metering_time_to_live (aka time_to_live) value is used
for deleting metering data. However, alarm history expirations shouldn’t
be the same frequency as sample expiration.&lt;/p&gt;
&lt;p&gt;Therefore, separate TTL value needs to be introduced for alarm history.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add the function of deleting alarm history. This functionality will be
put into the ceilometer-expirer.&lt;/p&gt;
&lt;p&gt;New TTL, alarm_history_time_to_live, is added as a config option to database
section.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;It is possible to use the same time_to_live value for both sample and
alarm history.&lt;/p&gt;
&lt;p&gt;However their scale might be completely different, so the expiration
frequency shouldn’t be the same.&lt;/p&gt;
&lt;p&gt;Therefore, we will have separate TTL.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;A new option should be set if deployer wants to enable this feature.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;honjo-rikimaru-c6&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ZhiQiang Fan&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ZhiQiang Fan&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;“alarm_history_time_to_live” is added as a config option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;support mongodb back end&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;support sqlalchemy back end&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This code will be tested in unit tests for expire.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/delete-alarmhistory"&gt;https://blueprints.launchpad.net/ceilometer/+spec/delete-alarmhistory&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] bug report that addresse this issue
&lt;a class="reference external" href="https://bugs.launchpad.net/ceilometer/+bug/1289141"&gt;https://bugs.launchpad.net/ceilometer/+bug/1289141&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3] ongoing patch for [2]
&lt;a class="reference external" href="https://review.openstack.org/#/c/87869/"&gt;https://review.openstack.org/#/c/87869/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Existence Meters Deprecation</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/deprecate-existence-meters.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/deprecate-existence-meters"&gt;https://blueprints.launchpad.net/ceilometer/+spec/deprecate-existence-meters&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;As Ceilometer has expanded to capture more notifications from the OpenStack
message ecosystem, the number of samples it generates grows even faster as
many samples are derived from a single notification or polling request.&lt;/p&gt;
&lt;p&gt;The “Existence of xyz” meters we store in our samples database
represents a significant portion of the data we store. These meters however
offer no useful measurement value and it’s true value is to capture the
state of the resource at a given time – a value that is also available in the
meters generated alongside the existence meters. Additionally, the volume=1
value is very confusing to consumers of data as for a while, Horizon used that
value as the total number of values and often users would wonder why there was
always 1 record of an instance, network, port, etc…&lt;/p&gt;
&lt;p&gt;As we move to a more time-series focused storage for samples, the “volume=1”
meters we collect has not just an impact on storage size, but also the overhead
of rolling up and computing statistics on something as trivial and meaningless
as the constant 1. Additionally, the rollup of samples will diminish the
value of said meters as valid auditable datapoints.&lt;/p&gt;
&lt;p&gt;At a high-level, Samples are the children of Events. Samples are a derived
subset of an Event. Because of that, the Samples we create should capture an
explicit datapoint of interest from an Event and not just be a shadow of an
Event.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The “Existence of xyz” and “volume=1” meters can be better represented as what
they really are: Events. The core event functionality was implemented in
previous cycles and should be expanded to better cover these non-measurement
meters.&lt;/p&gt;
&lt;p&gt;This will offer better querying of data in Events, less storage of data in
general, and less confusion as to what the volume attribute in a sample
represents.&lt;/p&gt;
&lt;p&gt;The proposed solution is to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Mark&lt;/span&gt; &lt;span class="s1"&gt;'volume=1'&lt;/span&gt; &lt;span class="n"&gt;meters&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Events&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;documentation&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
   &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;them&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;event_definitions&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;vast&lt;/span&gt; &lt;span class="n"&gt;majority&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;them&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt;
   &lt;span class="n"&gt;created&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;notifications&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;work&lt;/span&gt; &lt;span class="n"&gt;needs&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="n"&gt;aside&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;adding&lt;/span&gt;
   &lt;span class="n"&gt;them&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;event_defintion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;COMPLETED&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;KILO&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;
&lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Change&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="n"&gt;these&lt;/span&gt; &lt;span class="n"&gt;meters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;NOTE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt;
   &lt;span class="n"&gt;affect&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="n"&gt;solutions&lt;/span&gt; &lt;span class="n"&gt;nor&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="n"&gt;anything&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;An&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt;
   &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Kilo&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;disable&lt;/span&gt; &lt;span class="n"&gt;meters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;COMPLETED&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;KILO&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;
&lt;span class="mf"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Some&lt;/span&gt; &lt;span class="n"&gt;meters&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="n"&gt;related&lt;/span&gt; &lt;span class="n"&gt;meters&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LBaaS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VPNaaS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SDN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;come&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pollsters.&lt;/span&gt; &lt;span class="n"&gt;We&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;convert&lt;/span&gt; &lt;span class="n"&gt;these&lt;/span&gt; &lt;span class="n"&gt;pollsters&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;
   &lt;span class="n"&gt;republish&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;An&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt; &lt;span class="n"&gt;would&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;health&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;polls&lt;/span&gt;
   &lt;span class="n"&gt;made&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="n"&gt;meters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Instead&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;would&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;
   &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mf"&gt;4.&lt;/span&gt; &lt;span class="n"&gt;Henceforth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Samples&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;measurements&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;aggregated&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
   &lt;span class="n"&gt;rolled&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;meaningful&lt;/span&gt; &lt;span class="n"&gt;ways&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;within&lt;/span&gt; &lt;span class="n"&gt;gnocchi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Events&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;
   &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;Samples&lt;/span&gt; &lt;span class="n"&gt;come&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;and&lt;/span&gt; &lt;span class="n"&gt;they&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;stored&lt;/span&gt; &lt;span class="n"&gt;accordingly&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Both&lt;/span&gt;
   &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="n"&gt;series&lt;/span&gt; &lt;span class="n"&gt;driven&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A rough list of meters to be dropped can be found at the correspond bug[1].&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None. We could leave step 3 as optional as they are essentially healthcheck or
existence events. We can also support a tool to migrate ‘non-metric’ meters to
events but this is arguably not important.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None. Events already exist. This may have a side dependency on adding alarming
on Events to maintain feature parity.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None. we may want to expand Events but nothing is directly impacted here.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;Audit data. This is an issue that already exists and will just be migrated from
Samples to Events. It should be possible to add a tag to the event_definition
file to mark data as audit. It is technically possible to redirect audit data to
a separate db using event pipeline[4]&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;Users STILL have the option to keep these meters but we should advocate they
use Events instead. As of Liberty, these meters will be disabled by default
and remove completely as of M*. This has been documented in docs already.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Less sample data. Less equivalent data in Events (because of trait filtering).
Events are a bit more scalable in its design (maybe not the SQL backend).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;We should turn on store_events option by default. This will probably require
deployers to use event_connection option as it probably isn’t advisable to
store sample and event data together but they could.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Learn events. Make events better.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add pollster to Events functionality&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;turn on store_events by default&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add alarming to Events.[3]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;mark meters in measurement as available as Events and add a link to events.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://bugs.launchpad.net/ceilometer/+bug/1384874"&gt;https://bugs.launchpad.net/ceilometer/+bug/1384874&lt;/a&gt;
[3] &lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/notifications-triggers"&gt;https://blueprints.launchpad.net/ceilometer/+spec/notifications-triggers&lt;/a&gt;
[4] &lt;a class="reference external" href="https://bugs.launchpad.net/ceilometer/+bug/1376915"&gt;https://bugs.launchpad.net/ceilometer/+bug/1376915&lt;/a&gt;
[5] &lt;a class="reference external" href="https://github.com/openstack/ceilometer/blob/master/ceilometer/network/services/fwaas.py"&gt;https://github.com/openstack/ceilometer/blob/master/ceilometer/network/services/fwaas.py&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Using aggregation pipeline instead of map-reduce job in MongoDB</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/mongodb-aggregation-pipeline.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/mongodb-aggregation-pipeline"&gt;https://blueprints.launchpad.net/ceilometer/+spec/mongodb-aggregation-pipeline&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, when we make a GET “/v2/meter/&amp;lt;meter_type/statistics” with MongoDB
backend it starts a native map-reduce job in MongoDB instance. Tests and deep
researching show that the job have a lack of performance in work with huge
amount of samples (several millions and above). For example, job processes
~10000 samples per second on my test environment (16 GB RAM, 8 CPU, 1 TB disk,
15000000 samples). So job for 15M samples works ~1500 seconds. It’s longer
than default api timeout, 1 minute.&lt;/p&gt;
&lt;p&gt;Of course, with Gnocchi dispatcher we haven’t issue with statistics, but
users which are going to use only MongoDB backend will have troubles with alarm
work and making user reports.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add an implementation of method get_meter_statistics via MongoDB
aggregation pipeline framework.&lt;/p&gt;
&lt;p&gt;From MongoDB docs:
“This framework modeled on the concept of data processing pipelines. Documents
enter a multi-stage pipeline that transforms the documents into an aggregated
result. The most basic pipeline stages provide filters that operate like
queries and document transformations that modify the form of the output
document. Other pipeline operations provide tools for grouping and sorting
documents by specific field or fields as well as tools for aggregating the
contents of arrays, including arrays of documents. In addition, pipeline stages
can use operators for tasks such as calculating the average or concatenating a
string. The pipeline provides efficient data aggregation using native
operations within MongoDB, and is the preferred method for data aggregation
in MongoDB.”&lt;/p&gt;
&lt;p&gt;My researches show that aggregation pipeline is faster than native map-reduce
job to ~10 times. So processing of 15M samples in the same test environment
works 128 seconds vs 1500 seconds with map-reduce.&lt;/p&gt;
&lt;p&gt;Pipeline aggregation framework has a large functionality and
amount of operators, that allows to provide support of all existence
“statistics” features.&lt;/p&gt;
&lt;p&gt;This implementation affects only performance of statistics request in
Ceilometer MongoDB and doesn’t affects API or different backends.&lt;/p&gt;
&lt;p&gt;Risks:&lt;/p&gt;
&lt;p&gt;This framework have specified limits. It restricted by 100 MB RAM for stage
otherwise it needs to write temporary files with intermediate stages results
to disk. For avoiding failing caused by excessive memory using in MongoDB&amp;gt;=2.6
we can use the option &lt;cite&gt;allowDiskUse=True&lt;/cite&gt; in aggregation command .
This option allows to write intermediate staging data to temporary files.
So, primary risks of this approach are a necessity of free space
on disk and a slow performance of disk writing and reading.&lt;/p&gt;
&lt;p&gt;Accordingly, researches and MongoDB docs, the “$sort” command creates
the most amount of intermediate data for follow stages. So, in practice
this stage prepares data whose size is close to new index size.
In same time, the indexed fields sorting (like timestamp
in our &lt;cite&gt;meter&lt;/cite&gt; collection)  does not need the any additional data in the disk.
This request uses the existing index for sorting.
Other commands works with processed and grouped data and use
additional space only in worst case (huge amount of resources and
group by resource_id in one request).&lt;/p&gt;
&lt;p&gt;Despite to writing temporary file into disk the aggregation command
in this case faster than Map-Reduce up to several times.&lt;/p&gt;
&lt;p&gt;Also this MongoDB mechanisms have limit in size
of finally document in 16 MB, same as map-reduce job.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Also we may improve performance of map-reduce job&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Improve performance of GET “/v2/&amp;lt;meter_name&amp;gt;/statistics” request.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ityaptin&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;idegtiarev&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;implement a get_meter_statistics function with aggregation pipeline framework&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;current tests are check correct work of “statistics” request&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.mongodb.org/v2.4/core/aggregation-introduction/"&gt;http://docs.mongodb.org/v2.4/core/aggregation-introduction/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Pollsters No Transform</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/pollsters-no-transform.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/pollsters-no-transform"&gt;https://blueprints.launchpad.net/ceilometer/+spec/pollsters-no-transform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The ceilometer polling agents currently perform two roles: They poll various
services to generate samples and they optionally transform those samples, using
pipelines defined by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt;, to compose other samples eventually
publishing them as measurements. This latter transformation functionality raises
the complexity of the pollster code. An alternative would be for the pollsters
to send notifications for the meters it creates and have them be processed
by the notification agent (which has a transformation pipeline of its own) and
then be published.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Including the transformation pipeline in the pollsters increases complexity
in the pollsters and duplicates functionality found in the notification agent.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;One way to resolve this complexity is to not do transformations in the
pollsters. Instead when new samples are polled, format them as notifications
and push them onto the notification bus to be retrieved by the notification
agent. The pipeline within that agent will then do any required transformations.&lt;/p&gt;
&lt;p&gt;Besides clarifying the focus of the polling agents it is likely this change
will make it easier to test and build performance improvements both in code
and in deployments. This is murky speculation but it is challenging to test the
theory without doing the work.&lt;/p&gt;
&lt;p&gt;We also get an opportunity to review and audit the polling code, which is a
useful thing to do on a regular basis.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The primary alternative is to leave things as they are. Obviously if we do this
we lose the benefits described above.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;The proposal does not impact the structure of the data, but it would
impact the flow of the data. Testing will be required to see what
kind of impact this will have on the timeliness of data acquisition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;No direct impact on the resources presented by the API.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None beyond existing concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;Describing pipeline impact is somewhat complex because the word pipeline
can be used:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;to describe the overall process whereby a suite of samples is
gathered and transformed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to identify the pairing of a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;source&lt;/span&gt;&lt;/code&gt; with a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sink&lt;/span&gt;&lt;/code&gt; in the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt; file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to point at the file &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt; which configures many
aspects of gathering, transforming and publishing samples as well as
transforming and publishing samples that have been produced from
notifications&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this change transformation and publishing will be localized in the
notification agents. Gathering and producing of samples will be done by
polling agents, the api server (via posting meters) and the notification
agents.&lt;/p&gt;
&lt;p&gt;In order to ease migration the polling agents will continue to use
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pipeline.yaml&lt;/span&gt;&lt;/code&gt; file to configure the sources they will poll
and the intervals at which that polling will be done. The same file
may be used, or a new file without any sinks. The idea is that both
should work.&lt;/p&gt;
&lt;p&gt;The most significant difference is that the existing validation
which confirms that there is a pairing between &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;source&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sink&lt;/span&gt;&lt;/code&gt; will be removed. The polling agents may poll whatever
they like. If the notification agent doesn’t want the samples that
are generated it can simply drop them on the floor. This provides
two benefits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;it makes the pipeline (on the polling side) less complex&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;it focuses authority in the notification agent&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;There is hope that this will decrease the footprint of the pollsters making it
easier to deploy many of them, thus increasing the overall performance of the
polling system.&lt;/p&gt;
&lt;p&gt;On the negative side there could be increased load on both the messaging and the
notification agents but this could be compensated for by:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Having the pollsters publish their notifications on their own topic or even
bus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploying more notification agents (in a horizontal fashion).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Deployers will need to be aware of their options for deploying suitable numbers
of notification agents.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Testing sample transformation from point of sample creation to point of storage
will become more complex as it will traverse several services. With the advent
of in-tree functional testing there is a place where this testing can and
should be done. Having those tests will be very helpful in the long run despite
the initial pain in setting them up.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;you and all your friends&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Ensure existence of robust tests of both polling and notification agents.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replace source and sink handling in the pollster code with a simpler read of
the source descriptions in pipeline.yaml (leaving open the future option of
using a different file). Create samples will be republished as notifications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update documenation to reflect new architecture.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;The members of the Telemetry program will do any required ongoing
maintenance for this feature.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;No new dependencies.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Testing as described above.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Deployment documentation will need to be updated to reflect the connection
between the polling and notification agents, the option to use a custom
messaging bus and other opportunities for customization.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None at this time.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Dynamic pipeline configuration using File Reloading</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/reload-file-based-pipeline-configuration.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/reload-file-based-pipeline-configuration"&gt;https://blueprints.launchpad.net/ceilometer/+spec/reload-file-based-pipeline-configuration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently there is no way to enable or disable meters without restarting ceilometer.
There are cases where operators do not want to run all the meters continuously.&lt;/p&gt;
&lt;p&gt;By enhancing Ceilometer to monitor pipeline file configuration, the application
could be made to dynamically activate/deactivate meters, collection targets or similar
functions, have distinctly different configurations for multiple nodes in different
environments (i.e. dev/test/prod or HA scenarios) and could ultimately be updated
with new collection targets “on-the-fly”.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, Ceilometer relies on pipeline configuration file for determining
run-time parameters used in polling and notification handling.&lt;/p&gt;
&lt;p&gt;There is no way to enable or disable meters without restarting ceilometer.
There are cases where operators do not want to run all the meters
continuously. In these cases, there should be a way to disable or enable them
dynamically (without restarting ceilometer).&lt;/p&gt;
&lt;p&gt;Meters in ceilometer are enabled by adding them in “setup.cfg:entry_points”
configuration file and restarting ceilometer agent.&lt;/p&gt;
&lt;p&gt;When ceilometer agent restarts, during initialization it reads the
entry_points and creates and loads all pollster objects corresponding to
meters present in setup.cfg.&lt;/p&gt;
&lt;p&gt;There are disadvantages with this implementation:&lt;/p&gt;
&lt;p&gt;Ceilometer might be running several hundreds of meters continuously and
restarting it might impact other meters as it involves the deletion and
re-creation of the hundreds of pollster objects, when the need is to poll
a few meters or avoid polling a few meters.&lt;/p&gt;
&lt;p&gt;The subsequent sections will cover an approach to dynamically reload and
update agent pipeline configuration. (pipeline.yaml)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Summary:&lt;/p&gt;
&lt;p&gt;File polling by agent - Each agent polls its local pipeline.yaml file for
changes and re-configures pollsters/listeners on detecting a change.&lt;/p&gt;
&lt;p&gt;By default, this will be turned off. Its an optional feature and can be
turned on by specifying reload_pipeline_config = True in ceilometer.conf
under the default section.&lt;/p&gt;
&lt;p&gt;The proposed high-level flow:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Each agent daemon polls local pipeline configuration file
at configurable interval.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The agents will reload and validate the configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If validation succeeds, the new configuration is used.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Next steps for central-agent, compute-agent and ipmi-agent:&lt;/p&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;&lt;p&gt;For polling agent, determine which pollsters are needed based on new
configuration and need to run at what frequency (polling interval)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For polling-agent, all pollsters in flight are allowed to gracefully
complete.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In HA mode, re-initialize the partition coordinator with new groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start the new set of pollsters.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Next steps for notification agent:&lt;/p&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;&lt;p&gt;Existing listeners are stopped to allow for graceful termination.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure new listeners with the changed pipeline configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Next steps for HA notification agent:&lt;/p&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;&lt;p&gt;Pipeline listeners(pipeline sink-based internal queue listener) are
gracefully terminated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pipeline listeners are re-configured with new pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;dl&gt;
&lt;dt&gt;Pros:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Preferred and Easiest approach&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Cons:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;It doesn’t centralize the pipeline definition and runs the risk of agents
diverging on their pipeline definitions&lt;/p&gt;
&lt;p&gt;This means we’re allowing any kind of error levels due to the fact file
might be changed for one agent, and not changed for another one in the
same coordination group.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;File polling by separate daemon - Each agent uses a separate daemon
that polls the pipeline.yaml for changes. On detecting a change, it signals
(HUP) the agents to re-load the pipeline configuration.&lt;/p&gt;
&lt;p&gt;Pros:
Allows for future extensibility while keeping the agent to pipeline file
contract unchanged.
Cons:
Same as Previous approach
HA for the new daemon needed
Using SIGHUP a potential loophole? (since anyone can send a SIGHUP and have
the agent reload its configuration)
More work for less gain&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HUP-based pipeline reload by agent - The agent uses signal handler to handle
the HUP signal and reloads pipeline from the file in response to the signal.
The assumption on receiving a signal is that the pipeline file has changed,
so the pipeline file can be changed manually or using config management tools
- Chef/Puppet.&lt;/p&gt;
&lt;p&gt;Pros:
No API.
Cons:
File synchronization within coordination group is deployer responsibility
Same as Approach 1
Using SIGHUP a potential loophole? (since anyone can send a SIGHUP and have
the agent reload its configuration)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use automated deployment tools - Puppet, Chef, Ansible to change pipeline
definitions. While this automates changing pipeline definitions across
multiple agents, it doesn’t bring the value-add of on-the-fly updates to the
agent, without incurring a restart of the daemons.&lt;/p&gt;
&lt;p&gt;Pros:
No API.
Cons:
Is looking like the only pure admins approach. Will be more tricky for everyone
not familiar with these tools (devs, DevOps, etc.)
Not in ceilometer scope.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use a combination of 2 and 3 - Use configuration management tool to automate
the change in pipeline configuration across multiple remote agent nodes. Do
not restart any processes though. Agents on each node poll the pipeline file
and on detecting a change in the next polling, will update the pollsters and
listeners. This approach has a dependency with ops on the config mgmt tools.&lt;/p&gt;
&lt;p&gt;Pros:
No API.
Cons:
File synchronization within coordination group is on deployer responsibility&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;The use of the pipeline configuration will change from static to dynamic.
This will affect the supported meters and their datapoint collection.&lt;/p&gt;
&lt;p&gt;The impact to the system is expected to be minimal since changes to pipeline
are expected to be low in frequency.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;There could be a small window where message build-up occurs in oslo bus/
internal queues when the notification listeners are restarted.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Depending on the approach chosen, the deployer will have to synchronize
pipeline file updates across multiple agent instances and then signal the
agents to reload the configuration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;rjaiswal&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;TBD&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;rjaiswal&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement timer to poll pipeline configuration file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement graceful termination of pollsters and listeners&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement reconfiguring and reloading of pollsters in polling-agent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement reconfiguring and reloading of listeners in notification-agent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit Tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Doc updates&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;We’ll want to continue to iterate on this for future cycles to gain additional
functionality:&lt;/p&gt;
&lt;p&gt;Use Tooz with publish-subscribe functionality to enable synchronization of
pipeline configuration across multiple agent instances in a single coordination
group.&lt;/p&gt;
&lt;p&gt;Migration of event traits configuration&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Relates to:
&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/dedicated-event-db"&gt;https://blueprints.launchpad.net/ceilometer/+spec/dedicated-event-db&lt;/a&gt;
&lt;a class="reference external" href="https://review.openstack.org/#/c/119077/"&gt;https://review.openstack.org/#/c/119077/&lt;/a&gt; (central and compute agents merge)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Add unit tests to exercise reloading of pipeline in agents&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Update the relevant documentation about this new feature of reloading pipeline configuration&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/liberty-ceilometer-pipeline-config"&gt;https://etherpad.openstack.org/p/liberty-ceilometer-pipeline-config&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/configuration_via_data_store"&gt;https://etherpad.openstack.org/p/configuration_via_data_store&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/171826/"&gt;https://review.openstack.org/#/c/171826/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Ceilometer/blueprints/Configuration-via-data-store"&gt;https://wiki.openstack.org/wiki/Ceilometer/blueprints/Configuration-via-data-store&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/developer/oslo.config/configopts.html#oslo_config.cfg.ConfigOpts.reload_config_files"&gt;http://docs.openstack.org/developer/oslo.config/configopts.html#oslo_config.cfg.ConfigOpts.reload_config_files&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Remove Eventlet from the API Server</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/remove-web-eventlet.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/remove-web-eventlet"&gt;https://blueprints.launchpad.net/ceilometer/+spec/remove-web-eventlet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As of Kilo, the WSGI application which provides the Ceilometer API can be run
in two fundamentally different ways:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;As a Python command that runs a Werkzeug-based web server that is
monkeypatched to use eventlet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a WSGI application hosted by any WSGI server, often Apache + mod wsgi.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Hosting the server application in a dedicate WSGI host has performance,
configuration and scaling advantages. Running the command line service, while
convenient for simple testing, can result in difficult to diagnose bugs and
unusual behaviors when it is monkeypatched to use eventlet. Since the Werkzeug
server can (and as written, does) provide support for multi-process and
multi-threaded interactions, the inclusion of eventlet should be removed.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Eventlet monkeypatches the socket module to provide non-blocking network I/O.
This can work well most of the time, but when unusual socket situations arise
(for example the client frequently closes the connection before reading all the
data the server would like to send) the produced tracebacks can be more
difficult to use as debugging aids than those that are produced without
eventlet in place. We want our tooling to be as useful as possible &lt;em&gt;especially&lt;/em&gt;
when there are situations that require debugging.&lt;/p&gt;
&lt;p&gt;When using the Werkzeug service, using eventlet is fairly redundant as the
web server is configured to run multiple processes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We can resolve this problem relatively easily. At the moment eventlet monkey
patching is turned on for everything that is imported under &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceilometer.cmd&lt;/span&gt;&lt;/code&gt;
(through &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceilometer/cmd/__init__.py&lt;/span&gt;&lt;/code&gt;). This is overkill. We should evaluate
which services benefit from it and turn it on only for those. We can start with
the API server.&lt;/p&gt;
&lt;p&gt;Further, for the sake of guiding people to the best solutions, we should update
documentation and guidance to downstreams to indicate that using a WSGI host is
the better way to host the API service in production.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Do nothing. This is a hygienic change that will benefit users and developers
but is not strictly required.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None. If there is anything we’ve messed up.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;For production environments, the guidance to use a WSGI host will provide more
options for adjusting configuration for scaling and performance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Deployers who wish to take advantage of the more direct guidance to use a WSGI
host will have to do what it says.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Separate eventlet and non-eventlet commands into two different module
directories, starting with the api module.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compare and contrast performance of the API server with and without eventlet
paying specific attention to the impact on accessing the storage layer. Mike
Bayer has pointed out that removing eventlet has little impact on a properly
configured web server with a properly configured storage layer. We need to
confirm this across the three styles of presenting the APU: WSGI host,
Werkzeug with eventlet, Werkzeug without eventlet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update developer and admin documentation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;This is a core service which will receive ongoing maintenance from the
Ceilometer project. Once the API server is not using eventlet we can
see if any of the other console scripts would benefit from the change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;No new dependencies.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Existing API tests will cover these changes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;As mentioned above developer and admin documentation will need to be updated to
reflect the new guidance about the best service configuration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Spliting Ceilometer alarming</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/split-ceilometer-alarming.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/split-ceilometer-alarming"&gt;https://blueprints.launchpad.net/ceilometer/+spec/split-ceilometer-alarming&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ceilometer evolved from a simple meter gathering component to a lot of
different component doing different things. The storage layer has been
abstracted during Juno and Kilo and is going to be handled by Gnocchi. This
spec proposes that the work continues so that the alarming subsystem of
Ceilometer is split out as an autonomous component connected to the rest of
Ceilometer and Gnocchi.&lt;/p&gt;
&lt;p&gt;This should help with code review, maintenance, deployment, upgrade… as having
several small service-oriented components to manage is going to be easier than
a single monolithic project.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, Ceilometer features can be grouped in different components, mainly:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Metric polling and events storage (Ceilometer polling and notifications agents and collector)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Metric storage (Gnocchi)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alarm evaluation and triggering&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These all 3 components are currently merged in one code base and repository,
whereas they are different service talking to each other. This leads to a bit
of spaghetti code and architecture when digging the project.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We want to improve project management, code review, upgrade, etc, by spliting
the alarming subsystem out of Ceilometer main repository and having it living
its own life in its own repository.&lt;/p&gt;
&lt;p&gt;The new repository and project will be called either &lt;em&gt;aodh&lt;/em&gt;.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Do nothing and continue growing the project until it collapses.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;The main data model impact was storing alarms in a different database than the
samples and events. This change already been implemented in Juno.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;The alarming API should not change and continues to be contained in
&lt;cite&gt;/v2/alarms&lt;/cite&gt;. However, the &lt;cite&gt;ceilometer-api&lt;/cite&gt; endpoint and daemons is going to be
replace by a specific REST API daemon only implementing the alarming subsystem.
This means a new Keystone endpoint will need to be created and registered.&lt;/p&gt;
&lt;p&gt;We’ll also provide a documentation about how to support configuring a proxy
that can route requests to the Ceilometer API endpoint or the new alarm API
endpoint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;As stated above, this will require a new Keystone endpoint to manipulate
alarms.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;It’s easy to envision a better scalability if anything. It’ll be easier to
scale the API endpoint for alarming only. Also, performances might be a little
improved as the alarming codebase could be smaller.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;The configuration file used by the alarming subsystem when it’ll be part of its
own project/repository should be split out of &lt;cite&gt;ceilometer.conf&lt;/cite&gt;. That means a
new configuration file, but close to the current &lt;cite&gt;ceilometer.conf&lt;/cite&gt; file, should
be created.&lt;/p&gt;
&lt;p&gt;Other than that, no option should be added or removed.&lt;/p&gt;
&lt;p&gt;The daemon will remain the same and the API will be deployed in the same way –
either with a (new) daemon either through the recommended WSGI interface.&lt;/p&gt;
&lt;p&gt;The subsystem will be released independently than Ceilometer on its own
schedule, like it’s already the case for Gnocchi and now other OpenStack
projects. A coordinated release at the end of each cycle will happen too.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;The new code repository hosting Ceilometer alarming will require a new core
review team which will be composed of a copy of the current ceilometer-core
reviewers.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;jdanjou&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Isolate Ceilometer alarming codebase from the other part of Ceilometer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new Python package and repository with that isolated codebase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Publish this repository as openstack/&amp;lt;projectname&amp;gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable Tempest, devstack, grenade, etc, tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deprecate alarming code from Ceilometer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After Liberty: remove alarming code from Ceilometer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Contribute to the a downstream switch-over effort to migrate existing
Fedora/Deb packages and puppet modules.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;This Ceilometer subproject will be able to be released on its own like the rest
of the OpenStack projects/components.&lt;/p&gt;
&lt;p&gt;Work items 4 can be removed if the project agrees to not having a deprecation
period. Otherwise, core reviewer will have to be careful that the no code
changes/fixes are merged into Ceilometer rather than the new repository.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The testing coverage should remain the same, using unit tests and functional
tests with Tempest.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The documentation will have to be updated to include this new component in lieu
of the current Ceilometer alarm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Liberty Summit Etherpad &lt;a class="reference external" href="https://etherpad.openstack.org/p/ceilo-multi-identity"&gt;https://etherpad.openstack.org/p/ceilo-multi-identity&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name discussion &lt;a class="reference external" href="http://eavesdrop.openstack.org/meetings/ceilometer/2015/ceilometer.2015-06-04-15.00.log.html"&gt;http://eavesdrop.openstack.org/meetings/ceilometer/2015/ceilometer.2015-06-04-15.00.log.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Support composite threshold rule alarm</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/mitaka/composite-threshold-rule-alarm.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/composite-threshold-rule-alarm"&gt;https://blueprints.launchpad.net/ceilometer/+spec/composite-threshold-rule-alarm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This proposal want to support creating alarm that can specify composite
threshold rule and try to replace combination alarm.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The combination alarm was designed to handle alarm triggered against multiple
conditions. A combination alarm need to depend on other alarms, the dependent
alarms can be threshold alarms or combination alarms. This will form a
dependency chain if the situation is complex. There are some potential problems
of combination alarm evaluation, which have been described by ZhiQiang Fan in
blueprint[1]:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;dependency chain is too long, which causes the state of combination alarm
will not be evaluated timely, in the worst case, it will cause the
combination alarms never be updated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dead loop will be introduced when update alarm, which causes the state of
combination alarm will not be set properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dependency chain will be broken when delete dependent alarm.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, please see: blueprint[1] and spec[2]&lt;/p&gt;
&lt;p&gt;ZhiQiang Fan have made some efforts for these problems by
resolve-alarm-dependency-chain proposal[2]. That proposal tried to check and
resolve the dependency chain in both API and alarm-evaluator layers. To address
the above problems, the implementation of that proposal will be complex, and,
consider the alarm-evaluator working with partition coordinator, the situation
is worse, and hard to be addressed by that proposal.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This proposal allow specifying multiple threshold rules when creating a
threshold alarm, and the threshold rules combined with logical operators: and,
or. following is a sample for the new alarm body:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;......&lt;/span&gt;
    &lt;span class="s2"&gt;"threshold_rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"or"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"threshold"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;"gnocchi_threshold"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="s2"&gt;"meter_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"cpu_util"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"evaluation_periods"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"period"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"statistic"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"avg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"threshold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
                &lt;span class="s2"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"metadata.metering.stack_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"36b20eb3-d749-4964-a7d2-a71147cd8147"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ge"&lt;/span&gt;
            &lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="s2"&gt;"comparison_operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"exclude_outliers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"and"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
                &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"threshold"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;"gnocchi_threshold"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="s2"&gt;"meter_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mem_util"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"evaluation_periods"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"period"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"statistic"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"avg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"threshold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
                    &lt;span class="s2"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"metadata.metering.stack_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"36b20eb3-d749-4964-a7d2-a71147cd8147"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ge"&lt;/span&gt;
                &lt;span class="p"&gt;}],&lt;/span&gt;
                &lt;span class="s2"&gt;"comparison_operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"exclude_outliers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"threshold"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;"gnocchi_threshold"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="s2"&gt;"meter_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"disk.usage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"evaluation_periods"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"period"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"statistic"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"avg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"threshold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
                    &lt;span class="s2"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"metadata.metering.stack_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"36b20eb3-d749-4964-a7d2-a71147cd8147"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ge"&lt;/span&gt;
                &lt;span class="p"&gt;}],&lt;/span&gt;
                &lt;span class="s2"&gt;"comparison_operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"exclude_outliers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;
            &lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The change items of this proposal:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Allow specifying a list of threshold rules and the threshold rules combined
with two logical operators: “and”, “or”, see the above example. The
combination of threshold rules can be multi-hierarchy to support complex
scenario.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alarm evaluator will resolve the alarm threshold rules combined with
operators, and evaluate the threshold condition with statistics list queried
from Ceilometer in proper order. In this process, the short-circuit logic
should be considered to avoid unnecessary statistics query and comparison.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This proposal cannot be applied to EventAlarm, it mainly because event alarm
evaluation is not periodical, the event alarm evaluator listening message bus
and the evaluation action is passively triggered by external notifications.
This is disadvantage if there is alarm usage that need to combine event
alarm and threshold alarm, but I’d rather this situation should be handled in
users end. That means if users want alarm fired when threshold reached and
specify event occurred meanwhile, they can combine threshold alarm and event
alarm in upstream application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also considered above disadvantage, the old combination alarm functionality
will also be kept as supplementary for composite rules alarm, but need to
add documentation to describe the potential problem.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These change will solve the above issues easily and hope to replace combination
alarms. And also, this change will reduce the amount of alarms definition in
our cloud, because currently, we may need to create the dependent alarms
firstly if we want combination alarms. For end users, it is also convenient to
show the alarm triggering multiple conditions than combination alarms (which
need to query dependent alarms successively).&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Adopt the proposal[2] and struggle to make it works with partition coordinator.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The “threshold_rules” will be a dict that can be include multiple threshold
rules and the key of the dict will be “and” or “or”. But this has no
effect on data model, because the rules is stored as json in db.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liusheng&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;you&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liusheng&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Support Aodh API to allow creating alarms with this new threshold rules
definition, and hopefully, the API can keep compatibility with former usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the related changes in storage layer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change the threshold evaluator to support multiple threshold rules and
logical operators attached with an alarm.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The exist declarative tests and new tests with gabbi should be changed/added
to test the alarm CRUD actions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit tests should be added for new threshold evaluator process.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;API documentation should be updated for adding description about this
feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users guide should be updated for add the this usage description.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/resolve-combination-alarm-dependency-chain"&gt;https://blueprints.launchpad.net/ceilometer/+spec/resolve-combination-alarm-dependency-chain&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] &lt;a class="reference external" href="https://review.openstack.org/#/c/98047/"&gt;https://review.openstack.org/#/c/98047/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Only support sqlalchemy in Aodh</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/mitaka/only-support-sqlalchemy-in-aodh.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/only-support-sqlalchemy-in-aodh"&gt;https://blueprints.launchpad.net/ceilometer/+spec/only-support-sqlalchemy-in-aodh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This change want to deprecate others storage backends (mongodb, hbase) except
sql and remove them in future O* cycle, because sql is totally competent for
alarm data and we don’t need to maintain multiple storage backend.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We support multiple storage drivers(habase, mongodb, sqlalchemy) in
Ceilometer, that is mainly for the recording/query of performance based massive
metric data. Aodh continue those drivers after alarming service splitting, but
Aodh only has alarm related data which unlikely be a large number and sql can
well meet the requirement.&lt;/p&gt;
&lt;p&gt;Most of other projects in OpenStack only use sql as database. So we don’t need
to keep the hbase and mongodb support in Aodh. The advantages of removing the
hbase and mongodb support are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;make the code of Aodh more clean that reduce the maintenance works of storage
drivers and related tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;focus on the functionality and avoid considering multiple drivers support if
new features coming.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Deprecate mongodb/Hbase support firstly and remove them in future cycle.&lt;/p&gt;
&lt;p&gt;In current cycle:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;deprecate mongodb and Hbase storage support and log warning messages if
config mongodb or Hbase as storage driver&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add alarm data migration tool for migrating data from mongodb/Hbase to sql&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In future O* cycle:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;remove the mongodb storage implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove the hbase storage implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove the mongodb and hbase related tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove the gate jobs based on mongodb and hbase&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;mongodb or Hbase as storage driver will be not recommended in deployment.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Developers will be happy, they won’t need to consider mongodb and Hbase storage
support and related tests.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liusheng&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;In current cycle:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;send an email to do a user survey to get feedbacks about this change&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deprecate mongodb and Hbase storage support and log warning messages if
config mongodb or Hbase as storage driver&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add alarm data migration tool for migrating data from mongodb/Hbase to sql&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In future O* cycle:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;remove the mongodb storage implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove the hbase storage implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove the mongodb and hbase related tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove the gate jobs based on mongodb and hbase&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update the related docs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Update the documentation about these changes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/only-support-sqlalchemy-in-aodh"&gt;https://blueprints.launchpad.net/ceilometer/+spec/only-support-sqlalchemy-in-aodh&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Rolling Upgrades</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/mitaka/rolling-upgrades.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/rolling-upgrades"&gt;https://blueprints.launchpad.net/ceilometer/+spec/rolling-upgrades&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As Ceilometer matures through each iteration and adds new features, users
will be required to upgrade their existing environments while minimising
the potential downtime required.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Ceilometer currently provides 4 discrete services: polling agents, notification
agents, collector service, and an api service. Each of them provide their
own functionality and the flow of data and purpose of each component can often
be lost on operators when upgrading services.&lt;/p&gt;
&lt;p&gt;To ensure a smooth upgrade experience, we need to properly describe the upgrade
path of the components.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Fortunately, due to the unilateral design of Ceilometer where work is done and
handed off without worry, upgrading is actually a simple procedure and only
requires proper ordering of upgrades.&lt;/p&gt;
&lt;p&gt;Using the simple mantra of ‘never remove, never alter, only add’, we can ensure
a new schema change is understandable by both old and new consumers.&lt;/p&gt;
&lt;p&gt;There are two upgrade paths to handle – both require no code change:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Full upgrade of services&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;The database is upgraded using the above mantra.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The collector must be first taken offline. The new collector, that knows
how to interpret the new payload, can then be started. It will
disregard any historical attributes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The notification agent can then be taken offline and upgraded with the
same conditions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The polling agents can be taken offline and upgraded. In this path, you’ll
want to take down agents on all hosts before starting. After starting
first agent, you should verify that data is again being polled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The api service can be taken offline and upgraded at any point.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Partial upgrade of services&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;The database is upgraded using the above mantra.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The new collector services can be started alongside the old collectors and
must know how to interpret the new payload. It will disregard any
historical attributes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The new notification agent can be started alongside the old agent if no
workload_partioning is enabled OR if it has the same pipeline
configuration. If not, the old agents must be loaded with the same
pipeline configuration first to ensure the notification agents all work
against same pipeline sets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The new polling agent can be started alongside the old agent only if
no new pollsters were added. If not, new polling agents must start only
in its own partitioning group and poll only the new pollsters. After
all old agents are upgraded, the polling agents can be changed to poll
both new pollsters AND the old ones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API service management is handled by WSGI so there is only ever one
version of API service running&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Upgrade ordering does not matter in partial upgrade path. The only
requirement is that the database be upgraded first. It is advisable to
upgrade following the same ordering as currently described: database,
collector, notification agent, polling agent, api.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Regarding new models, they will be pushed into their own unique queue similar
to how Events and Samples are processed on completely separate queues today.&lt;/p&gt;
&lt;p&gt;The above procedures will be added to OpenStack documentation.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;oslo.versionedobjects - this seems like overkill and will add processing
overhead to each and every sample&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;versioned queues - this does not have o.vo overhead but will require more
memory to handle additional queues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;versioned payloads - this may simplify payload as we don’t need to carry
historical fields but requires agents to understand each unique version&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;Depending on the amount of changes, this may increase the size of the model
as we need to capture old attributes. We can choose to define a drop period
if this becomes an issue where we stop support attributes from EOL builds.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Same amount of processing but &lt;strong&gt;potentially&lt;/strong&gt; larger payloads.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;For those not consuming data from API, they will need to be aware of
model changes if they want the latest and greatest.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;gordc&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;everyone&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add the above conditions to docs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add testing support&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;If service requirements change, the above assumptions may not be enough.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;multi-node grenade testing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;migration testing - &lt;a class="reference external" href="https://review.openstack.org/#/c/234686/"&gt;https://review.openstack.org/#/c/234686/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;This proposal is nothing but documentation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://etherpad.openstack.org/p/mitaka-telemetry-upgrades"&gt;https://etherpad.openstack.org/p/mitaka-telemetry-upgrades&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Feb 2016 00:00:00 </pubDate></item><item><title>Event Alarm Timeout</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/mitaka/event-alarm-timeout.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/aodh/+spec/event-alarm-timeout"&gt;https://blueprints.launchpad.net/aodh/+spec/event-alarm-timeout&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This BP adds timeout mechanism for event-alarm. End users can specify a
timeout, 0 (no timeout) by default, for each event-alarm. The alarm status
becomes ‘TIMEOUT’ after timeout reached without receiving desired event.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;After event-alarm were introduced in Liberty, end users or operators could set
alarm for desired event and get alarmed when it receive them. But in some
circumstances, operator want to know otherwise: when desired event is not
received.&lt;/p&gt;
&lt;p&gt;For example, “compute.instance.create.end” is the final event sent to message
bus to indicate success of instance creation. Not receiving it after a long
time is a signal of creation failure, in which operator should be notified.
Unfortunately, current event-alarm doesn’t support it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;When creating event-alarm, a new parameter ‘timeout’ is proposed to define a
expiry time length, so that alarm gets fired when desired event is not received
in expected time. Otherwise, alarm status becomes ‘TIMEOUT’.&lt;/p&gt;
&lt;p&gt;Currently, 3 states are supported in alarm: ‘UNKNOWN’, ‘ALARM’ and ‘OK’, so a
new state ‘TIMEOUT’ will be added to reflect timeout situation.&lt;/p&gt;
&lt;p&gt;For timeout implementation, an ‘alarm.timeout.start’ notification is sent out
by the AODH api process after the event-alarm is created. After receiving it,
evaluator asks its timeout thread/process to handle timeout request. In this
way, avoid new process in AODH api and make all alarm handling jobs inside
evaluator.&lt;/p&gt;
&lt;p&gt;Synchronization handling is critical in evaluator, as both evaluators original
process and timeout process can change status for same alarm. To avoid
complicated lock, timeout process just send a ‘alarm.timeout.end’ event with
related alarm/project id to ‘alarm.all’ topic, where evaluator original process
handle it along with desired event.&lt;/p&gt;
&lt;p&gt;Each ‘alarm.timeout.*’ event should carry enough info in payload, including
alarm_id, project_id, timeout, and desired event. These info could be used for
evaluation and future partitioning infrastructure.&lt;/p&gt;
&lt;p&gt;Each evaluator has only one timeout thread, which gets timeout requests from
evaluator into a queue. Small footprint of timeout process is guaranteed, as
it always sleeps unless one timeout happens. After wake up, it only does 2
things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sends out ‘alarm.timeout.end’ event&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pick up nearest timeout request and start sleeping for it&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The final alarm status depends on the order of events. If ‘timeout.end’ event
comes first, alarm status becomes ‘TIMEOUT’ and following desired event is
ignored.  Otherwise, alarm status becomes ‘ALARM’ and following ‘timeout.end’
event is ignored.  In this way, synchronization is well handled with new
‘timeout.end’ event and simple logic in evaluator.&lt;/p&gt;
&lt;p&gt;After adding timeout, event-alarm state transition changes as following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;EVENT - desired event arrive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TIMEOUT - timeout happen&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Registered action is only triggered when:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;transition between different states, like UNKNOWN =&amp;gt; ALARM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;receiving desired event again at ALARM state if repeat_actions is true&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-----------+&lt;/span&gt;            &lt;span class="o"&gt;+---------+&lt;/span&gt;  &lt;span class="n"&gt;EVENT&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;+---------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;UNKNOWN&lt;/span&gt;  &lt;span class="o"&gt;+------------&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;TIMEOUT&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;TIMEOUT&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;&amp;lt;---------+&lt;/span&gt;
&lt;span class="o"&gt;+-----+-----+&lt;/span&gt;            &lt;span class="o"&gt;+---------+&lt;/span&gt;
      &lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;+---------+&lt;/span&gt;
      &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;+---------+&lt;/span&gt;
      &lt;span class="o"&gt;+------------------&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;ALARM&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;
              &lt;span class="n"&gt;EVENT&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;&amp;lt;---------+&lt;/span&gt;
                         &lt;span class="o"&gt;+-+-----^-+&lt;/span&gt;  &lt;span class="n"&gt;TIMEOUT&lt;/span&gt;
                           &lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt;
                           &lt;span class="o"&gt;+-----+&lt;/span&gt;
                            &lt;span class="n"&gt;EVENT&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Also need changes in DB layer to get all the event-alarm with timeout. In
following cases, we need restart timeout thread if the alarm has timeout, and
previous timeout thread already exit:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;reset the alarm state to ‘UNKNOWN’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable the alarm via the ‘enabled’ attribute&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;There is another BP from Igor to illustrate a different high level design and
usage model. Pls. check
&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/timeout-event-alarm-evaluator"&gt;https://blueprints.launchpad.net/ceilometer/+spec/timeout-event-alarm-evaluator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It adds a new alarm type ‘event_timeout’ to track sequence of
events, like: “compute.instance.create.start”, “compute.instance.create.end”.
So this new alarm includes 2 events: start and end – only after receiving
“start” event, timeout is created for “end” event. It is not as simple and
flexible as this BP, which just adds timeout.&lt;/p&gt;
&lt;p&gt;To handle the synchronization, an alternative is to lock critical section
between evaluator timeout and original thread, so each of them need handle
alarm data structure. But it’s tricky and bug prone.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;API needs minor changes to add ‘timeout’ to ‘event_rule’. One simple
event-alarm definition is as following:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"alarm_actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"log://"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="s2"&gt;"ok_actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"log://"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="s2"&gt;"alarm_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s2"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"alarm01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s2"&gt;"repeat_actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"insufficient data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s2"&gt;"event_rule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"traits.name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"cirros-0.3.4-x86_64-uec-ramdisk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"eq"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
                &lt;span class="s2"&gt;"event_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"image.update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"event"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;End user need to know a new ‘timeout’ parameter when create event alarm.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;No obvious performance issue, because of small footprint of timeout thread. No
obvious scalability issue, as timeout handling is done in evaluator who will
support good partition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;edwin-zhai&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new parameter ‘timeout’ for event-alarm creation in aodh-client&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new alarm state ‘TIMEOUT’ for timeout expired alarms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new interface in aodh-client and DB layer to get all event-alarm with
timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify AODH api’s event-alarm creating code to send out ‘alarm.timeout.start’
notification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify AODH event-alarm evaluator so that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;spawn a new timeout thread to handle all timeout requests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;timeout thread works in a loop of sleeping for timeout seconds then sending
out ‘alarm.timeout.end’ event&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;set related alarm status as ‘TIMEOUT’ when receive ‘alarm.timeout.end’
event.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add extra action to restart timeout thread when reset alarm state to
‘UNKNOWN’ or enable the alarm if previous timeout thread already exit&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;To be maintained by edwin-zhai for bug fixing and enhancement.&lt;/p&gt;
&lt;p&gt;In future, we need timeout thread disaster-recovery capability, that is, no loss
of timeout info when evaluator crash. Need store pending timeout requests in
DB, and feed evaluator when restarting.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Add new test case besides current event-alarm test to cover timeout&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Administrator Guide and Installation Guide in OpenStack Manuals should be
updated to describe usage of ‘timeout’ parameter.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Blueprint Timeout mechanism for Event Alarm Evaluator
&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/timeout-event-alarm-evaluator"&gt;https://blueprints.launchpad.net/ceilometer/+spec/timeout-event-alarm-evaluator&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 25 Jan 2016 00:00:00 </pubDate></item><item><title>Enable LBaaS V2 for Ceilometer</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/mitaka/lbaas-v2-enablement.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/lbaas-v2-enablement"&gt;https://blueprints.launchpad.net/ceilometer/+spec/lbaas-v2-enablement&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The goal of this blueprint is to support LBaaS v2 to poll the LoadBalancer
data in ceilometer.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;According to the Neutron api documentations[4], the LBaaS v1 has been
deprecated in the release Mitaka.&lt;/p&gt;
&lt;p&gt;Based on the neutron LBaaS v2 documentation[1] and LBaaS v2 blueprints,
LBaaS v2 apis are supported. LBaaS v1 and LBaaS v2 can not be run in the
same time. The users can only choose one version of LBaaS to run in their
environment.&lt;/p&gt;
&lt;p&gt;According to the ceilometer admin guide[3], Ceilometer support to collect
the data of LBaaS from Juno release.&lt;/p&gt;
&lt;p&gt;When the users choose to use LBaaS v2 in their environment, they will
meet the problem to use the ceilometer to collect LBaaS meters for the
LBaaS v2 api is different from LBaaS v1.&lt;/p&gt;
&lt;p&gt;For LBaaS v1 has been deprecated from the release Mitaka, Ceilometer will
lost the function to collect the LBaaS meters if Ceilometer doesn’t support
the LBaaS v2.&lt;/p&gt;
&lt;p&gt;The design of LBaaS v1 and LBaaS v2 is different. LBaaS v2 introduces the
meter ‘loadbalancer’ and it contains ‘vip’, so the meter ‘vip’ is not
important to the LBaaS v2 users. And LBaaS v2 has not supplied with the
APIs to achieve the data of the vips directly.&lt;/p&gt;
&lt;p&gt;Meters are supported by LBaaS v1 and not supported by LBaaS v2.&lt;/p&gt;
&lt;p&gt;Name                                  Type                Unit
network.services.lb.vip               Gauge               vip
network.services.lb.vip.create        Delta               vip
network.services.lb.vip.update        Delta               vip&lt;/p&gt;
&lt;p&gt;All the LBaaS APIs have changed in the version 2. We need to use the new APIs
to collect the data.&lt;/p&gt;
&lt;p&gt;The difference of APIs between LBaaS v1 and LBaaS v2.&lt;/p&gt;
&lt;p&gt;Meter_Name                                v1 API
network.services.lb.pool                  /v2.0/lb/pools
network.services.lb.member                /v2.0/lb/members
network.services.lb.health_monitor        /v2.0/lb/health_monitors
network.services.lb.total.connections     /v2.0/lb/pools/%s/stats
network.services.lb.active.connections    /v2.0/lb/pools/%s/stats
network.services.lb.incoming.bytes        /v2.0/lb/pools/%s/stats
network.services.lb.outgoing.bytes        /v2.0/lb/pools/%s/stats&lt;/p&gt;
&lt;p&gt;Meter_Name                                v2 API
network.services.lb.pool                  /v2.0/lbaas/pools
network.services.lb.member                /v2.0/lbaas/pool/%s/members
network.services.lb.health_monitor        /v2.0/lbaas/pools
network.services.lb.total.connections     /v2.0/lbaas/loadbalancers/%s/stats
network.services.lb.active.connections    /v2.0/lbaas/loadbalancers/%s/stats
network.services.lb.incoming.bytes        /v2.0/lbaas/loadbalancers/%s/stats
network.services.lb.outgoing.bytes        /v2.0/lbaas/loadbalancers/%s/stats&lt;/p&gt;
&lt;p&gt;The difference of neutron client methods we use to collect the LBaaS between
LBaaS v1 and LBaaS v2.&lt;/p&gt;
&lt;p&gt;Meter_Name                                v1 method
network.services.lb.pool                  list_pools
network.services.lb.member                list_members
network.services.lb.health_monitor        list_health_monitors
network.services.lb.total.connections     retrieve_pool_stats
network.services.lb.active.connections    retrieve_pool_stats
network.services.lb.incoming.bytes        retrieve_pool_stats
network.services.lb.outgoing.bytes        retrieve_pool_stats&lt;/p&gt;
&lt;p&gt;Meter_Name                                v2 method
network.services.lb.pool                  list_lbaas_pools
network.services.lb.member                list_lbaas_members
network.services.lb.health_monitor        list_lbaas_healthmonitors
network.services.lb.total.connections     retrieve_loadbalancer_stats
network.services.lb.active.connections    retrieve_loadbalancer_stats
network.services.lb.incoming.bytes        retrieve_loadbalancer_stats
network.services.lb.outgoing.bytes        retrieve_loadbalancer_stats&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;In order that the user can switch the LBaaS api version in current situation,
A new entry will be added in the configuration file to specify the api
version of LBaaS.&lt;/p&gt;
&lt;p&gt;When the user chooses to use the LBaaS api v1, the meters supported by LBaaS
v1 will be collected. But LBaaS api v1 has been deprecated in the release
Mitaka, we should suggest the user should not choose to use LBaaS api v1.&lt;/p&gt;
&lt;p&gt;When the user chooses to use the LBaaS api v2, the meters supported by LBaaS
v2 will be collected. But some meters will not be supported by LBaaS v2,
including ‘network.services.lb.vip’, ‘network.services.lb.vip.create’,
‘network.services.lb.vip.update’. we will add some error messages in the log
files to identify these meters can not be supported by LbaaS v2. And The
meters are supported both by LBaaS v1 and LBaaS v2, we will switch to use
the new neutron client methods to achieve the data of them. In the neutorn
client[5], the new LBaaS v2 apis have characters ‘&lt;em&gt;lbaas&lt;/em&gt;’.&lt;/p&gt;
&lt;p&gt;These change will not change the data model. It just switches to use the
LBaaS v2 api in the client.&lt;/p&gt;
&lt;p&gt;New meters are introduced and supported by LBaaS v2.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Metric Definitions:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Name                                       Type      Unit           Origin
network.services.lb.loadbalancer           g         loadbalancer   p
network.services.lb.listener               g         listener       p
network.services.lb.loadbalancer.create    d         loadbalancer   n
network.services.lb.loadbalancer.update    d         loadbalancer   n
network.services.lb.listener.create        d         listener       n
network.services.lb.listener.update        d         listener       n&lt;/p&gt;
&lt;p&gt;Note:
loadbalancer: existence of a loadbalancer
listener    : existence of a listener
g           : gauge
d           : delta
p           : pollster
n           : notification&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Metadata:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We extract the data from the response of calling neutron client to constitute
the metadata of sample. The fields of metadata we use are fixed in the code.
After checking the response of LBaaS v2 apis, most of the fields are still in
the response. Only the field ‘status_description’ is not in the response. But
the relationship between field ‘status’ and ‘status_description’ are list in
the documentation[5], we can use the valute of field ‘status’ to set the value
of the field ‘status_description’.&lt;/p&gt;
&lt;p&gt;Basd on the above reason, the structure of metadata has not changed. We will
not meet the problem when both the data collected by LBaaS v1 and LBaaS v2
are in the same database.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Option one:
Add the limitation in the admin guide[3], let the users to know the ceilometer
can not support the LBaaS v2. But the LBaaS v2 is more powerful and more safe
than v1, more and more users will choose to use LBaaS v2 in the future. And the
LBaaS v1 is deprecated in Mitaka release. So this limitation is not satisfied.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;jizilian&lt;/p&gt;
&lt;p&gt;Primary assignee:
jizilian&lt;/p&gt;
&lt;p&gt;Other contributors:&lt;/p&gt;
&lt;p&gt;Ongoing maintainer:&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;a. Add the new entry in the configration file to specify the version of
LBaaS
b. Use the LBaaS v2 api in ceilometer neutron client when the user decide
to use the LBaaS v2
c. Add the new UT test cases&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Ongoing maintenance will be handled by the Ceilometer team, myself
included.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit and integration Tests will be added to cover the necessary metrics
and validate samples generated.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Need to update the doc about LBaaS v2 support.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1]https://specs.openstack.org/openstack/neutron-specs/specs/kilo/lbaas-api-and-objmodel-improvement.html
[2]https://blueprints.launchpad.net/neutron/+spec/lbaas-api-and-objmodel-improvement
[3]http://docs.openstack.org/admin-guide-cloud/telemetry-measurements.html
[4]http://developer.openstack.org/api-ref-networking-v2-ext.html
[5]https://github.com/openstack/python-neutronclient/blob/master/neutronclient/v2_0/client.py&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 11 Nov 2015 00:00:00 </pubDate></item><item><title>Tempest Plugin</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/mitaka/tempest-plugin.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/templest-plugin"&gt;https://blueprints.launchpad.net/ceilometer/+spec/templest-plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As with devstack and grenade, the tempest program is encouraging
projects to manage their own tempest tests via code hosted in each
project’s code repository. This spec proposes that we do this for
those projects living under the ceilometer umbrella.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Managing tempest tests within tempest itself in the world of the big
tent is problematic: The people who want the tests to exist and the
people who review tempest are not congruent. This can lead to delays
in getting relevant tests in place. When projects host their own
tests as plugins the projects decide what happens when, according
to their own requirements.&lt;/p&gt;
&lt;p&gt;For ceilometer which is now spread over a few repos and has
increasingly complex integration scenarios these problems are
multiplied.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Using the &lt;a class="reference external" href="http://docs.openstack.org/developer/tempest/plugin.html"&gt;tempest plugin&lt;/a&gt; documentation and &lt;a class="reference external" href="http://docs.openstack.org/developer/tempest-lib/"&gt;tempest-lib&lt;/a&gt; new tempest
tests will be created in ceilometer related repos that duplicate
existing telemetry-related test functionality from tempest. Initially
these will be done in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ceilometer&lt;/span&gt;&lt;/code&gt; repo itself. There is a &lt;a class="reference external" href="https://github.com/openstack/sahara/tree/master/sahara/tests/tempest/scenario/data_processing"&gt;sahara
example&lt;/a&gt; and a &lt;a class="reference external" href="https://github.com/openstack/manila/tree/master/manila_tempest_tests"&gt;manila example&lt;/a&gt; that can be used for guidance.&lt;/p&gt;
&lt;p&gt;When these have proven themselves the test in tempest will be
removed and the project should be in a position to greatly increase
the number of tempest tests that are available and run.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;We can leave things as they are now but this is contrary to the
goals of the tempest project.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;If there is improved ceilometer coverage in tempest then operators
who use tempest to validate their clouds will have increased confidence
in more services in their cloud.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;It will be easier for developers to find and improve tempest tests
related to ceilometer.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;you&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The ceilometer team&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Evaluate pre-existing work from other projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a version for ceilometer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create experimental gate jobs to test them against commits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove existing tempest tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update gate jobs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;The ceilometer team will need to be responsible for the ongoing care
and feeding of the in-tree tempest tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;See work items above.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Tempest documentation will need to be updated to reflect that use of
ceilometer will require referencing the plugin.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/developer/tempest/plugin.html"&gt;tempest plugin&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/developer/tempest-lib/"&gt;tempest-lib&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/sahara/tree/master/sahara/tests/tempest/scenario/data_processing"&gt;sahara example&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/manila/tree/master/manila_tempest_tests"&gt;manila example&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 01 Oct 2015 00:00:00 </pubDate></item><item><title>Adds resident memory size meter to libvirt inspector</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/libvirt-memory-resident.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/memory-resident"&gt;https://blueprints.launchpad.net/ceilometer/+spec/memory-resident&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Memory statistics include just the actual usage inside the Virtual Machine.
The ‘memory.resident’ metric will add the resident memory size. The
implementation is done in the libvirt inspector. The value will be fetched
using the libvirt API and the ‘rss’ for dommemstats.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Resident memory is important to see the amount of memory consumed by the
Virtual Machine from the Physical Host. This spec adds the resident memory
statistics to the libvirt inspector.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Implements the method ‘inspect_memory_resident’ of LibvirtInspector, fetches the
rss value for memory from libvirt API ‘virDomainMemoryStats’. The libvirt API
‘virDomainMemoryStats’.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;vivek-nandavanam&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implements the method ‘inspect_memory_resident’ of LibvirtInspector.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates ceilometer measurements document.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Once this feature enabled, need test and bug fixing in next 2 releases to avoid
regression.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;libvirt 0.7.5&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests should be sufficient.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in &lt;a class="reference external" href="https://github.com/openstack/openstack-manuals/blob/master/doc/admin-guide-cloud/source/telemetry-measurements.rst"&gt;https://github.com/openstack/openstack-manuals/blob/master/doc/admin-guide-cloud/source/telemetry-measurements.rst&lt;/a&gt; which will get reflected in the cloud admin documentation &lt;a class="reference external" href="http://docs.openstack.org/admin-guide-cloud/telemetry-measurements.html#openstack-compute"&gt;http://docs.openstack.org/admin-guide-cloud/telemetry-measurements.html#openstack-compute&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;[1] &lt;a class="reference external" href="https://blueprints.launchpad.net/nova/+spec/memory-resident"&gt;https://blueprints.launchpad.net/nova/+spec/memory-resident&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[2] &lt;a class="reference external" href="http://libvirt.org/html/libvirt-libvirt.html#virDomainMemoryStats"&gt;http://libvirt.org/html/libvirt-libvirt.html#virDomainMemoryStats&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 17 Sep 2015 00:00:00 </pubDate></item><item><title>Improve Nova instance metering</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/mitaka/Improve-instance-metering.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/improve-nova-instance-metering"&gt;https://blueprints.launchpad.net/ceilometer/+spec/improve-nova-instance-metering&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now we have a great load on Nova API because ceilometer-polling with “compute”
namespace will polling on Nova API periodically. This proposal aims to reduce
the load by abandoning the current way of metrics collection with periodically
polling.&lt;/p&gt;
&lt;p&gt;NOTE: The ceilometer-polling service with “compute” namespace is previously
named as ceilometer-agent-compute.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Consider the following example. There is an environment with 500 compute nodes
and every compute node deployed with ceilometer-polling with “compute”
namespace (this is a real deployment scale of our company). the polling
interval is set to 60s. For every polling period, ceilometer-polling will
invoke “instance_get_all_by_host()” method (and maybe need querying image and
flavor also) to query the instances of this host from Nova API. That means
the Nova API will receive 500 requests meanwhile every minutes. It would
massively increase the workload on Nova API.&lt;/p&gt;
&lt;p&gt;In the metadata caching proposal[1], the instance info from Nova is be cached
in ceilometer-polling by using ‘change-since’ query filter of Nova server-list
API. That has significantly decreased the amount of items of every Nova query.
But that cannot help to reduce the query frequency.&lt;/p&gt;
&lt;p&gt;To illustrate this, We assume that we can deploy 100 instances on one host at
most. with proposal[1], that may reduce 100 instances to 20 instances returned
in every Nova list request, it’s not a significant improvement. But with this
proposed change it may will reduce the times of Nova API request from 500
requests/min to 1 requests/min, it would be a significant improvement and that
is the goal of this proposal.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This proposal try to solve the problem described above with changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The ceilometer-polling agent with “compute” namespace runs on every compute
nodes. Currently, the agent need to get the instances list of this host by
calling “instance_get_all_by_host” method of novaclient, then traverse this
instance list to get metrics of instance(e.g. cpu, disk.read.bytes,
network.incoming.bytes) by inspector, which will invoke the interfaces of
virt layer to get this metric data. Then ceilometer-polling will assemble the
metric data from virt layer and instance info from Nova API as sample
objects.&lt;/p&gt;
&lt;p&gt;Differently, this change want to add a global cache mechanism to cache the
resource metadata(instance info from Nova db). ceilometer-polling will use
“instance_get_all” to query all the instance from Nova, and then cache them
to the global cache. Also, ceilometer-polling will record the resource
caching time to the cache system, and add an option named
“interval_to_update_resource” to indicate the max interval of resource cache
updating. If the time from last updating is larger than this option value,
the resource cache need to be updated again.&lt;/p&gt;
&lt;p&gt;The “change-since” will also used as a query filter of “instance_get_all” to
massively reduce the amount of every query and only update the changed
instance to the resource cache.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In every ceilometer-polling of every compute node, unlike previous, agent
will try to query instances list of this host from the global resource cache
if the cached resources are not out of date, otherwise, query all the
instances from Nova API to update the cached instance resources and get the
instances of this host. The rest of the process will be same as before. The
above “out of date” means the time from last cached resource updating is
larger than the “interval_to_update_resource” option value.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;It allows users to enable/disable this global resource cache mechanism,
when disable this mechanism, the process is same as before,
ceilometer-polling won’t use the global cache but use a local cache
implemented by proposal[1].&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ol class="upperroman simple"&gt;
&lt;li&gt;&lt;p&gt;Another choice of resource metadata updating solution&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Another suggested solution for this goal is using instance events by
notifications instead of instance metrics by polling to collect instance
resource metadata.&lt;/p&gt;
&lt;p&gt;Using events to update resource metadata in Ceilometer or Gnocchi will be more
efficient because the resource metadata may only need to be update when
something about resource happened. but I have some concerns about that
approach:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The resource metadata updating will depend on events collection, what if some
events didn’t be collected ?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We need to ensure all the resource update actions in other projects of
OpenStack have corresponding events published, that need other resources
providers to ensure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do all the events include enough info for ceilometer? we may need the
resource metadata do some filter query. e.g. use query filtered by instance
metadata do auto-scaling.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="upperroman simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Another choice of where to use global cache&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Instead of the global cache directly used by compute pollsters of
ceilometer-polling service, another choice is using the global cache in
notification-agent service. Instances info will be polled and cached to the
global cache, metric data will be polled by ceilometer-polling and sent to
notification-agent, in notification-agent, the instances info will be queried
from the global cache, and then assemble the instance info and metric data to
sample objects, then push them to pipeline.&lt;/p&gt;
&lt;p&gt;With this proposal, the resource metadata won’t be taken from
ceilometer-polling to notification-agent, only the lightweight metric data will
be pushed to notification-agent. In a large scale deployment, this will also
significantly reduce the load of message bus.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Need to deploy an external global cache system, more details please see[2].&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liusheng&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;liusheng&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement a global resource caching mechanism to cache instance info.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change the instance metric discover to use the cached resource.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The current tests will need to modify to adapt these change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit tests should be add to cover these change.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation should be updated to add description for this.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://review.openstack.org/#/c/185084/"&gt;https://review.openstack.org/#/c/185084/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] &lt;a class="reference external" href="https://review.openstack.org/#/c/250778/"&gt;https://review.openstack.org/#/c/250778/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 06 Aug 2015 00:00:00 </pubDate></item><item><title>Events RBAC via Policy</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/events-rbac.html</link><description>
 
&lt;p&gt;OpenStack needs to support granular, customizable Role-Based Access Control
(RBAC) for ceilometer events. Policy should be dependent on policy.json rather
than simply hard-coded.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/events-rbac"&gt;https://blueprints.launchpad.net/ceilometer/+spec/events-rbac&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The only RBAC validation for ceilometer’s /events REST API that is in place
today is hard-coded logic to restrict requests to admins. This is not granular
enough. In a multi-tenant environment, there must be provision to restrict data
from events to the scope of the token given on the request (e.g. an admin from
one project should not be able to view the events of another project). There
should also be a way to allow non-admins access to some events (e.g. events
for their resources). This issue was originally raised as a bug [1].&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This blueprint proposes the following changes in the behavior of ceilometer’s
/events REST API:&lt;/p&gt;
&lt;p&gt;Add the following rules to ceilometer’s default policy.json:&lt;/p&gt;
&lt;p&gt;“telemetry:events:index”: “role:admin”
“telemetry:events:show”: “role:admin”&lt;/p&gt;
&lt;p&gt;Modify the code to uses those checks to determine who is allowed to request a
list of events (index) or a specific event (show). This pattern is in line with
other OpenStack projects.&lt;/p&gt;
&lt;p&gt;Further modify the code to, if/when those checks pass, filter which events will be returned based on the scope of the token. If the token is for an admin user
(determined by checking the special context_is_admin rule from policy.json),
only return events corresponding to the project to which the supplied
X-Auth-Token is scoped. This is also consistent with other projects. If the
token is for a non-admin user, further filter the results to only return
events corresponding to the user to which the supplied X-Auth-Token is scoped,
as well as the project.&lt;/p&gt;
&lt;p&gt;The events REST API will be processed only if the user passes a project-scoped
token. This is required to filter the events based on the project. If the user
passes an unscoped or domain-scoped token, a 403 error will be thrown.&lt;/p&gt;
&lt;p&gt;There may be events for which no project/user information is recorded. Most if
not all of these should have project/user information, so event-generating code
will need to be modified to include that when creating future events. Updating
existing events within the database is outside the scope of this spec. Until
all events have project/user information, events which lack this data will be
returned along with events corresponding to the token’s project, if the token’s
user is an admin on that project.&lt;/p&gt;
&lt;p&gt;For the first implementation, common name-reserved traits will be used to store
project/user information.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;We could use policy.json checks to filter results as well as determine whether
the request is allowed. This does not fit with the role and purpose of
policy.json, and may also have significant performance implications.&lt;/p&gt;
&lt;p&gt;Storing project/user information in base attributes rather than traits was
considered. This may be better long-term, but there has been some debate on the
appropriateness of using base attributes if there will be some events that are
not scoped to a project/user. Implementing this using traits first will help us
determine whether that is a valid case. A switch to base attributes could come
later.&lt;/p&gt;
&lt;p&gt;Rather than return both project/user-scoped events and unscoped events in a
single response, we could require a separate API call for unscoped events
if/when that is what the user desires. E.g. /broadcasts instead of /events. As
it is unclear whether we will end up with any events that do not have
project/user information, considering this now would be premature.&lt;/p&gt;
&lt;p&gt;We could create another policy check to identify whether a non-admin role
should be considered an admin for the purpose of the /events API (and thus able
query events for the entire project rather than just for themselves). But since
it is expected that events will be split out of ceilometer like meters
(gnocchi) and alarms (aodh), that would seem to be a short-term solution.&lt;/p&gt;
&lt;p&gt;We could support domain-scoped tokens to allow domain admins to query events
for the entire domain with a single request. This may be needed in the future,
but does not appear to be something that must be done as part of this effort.
And there could be benefits to waiting for the keystone reseller spec [2]
implementation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None, as long as we stick using traits.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;Whereas before this change an admin of any project saw events for EVERY project
in the response to a GET /events request, now GET /events will filter out
events belonging to projects other than the one in the scope of the request’s
auth token. This closes a security hole that allowed admins of one project to
gain information about another project in which they have no role.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;This will greatly enhance security by default. It will also provide a mechanism
for operators to customize policy related to events, so operators taking
advantage of this capability will need to consider the potential security
impacts of their configuration changes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Filtering on project/user may have a slight negative performance impact, though
this should be offset by the likely much more substantial performance
improvement of returning less data to the caller.&lt;/p&gt;
&lt;p&gt;Allowing events that do not have project/user information via the same API
queries will mean making two internal calls (one to get events scoped to the
project/user and another to get events not scoped to a project/user) and then
merging them. This may have a slight negative performance impact.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Updating from a previous release will need to include moving to a new version
of policy.json including the new checks, else those would resolve to the
default which is to allow for anyone.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;edmondsw&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;dikonoor&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Check context_is_admin to determine appropriate response filtering&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check policy.json to determine whether the request is allowed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add project/user to events that are currently lacking those details&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;This is essentially a large bug fix, not a feature. As such, all members of the
Telemetry program will be expected to keep this from breaking again.&lt;/p&gt;
&lt;p&gt;Several potential future enhancements are discussed under the Alternatives
section. It is expected that those would require a separate spec if someone
wants to pick up any of them in the future.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests should be sufficient.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Developer documentation [3] will be updated to add user_id to the list of
default traits, and to explain that non-admins will only be able to view events
with their user_id, while admins will only be able to view events with their
tenant_id plus events not associated with a project (aka tenant).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://bugs.launchpad.net/ceilometer/+bug/1461767"&gt;https://bugs.launchpad.net/ceilometer/+bug/1461767&lt;/a&gt;
[2] &lt;a class="reference external" href="https://github.com/openstack/keystone-specs/blob/master/specs/liberty/reseller.rst"&gt;https://github.com/openstack/keystone-specs/blob/master/specs/liberty/reseller.rst&lt;/a&gt;
[3] &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/events.html"&gt;http://docs.openstack.org/developer/ceilometer/events.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 29 Jul 2015 00:00:00 </pubDate></item><item><title>Highly Distributed Coordinated Notifications</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/distributed-coordinated-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/disributed-coordinated-notifications"&gt;https://blueprints.launchpad.net/ceilometer/+spec/disributed-coordinated-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In Kilo, support for coordinated notifications agents was added. This enabled
users to deploy multiple notification agents and ensured related messages
within a pipeline were funnelled into the same agent to allow for proper
aggregation calculations.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In the initial implementation, all the data relating to a pipeline was
funneled into a single queue per pipeline. While it ensured all corresponding
data is sent to the same place, it removed the ability to scale horizontally
as the pipeline queues can only have a single consumer listening to it.
This means that while multiple agents/handlers could be used to pull data off
main OpenStack queue, once the data reached pipeline processing, it was
relegated to a single worker.&lt;/p&gt;
&lt;p&gt;Data can be handled in parallel even at the pipeline level. For example, when
there are no transformers, datapoints do not need to be handled sequentially.
Additionally, when transformers are present, datapoints of different resources
have no relevance to each other and can be handled in parallel.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;To parallelise and scale out processing, we will create multiple copies of
each pipeline. When a datapoint arrives, we will bucketise each datapoint by
a hashed grouping key. Each transfromer will have a grouping key assigned to it
to note any dependency requirements (ie. transformers that work on resource
ids). When setting up pipeline, all the keys of transformers in the pipeline
will be combined to ensure that related datapoints will be consistently sent
to the same pipeline for processing.&lt;/p&gt;
&lt;p&gt;The basic workflow is as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;queues&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;listeners&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
  &lt;span class="n"&gt;corresponds&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="n"&gt;registered&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;datapoint&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;builds&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;built&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;transformer&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;
  &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;datapoint&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;corresponding&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;same&lt;/span&gt; &lt;span class="n"&gt;processing&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="n"&gt;here&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;listener&lt;/span&gt; &lt;span class="n"&gt;grabs&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This solution CANNOT handle multiple grouping_keys in pipeline. To properly
handle multiple grouping_keys in a pipeline we need to requeue after each
transform. The logic would become: main queue -&amp;gt; build sample -&amp;gt;
pipe1.transform1 queue -&amp;gt; pipe1.transform2 queue -&amp;gt; etc -&amp;gt; publish.&lt;/p&gt;
&lt;p&gt;Studying the existing transformers we have:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Accumulator&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;really&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt; &lt;span class="n"&gt;grouping&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;just&lt;/span&gt;
                &lt;span class="n"&gt;batches&lt;/span&gt; &lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Arithmetic&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;grouped&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;resource_id&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;RateOfChange&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;grouped&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;resource_id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt;
                 &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;generally&lt;/span&gt; &lt;span class="n"&gt;grouped&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;just&lt;/span&gt; &lt;span class="n"&gt;resource_id&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Aggregator&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;grouped&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;resource_id&lt;/span&gt;&lt;span class="o"&gt;+&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;custom&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;also&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt;
               &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;generally&lt;/span&gt; &lt;span class="n"&gt;grouped&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;just&lt;/span&gt; &lt;span class="n"&gt;resource_id&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Based on the above, it seems like resource_id is always a valid general
grouping key and the transformers may do more granular groupings themselves.
Because of this, it seems safe to assume we don’t need to support multiple
grouping keys (for now).&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Dumb easy fix is to detect whether a pipeline has transformers. If not, it
can be consumed by any number of consumers and thus we can assign multiple
listeners to those queues. This doesn’t help distribute load of pipelines
with transformers but allows for transformers spanning resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We implement a shared memory/storage mechanism so any worker can discover
the historical context. This is hard. I feel like i would end up recreating
Storm/Spark&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Magic&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;Nothing from user point of view. Internally, we will have more pipeline
queues.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None. Unless we decide to add option to define number of copies of pipeline
queues.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Positive. It will distribute pipeline processing when running in coordinated
mode. Message queues are consistently used with thousands of queues so
creating copies of pipeline queues (a relatively small set) should not be an
issue.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add grouping key to each transformer to define grouping of datapoints
* will be just resource_id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add support to build pipeline hashing from above grouping keys&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add functionality to create pipelines queues per agent and distribution
logic.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Support different grouping keys in a pipeline.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Test already exists. Just need to validate that we create appropriate amount
of copies.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None. Maybe dev docs.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.google.com/presentation/d/1QgjDOLRnKDboqP8P1LvV0kR5aQEv_VJsDtMlh6u7tIY/edit?usp=sharing"&gt;https://docs.google.com/presentation/d/1QgjDOLRnKDboqP8P1LvV0kR5aQEv_VJsDtMlh6u7tIY/edit?usp=sharing&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 07 Jul 2015 00:00:00 </pubDate></item><item><title>Track DBaaS(Trove) Notifications</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/dbaas-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/track-dbaas-notifications"&gt;https://blueprints.launchpad.net/ceilometer/+spec/track-dbaas-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The goal of this blueprint is to capture the notification events emitted by Trove
(DBaaS) during create, modify volume, resize, delete operations and periodic exist
events.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Trove is Database as a Service for OpenStack. It automates the creation, configuration
and management of relational or non-relational database without the burden of handling
complex administrative tasks.&lt;/p&gt;
&lt;p&gt;The trove-taskmanager service dispatches tasks such as provisioning database instances,
managing the lifecycle of database instances, and performing operations on the database
instance and emits notification event for each such task.&lt;/p&gt;
&lt;p&gt;These notifications are CRUD events, that notify the creation, update or modification
of a trove instance and its underlying volume, and also have measurement values such
as instance size and volume size.&lt;/p&gt;
&lt;p&gt;Ceilometer needs to be updated to consume and record these notifications as samples and
events (traits).&lt;/p&gt;
&lt;p&gt;From Trove perspective they are running instances of a database, not compute instances.
Metering and billing will be based on hours that the database has been running, not
necessarily how long the hosting instance has been run. This requires a unique set of
metering records(samples) to be generated and stored to enable usage tracking and billing
of the individual database instances.&lt;/p&gt;
&lt;p&gt;If Ceilometer processes and record these notifications, other services will be
able to use this for aggregation and billing purpose.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;To represent as events, define event definitions and field mappings
(trait definitions) for Trove resource type - instance in the
/etc/ceilometer/event_definitions.yaml file.&lt;/p&gt;
&lt;p&gt;The trait field syntax in trait definitions follow a variant of the JSONPath.&lt;/p&gt;
&lt;p&gt;Example of the event definition and field mappings for the domain notifications
that need to go in event_definitions.yaml,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;event_type: trove.instance.*&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;traits: &amp;amp;trove_traits&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;instance_size:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.instance_size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;resource_id:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.instance_id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;instance_name:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.instance_name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nova_instance_id:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.nova_instance_id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;created_at:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.created_at&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;launched_at:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.launched_at&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;volume_size:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.volume_size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;volume_id:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.nova.volume_id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;modify_at:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.modify_at&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deleted_at:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.deleted_at&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To enable event processing in Ceilometer, configuration is needed in ceilometer.conf,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Configure store_events as True under the notification section,&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;eg -
[notification]
store_events = True&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Specify the event_definitions file name under the event section,&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;eg -
[event]
definitions_cfg_file = event_definitions.yaml&lt;/p&gt;
&lt;p&gt;Using events provides better querying of metadata and avoids the effort to aggregate
samples with a fixed measurement value of 1.&lt;/p&gt;
&lt;p&gt;To represent as samples, a notification plugin is required in Ceilometer,
to hear notifications at an exchange and topic and transform them into samples.&lt;/p&gt;
&lt;p&gt;This is needed to account for the database uptime hours, which is based on
the trove.instance.exists event. Specifically, the audit_period_beginning
and audit_period_ending for each exists event will be used to compute the uptime
hours&lt;/p&gt;
&lt;p&gt;A counter type - database can be used to associate the trove samples&lt;/p&gt;
&lt;p&gt;Add a new listener class - TroveMetricsNotificationBase that extends
plugin.NotificationBase for DBaaS service to transform Trove event data
into samples&lt;/p&gt;
&lt;p&gt;A sub-class of TroveMetricsNotificationBase that emits samples
for the trove.instance.create and trove.instance.exists events and
another for the trove.instance.modify* and trove.instance.delete events&lt;/p&gt;
&lt;p&gt;The Trove event types have the following pattern,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;trove.&amp;lt;resource&amp;gt;.create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove.&amp;lt;resource&amp;gt;.modify_volume&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove.&amp;lt;resource&amp;gt;.modify_flavor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove.&amp;lt;resource&amp;gt;.delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove.&amp;lt;resource&amp;gt;.exists&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;, where resource is instance.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;No new impacts. Pre-existing concerns with capacity at the notification and
storage handling layers remain.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Enable Trove exchange in ceilometer.conf&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;rjaiswal&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;rjaiswal&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Event definitions and field mappings for all supported Trove resource types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Event validation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trove Notifications Listener class to process create/update/delete/exists events for
trove instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test coverage for the above listener class and sample validation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;There could be new types of notifications when new resource types are added
or new features are supported like backup/restore, patching, monitoring etc.&lt;/p&gt;
&lt;p&gt;When Trove conforms to the PaaS event format, the field mappings for integrated
events will need to be refactored to adjust to the new event format.&lt;/p&gt;
&lt;p&gt;With the impending move towards declarative metering in Ceilometer, the proposed
notification plugin for Trove will become redundant/deprecated and replaced with
declarative meter definitions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;DBaaS is construed as a PaaS service by some and might have it own message bus
where it is sending notifications. Ceilometer recently was extended to consume
notification from multiple message bus - &lt;a class="reference external" href="https://review.openstack.org/#/c/77612/"&gt;https://review.openstack.org/#/c/77612/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If there are multiple message buses, then ceilometer will need multiple transport
endpoints configured in ceilometer configuration. (ceilometer.conf)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit and integration Tests will be added to validate events generated.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/events.html"&gt;http://docs.openstack.org/developer/ceilometer/events.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/trunk/config-reference/content/ch_configuring-openstack-telemetry.html"&gt;http://docs.openstack.org/trunk/config-reference/content/ch_configuring-openstack-telemetry.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://specs.openstack.org/openstack/ceilometer-specs/specs/juno/paas-event-format-for-ceilometer.html"&gt;http://specs.openstack.org/openstack/ceilometer-specs/specs/juno/paas-event-format-for-ceilometer.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Trove/trove-notifications"&gt;https://wiki.openstack.org/wiki/Trove/trove-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/kennknowles/python-jsonpath-rw"&gt;https://github.com/kennknowles/python-jsonpath-rw&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 17 Jun 2015 00:00:00 </pubDate></item><item><title>PowerVM Compute Inspector</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/powervm-compute-inspector.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/powervm-inspector"&gt;https://blueprints.launchpad.net/ceilometer/+spec/powervm-inspector&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PowerVM is a hypervisor for the POWER processor architecture.  Community
drivers to support PowerVM in an OpenStack environment for Nova and
Neutron (ML2 agent) are in active development.  Telemetry is a key component
for operators within an OpenStack environment.  This blueprint proposes that
an inspector for PowerVM be included in Ceilometer.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;OpenStack drivers delivering support for the PowerVM hypervisor are being
developed for Nova and Neutron (an ML2 agent).  Operators require more
support than Nova and Neutron integration - they need telemetry information.
PowerVM provides a variety of performance monitoring interfaces for both
virtual machine and system monitoring metrics.&lt;/p&gt;
&lt;p&gt;This proposal is for the PowerVM Driver Team to add a PowerVM compute
inspector to the Ceilometer project.  This will allow operators receive and
store Telemetry data for PowerVM in the same fashion as other hypervisors.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We propose that a new python package be created:
ceilometer/compute/virt/powervm.&lt;/p&gt;
&lt;p&gt;This package will contain a compute inspector (similar to those for hyperv,
libvirt, vmware, and xen) that gathers the statistics.&lt;/p&gt;
&lt;p&gt;The collection of these statistics will be driven through the pypowervm API.
This is an open source project that allows python programs to interact with the
PowerVM hypervisor.&lt;/p&gt;
&lt;p&gt;The module within pypowervm that will be used is the LPAR (logical partition,
equivalent to a virtual machine) statistics package.  This will provide the
interfaces used to collect the statistics.&lt;/p&gt;
&lt;p&gt;The metrics reported for a given instance that will be included are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;CPU Statistics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CPU Utilization&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vNIC Statistics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vNIC Utilization&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disk Statistics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disk Rates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disk IOPs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Metrics that will not be included are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Disk Latency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disk Info&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;An alternative would be to keep the inspector in a separate StackForge project.
This was not seen as viable due to how the inspectors are derived.  Ceilometer
depends on the inspectors residing in the main ceilometer.compute.virt project.&lt;/p&gt;
&lt;p&gt;This approach could be supported if the get_hypervisor_inspector method was
extended to support external projects.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;The inspector should be running on the PowerVM host system in order to collect
the information.  This is in line with the Nova compute driver and the
Neutron ML2 agent.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;The hypervisor_inspector will have a new option available called ‘powervm’.
No database impacts would occur as the standard statistics would be supported.&lt;/p&gt;
&lt;p&gt;There will be a Chef blueprint that is being developed and worked with that
team to support the deployment of the PowerVM drivers/agents.  The changes
there would support the use of the Ceilometer inspector for PowerVM.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.  Unit tests would be developed for the new inspector but are contained
within the given package.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;thorst&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;adreznec, efried&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;thorst, efried&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Deliver the package structure for the powervm inspector.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop the CPU Statistics method and unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop the CPU Utilization method and unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop the vNIC Statistics method and unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop the vNIC Utilization method and unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop the Disk Statistics method and unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop the Disk Rates method and unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop the Disk IOPs method and unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;The PowerVM Drivers team that resides within IBM will continue maintenance and
support of the inspector for future releases.  The PowerVM Drivers team is
outlined here:  &lt;a class="reference external" href="https://launchpad.net/~powervm-drivers"&gt;https://launchpad.net/~powervm-drivers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The maintenance and support that will be provided is, at a minimum:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Changes in the PowerVM inspector due to base library changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ongoing testing and validation of the PowerVM inspector&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bug fixes identified within the PowerVM inspector&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pypowervm: &lt;a class="reference external" href="https://github.com/pypowervm/pypowervm"&gt;https://github.com/pypowervm/pypowervm&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The existing tempest tests will be run against the PowerVM inspector. The
tempest tests are hypervisor-agnostic, allowing the existing tempest tests to
be run against the PowerVM polling code without changes.&lt;/p&gt;
&lt;p&gt;The PowerVM Drivers team will directly run the tempest tests against a
PowerVM system (using the Nova PowerVM Driver and Neutron PowerVM ML2 Agent).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The configuration reference should include an update for the PowerVM inspector:
&lt;a class="reference external" href="http://docs.openstack.org/kilo/config-reference/content/ch_configuring-openstack-telemetry.html"&gt;http://docs.openstack.org/kilo/config-reference/content/ch_configuring-openstack-telemetry.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Python library for PowerVM:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pypowervm: &lt;a class="reference external" href="https://github.com/pypowervm/pypowervm"&gt;https://github.com/pypowervm/pypowervm&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Corresponding OpenStack Projects:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;nova-powervm: &lt;a class="reference external" href="https://launchpad.net/nova-powervm"&gt;https://launchpad.net/nova-powervm&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;neutron-powervm: &lt;a class="reference external" href="https://launchpad.net/neutron-powervm"&gt;https://launchpad.net/neutron-powervm&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: These are StackForge projects while we iterate with the core teams to
bring them into the core.  Neutron will stay a StackForge project given the
decomposition goals of Neutron itself.&lt;/p&gt;
&lt;p&gt;PowerVM as a Hypervisor:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Hypervisor Landing Page: &lt;a class="reference external" href="http://www-03.ibm.com/systems/power/software/virtualization/"&gt;http://www-03.ibm.com/systems/power/software/virtualization/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hypervisor Documentation: &lt;a class="reference external" href="http://www.redbooks.ibm.com/abstracts/sg247940.html"&gt;http://www.redbooks.ibm.com/abstracts/sg247940.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hypervisor Best Practices: &lt;a class="reference external" href="http://www.redbooks.ibm.com/abstracts/sg248062.html"&gt;http://www.redbooks.ibm.com/abstracts/sg248062.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 17 Jun 2015 00:00:00 </pubDate></item><item><title>Mandatory API Query Limits</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/mandatory-limit.html</link><description>
 
&lt;p&gt;Include the URL of your launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/mandatory-api-limit"&gt;https://blueprints.launchpad.net/ceilometer/+spec/mandatory-api-limit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently, Ceilometer’s api allows users to query for as much or as little
data as they desire. They are also allowed to query for everything no matter
the size of results.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Allowing the ability to have return the entire world of data is not a realistic
use case. While it is easier in theory to query for everything, in reality,
this is not viable as it puts a lot of strain on CPU and memory to manage all
the data required. In addition, these queries take a significant amount
of time to calculate and will always time out even if enough resources are
available to the system.&lt;/p&gt;
&lt;p&gt;As Ceilometer intends to remove unused pagination, another form of query
restriction is required.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Mandatory limits must be enforced on queries, whether it be a limit value.
If neither value is provided, a default restriction of 100 will be
applied. This behaves similarly to other dbs such as ElasticSearch which limit
the number of results returned if no restrictions are provided.&lt;/p&gt;
&lt;p&gt;Users are still allowed to query the entire set of data if they choose to, but
instead of implicitly doing so as it currently functions, users will need to
explicitly do so.&lt;/p&gt;
&lt;p&gt;These restrictions will apply to both events and meters api.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Nothing, and let users blame Ceilometer for insane queries.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;All GET queries will require a limit value. If none is given, a default of 100
will be applied.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;A limit value is required to get data as expected. If none is provided, the
returned results may be truncated. A warning will be logged whenever the default
limit is applied.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;This will limit the load created by unintentional large queries.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;A new option will be defined to allow operators control of what the default
return limit is.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Unit tests need to be written to consider this limit.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;gordc&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add option to control default limit value&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply limit check to meter queries and fix UT&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply limit check to event queries and fix UT&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update docs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;We can derive a query link which returns next set of data based on last
timestamp value of returned set.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit test to test default limits are applied.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;This may be a breaking change to some – Ceilometer will probably be already
broken to them. That said, this will need to be publicised.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/section&gt;
</description><pubDate>Wed, 10 Jun 2015 00:00:00 </pubDate></item><item><title>Resource Meta-data Caching</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/resource-metadata-caching.html</link><description>
 
&lt;p&gt;This was discussed at the YVR summit as follow up to issues raised during the
Operators feedback session.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Ceilometer polls regularly via the compute-agent to get resource meta-data’
for all instances. This polling adds load to Nova, Neutron, and Keystone
APIs, which at scale causes a significant performance impact. This meta-data
does not change very often, and the load is likewise often unnecessary.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Lets take advantage of the changes-since parameter in the nova api call.
We’ll start by creating an in-memory cache to store the resource meta-data
on the initial polling and the time of that polling. Then the compute agent
will use the changes-since parameter in all subsequent pollings. This will
reduce the amount of data queried and returned by the Nova API. The results
of this call will update the cache, and the cache will be used to return
the data. Also, we should populate the instance flavor and image data in
the cache as well.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Do nothing&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Should provide greater overall scalability due to the reduction in API load
and reduced traffic flows.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;jasonamyers&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;jasonamyers&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement an in-memory cache in the compute agent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change compute-agent to populate an in-memory cache.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change compute-agent to use the changes-since parameter in the Nova API call .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change compute-agent to record the polling timestamp in the cache.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change compute-agent to cache the flavor and image metadata as well.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;We will need to add tests for meta-data cache flag, API changed-since
queries, compute-agent cache control, and image/flavor caching.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;We will need to document the changes to the polling process, the new meta-data
cache config option, and create new documentation that describes the caching
work-flow.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/YVR-ops-ceilometer"&gt;https://etherpad.openstack.org/p/YVR-ops-ceilometer&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 22 May 2015 00:00:00 </pubDate></item><item><title>Adopt Oslo Guru Meditation Reports</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/guru-meditation-report.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/guru-meditation-report"&gt;https://blueprints.launchpad.net/ceilometer/+spec/guru-meditation-report&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec adopts Oslo Guru Meditation Reports in Ceilometer. The feature will
enhance debugging capabilities of all Ceilometer services, by providing an easy
and convenient way to collect debug data about current threads and
configuration, among other things, to developers, operators, and tech support
in production deployments.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, Ceilometer doesn’t provide a way to collect state data from active
service processes. The only information that is available to deployers,
developers, and tech support is what was actually logged by the service.
Additional data could be usefully used to debug and solve problems that occur
during Ceilometer operation. We could be interested in stack traces of green
and real threads, pid/ppid info, package version, configuration as seen by the
service, etc.&lt;/p&gt;
&lt;p&gt;Oslo Guru Meditation Reports provide an easy way to add support for collecting
the live state info from any service. Report generation is triggered by sending
a special(USR1) signal to a service. Reports are generated on stderr, and can
be piped into system log based on need.&lt;/p&gt;
&lt;p&gt;Nova has supported Oslo Guru Meditation Reports.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;First, a new oslo-incubator module (reports.*) should be synchronized into
Ceilometer tree. Then, each service process needs to initialize the error
report system before the process executes launch method in the main function.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;This feature could expose service internals to someone who is able to send the
needed signal to a service. That said, we can probably assume that the
operator is already authorized to achieve a lot more than just having an access
to stack traces and configuration used. Of course, if deployers are afraid of
the information leak for some reason, they could also make sure their stderr
output is channeled into safe place.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;The feature does not require any additional resources until it’s triggered by
the user and reports are not expected to be generated too often, so it has
little impact on performance and scalability.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;zhangtralon&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sync reports.* module from oslo-incubator&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adopt it in all ceilometer services under ceilometer/cmd/&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add some developer docs on how to use this feature&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Currently, the reports.* module from oslo-incubator is graduating into
oslo.reports in Library. In case it’s graduated into oslo.reports before
Ceilometer switches to it, we will not need to synchronize the reports.* module.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation should be extended to describe the new feature.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] oslo-incubator module: &lt;a class="reference external" href="http://git.openstack.org/cgit/openstack/oslo-incubator/tree/openstack/common/report"&gt;http://git.openstack.org/cgit/openstack/oslo-incubator/tree/openstack/common/report&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] nova guru meditation reports: &lt;a class="reference external" href="https://blueprints.launchpad.net/nova/+spec/guru-meditation-report"&gt;https://blueprints.launchpad.net/nova/+spec/guru-meditation-report&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3] blog about nova guru reports: &lt;a class="reference external" href="https://www.berrange.com/posts/2015/02/19/nova-and-its-use-of-olso-incubator-guru-meditation-reports/"&gt;https://www.berrange.com/posts/2015/02/19/nova-and-its-use-of-olso-incubator-guru-meditation-reports/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[4] oslo.reports repo: &lt;a class="reference external" href="https://github.com/directxman12/oslo.reports"&gt;https://github.com/directxman12/oslo.reports&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 14 May 2015 00:00:00 </pubDate></item><item><title>Declarative Notification Handling</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/declarative-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/declarative-notifications"&gt;https://blueprints.launchpad.net/ceilometer/+spec/declarative-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The goal of this spec is to propose a more declarative approach to defining
notification events.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The existing implementation of notification handling has various limitations.
The issues this proposal addresses include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;There is no way to selectively listen to specific event topics of interest.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Capturing notifications of interest should not require code changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adding new event exchanges involves same routine code changes. Too much code duplication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Requires more insight into the code base than needed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;more elegant exchange control&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This proposal takes a more declarative approach in addressing these concerns.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Firstly, we define a notification event template where the event signature and attributes are set.
This is simple yaml file of the following format:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;---&lt;/span&gt;
&lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;
     &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"gauge"&lt;/span&gt;
     &lt;span class="n"&gt;topics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"image.size"&lt;/span&gt;
     &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
     &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;
     &lt;span class="n"&gt;counter_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
     &lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;
     &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;
     &lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This essentially depicts the boiler plate code we add in notifications.py. A base
notification handler loads the event definition and does the rudimentary steps of
calling the process_notifications and yielding samples. The advantage of this is that
in future when new events need to be added, the end user only need to update the yaml.&lt;/p&gt;
&lt;p&gt;Also note that we’re in the process of deprecating existence meters. All the current
existence meters will be put at the bottom of the template file with a note saying they
will be removed in ‘M’ release.&lt;/p&gt;
&lt;p&gt;Secondly, we need to elegantly handle exchange control as part of this definition.
The exchanges are specified in ceilometer.conf&lt;/p&gt;
&lt;p&gt;We already have exchange definitions as part of ceilometer.conf. We could leverage these
as it is and assume that if these are defined then we will enable them. We could also
add a new option to specify all the exchanges we like to allow with same exchange name
as defined. These exchanges will be read by the base notification handler and get_targets
logic will loop through the allowed exchanges and sets up the exchanges. If an event name
is part of the exchange names, we’ll skip processing these notifications and move on.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;We could leverage the existing event_definition.yaml used for conversion.
But i’m not sure how free flowing and flexible that would be. I’m open to
this idea.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Pradeep Kilambi &amp;lt;&lt;a class="reference external" href="mailto:pkilambi%40redhat.com"&gt;pkilambi&lt;span&gt;@&lt;/span&gt;redhat&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Pradeep Kilambi &amp;lt;&lt;a class="reference external" href="mailto:pkilambi%40redhat.com"&gt;pkilambi&lt;span&gt;@&lt;/span&gt;redhat&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Work items:
* Define Event notification template
* Implement generic notification handler to process the template and generate samples
* Add support for handling exchange control
* Clean up existing handlers
* Add and update test coverage&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Add unit test coverage&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Document new ways of enabling notification events and exchanges via the template file with examples.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/ceilo-declarative-notifications"&gt;https://etherpad.openstack.org/p/ceilo-declarative-notifications&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 28 Apr 2015 00:00:00 </pubDate></item><item><title>Declarative snmp metrics</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/declarative-snmp-metrics.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/declarative-snmp-metrics"&gt;https://blueprints.launchpad.net/ceilometer/+spec/declarative-snmp-metrics&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint wants to add a mechanism so we can add new snmp metrics in a
declarative way instead of writing new source code for new pollsters.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, we use a generic snmp hardware inspector and a python dict which
defines the mapping between snmp oid/operations and the metrics value the
caller wants(See the following link for the description of that mapping).&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/ceilometer/blob/stable/kilo/ceilometer/hardware/inspector/snmp.py#L112"&gt;https://github.com/openstack/ceilometer/blob/stable/kilo/ceilometer/hardware/inspector/snmp.py#L112&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On top of that generic snmp inspector, we still have separate hardware
pollsters doing things like setting multiple fields in the Sample object.
It’s ok to add a dozen of new metrics. But if want to add hundreds of new snmp
metrics, we need to do it in a declarative way, instead of writing new
pollster code for every new snmp metrics added.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;While keeping the current snmp related hardware.* pollsters intact for
backward compatibility, we’ll add a new generic snmp pollster, which
can return different types of snmp related metrics based on user request.&lt;/p&gt;
&lt;p&gt;This generic snmp pollster will load a definition from a yaml definition
file which defines the parameters used to call into the generic snmp
inspector, and also other fields in the final Sample object the pollster
returns, like name/unit/type. However, the resource_id/user_id/project_id
will still be read from the resources returned by the discover just
like what we do today.&lt;/p&gt;
&lt;p&gt;The yaml definition would be something like the followings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;---&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;counter_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hardware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="mf"&gt;.15&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;
  &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;
  &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gauge&lt;/span&gt;
  &lt;span class="n"&gt;snmp_inspector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;matching_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;type_exact&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="s2"&gt;"1.3.6.1.4.1.2021.10.1.3.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;post_op&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;counter_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hardware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;incoming&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;
  &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;
  &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cumulative&lt;/span&gt;
  &lt;span class="n"&gt;snmp_inspector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;matching_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;type_prefix&lt;/span&gt;
    &lt;span class="n"&gt;metric_oid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="s2"&gt;"1.3.6.1.2.1.2.2.1.10"&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                     &lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1.3.6.1.2.1.2.2.1.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"str"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                     &lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1.3.6.1.2.1.2.2.1.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"lambda x: int(x) / 8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;post_op&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"_post_op_net"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Please see the following link for the detailed explanation of the
snmp_inspector dict in the definition:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/ceilometer/blob/stable/kilo/ceilometer/hardware/inspector/snmp.py#L112"&gt;https://github.com/openstack/ceilometer/blob/stable/kilo/ceilometer/hardware/inspector/snmp.py#L112&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When adding new snmp metrics, we only needs to add the new definitions into
the yaml definition. No need to writing new code.&lt;/p&gt;
&lt;p&gt;Because the new generic snmp pollster could return multiple different types
of meters, it would bring the following changes to the current polling
agent implementation:&lt;/p&gt;
&lt;p&gt;1. Currently, because of the mapping of meter pollster plugin one meter,
when deciding whether a pollster is needed for a given pipeline, we
use the pollster plugin’s entry point name. This will be changed. We’ll
add a new helper function which could return all the meters that pollster
could return, and use that helper function in the above process to decide
whether a pollster is needed for a given pipeline.&lt;/p&gt;
&lt;p&gt;2. When calling the pollster plugin to get the samples, we’ll pass
the pipeline definition as a new parameter to get_samples() call. So
instead of return all the samples, the pollster can only return what
the pipeline source asks for.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;No changes for the admin in how to configure the pipeline yaml file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Need to deploy a new yaml definition file on the system running polling agent.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;lianhao-lu&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;lianhao-lu&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;enhance the pipeline to support new source definition&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement the generic snmp pollster and its yaml definition file&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;To be maintained by &amp;lt;lianhao-lu&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The functionality test should be covered in the 3rd party CI of
Intel Hradware-Meters CI.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Need to update the openstack-manual admin manual about the change to the pipeline
definition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 28 Apr 2015 00:00:00 </pubDate></item><item><title>Create functional and integration tests in ceilometer project</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/ceilometer-functional-tests.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-functional-tests"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-functional-tests&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At this moment there are no integration tests for Ceilometer outside of Tempest,
which are fully covering all its functionality. On Paris summit it was decided
to move part of the tests (and the implementation of new ones) in the code tree of
Ceilometer itself. Also tests for different databases should be moved to this
module as well (currently they are living in the folder of unit tests and
this doesn’t correspond, generally speaking, to their aim). And all unit tests
should be moved from ceilometer/tests/ path to ceilometer/tests/unit folder,
so that ceilometer/tests tree contains only three folders: unit, functional,
integration.&lt;/p&gt;
&lt;p&gt;It is why we should develop integration tests and create Jenkins job for
them, which will run these tests, located in a separate module within
the Ceilometer code tree (tests for different backends will be moved
to this module as well). These tests will be designed in DSVM-style.
Tests that require communication with real other OpenStack services,
will follow Tempest practice to use master branches for these components.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Implementation of the plan will take a long time because of many subtasks
and interaction with other projects (in particular with OpenStack infra).
In this approach we may implement tests which are not assumed in tempest:
* grey/white-box tests that are not pure API tests and may assumed some
knowledge of the implementation
* tests that require acceleration of the polling interval in order to complete
within a reasonable time, e.g. changing the cpu_source interval
in the pipeline.yaml and restarting the compute agent so as
to gather sufficient cpu_util datapoints to drive alarming tests
* tests that depend on the timeliness of incoming notifications
from other OpenStack services
The implementation of this task will greatly increase test coverage
for ceilometer project, including the features which weren’t tested before.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Contribute new integration tests to the tempest project. This approach
does not satisfy us because OpenStack QA team rejects too specific
integration tests for projects, as only projects teams can decide
if they are good or not.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;vrovachev &amp;lt;&lt;a class="reference external" href="mailto:vrovachev%40mirantis.com"&gt;vrovachev&lt;span&gt;@&lt;/span&gt;mirantis&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent &amp;lt;&lt;a class="reference external" href="mailto:chdent%40redhat.com"&gt;chdent&lt;span&gt;@&lt;/span&gt;redhat&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Work items:
* Add ceilometer/tests/{integration|functional} testcases
that use the python-clients directly.
* Move ceilometer/tests testcase to ceilometer/tests/unit.
* Move all existing unit tests to ceilometer/tests/unit.
* Move existing DB scenario tests to ceilometer/tests/{integration|functional}.
* Add new tox target(s)(functional, integration and others
if necessary) to ceilometer/tox.ini.
* Add {pipeline}-ceilometer-dsvm-functional-{datastore} job template
to os-infra/project-config/jenkins/jobs/ceilometer.yaml
where datastore in [‘sqlalchemy’, ‘mongodb’, ‘hbase’].&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 15 Apr 2015 00:00:00 </pubDate></item><item><title>Track DNS Service Notifications</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/dns-service-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/dns-service-notifications"&gt;https://blueprints.launchpad.net/ceilometer/+spec/dns-service-notifications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The goal of this blueprint is to capture the notification events emitted by Designate
(DNSaaS) during create, update and delete operations.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Designate (designate-central) emits notifications in response to user actions by
designate-api and other openstack service (nova, neutron) events by designate-sink.&lt;/p&gt;
&lt;p&gt;These notifications are CRUD events, that notify the creation, update or delete
of a DNS resource, with no specific measurement value.&lt;/p&gt;
&lt;p&gt;Ceilometer needs to be updated to consume and record these notifications as events
and traits.&lt;/p&gt;
&lt;p&gt;If Ceilometer processes and record these notifications, other services will be
able to use this for aggregation and billing purpose.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Define event definitions and field mappings(trait definitions) for DNS resource types
- domain, record in the /etc/ceilometer/event_definitions.yaml file.&lt;/p&gt;
&lt;p&gt;The trait field syntax in trait definitions follow a variant of the JSONPath.&lt;/p&gt;
&lt;p&gt;Example of the event definition and field mappings for the domain notifications
that need to go in event_definitions.yaml,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;event_type: dns.domain.*&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;traits: &amp;amp;dns_domain_traits&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;status:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;retry:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.retry&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;description:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.description&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;expire:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.expire&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;email:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.email&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ttl:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.ttl&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;action:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.action&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;name:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;id:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;created_at:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.created_at&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;updated_at:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.updated_at&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;version:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.version&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;parent_domain_id:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: parent_domain_id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;serial:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fields: payload.serial&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To enable event processing in Ceilometer, configuration is needed in ceilometer.conf,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Configure store_events as True under the notification section,&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;eg -
[notification]
store_events = True&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Specify the event_definitions file name under the event section,&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;eg -
[event]
definitions_cfg_file = event_definitions.yaml&lt;/p&gt;
&lt;p&gt;The dns event types have the following pattern,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;dns.&amp;lt;resource&amp;gt;.create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dns.&amp;lt;resource&amp;gt;.update&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dns.&amp;lt;resource&amp;gt;.delete&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;, where resource is domain, record, pool.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Transform DNS notifications as samples using notification plugin to listen for notifications
at an exchange and topic. This could be useful when the notifications represent something other
than CRUD events that contain a value of interest that can be measured.&lt;/p&gt;
&lt;p&gt;Using events provides better querying of metadata and avoids the effort to aggregate samples
with a fixed measurement value of 1.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;No new impacts. Pre-existing concerns with capacity at the notification and
storage handling layers remain.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;rjaiswal&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;rjaiswal&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Event definitions and field mappings for all supported DNS resource types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Event validation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;In the future Designate will emit the dns.domain.exists event. This will need to be
handled when designate emits this notification.&lt;/p&gt;
&lt;p&gt;The set of dns resource types - (domain, record, pool) may change going
forward. There could be new types of notifications which will need to be supported.&lt;/p&gt;
&lt;p&gt;When Designate confirms with the PaaS event format, the field mappings for integrated
events will need to be refactored to adjust to the new event format.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;DNSaaS is construed as a PaaS service by some and might have it own message bus
where it is sending notifications. Ceilometer recently was extended to consume
notification from multiple message bus - &lt;a class="reference external" href="https://review.openstack.org/#/c/77612/"&gt;https://review.openstack.org/#/c/77612/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If there are multiple message buses, then ceilometer will need multiple transport
endpoints configured in ceilometer configuration. (ceilometer.conf)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit and integration Tests will be added to validate events generated.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/events.html"&gt;http://docs.openstack.org/developer/ceilometer/events.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/trunk/config-reference/content/ch_configuring-openstack-telemetry.html"&gt;http://docs.openstack.org/trunk/config-reference/content/ch_configuring-openstack-telemetry.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://specs.openstack.org/openstack/ceilometer-specs/specs/juno/paas-event-format-for-ceilometer.html"&gt;http://specs.openstack.org/openstack/ceilometer-specs/specs/juno/paas-event-format-for-ceilometer.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Designate"&gt;https://wiki.openstack.org/wiki/Designate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/kennknowles/python-jsonpath-rw"&gt;https://github.com/kennknowles/python-jsonpath-rw&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 15 Apr 2015 00:00:00 </pubDate></item><item><title>Healthcheck Middleware Metering</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/healthcheck-middleware.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-healthcheck-middleware"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-healthcheck-middleware&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oslo.middleware is going to provide a healthcheck middleware in order to monitor
health of HTTP services. We want to monitor this middleware response code and
time in Ceilometer in order to have analytics available.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The healthcheck functionnality provided by oslo.middleware will provide
information about the health of a particular API service. It’ll be useful to
retrieve periodically the state of the service in Ceilometer to have the ability
to analyse these data.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Let’s write a pollster that polls the healthcheck middleware to generate samples
measuring the response time of the middleware, and incorporating the status code
as metadata.&lt;/p&gt;
&lt;p&gt;In order to find which endpoints to poll, the pollster will rely on the
EndpointDiscovery discover to find them.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;jdanjou&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;sileht&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;jdanjou
sileht&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Write a pollster&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;As all pollsters.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;We should be able to test using unit testing and testing inside Tempest.
Devstack should have support of this healthcheck middlware by default.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new pollster should be documented the same way we do for others.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;oslo.middleware healthcheck blueprint
&amp;lt;&lt;a class="reference external" href="https://blueprints.launchpad.net/oslo.middleware/+spec/oslo-middleware-healthcheck"&gt;https://blueprints.launchpad.net/oslo.middleware/+spec/oslo-middleware-healthcheck&lt;/a&gt;&amp;gt;_&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 15 Apr 2015 00:00:00 </pubDate></item><item><title>Event Alarm Evaluator</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/event-alarm-evaluator.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/event-alarm-evaluator"&gt;https://blueprints.launchpad.net/ceilometer/+spec/event-alarm-evaluator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint proposes to add a new alarm evaluator for handling alarms on
events passed from other OpenStack services, that provides event-driven alarm
evaluation which makes new sequence in Ceilometer for handling alarms on events
separated from other types of alarms handled in the existing polling-based
Alarm Evaluator, and realizes immediate alarm notification to end users.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;As an end user, I need to receive alarm notification immediately once
Ceilometer captured an event which would make alarm fired, so that I can
perform recovery actions promptly to shorten downtime of my service.
The typical use case is that an end user set alarm on “compute.instance.update”
in order to trigger recovery actions once the instance status has changed to
‘shutdown’ or ‘error’. It should be possible for an end user to receive a
notification within 1 second of a fault being observed, as with other health-
check mechanisms can do in some cases.&lt;/p&gt;
&lt;p&gt;The existing Alarm Evaluator is periodically querying/polling the databases
in order to check all alarms independently from other processes. This is good
approach for evaluating an alarm on samples stored in a certain period.
However, this is not efficient to evaluate an alarm on events which are emitted
by other OpenStack servers once in a while.&lt;/p&gt;
&lt;p&gt;The periodical evaluation leads delay on sending alarm notification to users.
The default period of evaluation cycle is 60 seconds. It is recommended that
an operator set longer interval than configured pipeline interval for
underlying metrics, and also longer enough to evaluate all defined alarms
in certain period while taking into account the number of resources, users and
alarms.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The proposal is to add a new event-driven alarm evaluator which receives
messages from Notification Agent and finds related Alarms, then evaluates each
alarms;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New alarm evaluator receives event notification from Notification Agent
by which adding a dedicated notifier to publish event in a new topic.
The topic name is ‘alarm.all’.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When new alarm evaluator received event notification, it queries alarm
database by Project ID written in the event notification.
To reduce heavy load of Ceilometer API, this alarm evaluator would cache
alarm definitions which queried by Project ID in a certain period.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Found alarms are evaluated by referring event notification.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Depending on the result of evaluation, those alarms would be fired through
Alarm Notifier as the same as existing Alarm Evaluator does.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This proposal also adds new alarm type “event” and “event_rule”.
This enables users to create alarms on events. The separation from other alarm
types (such as “threshold” type) is intended to show different timing of
evaluation and different format of condition, since the new evaluator will
check each event notification once it received whereas “threshold” alarm can
evaluate average of values in certain period calculated from multiple samples.&lt;/p&gt;
&lt;p&gt;The new alarm evaluator handles “event” type alarms, so we have to change
existing alarm evaluator to exclude “event” type alarms from evaluation
targets.&lt;/p&gt;
&lt;p&gt;Project ID of events would be retrieved from traits named ‘project_id’ and
‘tenant_id’ by this alarm evaluator, since there is no common field to hold it.
Not all events have project ID; all events of virtual resource like VM instance
should have project ID which belongs to, but events of physical resources like
host don’t have project ID. Since those raw infra events have to be hidden from
end users, those will be treated as labeled with PROJECT_NONE (’’ in API) which
can be set in an alarm definition only by admin.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;There was similar blueprint proposal “Alarm type based on notification”, but
the approach is different. The old proposal was to adding new step (alarm
evaluations) in Notification Agent every time it received event from other
OpenStack services, whereas this proposal intends to execute alarm evaluation
in another component which can minimize impact to existing pipeline processing.&lt;/p&gt;
&lt;p&gt;Another approach is enhancement of existing alarm evaluator by adding
notification listener. However, there are two issues; 1) this approach could
cause stall of periodical evaluations when it receives bulk of notifications,
and 2) this could break the alarm partitioning i.e. when alarm evaluator
received notification, it might have to evaluate some alarms which are not
assign to it.&lt;/p&gt;
&lt;p&gt;Caching all alarm definitions can reduce the number of query to API/DB in each
period and reduce time of evaluation in other projects, but it may lead longer
time in first query and larger footprint of cache since there can be large
number of projects whereas alarms in a project could be limited by quota.&lt;/p&gt;
&lt;p&gt;Event ID can be used instead of Project ID in alarm query, but it cannot ensure
the number of alarms retrieved from DB and difficult to get all alarms when we
allow users to use wildcard in “event_type” of an alarm definition, which is
proposed in this spec.&lt;/p&gt;
&lt;p&gt;Resource ID could be added to Alarm data model as an optional attribute.
This would help the new alarm evaluator to filter out non-related alarms
while querying alarms, otherwise it have to evaluate all alarms in the project.
To focus on creating basic framework of event alarms, we decided not to handle
Resource ID in this blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;Alarm API will be extended as follows;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add “event” type into alarm type list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add “event_rule” to “alarm”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“event_rule” has “event_type”, which can include “*”, to indicate which
type(s) of event to be evaluated on the alarm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“event_rule” has “query” which is a list of conditions combined by AND as
the same as AlarmThresholdRule&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sample data of Notification-type alarm:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"alarm_actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"http://site:8000/alarm"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"alarm_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"An event alarm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"insufficient_data_actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"http://site:8000/nodata"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"InstanceStatusAlarm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"event_rule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"event_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"compute.instance.update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"query"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"field"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"traits.instance_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"type"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"value"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"153462d0-a9b8-4b5b-8175-9e4b05e9b856"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"op"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"eq"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"field"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"traits.state"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"type"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"value"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"op"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"eq"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ok_actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"c96c887c216949acbdfbd8b494863567"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"repeat_actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"moderate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"state_timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-04-03T17:49:38.406845"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-04-03T17:49:38.406839"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"event"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"c96c887c216949acbdfbd8b494863567"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;Since default event notification may include raw infra information,
operator/administrator should configure event definitions carefully when end
users is allowed to operate this event alarm API and can receive event alarm
notification.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;This change needs to add new notifier into event pipeline in order to pass
event to this new alarm evaluator.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;When Ceilometer received a number of events from other OpenStack services in
short period, this alarm evaluator can keep working since events are queued in
a messaging queue system, but it can cause delay of alarm notification to users
and increase the number of read and write access to alarm database.&lt;/p&gt;
&lt;p&gt;All event alarms defined in the project will be evaluated every time this
evaluator received event. The number of alarms to be evaluated can be reduced
by adding new parameter (e.g. Resource ID) on Alarm data model and setting
filter while alarm querying.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Notification Agent have to be configured to publish event to a new topic
‘alarm.all’ which is dedicated to this event alarm evaluator and different from
current messaging to store events (i.e. add ‘notifier://?topic=alarm.all’ in
event_pipeline.yaml). Note this configuration should be done when the new event
alarm evaluator runs in the deployment, otherwise it may fill up the queue.&lt;/p&gt;
&lt;p&gt;New service process (this alarm evaluator) have to be run.&lt;/p&gt;
&lt;p&gt;A deployer can run multiple evaluators in order to scale out event alarm
evaluation process. All event will be dispatched to all evaluators listening
the topic in a round robin fashion.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Developers should be aware that events could be notified to end users and avoid
passing raw infra information to end users, while defining events and traits.&lt;/p&gt;
&lt;p&gt;All events related to virtual resources should have project ID and user ID
properly.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;r-mibu&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;lianhao-lu
edwin-zhai&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new alarm type “event” as well as AlarmEventRule&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify existing alarm evaluator to filter out “event” alarms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New event-driven alarm evaluator&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make the new evaluator cache alarm definitions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;This proposal is key feature to provide information of cloud resources to end
users in real-time that enables efficient integration with user-side manager
or Orchestrator, whereas currently those information are considered to be
consumed by admin side tool or service.
Based on this change, we will seek orchestrating scenarios including fault
recovery and add useful event definition as well as additional traits.&lt;/p&gt;
&lt;p&gt;This feature will or can be enhanced by the followings in the future;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Enabling this evaluator to get delta of alarm definitions in the last period,
in order to reduce traffic on updating cache. This requires alarm storage to
hold deleted alarms and alarm API amendment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adopting similar coordination process as the notification agent has, for
efficiency of this evaluator e.g. reducing cache of alarm definitions.
Key for partitioning might be ‘project_id’, ‘event_type’ or ‘resource_id’.
For this coordination, all topic name will have the same prefix ‘alarm.’,
so that evaluator can use topic=’alarm.*’ to listen all messages for event
alarm evaluation. This is the reason why we use ‘alarm.all’ in this spec.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mechanism to update cache of alarm definition promptly; poisoning cache on
evaluator in which assigned alarm definition has updated, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Filtering out uninterested events in notification agent by leveraging the
mechanism of graceful pipeline update and reflecting alarm definitions
configured by end users.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We can refactor function to retrieve project ID from event object after
creating common field in event object that requires DB and API changes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;New unit/scenario tests are required for this change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Administrator Guide and Installation Guide in OpenStack Manuals should be
updated to describe new alarm type and rule as well as all deployer impacts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proposed evaluator will be described in the developer document.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OPNFV Doctor project: &lt;a class="reference external" href="https://wiki.opnfv.org/doctor"&gt;https://wiki.opnfv.org/doctor&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blueprint “Alarm type based on notification”:
&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/alarm-on-notification"&gt;https://blueprints.launchpad.net/ceilometer/+spec/alarm-on-notification&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Liberty Summit Note: &lt;a class="reference external" href="https://etherpad.openstack.org/p/event_alarm"&gt;https://etherpad.openstack.org/p/event_alarm&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Mon, 13 Apr 2015 00:00:00 </pubDate></item><item><title>Add hardware.memory.buffer and hardware.memory.cached metrics</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/liberty/memory-buffer-and-cache-metrics.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/hardware-memory-buffer-and-cache-metrics"&gt;https://blueprints.launchpad.net/ceilometer/+spec/hardware-memory-buffer-and-cache-metrics&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add hardware.memory.buffer and hardware.memory.cached metrics to monitor
the memory buffer size and memory cache size of a physical machine through
SNMP.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Currently Ceilometer only support 4 memory oid of SNMP:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;_memory_total_oid = “1.3.6.1.4.1.2021.4.5.0”
_memory_avail_real_oid = “1.3.6.1.4.1.2021.4.6.0”
_memory_total_swap_oid = “1.3.6.1.4.1.2021.4.3.0”
_memory_avail_swap_oid = “1.3.6.1.4.1.2021.4.4.0”&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;But in practice, memory cache and buffer size are also very useful information
to determine the status of a physical machine.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add two metrics, hardware.memory.buffer and hardware.memory.cached, to
monitor the memory buffer size and memory cache size of a physical machine.&lt;/p&gt;
&lt;p&gt;To achieve this, we need add two SNMP oid and two hardware pollsters.&lt;/p&gt;
&lt;p&gt;Firstly, add two oid in SNMP inspector:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;_memory_buffer_oid = “1.3.6.1.4.1.2021.4.14.0”
_memory_cached_oid = “1.3.6.1.4.1.2021.4.15.0”&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Secondly, add two Hardware Pollsters in hardware.pollsters.memory:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;MemoryBufferPollster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MemoryCachedPollster&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;luogangyi&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add two oid in SNMP inspector:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;_memory_buffer_oid = “1.3.6.1.4.1.2021.4.14.0”
_memory_cached_oid = “1.3.6.1.4.1.2021.4.15.0”&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add two Hardware Pollsters in hardware.pollsters.memory:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;MemoryBufferPollster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MemoryCachedPollster&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Need unit test&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] oid references &lt;a class="reference external" href="http://www.net-snmp.org/docs/mibs/ucdavis.html"&gt;http://www.net-snmp.org/docs/mibs/ucdavis.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 23 Mar 2015 00:00:00 </pubDate></item><item><title>Regexp in complex query</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/regexp-in-complex-query.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/regexp-in-complex-query"&gt;https://blueprints.launchpad.net/ceilometer/+spec/regexp-in-complex-query&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently some instance or network related service have extra identifier in
resource_id. Example is disk.device.* metrics. They have resource_id
with format - &amp;lt;instance_id&amp;gt;-&amp;lt;disk-id&amp;gt;. We can’t make query for getting
all samples from these meters with specified instance_id because disks have
different ids. This behavior not easy for end users and adds troubles for
someone who wants know more information about cluster work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;To support complex queries described above we should add new regex
operator with corresponding “=~” designation.&lt;/p&gt;
&lt;p&gt;Implementation depends on backend:&lt;/p&gt;
&lt;p&gt;1) MongoDB and DB2. These dbs has $regex query support.
It provides regular expression capabilities for pattern matching strings
in queries. MongoDB and DB2 use Perl compatible regular expressions
(i.e. “PCRE” ) version 8.30 with UTF-8 support. For correct work we map
“=~” from filter query to “$regex” in pymongo request.&lt;/p&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;SQLAlchemy. This backend supports “regexp” MySQL operator, also it’s mapped&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HBase supports regexp queries with RegexStringComparator.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Add extra information to resource metadata&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;Add new simple operator “=~” in complex queries.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;You may make regex request in complex query.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Will affect performance for large regular expressions,
api service may be affected.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ityaptin&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;enovokshonova&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add “=~” to simple operators list in controller&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add regexp operator processing to backends&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;extend storage scenarios testing to include regexp operator&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;update complex query notes to include new operator&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/regexp-in-complex-query"&gt;https://blueprints.launchpad.net/ceilometer/+spec/regexp-in-complex-query&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 06 Feb 2015 00:00:00 </pubDate></item><item><title>Adds Disk Capacity, Allocation and Usage metrics implementation in Libvirt</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/disk-info-meters.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/disk-info-meters"&gt;https://blueprints.launchpad.net/ceilometer/+spec/disk-info-meters&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, Libvirt Inspector does not collect disk capacity, usage and
allocation metrics. This feature can be added for Libvirt to monitor disk
metrics : capacity, usage and allocation. It will help to manage disk
resources for addition of Virtual Machinesusing same physical disk.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Implement the method ‘inspect_disk_info’ in Inspector for Libvirt. This method
will return the disk capacity,usage and allocation per device. The values
correspond to values monitored by domblkinfo command of Libvirt.&lt;/p&gt;
&lt;p&gt;Add CapacityPollster which create sample :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name=’disk.capacity’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type=sample.TYPE_GAUGE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unit=’B’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add PerDeviceCapacityPollster which create sample :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name=’disk.device.capacity’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type=sample.TYPE_GAUGE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unit=’B’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add AllocationPollster which create sample :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name=’disk.allocation’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type=sample.TYPE_GAUGE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unit=’B’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add PerDeviceAllocationPollster which create sample :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name=’disk.device.allocation’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type=sample.TYPE_GAUGE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unit=’B’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add PhysicalPollster which create sample :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name=’disk.usage’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type=sample.TYPE_GAUGE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unit=’B’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add PerDevicePhysicalPollster which create sample :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;name=’disk.device.usage’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;type=sample.TYPE_GAUGE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unit=’B’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;In pipeline.yaml, if user is not having * in meters_sink
then new meters disk.capacity, disk.allocation, disk.usage,
disk.device.capacity, disk.device.usage and disk.device.allocation
needs to be added&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ahmed-nooras-saba&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add _DiskInfoPollsterBase base class for reading values and aggregating
for all devices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add CapacityPollster , AllocationPollster , PhysicalPollster for disk
metrics at instance level&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add PerDeviceCapacityPollster , PerDeviceAllocationPollster and
PerDevicePhysicalPollster for disk metrics at device level of an instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add inspect_disk_info to Libvirt inspectors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new metrics definition in measurements.rst&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;This feature will need testing for next two releases.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;libvirt 0.8.1 and above.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests are required to test all the new pollsters at Libvirt.
The new meters should be discoverable when listing ceilometer meters.
Example : ceilometer meter-list&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Added the following metrics in ceilometer/doc/source/measurements.rst and
“measurement section” of
&lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;http://docs.openstack.org/developer/ceilometer/measurements.html&lt;/a&gt; needs to
be updated.&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"/&gt;
&lt;th class="head"/&gt;
&lt;th class="head"/&gt;
&lt;th class="head"/&gt;
&lt;th class="head"/&gt;
&lt;th class="head"/&gt;
&lt;th class="head"/&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;disk.capacity&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;inst ID&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;n&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Capacity of disk in B&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;disk.allocation&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;inst ID&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;n&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Allocation of disk in B&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;disk.usage&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;inst ID&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;n&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Usage of disk in B&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;disk.device.capacity&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;disk ID&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;n&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Capacity per device of disk in B&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;disk.device.allocation&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;disk ID&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;n&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Allocation per device of disk in B&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;disk.device.usage&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;disk ID&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;n&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Usage per device of disk in B&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://osdir.com/ml/libvir-list/2010-04/msg01300.html"&gt;http://osdir.com/ml/libvir-list/2010-04/msg01300.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 15 Jan 2015 00:00:00 </pubDate></item><item><title>Add Support to include Alarm level as part of notifications</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/ceilometer-alarm-level.html</link><description>
 
&lt;p&gt;Include the URL of your launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-alarm-level"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-alarm-level&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The goal of this blueprint is to expose an alarm priority field that can be used
to set the alarm importance level.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;A detailed description of the problem:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Alarms in ceilometer have no way to identify the criticality of an alarm.
All we know today is if alarm has been triggered or insufficient data. This
might be ok in general.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;But from auditing point of view, cloud administrators would like to know if
an alarm is triggered and if so how critical is it. A hardware failure would
be a critical alarm vs an occasional spike in cpu level could be medium or
low. Differentiating this level would be very useful for audit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Expose a new field called alarm_priority as part of the alarm base object. This
will be exposed via the alarm notifications so the alarms can be filtered by
priority.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;Need to update the Alarm model to include a new field called priority&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;We will probably want to expose requests to get alarms by priority.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;pkilambi&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;pkilambi&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The specific work items include:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update the model layer to include the necessary fields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the notifier module to expose the priority field&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the rpc and service modules under alarm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for alarm level in the python-ceilometerclient&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit and integration Tests will be added/updated to cover the necessary scenarios
for alarms&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;We might need to update the example json in alarm api docs.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Initial implementation is here &lt;a class="reference external" href="https://review.openstack.org/#/c/142849/"&gt;https://review.openstack.org/#/c/142849/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 18 Dec 2014 00:00:00 </pubDate></item><item><title>Adds disk latency metrics implementation in the Hyper-V Inspector</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/hyper-v-disk-latency-metrics.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/hyper-v-disk-latency-metrics"&gt;https://blueprints.launchpad.net/ceilometer/+spec/hyper-v-disk-latency-metrics&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;High latency between I/O requests can be signs of issues. Collecting disk
latency metrics can help us detect those issues. Hyper-V Inspector can collect
those metrics.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Disk latency metrics are important in telemetry and useful when determining
instance’s performance. This spec is about these stats and their implementation
in the Hyper-V Inspector.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add DiskLatencyPollster and PerDeviceDiskLatencyPollster pollsters, which
create samples having the properties:
* name: ‘disk.latency’
* type: ‘gauge’
* unit: ‘ms’&lt;/p&gt;
&lt;p&gt;Add the method ‘inspect_disk_latency’ in Inspector and implementing it in the
HyperVInspector, fetching disk latency stats data from Hyper-V VMs, located
in the Msvm_AggregationMetricValue objects (further referred to as
‘metrics objects’) associated with the VMs.
The metrics objects ‘MetricDefinitionId’ must be the equal to the ‘Id’ of
Msvm_AggregationMetricDefinition object having the Caption
‘Average Disk Latency’.&lt;/p&gt;
&lt;p&gt;Hyper-V disk metrics were introduced in Windows / Hyper-V Server 2012 R2
(kernel version 6.3). They are not supported in the previous versions.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Users will have to add meter ‘disk.latency’ in the disk_source source in
pipeline.yaml
By default, the disk usage metrics collection is enabled in Nova, we just need
to collect the data from the Hyper-V API.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;cbelu&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Adds the DiskLatencyPollster and PerDeviceDiskLatencyPollster pollsters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adds the method ‘inspector_disk_latency’ in Inspector.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implements the method ‘inspect_disk_latency’ in HyperVInspector.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adds related unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates ceilometer measurements document.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Once this feature is enabled, it needs tests and bug fixing in the next
2 releases to avoid regression.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Windows / Hyper-V Server 2012 R2 (kernel version 6.3)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wmi 1.4.9+&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests are needed to test the new pollsters and the implementation on
the Hyper-V side.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;[1] &lt;a class="reference external" href="http://msdn.microsoft.com/en-us/library/cc768535%28v=bts.10%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc768535%28v=bts.10%29.aspx&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 11 Dec 2014 00:00:00 </pubDate></item><item><title>Adds memory usage metrics implementation in the Hyper-V Inspector</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/hyper-v-memory-metrics.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/hyper-v-memory-metrics"&gt;https://blueprints.launchpad.net/ceilometer/+spec/hyper-v-memory-metrics&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently, the Hyper-V Inspector does not collect the memory metrics. This
feature can be added, since Hyper-V can measure the amount of memory the
instances are using. This is especially useful if the instances are configured
to use dynamic memory.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Instances’ memory usage metrics are very important in telemetry, but it is not
currently implemented in the Hyper-V Inspector. This spec adds memory usage
statistics to Hyper-V, so the user can get vital data on the instance’s
performance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Implements the method ‘inspect_memory_usage’ of HyperVInspector, fetches the
memory stats data from Hyper-V VMs, located in the Msvm_AggregationMetricValue
objects (further referred to as ‘metrics objects’) associated with the VMs.
The metrics objects ‘MetricDefinitionId’ must be the equal to the ‘Id’ of
Msvm_AggregationMetricDefinition object having the Caption
‘Aggregated Average Memory Utilization’.&lt;/p&gt;
&lt;p&gt;Hyper-V metrics were introduced in Windows / Hyper-V Server 2012 (kernel
version 6.2). They are not supported in the previous versions.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None. By default, the memory metrics collection is enabled in Nova, we just
need to collect the data from the Hyper-V API.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;itoader&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implements the method ‘inspect_memory_usage’ in HyperVInspector.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adds related unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates ceilometer measurements document.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Once this feature is enabled, it needs tests and bug fixing in the next
2 releases to avoid regression.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Windows / Hyper-V Server 2012 (kernel version 6.2)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wmi 1.4.9+&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests are sufficient, since the implementation will only require data
fetching from Hyper-V.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;[1] &lt;a class="reference external" href="http://msdn.microsoft.com/en-us/library/cc768535%28v=bts.10%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc768535%28v=bts.10%29.aspx&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 11 Dec 2014 00:00:00 </pubDate></item><item><title>More Power and Thermal Data</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/power-thermal-data.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/power-thermal-data"&gt;https://blueprints.launchpad.net/ceilometer/+spec/power-thermal-data&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add more power and thermal data besides IPMI sensor data and Node Manager basic
data. These data from platform hardware are independent of OS/driver, and
valuable to show running status of node.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We already have IPMI sensor data and Node Manager basic data, but they don’t
provide enough info of overall picture for server in data center. Some extra
data can be added, like CUPS(Compute Usage Per Second), which indicates
CPU/IO/Memory utilization, and Volumetric Airflow, which indicates current
amount of air that goes through server. These data plus previous basic
power/thermal data, can be used as input for Nova scheduling.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add capability to get new data in NodeManager class. Add new pollsters to get
CUPS and airflow data.&lt;/p&gt;
&lt;p&gt;Add following new metrics:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Unit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Origin&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;hardware.ipmi.airflow&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;CFM&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;hardware.ipmi.cups.core&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;%&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;hardware.ipmi.cups.io&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;%&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;hardware.ipmi.cups.mem&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;%&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;g = gauge, n = notification , p = pollster, CFM = Cubic Feet per Minute&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;These new data should be exposed via the Horizon metering dashboard.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Fetching some new metrics would not cause obvious perf drop&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;edwin-zhai&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;lianhao-lu&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add raw IPMI command to get new data in NodeManager class&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement 2 new pollster: CUPS and airflow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add unit test coverage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update related docs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Once this feature enabled, need test and bug fixing in next 2 releases to avoid
regression&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;This feature depends on IPMI/NM capable servers&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This feature with previous IPMI sensor data and NM basic data need 3rd party
testing system to verify its function. This testing system development is in
progress.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 04 Dec 2014 00:00:00 </pubDate></item><item><title>Event Pipelines</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/notification-pipeline.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/notification-pipeline"&gt;https://blueprints.launchpad.net/ceilometer/+spec/notification-pipeline&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, when notifications are picked up by the notification agent, they
are all funnelled into a single endpoint, filtered using event_definition and
pushed to the dispatchers, which is generally a database. There is a lack of
flexibility to transform, extend, trigger on these events and to publish
to this data to multiple consumers.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Like samples, we have a pipeline for events. Like samples, we define sources
and sinks. Unlike samples, we don’t have an interval defined in sources.&lt;/p&gt;
&lt;p&gt;This will also allow ability to publish different data (ie. audit) to different
storages and also allow ability to ignore notifications completely (currently,
we capture a shell event for all notifications)&lt;/p&gt;
&lt;p&gt;The proposed schema is:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;---&lt;/span&gt;
&lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;eventA_source&lt;/span&gt; &lt;span class="c1"&gt;# any unique name for source&lt;/span&gt;
      &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# list of event_types, same wildcard technique in samples&lt;/span&gt;
          &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"*"&lt;/span&gt;
      &lt;span class="n"&gt;sinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sink1&lt;/span&gt;
          &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sink2&lt;/span&gt;
&lt;span class="n"&gt;sinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sink1&lt;/span&gt; &lt;span class="c1"&gt;# any unique name for sink&lt;/span&gt;
      &lt;span class="n"&gt;transformers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# one or many transformers that work on an Event.&lt;/span&gt;
      &lt;span class="n"&gt;triggers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# potential for triggering (short term inline actions). i'd&lt;/span&gt;
          &lt;span class="c1"&gt;# envision a trigger that built performance samples. ie time&lt;/span&gt;
          &lt;span class="c1"&gt;# between corresponding start/end events and republish as a sample&lt;/span&gt;
          &lt;span class="c1"&gt;# alternatively, that same work could send an alarm if it didn't&lt;/span&gt;
          &lt;span class="c1"&gt;# meet a certain threshold&lt;/span&gt;
      &lt;span class="n"&gt;publishers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# we will not support rpc it isn't great for performance&lt;/span&gt;
          &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;notifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Publishers here can be a little different. we currently publish events straight
to the database avoiding the collector. In this spec, we will continue this
offering in addition to the notifier, udp, file options. The collector offers
no discernible benefit apart from moving any synchronous task off the
notification agent to the collector. As we already requeue items for each
pipeline, this synchronous bottleneck exists only on the pipeline which has the
synchronous task and will not slow down the other pipelines.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;publish to the collector instead and let it persist data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;put this in same pipeline.yaml file as samples.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None currently but it’ll affect pipeline in database work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;Same security concerns as current publishers.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;This is a completely new pipeline so yes there is impact: a new pipeline.yaml&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;You need another pipeline.yaml; You need to configure it appropriately.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;This will by default cause no difference. There’s potential for less data
because of ability to filter out events. There’s potential for more data
because of transformers and multiple publishers. We have notification agent
coordination which will split pipeline and data across agents to handle
scaling.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Adding a configuration option for new pipeline.yaml&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;Understand how pipelines work if they don’t understand already.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create event_pipeline.yaml&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;redirect current event endpoint to use this pipeline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add publisher support for events&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Build transformers. Build triggers. Build publishers.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;extend pipeline testing to include event_pipeline&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;rewrite pipeline notes to include new event_pipeline and it’s differences&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/notification-pipelines"&gt;https://blueprints.launchpad.net/ceilometer/+spec/notification-pipelines&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 03 Dec 2014 00:00:00 </pubDate></item><item><title>Support Time To Live on Event Database</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/event-database-ttl.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/event-database-ttl"&gt;https://blueprints.launchpad.net/ceilometer/+spec/event-database-ttl&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Event database grows over time, after we dump data to larger storage system,
the old data in event database should be cleared, but now, there is no such
way to do it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add time to live feature on event database, just like what we do on metering
database. A new option event_time_to_live will be added, such as what we do
for metering database.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;User now can clean event database when they run ceilometer-expirer
and set event_time_to_live options to value that larger than 0.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Performance can be improved since event database can keep light.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;aji-zqfan&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Contributors who want to help on databases except MongoDB&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;aji-zqfan&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement it on MongoDB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement it on other database back end&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit test code will be added along with source code.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;New option will be added, so OS Configuration Document should be update,
and new feature is added, Administrator’s Guide Document should be updated
too. But not this spec’s job.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 01 Dec 2014 00:00:00 </pubDate></item><item><title>Http Dispatcher Spec</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/http-dispatcher.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/http-dispatcher"&gt;https://blueprints.launchpad.net/ceilometer/+spec/http-dispatcher&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ceilometer dispatcher framework allows various dispatchers to be developed and
configured to make ceilometer meter destination to be fully configurable.
Currently there are two dispatchers available for Ceilometer, these two
dispatchers are used to save Ceilometer meters either to database or log like
files. In some applications, meters or filtered meters are wanted to be sent
to other third party systems especially using http protocol. This spec
provides the specification for a Ceilometer dispatcher using http protocol.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The usecase is as follows:
Enterprise Monitoring system QRadar needs to capture activities happening in
OpenStack keystone such as user creation, deletion, log in etc. Keystone posts
these activities onto OpenStack message queues, Ceilometer collector
ultimately collects these messages and turn them into meters, so these meters
will be sent over to QRadar via the http post request, once the meters get
posted via http post request to QRadar, QRadar will analyze the meters and
take actions accordingly.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;A new dispatcher should be added in Ceilometer/dispatcher package, the
dispatcher will be named HttpDispatcher by inheriting the dispatcher.Base
class and implement the record_metering_data method along some dispatcher
specific configuration parameters. The record_metering_data method will
wrap meters in JSON format and post the data by using HTTP POST method to
a target. The http request content type should be application/json. If the
post target is not defined, then an error should be logged. The post request
should use a configurable time to determine if the connection should be timed
out. The implementation file should be named http.py so that the module naming
pattern consistency is kept. If the meter data contains auditing information
(CADF), then the auditing message will be sent rather than the meter itself
since most of the information in the meter will be duplicate of the auditing
information.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;develop an agent and read data from database, but the impact will be data
get saved in the database, but the goal is to have the meter info saved in
the system which integrates with Ceilometer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;develop an agent read data from queue, but there will be a lot more code
needed to do that.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Tong Li (IBM)&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;litong01&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Tong Li&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Http dispatcher&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document on how to configure this dispatcher&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;test cases&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;No new dependencies required. It only requires requests, oslo.config which have
been the common dependencies of this project.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Tempest tests will be added in ceilometer/tests/dispatcher/test_http.py.
These test cases can be invoked at the gate or locally in a dev environment.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;file at /doc/source/install/manual.rst will be changed to reflect this new
dispatcher along other existing dispatchers. Since this is a new dispatcher,
there will not be changes to any existing components, only additional
information will be added to the doc on how to enable and configure this
dispatcher.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 01 Dec 2014 00:00:00 </pubDate></item><item><title>Coordination of Notification Agents</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/notification-coordiation.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/notification-coordination"&gt;https://blueprints.launchpad.net/ceilometer/+spec/notification-coordination&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, the notification agent can function in active/active HA where each
notification agent grabs notifications from the message queue in a round robin
type rotation (it checks for message(s), grabs message(s)). The issue that
arises is that if we want to implement a pipeline to process events, we cannot
guarantee what event each agent worker will get and because of that, we cannot
enable transformers which aggregate/collate some relationship across similar
events.&lt;/p&gt;
&lt;p&gt;This also fixes an existing bug where if multiple notification agents are
enabled, the pipeline transformers may not work as expected because it will
only act on the samples it sees on current worker.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Similar to how we implemented coordination between the central agents, this bp
is to proposed a way to coordinate which event gets passed to which
notification agent.&lt;/p&gt;
&lt;p&gt;The proposed solution is to implement additional processing steps as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Existing&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;continues&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt;
   &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;same&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;grab&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;they&lt;/span&gt; &lt;span class="n"&gt;arrive&lt;/span&gt; &lt;span class="n"&gt;without&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;
   &lt;span class="n"&gt;coordination&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;After&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;converted&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="n"&gt;into&lt;/span&gt; &lt;span class="n"&gt;samples&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
   &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;republished&lt;/span&gt; &lt;span class="n"&gt;onto&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;ceilometer&lt;/span&gt; &lt;span class="n"&gt;internal&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;
   &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;published&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;multiple&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;topics&lt;/span&gt; &lt;span class="n"&gt;corresponding&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;known&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;
   &lt;span class="n"&gt;sinks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;two&lt;/span&gt; &lt;span class="n"&gt;sinks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;processes&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt;
   &lt;span class="n"&gt;meters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;processes&lt;/span&gt; &lt;span class="n"&gt;compute&lt;/span&gt; &lt;span class="n"&gt;meters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;case&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt;
   &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;publish&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;'all-meters'&lt;/span&gt; &lt;span class="n"&gt;sink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;compute&lt;/span&gt;
   &lt;span class="n"&gt;meters&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;publish&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="s1"&gt;'compute-only'&lt;/span&gt; &lt;span class="n"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mf"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;An&lt;/span&gt; &lt;span class="n"&gt;additional&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;listen&lt;/span&gt;
   &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;internal&lt;/span&gt; &lt;span class="n"&gt;queues&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;coordination&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;happen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Each&lt;/span&gt;
   &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="mf"&gt;2.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The existing notification agent will exists as is as there isn’t a need for
additional queueing to handle single worker scenario.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;The notification agent can be coordinated across existing targets ie. each
existing projects exchange. This does not allow for cross exchange sinks.
ie. we cannot have an aggregation that combines events from different
projects. This might be a non-issue for samples (who needs to aggregate and
transform a new sample from samples from nova and neutron?). It will
probably be an issue for events which we may want to coordinate across
exchanges. This would mean we should have samples listener to coordinate
across exchanges, and events listener which would do the above.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The notification agent can be coordinated across endpoints. This will cause
issues as we need to have duplicate queues that each agent listens to (to
ensure agent with endpoint gets the message it needs). It also runs into
potential loss or duplicate messages because of duplicate queues.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;Same as existing security concerns polling agents face – we need to ensure
that phantom agents can’t register and create phantom tasks.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;It should actually work properly when multiple workers deployed.
Additional event pipeline will be added in a subsequent bp and patch.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;This should improve write performance (at least from SQL pov) as we can do
batch inserts.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;Users will need to enable coordination. By default, the notification agent is
expected to continue as currently ie. pull messages if they exists.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chungg&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add coordination of notification agent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reuse or add tests for coordination&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;First step to adding in event specific pipeline.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;tooz&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;one of the backends for tooz (ZooKeeper, memcached, redis, etc…)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;coordination tests exist. We may just need to add it for notification agent
if the existing agent coordination tests are central agent specific.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add notes on enabling coordination of notification agents.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://github.com/openstack/ceilometer-specs/blob/master/specs/juno/central-agent-partitioning.rst"&gt;https://github.com/openstack/ceilometer-specs/blob/master/specs/juno/central-agent-partitioning.rst&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 07 Nov 2014 00:00:00 </pubDate></item><item><title>Self-disabled Pollster</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/self-disabled-pollster.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/self-disabled-pollster"&gt;https://blueprints.launchpad.net/ceilometer/+spec/self-disabled-pollster&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Avoid loading one pollster if required environment is not ready. Remove
resources that cause continuous exception in polling time.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently pollsters are used in following way.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;define via setup.cfg&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;load each pollster in initialization&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pollster’s get_samples get called in periodic way to collect metrics&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This fixed process is not flexible enough to handle various situation, like
following cases:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;One pollster depends on specific environment, e.g compute node pollsters
need right hypervisor inspector, ipmi pollsters need ipmitool installed.
Loading pollster unconditionally produces extra exceptions or dummy samples
with minor performance drop. Check in deployment can not resolve all the
issues, as environment changes dynamically. The perfect solution is that
check in loading time and do not load the pollster if no required
environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One pollster gets loaded and runs well, then some polling resource becomes
unavailable, so the pollster fails to produce samples and probably throws
exceptions with performance drop. We need detect such changes, then remove
this resource from polling. Also need put warning in log, so operator can
track and handle it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Provides infrastructure to get pollster specific response then take different
action.&lt;/p&gt;
&lt;p&gt;For case 1, need provide a function in pollster constructor, to raise specific
exception if required hardware is missing. When loading extensions, add
on_load_failure_callback, which checks and suppresses the exception to avoid
loading this extension. Probably need one configuration list to indicate which
pollster can be skipped.&lt;/p&gt;
&lt;p&gt;For case 2, we need pollsters throw 2 different exceptions in run time:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;transient failure: treat like existing ones&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permanent failure: Not poll that resources from this pollster any more&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To achieve this, we have PollingTask to catch that permanent failure, then
block polling for that resources.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;This BP improve performance due to avoid loading unnecessary pollster and
remove unavailable resources to eliminate continuous exceptions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;edwin-zhai&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;lianhao-lu&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;edwin-zhai&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;For loading time pollster&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add environment check function in pollster constructor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new on_load_failure_callback to avoid loading failed extension&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For running time pollster&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Modify required pollster to throw permanent failure exception&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify PollingTask to skip failure resources&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Once this feature enabled, need test and bug fixing in next 2 releases to avoid
regression&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Need unit test&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 24 Oct 2014 00:00:00 </pubDate></item><item><title>Add new notifications types for volumes/snapshots</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/add-new-cinder-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/add-new-notifications-types-for-volumes-and-snapshots"&gt;https://blueprints.launchpad.net/ceilometer/+spec/add-new-notifications-types-for-volumes-and-snapshots&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now we have only two types of notifications about volumes/snapshots:
volume/snapshot existence and their size.
This change allows to collect and view notifications of different types.
We can get information about which events have occurred: volume/snapshot has
been created or deleted or updated(renamed or modified description), volume
has been resized or attached/detached. This will allow to process additional
events and will improve the overall Ceilometer functionality.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Now we have only two types of notifications about volumes/snapshots:
volume/snapshot existence and their size. But there is no information about
events like volume/snapshot was created or deleted or updated or volume was
resized or attached/detached.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This change allows to collect and view notifications of different types -
volume/snapshot.create.start, volume/snapshot.create.end,
volume/snapshot.delete.start, volume/snapshot.delete.end,
volume/snapshot.update.start, volume/snapshot.update.end,
volume.resize.start, volume.resize.end,
volume.attach.start, volume.attach.end,
volume.detach.start, volume.detach.end.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;enovokshonova &amp;lt;&lt;a class="reference external" href="mailto:enovokshonova%40mirantis.com"&gt;enovokshonova&lt;span&gt;@&lt;/span&gt;mirantis&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Implement appropriate handler classes.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This change needs to be tested by unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;We need to add new meter types to
&lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;http://docs.openstack.org/developer/ceilometer/measurements.html&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/cinder/blob/master/bin/cinder-volume-usage-audit"&gt;https://github.com/openstack/cinder/blob/master/bin/cinder-volume-usage-audit&lt;/a&gt;
&lt;a class="reference external" href="https://github.com/openstack/cinder/blob/master/cinder/volume/manager.py"&gt;https://github.com/openstack/cinder/blob/master/cinder/volume/manager.py&lt;/a&gt;
&lt;a class="reference external" href="https://github.com/openstack/cinder/blob/master/cinder/api/v2/volumes.py"&gt;https://github.com/openstack/cinder/blob/master/cinder/api/v2/volumes.py&lt;/a&gt;
&lt;a class="reference external" href="https://github.com/openstack/cinder/blob/master/cinder/api/v1/volumes.py"&gt;https://github.com/openstack/cinder/blob/master/cinder/api/v1/volumes.py&lt;/a&gt;
&lt;a class="reference external" href="https://github.com/openstack/cinder/blob/master/cinder/api/v1/snapshots.py"&gt;https://github.com/openstack/cinder/blob/master/cinder/api/v1/snapshots.py&lt;/a&gt;
&lt;a class="reference external" href="https://github.com/openstack/cinder/blob/master/cinder/api/v2/snapshots.py"&gt;https://github.com/openstack/cinder/blob/master/cinder/api/v2/snapshots.py&lt;/a&gt;
&lt;a class="reference external" href="https://github.com/openstack/cinder/blob/master/cinder/volume/flows/manager/create_volume.py"&gt;https://github.com/openstack/cinder/blob/master/cinder/volume/flows/manager/create_volume.py&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 23 Oct 2014 00:00:00 </pubDate></item><item><title>Adds memory utilization meter to libvirt inspector</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/libvirt-memory-utilization-inspector.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/libvirt-memory-utilization-inspector"&gt;https://blueprints.launchpad.net/ceilometer/+spec/libvirt-memory-utilization-inspector&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Memory usage statistics is not implemented in libvirt inspector. We can get
memory stats of the instance from libvirt API ‘virDomainMemoryStats’ in order
to add memory usage meter to libvirt inspector.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Memory usage of instance is very important data in telemetry, but now it is not
implemented in libvirt inspector. This spec adds memory usage statistics to
libvirt, so the user can get the data on the performance of the instance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Implements the method ‘inspect_memory_usage’ of LibvirtInspector, fetches the
memory stats data from libvirt API ‘virDomainMemoryStats’, used memory is
calculated by the available and unused memory. The libvirt API
‘virDomainMemoryStats’ may raise an exception if the method is not supported by
libvirt, refer to ‘Dependencies’ section, catches the exception and translates
that into an empty data of memory stats.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;User need to prepare suitable balloon driver in image, particularly for Windows
guests, most modern Linuxes have it built in. Booting instance will be
successful without image balloon driver, just can’t get guest memory usage
meter.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None. By default, the memory statistical feature is enabled in Nova, refer to
[1], we just fetch and collect the data from libvirt API.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;kiwik-chenrui&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implements the method ‘inspect_memory_usage’ of LibvirtInspector.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adds relate unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates ceilometer measurements document.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Once this feature enabled, need test and bug fixing in next 2 releases to avoid
regression.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;libvirt 1.1.1+&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;qemu 1.5+&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guest driver that supports memory balloon stats&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests are sufficient since only data fetching need test.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;[1] &lt;a class="reference external" href="https://blueprints.launchpad.net/nova/+spec/enabled-qemu-memballoon-stats"&gt;https://blueprints.launchpad.net/nova/+spec/enabled-qemu-memballoon-stats&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[2] &lt;a class="reference external" href="http://libvirt.org/html/libvirt-libvirt.html#virDomainMemoryStats"&gt;http://libvirt.org/html/libvirt-libvirt.html#virDomainMemoryStats&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Mon, 20 Oct 2014 00:00:00 </pubDate></item><item><title>MagnetoDB Notifications</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/magnetodb-notifications.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/support-magnetodb"&gt;https://blueprints.launchpad.net/ceilometer/+spec/support-magnetodb&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec proposes to add MagnetoDB metering to Ceilometer by catching
notifications emitted by MagnetoDB. For example, when a table is created a
notification called table.create.start is emitted and when the table creation
is finished a notification called table.create.end is emitted.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The notifications sent by MagnetoDB needs to be fetched from message bus
and then transformed into samples and then stored in the database. To
achieve this a notification handler is needed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;A new notification plugin for MagnetoDB to transform the notifications
into samples using existing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;NotificationBase&lt;/span&gt;&lt;/code&gt; implementation as a model.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://gist.github.com/ajayaa/3e4617a832afd9f229c6"&gt;Example of a notification and corresponding sample&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;List of new samples:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Resource ID&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Name&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;table.create&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Type&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;gauge&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Volume&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;1&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Unit&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;table&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Timestamp&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;time&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Resource ID&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Name&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;table.delete&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Type&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;gauge&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Volume&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;1&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Unit&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;table&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Timestamp&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;time&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Resource ID&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Name&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;index.size&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Type&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;gauge&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Volume&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;2&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Unit&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;index&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Timestamp&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;time&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;There will be additional valid values in the query parameters but no changes
to API endpoints.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;No new impacts. As we are only storing table creation and deletion
notification, the impact would be negligible.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ajayaa&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Establish expected data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create tests of transformation of notifications to samples.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create notification plugin to consume notifications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create tests of notifications across fake bus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create sample query tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;In future new types of notifications are expected from the MagnetoDB.
These will need to be handled either by additional notification
plugins or (hopefully) generic notification handling. The MagnetoDB team
will be responsible for collaborating with the ceilometer team to ensure these
are handled smoothly.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unittests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 06 Oct 2014 00:00:00 </pubDate></item><item><title>Merge Compute and Central agents</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/kilo/merge-compute-and-central-agents.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/merge-central-and-compute-agents"&gt;https://blueprints.launchpad.net/ceilometer/+spec/merge-central-and-compute-agents&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Central agent was previously extracted from compute agent code to support not
only compute metrics to be polled, but also to collect measurements from other
services and resources. Actually the main difference between these two agents
was in the way they discover and poll the resources. After the discovery was
unified for the all pollsters, we actually are having the logic duplication,
having two different agents, although they both discover and poll &lt;em&gt;some&lt;/em&gt;
resources and collect then &lt;em&gt;some&lt;/em&gt; metrics.&lt;/p&gt;
&lt;p&gt;It looks logical to merge the code of agents back. They even might have exactly
the same pipeline being used, but differ only in the console script parameter
&lt;em&gt;–polling-namespace&lt;/em&gt; to have the opportunity still to separate them in the
real deployment. Also that might be possible to define exact list of pollsters
to be used via &lt;em&gt;–pollster-list&lt;/em&gt; script parameter here.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;We have logic mismatch with two separated agents, although they might be
part of one piece of code, configured via pipeline.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We need to merge carefully code of compute and central agents, using unified
mechanism we already have to process discovery and polling processes.&lt;/p&gt;
&lt;p&gt;Also we need to save the opportunity of setting up agent to poll only compute
or only meters used to be polled by central agent. Basically all-in-one
installation will be satisfied with agent polling all available meters, but
production installations need this separation. This will be achieved by adding
additional per-agent CLI script parameter:
&lt;em&gt;–polling-namespace={compute|central|compute,central}&lt;/em&gt;
(with adding here &lt;em&gt;ipmi&lt;/em&gt; when this agent will be added here as well). In this
case running of polling agent will look like following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;ceilometer-polling –polling-namespace central compute –logfile /var/log/ceilometer/polling.log&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This parameter will be passed to the agent manager class directly, and will
define what setup.cfg namespace (&lt;em&gt;ceilometer.poll.central&lt;/em&gt;,
&lt;em&gt;ceilometer.poll.compute&lt;/em&gt; or both) with possible pollsters to load. This
will emulate current workflow (and probably become deprecated in next cycles).&lt;/p&gt;
&lt;p&gt;Also this change will propose new way of how do pollsters to be used are
chosen for polling agent instance - via CLI script parameter
&lt;em&gt;–pollster-list=&amp;lt;list of pollster entrypoints or wildcards&amp;gt;&lt;/em&gt;. In this case
polling agent running command will look like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;ceilometer-polling –pollster-list image image.size storage.* –logfile /var/log/ceilometer/polling.log&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;If both of these parameters will be set, we need to use them both (possibly using
logical AND operation to find out final list of pollsters to be used).&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Better RAM usage in case of development OpenStack all-in-one installations.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It’ll be less services Ceilometer will run on node (if it’ll be all-in-one
installation) and we’ll have more unified way of Ceilometer installation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Downstream impact on how Ceilometer packages will be created and on the
deployment tools that use them right now. Currrently we are having two
&lt;em&gt;separated&lt;/em&gt; packages for central and compute agents in Ceilometer (both for
the .rpm and .deb), and these packages have different .service/.upstart
definitions for launching the corresponding service. The simplest way to
fix this moment will be to add new combined package and make current
separated ones to use introduced in this change namespaces like below:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=...&lt;/span&gt;&lt;span class="n"&gt;ceilometer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compute&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="n"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=...&lt;/span&gt;&lt;span class="n"&gt;ceilometer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;polling&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;pollster&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;compute&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We need to update puppet-ceilometer module and add there new manifest
that will support combined agent.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;dbelova &amp;lt;&lt;a class="reference external" href="mailto:dbelova%40mirantis.com"&gt;dbelova&lt;span&gt;@&lt;/span&gt;mirantis&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Merge central agent code into the current compute one
(ceilometer-polling). Leave ceilometer-agent-compute and
ceilometer-agent-central CLI commands for a deprecation
cycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Investigate Tempest testing impact and provide new tests if needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide Devstack with new agents scheme support (for all-in-one and multinode
installations).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Investigate Grenade tests aspect.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This change needs to be tested by merged unit tests and via integration tests
(old and possible new ones).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;We’ll need to rewrite our installation guide and common documentation parts
with the information about one agent instead of two.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 04 Sep 2014 00:00:00 </pubDate></item><item><title>Horizontal scaling and work-load partitioning of the Central Agent</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/central-agent-partitioning.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/central-agent-partitioning"&gt;https://blueprints.launchpad.net/ceilometer/+spec/central-agent-partitioning&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The central agent’s job is polling resources for information, transforming that
information into samples and passing the samples on to the Collector Agent.&lt;/p&gt;
&lt;p&gt;This specification proposes an implementation of coordination between multiple
Central Agents, which could then dynamically distribute the workload between
them, providing scalability and high availability.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, each Central Agent retrieves a set of resources and polls all of
them. If we have multiple Central Agents running, they all poll the same set
of resources, which prevents us from scaling out horizontally.&lt;/p&gt;
&lt;p&gt;At the start of each polling interval, each of the pollsters retrieves a list
of resources to poll from its Discovery plugin (configured in the pipeline
or a default one). This makes the discovery process a great place to implement
the coordination and partitioning logic, while the pollsters themselves can
remain in blissful ignorance of anything going on.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The basic idea is to use the &lt;em&gt;tooz&lt;/em&gt; &lt;a class="footnote-reference brackets" href="#id4" id="id1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; library for group membership and
hashing to assign resources to active Central Agents.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Discovery plugins on different Central Agents that discover the same set of
resources would join the same group in &lt;em&gt;tooz&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For each polling interval, after independently discovering the global set of
resources that need to be polled by one or other of the central agents,
they would get a list of all group members (Discovery plugins in other
Central Agents that have the same set of resources).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They would use hashing to determine the set of resources assigned to the
Discovery’s Central Agent.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Determining the resources we’re responsible for&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We have a list of resources and get a list of active agents from &lt;em&gt;tooz&lt;/em&gt;. We
then get our assigned resources as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;our_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;our_agent_uuid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;our_resources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;our_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;our_resources&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# or more pythonic&lt;/span&gt;
&lt;span class="n"&gt;our_resources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;our_key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In essence we hash the resources to &amp;lt;number of Central Agents&amp;gt; of buckets and
only poll the resources that fall into our bucket. A good hash function
&lt;a class="footnote-reference brackets" href="#id6" id="id2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; ensures that the resources are evenly distributed to the active Central
Agents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grouping&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The pollster’s Discovery plugin (be it a Compute Discovery, Hardware Discovery,
etc.) provides the scope its resources are a part of.&lt;/p&gt;
&lt;p&gt;For example, if a Discovery plugin isn’t constrained to a subset of
resources, as is the case for most Discovery plugins, then it should simply
join the global group of unconstrained Discovery plugins.&lt;/p&gt;
&lt;p&gt;If, on the other hand, the resources that the Discovery plugin can discover
are constrained, like in the case of Compute Discovery, then the group name
should reflect their scope. An example of this would be
‘compute-&amp;lt;hostname&amp;gt;-discovery’. This way only the pollsters that are polling
the same host will share their workload between them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What happens when we start another agent (or stop an existing one)?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;tooz&lt;/em&gt; allows us to register a callback that is called when a member joins or
leaves the group. It keeps track of member liveness using a heartbeat
mechanism.&lt;/p&gt;
&lt;p&gt;When a member joins or leaves the group, this is what happens to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The agents already running&lt;/strong&gt;
If they are currently in the middle of polling, they complete their full
polling cycle and only then they re-balance their hash buckets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The agent we just started&lt;/strong&gt;
Joins a group first, but then waits for one polling interval to ensure all the
other agents have updated their hash buckets as well, then starts polling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The agent that is stopped/crashes mid-cycle&lt;/strong&gt;
The resources that the stopped agent hasn’t polled yet will not be polled in
this cycle, but they will be polled from the next one on.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Generalizing the implementation for re-use&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The need for coordinated assignment of “things” (resources, alarms, …) to
agents is not unique to the Central Agent. Currently, the Alarm Evaluator could
make use of it as well to have multiple Alarm Evaluators running, each
evaluating their share of alarms.&lt;/p&gt;
&lt;p&gt;This functionality could be captured in a &lt;em&gt;PartitionCoordinator&lt;/em&gt; class, which
agents could use like:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;partition_coordinator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PartitionCoordinator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'alarm'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;partition_coordinator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="n"&gt;evaluation_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;all_alarms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_all_alarms&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;my_alarms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;partition_coordinator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_my_subset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_alarms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;my_alarms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;The actual change-over of the alarm partitioning coordination to the
proposed approach will be tracked in a separate blueprint.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;or in the case of the central agent:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;partition_coordinator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PartitionCoordinator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'central_agent'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;partition_coordinator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="n"&gt;polling_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;all_resources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;discover_resources&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;my_resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;partition_coordinator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_my_subset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_resources&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;my_resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fabio Gianetti’s approach&lt;/strong&gt; &lt;a class="footnote-reference brackets" href="#id5" id="id3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fabio’s approach uses source&amp;lt;-&amp;gt;agent assignments in the database for
figuring out what to poll and a heartbeat in combination with additional
agents listening for that heartbeat for failure detection.&lt;/p&gt;
&lt;p&gt;In contrast, this proposal uses &lt;em&gt;tooz&lt;/em&gt; for failure detection (via heartbeats
as well). Additionally, the resource allocation is more dynamic since the
resources are assigned to agents evenly at any point in time. It is also
more lightweight since we don’t need to keep an explicit resource&amp;lt;-&amp;gt;agent
mapping in the database, but use hashing instead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Locking&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another approach would be to use distributed locking provided by &lt;em&gt;tooz&lt;/em&gt;.
Before a pollster would poll a resource, it’d need to acquire its lock.
Pollsters contend for the locks and whoever gets the lock, polls the
resource.&lt;/p&gt;
&lt;p&gt;The downside of this approach is the overhead of distributed locking.
Acquiring a distributed lock incurs a cost (time, network traffic). When using
distributed locks for resource contention, this cost is incurred per-resource.
Whereas in the approach with group membership, the coordination cost is
incurred only when a member joins/leaves the group, the frequency of which is
negligible compared to the amount of resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;Positive&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;If deployers want to use multiple central agents, they will need to deploy
one of the tooz backends (ZooKeeper, memcached, possibly just an AMQP broker
soon)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;nejc-saje&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;chdent&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ceilometer team&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;tooz&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;one of the backends for tooz (ZooKeeper, memcached, possibly just
oslo.messaging)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The implementation should be tested with unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Operator’s manual should explain the process and properties of running multiple
Central Agents.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="id4" role="note"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/stackforge/tooz"&gt;https://github.com/stackforge/tooz&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="id5" role="note"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id3"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/101282/5"&gt;https://review.openstack.org/#/c/101282/5&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="id6" role="note"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="#id2"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="http://en.wikipedia.org/wiki/Hash_function#Properties"&gt;http://en.wikipedia.org/wiki/Hash_function#Properties&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
</description><pubDate>Mon, 04 Aug 2014 00:00:00 </pubDate></item><item><title>Multi meter arithmetic transformer</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/arithmetic-transformer.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/arithmetic-transformer"&gt;https://blueprints.launchpad.net/ceilometer/+spec/arithmetic-transformer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adding the ability to take more than one meter into account when performing
a transformation. An example of this is the memory utilization, where:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;memory_util&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Pipeline transformers are currently performing calculations only on one or
more values of the same meter. Some calculations need to take into account
multiple meters, like in the case of memory utilization, where:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;memory_util&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We suggest an implementation of a flexible transformer capable of performing
arithmetic operations on multiple meters and/or their metadata. To prevent
irregular cadence of the produced meter, calculation is limited to meters
with the same interval.&lt;/p&gt;
&lt;p&gt;The configuration of the new transformer would be:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;
  &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"memory_util"&lt;/span&gt;
      &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"%"&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"gauge"&lt;/span&gt;
      &lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"100 * $(memory.usage) / $(memory)"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To demonstrate the use of metadata, here is the implementation of
a silly metric that shows average CPU time per core:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;
  &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"avg_cpu_per_core"&lt;/span&gt;
      &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ns"&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"cumulative"&lt;/span&gt;
      &lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"$(cpu) / ($(cpu).resource_metadata.cpu_number or 1)"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Expression evaluation would gracefully handle NaNs and exceptions. In such
a case it would not create a new sample but would only log a warning.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parsing the meter names&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since meter names are not necessarily valid Python identifiers, we must
escape them. The expression string is only parsed at the time the pipeline
is initialized, so it does not cause any performance overhead.&lt;/p&gt;
&lt;p&gt;The escaping is done as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$(cpu) -&amp;gt; cpu
$(cpu_util) -&amp;gt; cpu_util
$(cpu.util) -&amp;gt; _cpu_util_ESCAPED (in order to avoid clashes with legal
  meter names)
$(class) -&amp;gt; _class_ESCAPED (avoid clash with Python keywords)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Also, if the meter name isn’t followed by a dot (‘.’), we default to the
volume parameter.&lt;/p&gt;
&lt;p&gt;So, the expression:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$(memory.usage) / $(memory)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;will be translated to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;_memory_usage_ESCAPED&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;volume&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;volume&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and eval’d with the following &lt;a class="reference external" href="https://github.com/openstack/ceilometer/blob/master/ceilometer/transformer/conversions.py#L30)"&gt;Namespace&lt;/a&gt; object&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;Namespace&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="s2"&gt;"_memory_usage_ESCAPED"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="s2"&gt;"memory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Gathering the values&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not all the needed samples will arrive at the same time. Multiple approaches
are possible here.&lt;/p&gt;
&lt;p&gt;1. &lt;em&gt;[CHOSEN APPROACH]&lt;/em&gt; We can cache samples of the necessary meters (keyed by
resource ID) as they arrive. When the pipeline is flushed, we can check if we
have the necessary samples and do the transformation.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;pro&lt;/em&gt;: no need for specifying TTL for cached samples&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;con&lt;/em&gt;: arithmetic operation limited only to samples that originate&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;from the same polling task (=&amp;gt; same interval)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2. We cache the samples same as above, but do the transformation
as soon as we have the necessary samples (samples that are used in the
calculation expression). After the transformation
we clear the cache. The user provides the maximum age (TTL) of a sample for it
to be considered for calculation. E.g. we get a sample of ‘memory.usage’
and we already have a sample of ‘memory’ in cache, which is less than
TTL=10s old. We can perform the calculation.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;pro&lt;/em&gt;: meters used not limited to the same polling task&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;pro&lt;/em&gt;: largest flexibility of all options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;con&lt;/em&gt;: need to specify maximum age for samples to be used in calculation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;con&lt;/em&gt;: might produce samples with irregular cadence, as in the case of&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;the calculation involving meter A with 60s cadence and meter B with 45s
cadence&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;&lt;p&gt;Similar as #2, but limit only to meters from sources with the same interval.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;pro&lt;/em&gt;: produced samples can’t have irregular cadence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;pro&lt;/em&gt;: since all meters involved have the same interval, we can have a&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;static TTL for samples, no need for user configuration. If we know that
all the samples arrive at approximately the same time (because they are
on the same interval and therefore in the same polling task), we only have
a short period of time in which the samples are valid (say, 5 seconds).&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;con&lt;/em&gt;: The next question is how to set the TTL? With a 600s cadence,&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;5 seconds is OK, but with 10s cadence it probably isn’t.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;con&lt;/em&gt;: how to technically enforce this restriction?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4. Same as #2, but provide a configuration option to not clear the cache
after calculation.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;pro&lt;/em&gt;: enables use cases like “we get ‘memory.usage’ every 10s and ‘memory’&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;every ‘600s’. If we don’t clear the cache, we can calculate ‘memory_util’
every 10s using the cached value of ‘memory’.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;con&lt;/em&gt;: extra configuration option might be confusing for the user. The&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;benefit might outweigh this.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;require user to assign the meters to “variables”, e.g.:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"arithmetic"&lt;/span&gt;
  &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"memory_util"&lt;/span&gt;
      &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"%"&lt;/span&gt;
      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"gauge"&lt;/span&gt;
      &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="s2"&gt;"memory.usage"&lt;/span&gt;
      &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="s2"&gt;"memory"&lt;/span&gt;
      &lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"100 * a / b"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Unnecessary since the parsing is only done at pipeline initialization and so
does not cause any overhead in processing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;somehow change the pipeline to only send the samples to transformer when
it has all the required samples&lt;/p&gt;
&lt;p&gt;Our approach is simpler, since other transformers already use caching so it
wouldn’t make sense to push this functionality to the pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;It impacts the format of the pipeline.yaml as described in section
Implementation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None. Expression parsing is performed only at pipeline initialization.
In regard to caching, other transformers already cache values between
intervals. The only difference is that we would store values for more than
one meter.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;nejc-saje&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;nejc-saje&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create the new transformer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write unit tests for the new transformer&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;With the current capabilities of Tempest testing I think unit tests
should suffice.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation should be added for the new type of transformer.&lt;/p&gt;
&lt;p&gt;Documentation must make it clear that the meters included in the expression
must have the same cadence. In case that the expression contains meters
with different cadences or nonexisting meters, the user should expect to have
a warning logged for each unsuccessful calculation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Tue, 08 Jul 2014 00:00:00 </pubDate></item><item><title>Dispatcher for Gnocchi Integration</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/dispatcher-for-gnocchi-integration.html</link><description>
 
&lt;p&gt;Ceilometer is planned to be re-based on a TimeSeries as a Service concept,
namely Gnocchi. We’ve reached the state, when these two projects can be
loosely integrated. This blueprint is about to describe the options for
implementing a dispatcher for realizing the data flow between the monitored
infrastructure and the database.&lt;/p&gt;
&lt;p&gt;There are several ways for integrating these two projects. This blueprint
represents a first stage, proof of concept solution for testing how the new
design is performing. It could/should be refactored later to reach a better
performance and closer integration.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/dispatcher-for-gnocchi-integration"&gt;https://blueprints.launchpad.net/ceilometer/+spec/dispatcher-for-gnocchi-integration&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Gnocchi has several new terms comparing to Ceilometer, like entity and
archive/archiving policy. Ceilometer does not create/define these items now,
therefore it is the key point of the integration process, how to synchronize
the mechanisms that are needed for storing the samples and the corresponding
metadata in the new structure.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;This proposal describes the solution, which is about to implement a new
dispatcher that can be used in the collector to send data to Gnocchi, instead
of one of the currently supported database backends.&lt;/p&gt;
&lt;p&gt;For storing time series data, we need to do several preparation steps in the
polling/notification handler workflow. The processed notifications and also
the polled data have metadata information attached to it. We need to define
resources that will hold this additional information.&lt;/p&gt;
&lt;p&gt;The resource creation has to happen before storing any datapoints. To make
this mechanism effective and easy to implement and extend later the plan is
to create stevedore extensions for the different resource types, which
provides a pluggable solution for the future.&lt;/p&gt;
&lt;p&gt;These resource creation extensions will each handle the creation of a
strongly-typed resource of a single type, and be aware of the
resource-specific attributes required in the Gnocchi representation. The
loaded resource creation extensions will be managed by the dispatcher as a
map keyed on meter-name (acting as a proxy for resource type). Resources of
an unrecognized type will be modelled in Gnocchi as generic resources.&lt;/p&gt;
&lt;p&gt;The resource creation would happen using PUT request, if the given resource
does not exist.&lt;/p&gt;
&lt;p&gt;The next step after having a resource is to create entity for the given
measurement, that is connected to the previously created resource. The entity
creation should also happen automatically, without any human interaction.
Meter name will be used to name each entity. As a first step, the entity
creation will happen in two steps. First to retrieve the resource and check
whether the particular entity exists or not and in the latter case create
the entity with a default archiving policy.&lt;/p&gt;
&lt;p&gt;Later on as a next step, to avoid additional overhead of checking whether the
entity exists or not, we try to POST new measurements with using the
following request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;measures&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If the request fails with missing entity error, then we create the entity
with using a default archiving policy, as it is described below associate
the entity with the resource, and then, and post the measurements again.
In the next polling cycle or when the next notification is received for the
given entity, the POST request will be successful. This option requires
a new operation to be supported on the Gnocchi API, that is why it will be a
future improvement.&lt;/p&gt;
&lt;p&gt;There is also a need for at least one archiving policy to be existed before
storing any time series data. We can reuse the currently existing
configuration parameters that are used for the pipelines or the samples
lifecycle to define archives.&lt;/p&gt;
&lt;p&gt;As these archives can be defined based on the lifespan and granularity values
the ttl value that specifies how long the samples should be kept in the
database can be reused to define the former parameter. The granularity
will be configured as one second by default in the first step.&lt;/p&gt;
&lt;p&gt;Later on it will be also supported to change these values or adding new
archives via the Ceilometer’s REST API, but currently we provide the mechanism
the can be built in the current data collection and storage mechanisms.&lt;/p&gt;
&lt;p&gt;The data will be stored by calling the REST API of Gnocchi from the collector.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The alternate solution is to remove the collector from the chain and store the
collected data directly from the pollsters. This would increase the
performance, as we do not add additional steps before storing the data in the
database.&lt;/p&gt;
&lt;p&gt;This solution needs more effort, therefore it is a proposed way of future
improvement of the integration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;New resource types were introduced by Gnocchi, which are handled inside that
module, Ceilometer is aware of the available types, for creating new
instances, when it’s necessary.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;The data retrieval will change after fully integrating Gnocchi into
Ceilometer. This will be introduced by the new v3 API, described in a separate
blueprint.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;The deployment of Gnocchi should be done before using this new solution.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;One of the goals of this blueprint is to make it possible how this new
approach behaves comparing with the old one.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;The new way of storing data will not replace the currently existing solution.
If someone wants to develop some feature based on the new approach, he/she has
to be aware of how Gnocchi works.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ildikov&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;jdanjou&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;ildikov, jdanjou, eglynn&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;create extensions and the additional steps for resource creation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;finish the implementation of the dispatcher&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;The mid-term plans are to integrate Gnocchi closely into Ceilometer, if the
performance and functionality are both fulfills the requirements. This
means that this first step may be changed in some points and the final
solution will then be maintained by the Ceilometer core team and further
contributors.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The current state of Gnocchi supports this integration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests should be provided for the new implementation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The documentation should be updated with the configuration needs for deploying
Ceilometer with Gnocchi and also with the information about how to reach the
data via the Gnocchi API, until Ceilometer v3 API is not available.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/98798"&gt;Initial dispatcher implementation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 08 Jul 2014 00:00:00 </pubDate></item><item><title>IPMI support</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/ipmi.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ipmi-support"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ipmi-support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add IPMI function in ceilometer, so that power/thermal data can be fetched
through IPMI capable servers. These data can be exported to other openstack
component for other usage, like policy control.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The Intelligent Platform Management Interface (IPMI) is a standardized computer
system interface used by system administrators for out-of-band management of
computer systems and monitoring of their operation. Enabling IPMI in ceilometer
allows the cloud operator to monitor the power and thermal behaviors of servers
and make reasonable operation or policy according to the real-time power/thermal
status of data center.&lt;/p&gt;
&lt;p&gt;With IPMI support,the power and thermal information of these servers can be used
to improve overall data center efficiency and maximize overall data center
usage. Data center managers can maximize the rack density with the confidence
that rack power budget will not be exceeded. During a power or thermal
emergency, we can limit server power consumption and send alert to
administrators via the pre-defined policy.&lt;/p&gt;
&lt;p&gt;Currently, Ironic project is doing work to emit notifications on the message bus
containing IPMI sensor data, so that Ceilometer is possible to process these
notifications for high level usage. But for nodes that are not managed by
Ironic, IPMI data is still missing. This spec removes dependency on Ironic by
adding IPMI support in Ceilometer.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add a new IPMI agent, who get the power &amp;amp; thermal data via IPMI protocol in
periodic way and publish these data via pipeline. IPMI agent lives in each IPMI
capable node, and gets configured in deployment.&lt;/p&gt;
&lt;p&gt;In this way, data can be fetched locally without credentials via network. Also
agent polling period can be controlled by pipeline file.&lt;/p&gt;
&lt;p&gt;Line up metrics with IPMI support in Ironic, so we get same IPMI data regardless
of the underlying method (an agent-per-node directly emitting samples, or the
ceilometer notification agent consuming notifications emitted by Ironic. If both
available, user need deploy one only):&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Unit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Origin&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;hardware.ipmi.fan&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;RPM&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;hardware.ipmi.temperature&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;C&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;hardware.ipmi.current&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;W&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;hardware.ipmi.voltage&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;V&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;g = gauge, n = notification , p = pollster&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;IPMI is generic protocol, each vendor may add specific metric for their own
hardware. So there are probably more vendor specific metric in implementation.&lt;/p&gt;
&lt;p&gt;Aim of this spec is to provide:
1) a standard metrics that exist for most of vendor
2) infrastructure to enable IPMI, that is, basic working unit to send IPMI
commands.&lt;/p&gt;
&lt;p&gt;It could include an simple vendor specific implementation based on 2 as example,
so other vendor can do their own work easily.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Instead of deploying IPMI agent for each node, Ceilometer itself hosts one agent
for a bunch of nodes. It poll IPMI data from each node via network in periodic
way. SNMP support in Ceilometer and IPMI in ironic take similar way.&lt;/p&gt;
&lt;p&gt;This method avoid deploying agent in each nodes, but it introduce more work
loads in Ceilometer itself, thus bad scalability. Furthermore, IPMI via network
requires credential management.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;Power/Thermal data should be exposed via the Horizon metering dashboard.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;By default, IPMI agent is not enabled until operator explicitly turn on it in
config file for IPMI capable servers. So no performance impacts by default.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;IPMI config option(default off) need to be added&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;an IPMI agent need to be added and deployed to every node, along with
ceilometer config such as the metering secret&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If both Ironic and Ceilometer available for IPMI data, user need deploy one
only&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;edwin-zhai&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;lianhao-lu
shane-wang&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement an IPMI agent for data fetching deployed in each IPMI capable node.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add unit test coverage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update related docs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;Once this feature enabled, need test and bug fixing in next 2 releases to avoid
regression&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;This feature depends on IPMI capable servers&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests are sufficient since only data fetching/exporting need test.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The added metrics will need to be documented in the &lt;a class="reference external" href="http://docs.openstack.org/developer/ceilometer/measurements.html"&gt;measurements section&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The new configuration for deployment need to be documented.&lt;/p&gt;
&lt;p&gt;IPMI agent shouldn’t be deployed if a node is managed with Ironic, which need to
be documented.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.intel.com/content/www/us/en/servers/ipmi/ipmi-home.html"&gt;http://www.intel.com/content/www/us/en/servers/ipmi/ipmi-home.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 03 Jul 2014 00:00:00 </pubDate></item><item><title>Improve the snmp hardware inspector</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/snmp-improvement.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/snmp-improvement"&gt;https://blueprints.launchpad.net/ceilometer/+spec/snmp-improvement&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We could make some improvement to the existing hardware snmp inspector for the
following objectives:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Minimize the coding effort in snmp inspector when adding new hardware metrics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduce the network traffic between the inspector and the remote snmpd agent&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Currently, to add new hardware metrics, the developer needs to do the
following:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add new inspect method in ceilometer.hardware.inspector.base.Inspector class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new returned data type definition of the above new inspect method.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the new inspect method in snmp inspetor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new hardware pollsters and register it in setup.cfg.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This could result in quite a lot of coding, considering the tons of metrics
available through snmp which could be added.&lt;/p&gt;
&lt;p&gt;Besides, since most of the existing snmpd agents support version 2c, we should
leverage the snmp GetBulkRequest introduced in version 2c to minimize the
network traffic between the snmp inspector and snmpd agent. If the snmpd agent
doesn’t support version 2c and above, we should fall back to GetNextRequest.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Because for each hardware metric, it could be mapped to one or more snmp OIDs.
Using these OIDs, the snmp inspector could get the sample value as well as
the sample’s metadata.&lt;/p&gt;
&lt;p&gt;So here we propose the following changes:&lt;/p&gt;
&lt;p&gt;In ceilometer.hardware.inspector.base.Inspector:&lt;/p&gt;
&lt;p&gt;We’ll replace the current inspect_xxx() methods with a generic inspect
method:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inspect_generic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;""" return an iterator of (value, metadata, extra)&lt;/span&gt;
&lt;span class="sd"&gt;    param host: the target host&lt;/span&gt;
&lt;span class="sd"&gt;    param identifier: the identifier of the metric&lt;/span&gt;
&lt;span class="sd"&gt;    param cache: cache passed from the pollster&lt;/span&gt;
&lt;span class="sd"&gt;    return value: sample value&lt;/span&gt;
&lt;span class="sd"&gt;    return metadata: dict to construct sample's metadata&lt;/span&gt;
&lt;span class="sd"&gt;    return extra: dict of extra information to help pollster&lt;/span&gt;
&lt;span class="sd"&gt;                  to construct the sample&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In ceilometer.hardware.inspector.snmp:&lt;/p&gt;
&lt;p&gt;Here we define a mapping dict like the following:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;MAPPING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'matching_type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EXACT&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;PREFIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'metric_oid'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'metadata'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;metadata_name1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;oid1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value_converter&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
       &lt;span class="n"&gt;metadata_name2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;oid2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value_converter&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s1"&gt;'post_op'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;special&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;modify&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The identifier parameter passed in to the method inspect_generic() serves as
the key to the above mapping.&lt;/p&gt;
&lt;p&gt;The inspect_generic() method in snmp inspector would do the following things:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MAPPING&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
   &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
   &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
   &lt;span class="n"&gt;extra&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Collect&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;oids&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;including&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;metric_oid&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt;
   &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'metric_oid'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;oids&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'metadata'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="mf"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Send&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;GetRequest&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;GetBulkRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;based&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;matching_type&lt;/span&gt;
   &lt;span class="n"&gt;respectively&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;those&lt;/span&gt; &lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;save&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;pairs&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="mf"&gt;4.&lt;/span&gt; &lt;span class="n"&gt;Based&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;matching_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;construct&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
   &lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;pairs&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;constructed&lt;/span&gt;
   &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;dictionary&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;metadata_name1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value_converter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;select_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oid1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
     &lt;span class="n"&gt;metadata_name2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value_converter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;select_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oid2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="mf"&gt;5.&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;post_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;post_op&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;assumed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;implemented&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;metric&lt;/span&gt; &lt;span class="n"&gt;developer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;It&lt;/span&gt;
   &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;additional&lt;/span&gt; &lt;span class="n"&gt;special&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt;
   &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt; &lt;span class="n"&gt;into&lt;/span&gt; &lt;span class="n"&gt;extra&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;returned&lt;/span&gt;
   &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;construct&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;pollster&lt;/span&gt; &lt;span class="n"&gt;how&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
       &lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'project_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;zw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Based on the different matching_type, the way to construct the returned
(value, metadata) in the above step 5 is a little bit different:&lt;/p&gt;
&lt;p&gt;If matching_type is EXACT, we use oid as the exact key into the cache to find
the corresponding value, i.e. cache[oid].&lt;/p&gt;
&lt;p&gt;If matching_type is PREFIX, all the keys in the cache starting with oid as the
prefix matches, and remaining part in the key will be treat like the index.
The index could be used to find corresponding metadata value. For example,
suppose we have the following mapping:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;MAPPING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;'disk.size.total'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'matching_type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PREFIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'metric_oid'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1.3.6.1.4.1.2021.9.1.6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'metadata'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="s1"&gt;'device'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"1.3.6.1.4.1.2021.9.1.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
       &lt;span class="s1"&gt;'path'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"1.3.6.1.4.1.2021.9.1.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s1"&gt;'post_op'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;something&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;'1.3.6.1.4.1.2021.9.1.6.1'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19222656&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'1.3.6.1.4.1.2021.9.1.3.1'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/dev/sda2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'1.3.6.1.4.1.2021.9.1.2.1'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt;
  &lt;span class="s1"&gt;'1.3.6.1.4.1.2021.9.1.6.2'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;808112&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'1.3.6.1.4.1.2021.9.1.3.2'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"tmpfs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'1.3.6.1.4.1.2021.9.1.2.2'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;So&lt;/span&gt; &lt;span class="n"&gt;here&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt;&lt;span class="s1"&gt;'ll return 2 instances of (value, metadata, extra):&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;19222656&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'device'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/dev/sda2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'path'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;808112&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'device'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"tmpfs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'path'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/run"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In ceilometer.hardware.pollsters:&lt;/p&gt;
&lt;p&gt;We need to change accordingly to the new generic inspector interface.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;The existing model is to use GetNextRequest first to get the index and then
use that index to GetRequest mutiple OIDs. We replace it with GetBulkRequest.
This could significantly reduce the snmp packet number exchanged between the
snmp inspector and snmpd agent. Thus we could improve the performance.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;In order to make snmp inspector working, a snmp agent ‘snmpd’ needs to be
running on the machine, listening on the network interface which is accessible
to the snmp inspector and the ceilometer agent. However, this is not a new
deploy requirement because we already require a snmpd agent deployed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;The interface change in ceilometer.hardware.inspector.base.Inspector might
requires other hardware inspector implementations to be changed too. But the
only known implementation now is the snmp inspector, so there should be no
other significant impact.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;lianhao-lu&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;lianhao-lu&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;adding new inspect_generic interface and the snmp implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;change the pollster to new interface and remove old inspector interface&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/92370"&gt;https://review.openstack.org/#/c/92370&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Juno summit session log&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/ceilometer-snmp-inspector"&gt;https://etherpad.openstack.org/p/ceilometer-snmp-inspector&lt;/a&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pysnmp library&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="reference external" href="http://pysnmp.sourceforge.net"&gt;http://pysnmp.sourceforge.net&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 02 Jul 2014 00:00:00 </pubDate></item><item><title>Gnocchi – Ceilometer API v3</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/gnocchi.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/gnocchi"&gt;https://blueprints.launchpad.net/ceilometer/+spec/gnocchi&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;From the beginning of the Ceilometer project, a large part of the goal was
to store time series data that were collected. In the early stages of the
project, it wasn’t really clear what and how these time series were going to
be handled, manipulated and queried, so the data model used by Ceilometer
was very flexible. That ended up being really powerful and handy, but the
resulting performance has been terrible, to a point where storing a large
amount of metrics on several weeks is really hard to achieve without having
the data storage backend collapsing.&lt;/p&gt;
&lt;p&gt;Having such a flexible data model and query system is great, but in the end
users are doing the same request over and over and the use cases that need
to be addressed are a subset of that data model. On the other hand, some
queries and use cases are not solved by the current data model, either
because they are not easy to be expressed or because they are just too damn
slow to run.&lt;/p&gt;
&lt;p&gt;Lately, during the Icehouse Design Summit in Hong-Kong, developers and users
showed interest in having Ceilometer doing metric data aggregation, in order
to keep data in a more long running fashion. No work has been done during
the Icehouse cycle on that, probably due to the lack of manpower around the
idea, even if the idea and motivation was validated by the core team back
then.&lt;/p&gt;
&lt;p&gt;Considering the amount of data and metrics Ceilometer generates and has to
store, a new strategy and a rethinking of the problem was needed, so Gnocchi
is a try on that.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Ceilometer is nowadays trying to achieve two different things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Store metrics, that is a list of (timestamp, value) for a given entity,
this entity being anything from the temperature in your datacenter to the
CPU usage of a VM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Store events, that is a list of things that happens in your OpenStack
installation: an API request has been received, a VM has been started, an
image has been uploaded, a server fell of the roof, whatever&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These two things are both very useful for all the use cases Ceilometer tries
to achieve. Metrics are useful for monitoring, performance analysis, and
alarming, where events are useful to do audit, billing, debugging, etc.&lt;/p&gt;
&lt;p&gt;However, while the event collection of Ceilometer is pretty solid and ok
(but still needs to be working on), the metrics part suffers terrible design
and performance issues.&lt;/p&gt;
&lt;p&gt;Having the so-called free form metadata associated with each metric
generated by Ceilometer is the most problematic design we have. It stores a
lot of redundant information that it is hard to query in an efficient manner.
On the other hand, systems like RRD have existed for a while, storing a
large amount of (aggregated) metrics without much problem. The metadata
associated to these metrics being another issue.&lt;/p&gt;
&lt;p&gt;So that left us with 2 different problem to solve: store metrics and store
information (the so-called metadata) about resources.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;This will bring a whole new data model, where metrics and resources are
split with snapshots of resource metadata no longer wedded to individual
sample datapoints.&lt;/p&gt;
&lt;p&gt;It will be possible to migrate data from the current Ceilometer database to
this new system by writing and running a script taking charge of that. A
future blueprint should cover this topic.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;The change of the data model is consequent, so a new API is also needed. It
should be a version 3 of the Ceilometer API, or if the project is kept
separate a version 1 of it.&lt;/p&gt;
&lt;p&gt;The proposed API is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;POST /v1/entity&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"archives"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"lifespan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"points"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"lifespan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1 year"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"points"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt; &lt;span class="n"&gt;Created&lt;/span&gt;
   &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;Create&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="n"&gt;storing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt; &lt;span class="n"&gt;over&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="n"&gt;minute&lt;/span&gt; &lt;span class="n"&gt;over&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;year&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="n"&gt;minute&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;returned&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;POST /v1/entity/&amp;lt;uuid&amp;gt;/measures&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:12:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;42.0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:12:24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;43.1&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="mi"&gt;204&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt;

&lt;span class="n"&gt;Store&lt;/span&gt; &lt;span class="n"&gt;measures&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;GET /v1/entity/&amp;lt;uuid&amp;gt;/measures&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:12:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;42.0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:12:24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;43.1&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;

&lt;span class="n"&gt;Returns&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;measures&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;this&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Time&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;specified&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;DELETE /v1/entity/&amp;lt;uuid&amp;gt;&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="mi"&gt;204&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt;

&lt;span class="n"&gt;Delete&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;POST /v1/resource/&amp;lt;resource type&amp;gt;&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"started_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:23:12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"cpu.util"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobaz"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"started_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:23:12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"cpu.util"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobaz"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Create&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;provided&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;caller&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt;
&lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;native&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;underlying&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
&lt;span class="n"&gt;various&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;also&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;provided&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Entities&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;specified&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;their&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;creation&lt;/span&gt; &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"started_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:23:12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"cpu.util"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"archives"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"lifespan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"points"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobaz"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"started_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:23:12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"cpu.util"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobaz"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;GET /v1/resource/&amp;lt;resource type&amp;gt;&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"started_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:23:12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"generic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"cpu.util"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobaz"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;

&lt;span class="n"&gt;Return&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;GET /v1/resource/&amp;lt;resource type&amp;gt;/&amp;lt;uuid&amp;gt;&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"started_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:23:12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"generic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"cpu.util"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobaz"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Return&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt; &lt;span class="n"&gt;about&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;DELETE /v1/resource/&amp;lt;resource type&amp;gt;/&amp;lt;uuid&amp;gt;&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="mi"&gt;204&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt;

&lt;span class="n"&gt;Delete&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;PATCH /v1/resource/&amp;lt;resource type&amp;gt;/&amp;lt;uuid&amp;gt;&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"started_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:23:13"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"started_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2013-01-01 12:23:13"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"generic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"cpu.util"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"foobaz"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Change&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;mutable&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt;
&lt;span class="n"&gt;mutable&lt;/span&gt; &lt;span class="n"&gt;depends&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ended_at&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;entities&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All resources inherits from the &lt;cite&gt;generic&lt;/cite&gt; resource type and can therefore be
partially manipulated by using this resource type. Otherwise, resource types
with more attributes are provided such as &lt;cite&gt;instance&lt;/cite&gt; to create more complete
resources.&lt;/p&gt;
&lt;p&gt;All resources types are builtin within Gnocchi in order to be more
performant. If a resource type needs to be indexed but is not known to
Ceilometer, one can relies on the &lt;cite&gt;generic&lt;/cite&gt; resource type and manage the
attributes of the resource is another system, per user discretion.&lt;/p&gt;
&lt;p&gt;The resource type known by Gnocchi will be the resource types provided by
OpenStack, e.g. &lt;cite&gt;instance&lt;/cite&gt;, &lt;cite&gt;port&lt;/cite&gt;, &lt;cite&gt;network&lt;/cite&gt;, &lt;cite&gt;volume&lt;/cite&gt;, etc.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;Usual Keystone token-based authN and RBAC-based authZ.&lt;/p&gt;
&lt;p&gt;No security mechanism is proposed to access entities. As the entities UUID
are dynamically and randomly allocated, one has to know the UUID of that
entity to access it. It can therefore be considered as a secret.&lt;/p&gt;
&lt;p&gt;Access to the resources can be filtered based on the &lt;cite&gt;user_id&lt;/cite&gt; and
&lt;cite&gt;project_id&lt;/cite&gt; fields that are stored and &lt;strong&gt;mandatory&lt;/strong&gt; attributes. That’s the
same mechanism currently used in Ceilometer API v2.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;The publishing mechanism will need to be adapted to that new model, as
resources needs to be created before they can be metered. Another blueprint
should cover this topic.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;The ceilometerclient will need to be extended to support both the old and
new APIs to that also.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;The scalability and performances of this new system should be drastically
better than the old one.&lt;/p&gt;
&lt;p&gt;Having real benchmarks of this system would also be interesting.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;It’s likely that the API v2 of Ceilometer should be frozen and that no
further improvements should be made at this stage.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;jdanjou&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sileht&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dbelova&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;jdanjou&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Build the Gnocchi service and API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adjust Ceilometer data retrieval and publishing as needed to adapt to the
new data storage and API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make things work together&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;This will be a core component of Ceilometer, so everyone is going to take
care of that, me included.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Canonical implementation of the storage driver requires Pandas and Swift.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alternative statistical/storage driver(s) with different dependencies may
also be provided in time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests are provided.&lt;/p&gt;
&lt;p&gt;Tempest tests should be added to cover the new API. A variant of the v2
tests running with v3 mechanism enabled is a possibility.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;We must document the new API. There is currently no mechanism to
auto-generate the API documentation, though it should be doable and
interesting to do so.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/Gnocchi"&gt;https://wiki.openstack.org/Gnocchi&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/ceilometer-tsdaas"&gt;https://etherpad.openstack.org/p/ceilometer-tsdaas&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 01 Jul 2014 00:00:00 </pubDate></item><item><title>OSprofiler notification plugin</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/osprofiler_plugin.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/osprofiler-plugin"&gt;https://blueprints.launchpad.net/ceilometer/+spec/osprofiler-plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This spec is about integration between osprofiler and ceilometer.
Actually osprofiler requires some kind on notification API and collector.
Which is actually Ceilometer.&lt;/p&gt;
&lt;p&gt;More about OSprofiler:
&lt;a class="reference external" href="https://github.com/stackforge/osprofiler"&gt;https://github.com/stackforge/osprofiler&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;In OpenStack we have bunch of services inside every project. It’s really hard
to understand where and why your request works slow. To resolve this issue we
introduce tiny library, that can be easily integrated in all existing service
and will allow us to get 1 trace (tree of elements) per API request.
It’s simpler to see, then to explain sample:
&lt;a class="reference external" href="http://pavlovic.me/rally/profiler/"&gt;http://pavlovic.me/rally/profiler/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To resolve this task, we have to send from all services to some common
collector special notifications. As there is already Ceilometer, that is
integrated with everything and as well notification API that perfectly works
for us we decide to use it (Ceilometer).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add new Ceilometer notification plugin, that will collect notifications
related to profiler.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Make another collector of notifications (Ceilometer) and integrate it in
all projects ;)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;It depends on how heavy you are using osprofiler. By default even if everything
is turned on, osprofiler won’t sent any notifications.
profiler will send notifications only in case if person that knows hmac key
sends special trace info in special header.&lt;/p&gt;
&lt;p&gt;Amount of data that will be send depends on API request. One of worst API call
is boot VM. If we trace all rest/rpc/db calls it will be about 150kb of
samples. Note with disabled tracing of DB we can reduce multiple times amount
of profiling data.&lt;/p&gt;
&lt;p&gt;Warnings:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Do not trace every request, especially such like “nova boot VM”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep hmac in safe, if somebody knows it, he can create trace for every
request or in another words DDOS Ceilometer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Boris Pavlovic &amp;lt;&lt;a class="reference external" href="mailto:boris%40pavlovic.me"&gt;boris&lt;span&gt;@&lt;/span&gt;pavlovic&lt;span&gt;.&lt;/span&gt;me&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new notification plugin (already done):
&lt;a class="reference external" href="https://review.openstack.org/#/c/100239/"&gt;https://review.openstack.org/#/c/100239/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Turn it on by default in devstack&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;This plugin is essential for OSprofiler, and OSprofiler is essential for
OpenStack. So this code will be fully supported.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;There is no dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;For the begging we are going to have only unit tests.
Actually code is quite simple, so it doesn’t require functional testing, as
well this code won’t be changed a lot (at all).&lt;/p&gt;
&lt;p&gt;The second reason why unit test are enough is that this plugin will be heavy
used in rally gates. So if something went wrong we will catch it quite fast.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Add warning that profiler creates huge load on Ceilometer backend. It means
that it shouldn’t be turned on for every request. As well we should say that
load can be drastically reduced in case of turned off tracing of DB request.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OSprofiler lib: &lt;a class="reference external" href="https://github.com/stackforge/osprofiler"&gt;https://github.com/stackforge/osprofiler&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;oslo.messaging notification api for osprofiler: &lt;a class="reference external" href="http://goo.gl/nCK21D"&gt;http://goo.gl/nCK21D&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cinder integration: &lt;a class="reference external" href="http://goo.gl/yY42jd"&gt;http://goo.gl/yY42jd&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Result: &lt;a class="reference external" href="http://pavlovic.me/rally/profiler/"&gt;http://pavlovic.me/rally/profiler/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Wed, 25 Jun 2014 00:00:00 </pubDate></item><item><title>XenAPI support</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/xenapi-support.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/xenapi-support"&gt;https://blueprints.launchpad.net/ceilometer/+spec/xenapi-support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently ceilometer can support libvirt, hyperv and vmware hypervisor.
And now it is necessary to add xenapi inspector for XenServer/Xen Cloud
Platform.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The usecase is to use xenapi to inspect the XenServer hypervisor.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Create xenapi directory in ceilometer/compute/virt, and implement
xenapi inspector to support all existing meters.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;The deployer can now optionally define connection information to
XenServer/Xen Cloud Platform by adding:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;xenapi&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;connection_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;connection_username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;connection_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;qiaowei-ren&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;qiaowei-ren&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement xenapi inspector for XenServer/Xen Cloud Platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test method in unit tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit Tests will be added to cover the necessary inspector calls.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The Measurement docs need to be updated to reflect xenapi support.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;XenAPI Documentation: &lt;a class="reference external" href="http://docs.vmd.citrix.com/XenServer/6.2.0/1.0/en_gb/api/"&gt;http://docs.vmd.citrix.com/XenServer/6.2.0/1.0/en_gb/api/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Wed, 25 Jun 2014 00:00:00 </pubDate></item><item><title>PaaS Event Format</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/paas-event-format-for-ceilometer.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/paas-event-format-for-ceilometer"&gt;https://blueprints.launchpad.net/ceilometer/+spec/paas-event-format-for-ceilometer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The general mechanism for setting up Ceilometer collection for a new service
has been to either create a targeted agent or use the existing service APIs to
meter these systems. While this approach has worked for the existing set of
services, it will run into a several problems as the number of PaaS and SaaS
services that need to be metered expand. This blueprint provides a proposal for
streamlining the format of integrations so that Ceilometer can consume
metering data from any conforming PaaS application without doing any custom
integration.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;There are a number of PaaS services that are currently in development
and a growing number of applications running on top of OpenStack
infrastructure. Many of these new applications will need to be metered
for a variety of reasons: internal systems management, license
management, end customer billing. Ceilometer currently supports the
collection of metering information for many infrastructure-level services,
however it won’t be viable to do custom integrations for the
potentially hundreds (and eventually thousands) of services that may be
hosted in OpenStack. We want to head off that issue by defining a
universal PaaS notification payload so Ceilometer can consume PaaS
notifications without significant integration work.&lt;/p&gt;
&lt;p&gt;A few use cases come to mind:
&lt;strong&gt;Database as a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Database as a Service (DBaaS), i.e. Trove, has an architecture where a service
controller manages special Nova compute instances on behalf of the customer.
From their perspective they are running instances of a database, not compute
instances. Metering and billing will be based on hours that the database has
been running, not necessarily how long the hosting instance has been run. This
requires a unique set of metering records to be generated and stored to enable
usage tracking and billing of the individual database instances.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DNS as a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DNS as a service runs on a similar service controller architecture to DBaaS. In
this case, the meters that need to be measured are the existence of a DNS zone
and the number of DNS queries that have been served. Once again these are
application level meters that do not correlate directly to the host instances
that are running. Queries could be served by a variety of hosts and a DNS
zone’s existence does not depend on a specific compute instance. Application
level metrics must be tracked by the DNS service and reported out so that these
systems can be tracked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Load Balancing as a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A load balancer is a logical system that consists of some number of independent
backends that host the load balancing software. Meters that must be measured
would be things like the existence of a load balancer VIP, its members, and the
amount of data that is being transferred through the system. Once again, this
does not directly correlate to the underlying infrastructure but must be
reported at the application level&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;We need to standardize the content of the PaaS payload to include a set of data
that will include data needed for metering and billing. This essentially
constitutes a documentation change and a set of tests to verify key fields.&lt;/p&gt;
&lt;p&gt;The following is the proposed schema:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"event_type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"enumeration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"for event type records, this describes the actual event that occurred"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required for events"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"depends on service, defaults to create, exists, delete"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"UTC DateTime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"timestamp of when this event was generated at the resource"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ISO 8859 date YYYY-mm-ddThh:mm:ss"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"message_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"unique identifier for event"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"payload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Version of event format"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"audit_period_beginning"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"UTC DateTime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Represents start time for metrics reported"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Format ISO 8859 date YYYY-mm-ddThh:mm:ss"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"audit_period_ending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"UTC DateTime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Represents end time for metrics reported"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Format ISO 8859 date YYYY-mm-ddThh:mm:ss"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"record_type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"enumeration "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="s2"&gt;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"events describe some kind of state change in the service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"quantity describes a usage metric value"&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"UUID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Keystone project_id identifies the owner of&lt;/span&gt;
                          &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="s2"&gt;",&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"UUID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Keystone user_id identifies specific user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"service_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"UUID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Keystone service_id uniquely identifies a service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"service_type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Keystone service_type uniquely identifies a service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"instance_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"UUID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"uniquely identifies an instance of the service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"assuming instance level reporting"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"display_name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"text description of service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"used if customer names instances"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"instance_type_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"enumeration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"used to describe variations of a service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"needed if variations of service have different prices or&lt;/span&gt;
                    &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;broken&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;separately&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"text description of service variations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"availability_zone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"where the service is deployed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required if service is deployed at an AZ level"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"data center that the service is deployed in"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required if service is billed at a regional level"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"enumeration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"status of the service at the time of record generation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required for existence events"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"state_description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"text description of state of service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"license_code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"enumeration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"value that describes a specific license model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"this field is TBD depending on dev_pay design work"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="s2"&gt;"metrics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"metric_name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"unique name for the metric that is represented&lt;/span&gt;
                       &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="s2"&gt;",&lt;/span&gt;
                      &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
                  &lt;span class="p"&gt;},&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"metric_type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"enumeration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"gauge, cumulative, delta"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"describes the behavior of the metric, from ceilometer"&lt;/span&gt;
                  &lt;span class="p"&gt;},&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"metric_value"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Float"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"value of metric for quantity type records"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"required for quantities"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
                  &lt;span class="p"&gt;},&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"Field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"metric_units"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"enumeration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"describes the units for the quantity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Compliance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
                  &lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;]&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note: Required means that it must be present and described as in the specification.
Optional means it can be present or not, but if present it must be described as
in the specifications.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The alternative approach to this standardization is to allow PaaS service
providers to determine the content of the notifications and the associated
plugins, requiring missing data to be addressed post implementation through
patching.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;What new data objects and/or database schema changes is this going to
require?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This format should fit within the existing schema.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;What database migrations will accompany this change, treating the SQLAlchemy
and NoSQL cases separately.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No DB migrations will be required.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Will this add to the on-the-fly data massaging cruft that we’ve accreted
over time?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The purpose of this change is to avoid the explosion of cruft that could
potentially be generated as PaaS services implement variations on the
notification payload.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;The API should transparently handle the PaaS data, there should be no API
impact.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;As this BP only specifies a standard format for PaaS samples (and one that
closely resembles the current sample content) current content of Ceilometer
samples) there is no security impact.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;The implementation of the PaaS collection agent is documented in a separate BP;
this standardization requires no pipeline changes in itself.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;There should be a positive impact to deployers from implementing this standard:
unifying the PaaS content up-front will reduce the likelihood of missing data
required for downstream processing.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;There is the increase in up-front effort to define, for each PaaS service being
implemented, a set of data that fulfills the standard. There is also an
implication that there may be evolution of this standard, and therefore
evolution of the documentation/tests.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;This is tied to the work documented in the PaaS Event Collection blueprint and
will be implemented in parallel with that. That said, there’s certainly benefit
in opening this up to those who have an interest in PaaS events, especially if
there are data elements that we haven’t considered here.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;nealph (&lt;a class="reference external" href="mailto:phil.neal%40hp.com"&gt;phil&lt;span&gt;.&lt;/span&gt;neal&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;fabiog (&lt;a class="reference external" href="mailto:fabio.gianetti%40hp.com"&gt;fabio&lt;span&gt;.&lt;/span&gt;gianetti&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;nealph (&lt;a class="reference external" href="mailto:phil.neal%40hp.com"&gt;phil&lt;span&gt;.&lt;/span&gt;neal&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;It’s likely that the standard will expand: the intent here is to define and
clearly document the core elements required. For that reason, I expect
contributions to this documentation will be done by others beside myself.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;1. Identify impacts to existing services (if any) and submit appropriate
requests (via Launchpad)&lt;/p&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Create documentation changes&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;I expect there will be pressure to expand the specification in future release
cycles.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;There is some implication for testing, since we want to check for existence of
the fields defined in the specification.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation for this change is the core deliverable. While it won’t require a
lot of documentation, the readability and descriptiveness of the documentation
is critical. We expect to leverage much of the content at
&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Ceilometer/blueprints/StandardPaaSEventFormat"&gt;https://wiki.openstack.org/wiki/Ceilometer/blueprints/StandardPaaSEventFormat&lt;/a&gt;
as well as add updated event payload examples.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;The full blueprint for this change is available at:
&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Ceilometer/blueprints/StandardPaaSEventFormat"&gt;https://wiki.openstack.org/wiki/Ceilometer/blueprints/StandardPaaSEventFormat&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The related blueprint outlining changes to the PaaS event collection mechanism
(that benefits from on this standard being in place)
is available at:
&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Ceilometer/blueprints/PaaSEventUsageCollection"&gt;https://wiki.openstack.org/wiki/Ceilometer/blueprints/PaaSEventUsageCollection&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Mon, 23 Jun 2014 00:00:00 </pubDate></item><item><title>Enable event feature on MongoDB</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/mongodb-events-feature.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/mongodb-events-feature"&gt;https://blueprints.launchpad.net/ceilometer/+spec/mongodb-events-feature&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Events feature was implemented on SQLAlchemy and HBase backends. And now it is
necessary to extend it on MongoDB and DB2.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The usecase is to store events in database (MongoDB or DB2) and to get
events (event’s types, traits, trait’s types) from this database.&lt;/p&gt;
&lt;p&gt;The main idea is to implement event feature in way like it was done on
other drivers (SQLAlchemy and HBase).&lt;/p&gt;
&lt;p&gt;Usecases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;to get all events that were created in a specified period of time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get events by event’s type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get events by event’s message id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get events by trait’s description, type, and value&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get all event’s types that were stored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get all trait types belonging to specific event type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get all traits that could be found in specific event’s type, and
optionally with specific trait type.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add new methods in ceilometer.storage.pymongo_base.py for storing and getting
events from database. Basing on events implementation that have been already
done we should create next methods:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;record_event – method for storing collected events into MongoDB and DB2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_events – method for getting events from MongoDB and DB2 with specified
filters:
- period of event’s generation time
- event’s type
- event’s message id
- trait’s description, type, and value (here should be taken into account
possible operations on values, for ex: &amp;lt;lt, le, eq, ne, ge, gt&amp;gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_event_types – method for getting all event’s types that were stored in
database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_trait_types – method returns all trait types for all stored event
types or only for one event’s type if it is specified.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_traits – method returns all traits for certain event type, or traits
for specified trait’s type if type is defined.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;We will need to add new collection into MongoDB and DB2 for events&lt;/p&gt;
&lt;p&gt;Collection:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;events&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;_id: uuid of event (Event.message_id)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;event_type: description of event’s type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;timestamp: time stamp of event generation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;traits: [array of {trait_name: string, trait_type: integer,&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;trait_value: data}]&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;idegtiarov&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;idegtiarov&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create new method for event feature implementation on MongoDB and DB2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test method in unit tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This code will be tested in unit tests for event feature&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 13 Jun 2014 00:00:00 </pubDate></item><item><title>Metering Network Services - LoadBalancer as a Service</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/lbaas_metering.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-meter-lbaas"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-meter-lbaas&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Ceilometer currently has no support for metering Network Services. Cloud
providers/Operators have the need to monitor and meter various aspects of
the Network Services. This spec deals with metering Load Balancer as a
service(LBaaS).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The measurements needed for metering LBaas are categorized into two, provider
and service level. Following are the measurements targeted to be included in
Ceilometer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Provider level metrics:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Type of LB ( HAproxy, VPx etc..)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Features (SSL, Non-SSL, stickiness etc..)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Service level metrics:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;LB pool&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Number of Connections
- Use statistics API call from LBaaS side&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bandwidth
- Use statistics API call from LBaaS side&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;Members&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bandwidth
- Use statistics API call from LBaaS side&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;Health monitors&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Status of the health probe&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Metric Definitions:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Unit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Origin&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.lb.type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;network.services.lb.pool&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;pool&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.lb.vip&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vip&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;network.services.lb.member&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;member&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.lb.health_monitor&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;monitor&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;network.services.lb.total.connections&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;connection&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.lb.active.connections&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;connection&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;network.services.lb.incoming.bytes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.lb.outgoing.bytes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;g = gauge, c = cumulative, p = pollster&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Status is captured in an enum-style value in the sample volume, as opposed to
the resource metadata, for each pool, vip, members and monitor.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;The end user should be able to interact via the existing API and CLI.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;It would be good to expose these metrics on horizon dashboard, but
that is outside the scope of this spec.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;This change should not have any major impact on performance/Scalability.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;This feature should have minimal impact on developers for ongoing maintenance&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pkilambi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;None&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pkilambi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add neutron client APIs to query LBaas calls in neutron_client.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new Pollsters and notification handlers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Unit/Integration test coverage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update measurement docs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;New measurements around LBaaS and other network services will be part of the
network pollsters and notifications. So ongoing maintenance will be handled
by the Ceilometer team, myself included.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit and integration Tests will be added to cover the necessary neutron_client calls, pollsters and notifications.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The Measurement docs need to be updated to reflect the new meters captured
from LBaaS API and notifications.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/juno-summit-metering-network-services"&gt;https://etherpad.openstack.org/p/juno-summit-metering-network-services&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Thu, 05 Jun 2014 00:00:00 </pubDate></item><item><title>Enable event feature on HBase</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/hbase-events-feature.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/hbase-events-feature"&gt;https://blueprints.launchpad.net/ceilometer/+spec/hbase-events-feature&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently events feature is implemented only on SQLAlchemy backend, so choosing
another database events are not supported.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The usecase is to store events in HBase and to get events (event’s types,
traits, trait’s types) from this database.&lt;/p&gt;
&lt;p&gt;The main idea is to implement event feature in way like it was done on
SQLAlchemy driver.&lt;/p&gt;
&lt;p&gt;Usecases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;to get all events that were created in a specified period of time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get events by event’s type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get events by event’s message id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get events by trait’s description, type, and value&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get all event’s types that were stored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get all trait types belonging to specific event type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to get all traits that could be found in specific event’s type, and
optionally with specific trait type.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Add new methods in ceilometer.storage.impl_hbase.py for storing and getting
events from database. Basing on events implementation for SQL database we
should create next methods:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;record_event – method for storing collected events into HBase&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_events – method for getting events from HBase with specified
filters:
- period of event’s generation time
- event’s type
- event’s message id
- trait’s description, type, and value (here should be taken into account
possible operations on values, for ex: &amp;lt;lt, le, eq, ne, ge, gt&amp;gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_event_types – method for getting all event’s types that were stored in
database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_trait_types – method returns all trait types for all stored event
types or only for one event’s type if it is specified.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_traits – method returns all traits for certain event type, or traits
for specified trait’s type if type is defined.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;We will need to add new collection into HBase for events&lt;/p&gt;
&lt;p&gt;Collection:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl&gt;
&lt;dt&gt;events&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;row_key: timestamp of event’s generation + uuid of event&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;in format: “%s+%s” % (ts, Event.message_id)
If we store events with such row_key they are sorted by
timestamp in the database.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;-Column Families:&lt;/dt&gt;&lt;dd&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;f: contains the following qualifiers:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;-event_type: description of event’s type
-timestamp: time stamp of event generation
-all traits for this event in format
“%s+%s” % (trait_name, trait_type)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;idegtiarov&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;idegtiarov&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create new method for event feature implementation on HBase&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test method in unit tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;This code will be tested in unit tests for event feature&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 30 May 2014 00:00:00 </pubDate></item><item><title>Dedicated database for the alarm definition and history of Ceilometer</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/dedicated-alarm-database.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/dedicated-alarm-database"&gt;https://blueprints.launchpad.net/ceilometer/+spec/dedicated-alarm-database&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently if we use MongoDB for storing metering data, we are forced to use
MongoDB for storing events and alarms. Because the API service can use only
one database connection object.&lt;/p&gt;
&lt;p&gt;Also metering and alarm are two completely different things, but the db code
are currently in the same place.&lt;/p&gt;
&lt;p&gt;The blueprint proposes to allow to have a different database for alarms
definition and alarms history.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;The usecase is I want to store my metering data into MongoDB and my alarm
definition and history into MySQL&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The idea is to move all alarms db stuffs from ceilometer/storage to
ceilometer/alarm/storage&lt;/p&gt;
&lt;p&gt;ceilometer.storage.get_connection_from_conf get a new argument ‘purpose’,
that can be set to metering or alarm.&lt;/p&gt;
&lt;p&gt;This will allow to use a different namespace to load a driver that depends
of the purpose.&lt;/p&gt;
&lt;p&gt;New entry points will be added to have a different set of driver for alarm
and metering.&lt;/p&gt;
&lt;p&gt;Ceilometer API will use two connection objects, one for metering and one for
alarm depending on the used API endpoint requested.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;p&gt;In case of SQLAlchemy, migration scripts will continue to be stored in a
common place to ensure easy migration.
And if a dedicated database is used, we accepted having unused and empty
tables.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;The deployer can now optionally define a dedicated database for the alarming
of ceilometer by adding:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mongodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ceilometer&lt;/span&gt;
&lt;span class="n"&gt;alarm_connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ceilometer&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;sileht&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;sileht&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Splits the alarm db API from metering db API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove unuseful drivers for alarm API&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The is code refactoring with a new optional configuration option.
This configuration will be tested in new unit tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Thu, 29 May 2014 00:00:00 </pubDate></item><item><title>Metering Network Services - Firewall as a Service</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/ceilometer-meter-fwaas.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-meter-fwaas"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-meter-fwaas&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Ceilometer currently has no support for metering Firewall as a Service.
Cloud providers/Operators have the need to monitor and meter various aspects
of the Network Services. This spec deals with metering Firewall as a
Service(FWaaS).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The measurements needed for metering FWaas are categorized into two, provider
and service level. Following are the measurements targeted to be included in
Ceilometer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Provider level metrics:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Type of Firewall (iptables, CSR virtual firewall etc..)
- depends on flavor framework in neutron(See Dependencies)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Service level metrics:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Firewall Rule/Policy existence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Number of Connections
- Needs changes to Neutron FWaaS(See Dependencies)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bandwidth
- Needs changes to neutron FWaaS(See Dependencies)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Metric Definitions:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Unit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Origin&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.fw&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;firewall&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;network.services.fw.policy&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;policy&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.fw.type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;firewall&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;network.services.fw.total.connections&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;connections&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.fw.active.connections&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;connections&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;network.services.fw.incoming.bytes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.fw.outgoing.bytes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;g = gauge, c = cumulative, p = pollster&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Status is captured in an enum-style value in the sample volume, as opposed to
the resource metadata, for each firewall.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The resources associated with these metrics are captured as part of resource discovery.
Neutron exposes apis to capture this data which are invoke via pollsters from the
ceilometer side. The notifications on neutron services side are a bit slim. As we
add these notification messages to the neutron side, we will enhance the ceilometer
side to capture these events through notification handlers.&lt;/p&gt;
&lt;p&gt;For reference implemenation on neutron side, there will be an api call to retrieve
stats such as connections and bandwidth.The backend implementation will be based on
iptables. Iptables provides us a way to gather average hit counts to provide these
stats. Other vendor based implementation can do the same.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;New sources need to be included in pipeline.yaml for each group of pollsters that share a
discovery extension. An example below:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fw_source&lt;/span&gt;
    &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;
    &lt;span class="n"&gt;meters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"network.services.fw"&lt;/span&gt;
    &lt;span class="n"&gt;discovery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"firewall"&lt;/span&gt;
    &lt;span class="n"&gt;sinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;network_services_sink&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Similarly, we will have sources for firewall policy, hit counts and bandwidth.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;The end user should be able to interact via the existing API and CLI.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;It would be good to expose these metrics on horizon dashboard, but
that is outside the scope of this spec.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;This change should not have any major impact on performance/Scalability.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;This feature should have minimal impact on developers for ongoing maintenance&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pkilambi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;None&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pkilambi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add neutron client APIs to query FWaaS calls in neutron_client.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new Pollsters and notification handlers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Unit/Integration test coverage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update measurement docs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;New measurements around FWaaS and other network services will be part of the
network pollsters and notifications. So ongoing maintenance will be handled
by the Ceilometer team, myself included.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Flavor Framework in Neutron to determine the type of firewall.
- &lt;a class="reference external" href="https://blueprints.launchpad.net/neutron/+spec/neutron-flavor-framework"&gt;https://blueprints.launchpad.net/neutron/+spec/neutron-flavor-framework&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need statistics calls for hit counts on neutron FWaaS side to support
connections and bandwidth.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit and integration Tests will be added to cover the necessary neutron_client
calls, pollsters and notifications.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The Measurement docs need to be updated to reflect the new meters captured
from FWaaS API and notifications.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/juno-summit-metering-network-services"&gt;https://etherpad.openstack.org/p/juno-summit-metering-network-services&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 27 May 2014 00:00:00 </pubDate></item><item><title>Metering Network Services - VPN as a Service</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/ceilometer-meter-vpnaas.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-meter-vpnaas"&gt;https://blueprints.launchpad.net/ceilometer/+spec/ceilometer-meter-vpnaas&lt;/a&gt;&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Ceilometer currently has no support for metering VPN as a Service. Cloud
providers/Operators have the need to monitor and meter various aspects of
the Network Services. This spec deals with metering VPN as a service(VPNaaS).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;The measurements needed for metering VPNaas are categorized into two, provider
and service level. Following are the measurements targeted to be included in
Ceilometer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Provider level metrics:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Type of VPN (Openswan, Cisco etc..)
- depends on flavor framework in neutron(See Dependencies)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Service level metrics:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;VPN service Status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Number of Connections&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bandwidth
- Needs changes to neutron VPNaaS(See Dependencies)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Metric Definitions:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Unit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Origin&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.vpn&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vpn&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;network.services.vpn.type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vpn&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.vpn.connections&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;g&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;connections/s&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;network.services.vpn.incoming.bytes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;network.services.vpn.outgoing.bytes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;c&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;B&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;p&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;g = gauge, c = cumulative, p = pollster&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Status is captured in an enum-style value in the sample volume, as opposed to
the resource metadata, for each vpn.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The resources associated with these metrics are captured as part of resource discovery.
Neutron exposes apis to capture this data which are invoke via pollsters from the
ceilometer side. The notifications on neutron services side are a bit slim. As we
add these notification messages to the neutron side, we will enhance the ceilometer
side to capture these events through notification handlers.&lt;/p&gt;
&lt;p&gt;For reference implemenation on neutron side, there will be an api call to retrieve
stats such as connections and bandwidth.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;New sources need to be included in pipeline.yaml for each group of pollsters that share a
discovery extension. An example below:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fw_source&lt;/span&gt;
    &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;
    &lt;span class="n"&gt;meters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"network.services.vpn"&lt;/span&gt;
    &lt;span class="n"&gt;discovery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"vpn"&lt;/span&gt;
    &lt;span class="n"&gt;sinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;network_services_sink&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Similarly, we will have sources for connections and bandwidth.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;The end user should be able to interact via the existing API and CLI.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;It would be good to expose these metrics on horizon dashboard, but
that is outside the scope of this spec.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;This change should not have any major impact on performance/Scalability.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;This feature should have minimal impact on developers for ongoing maintenance&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pkilambi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;None&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pkilambi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add neutron client APIs to query VPNaaS calls in neutron_client.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new Pollsters and notification handlers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Unit/Integration test coverage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update measurement docs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;New measurements around VPNaaS and other network services will be part of the
network pollsters and notifications. So ongoing maintenance will be handled
by the Ceilometer team, myself included.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Flavor Framework in Neutron to determine the type of firewall.
- &lt;a class="reference external" href="https://blueprints.launchpad.net/neutron/+spec/neutron-flavor-framework"&gt;https://blueprints.launchpad.net/neutron/+spec/neutron-flavor-framework&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need statistics calls for hit counts on neutron VPNaaS side to support
connections and bandwidth.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit and integration Tests will be added to cover the necessary neutron_client calls,
pollsters and notifications.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The Measurement docs need to be updated to reflect the new meters captured
from VPNaaS API and notifications.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/juno-summit-metering-network-services"&gt;https://etherpad.openstack.org/p/juno-summit-metering-network-services&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><pubDate>Tue, 27 May 2014 00:00:00 </pubDate></item><item><title>Ceilometer Python Client Keystone V3 Upgrade</title><link>https://specs.openstack.org/openstack/telemetry-specs/specs/juno/ceilometer_client_keystone_v2_v3_update.html</link><description>
 
&lt;p&gt;Keystone declared V2 deprecated in K cycle with the intent of maintaining
V2 for another two cycles after that. All the services clients are going
to add support to V3 in order to smooth this transition.&lt;/p&gt;
&lt;section id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Keystone V3 API has introduced the following major changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Authentication: Custom auth method can be developed as plug-ins, this enables
support for: OAuth 1.0 and SAML based federation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Authorization: in V2 API there are only two levels “admin” or none. V3 API
enables control of who can call each method if the policy file is correctly
specified.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Richer set of APIs. Vendor specific extensions are not supported directly
anymore and there is a set of optional extensions supported by Keystone.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Since Ceilometer Client imports keystoneclient, the main changes to client.py
are to selectively import the correct keystoneclient library version and pass a
number of new options. In shell.py the new options are added to the parser.&lt;/p&gt;
&lt;section id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="data-model-impact"&gt;
&lt;h3&gt;Data model impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="rest-api-impact"&gt;
&lt;h3&gt;REST API impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="security-impact"&gt;
&lt;h3&gt;Security impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pipeline-impact"&gt;
&lt;h3&gt;Pipeline impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-end-user-impact"&gt;
&lt;h3&gt;Other end user impact&lt;/h3&gt;
&lt;p&gt;There will be new commands to be used with the ceilometer client to scope the
request to Domain/Project and support different auth methods.
Alarms are using the ceilometer client and there could be a potential impact.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="performance-scalability-impacts"&gt;
&lt;h3&gt;Performance/Scalability Impacts&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-deployer-impact"&gt;
&lt;h3&gt;Other deployer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="developer-impact"&gt;
&lt;h3&gt;Developer impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;section id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Who is leading the writing of the code? Or is this a blueprint where you’re
throwing it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;fabgia&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Other contributors:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;robsparker&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Ongoing maintainer:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;fabgia&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new parameters to the client and cli.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call the V3 Keystone client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validate the authorization and authentication via python-keystoneclient.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future-lifecycle"&gt;
&lt;h2&gt;Future lifecycle&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Keystone client: python-keystoneclient.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added to the Ceilometer client to support the new parameter
submission as well as validation of the authorization and authentication with
Keystone client.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation changes specific to new parameters added to the client.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Related blueprints:
Ceilometer Client
&lt;a class="reference external" href="https://blueprints.launchpad.net/python-ceilometerclient/+spec/support-keystone-v3-api"&gt;https://blueprints.launchpad.net/python-ceilometerclient/+spec/support-keystone-v3-api&lt;/a&gt;
Keystone
&lt;a class="reference external" href="https://blueprints.launchpad.net/keystone/+spec/document-v2-to-v3-transition"&gt;https://blueprints.launchpad.net/keystone/+spec/document-v2-to-v3-transition&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><pubDate>Fri, 23 May 2014 00:00:00 </pubDate></item></channel></rss>