Add support to customize polling meters

This adds a new parameter called polling_meters
to the ceilometer::agent::polling class.

If you pass a array of strings this parameter
will then populate the meters in the polling.yaml
file by inserting them in the templated polling file.

The default values that was hardcoded in the template
is still the same but has been moved to the params class
as an array of strings.

Change-Id: Iae2567b5a0f24b2aa80f9640ff10df96cd656922
This commit is contained in:
Tobias Urdin
2018-07-23 22:21:21 +02:00
parent dfe9385457
commit f236f531df
5 changed files with 189 additions and 130 deletions

View File

@@ -48,6 +48,11 @@
# (Optional) Number of seconds between polling cycle # (Optional) Number of seconds between polling cycle
# Defaults to 600 seconds, used only if manage_polling is true. # Defaults to 600 seconds, used only if manage_polling is true.
# #
# [*polling_meters*]
# (Optional) Array of strings with meters to add to
# the polling.yaml file, used only if manage_polling is true.
# Defaults to $::ceilometer::params::polling_meters
#
class ceilometer::agent::polling ( class ceilometer::agent::polling (
$manage_service = true, $manage_service = true,
$enabled = true, $enabled = true,
@@ -59,6 +64,7 @@ class ceilometer::agent::polling (
$instance_discovery_method = $::os_service_default, $instance_discovery_method = $::os_service_default,
$manage_polling = false, $manage_polling = false,
$polling_interval = 600, $polling_interval = 600,
$polling_meters = $::ceilometer::params::polling_meters,
) inherits ceilometer { ) inherits ceilometer {
include ::ceilometer::deps include ::ceilometer::deps

View File

@@ -6,13 +6,40 @@
class ceilometer::params { class ceilometer::params {
include ::openstacklib::defaults include ::openstacklib::defaults
$dbsync_command = 'ceilometer-upgrade' $dbsync_command = 'ceilometer-upgrade'
$expirer_command = 'ceilometer-expirer' $expirer_command = 'ceilometer-expirer'
$user = 'ceilometer' $user = 'ceilometer'
$event_pipeline = '/etc/ceilometer/event_pipeline.yaml' $event_pipeline = '/etc/ceilometer/event_pipeline.yaml'
$pipeline = '/etc/ceilometer/pipeline.yaml' $pipeline = '/etc/ceilometer/pipeline.yaml'
$polling = '/etc/ceilometer/polling.yaml' $polling = '/etc/ceilometer/polling.yaml'
$group = 'ceilometer' $group = 'ceilometer'
$polling_meters = [
'cpu',
'cpu_l3_cache',
'memory.usage',
'network.incoming.bytes',
'network.incoming.packets',
'network.outgoing.bytes',
'network.outgoing.packets',
'disk.read.bytes',
'disk.read.requests',
'disk.write.bytes',
'disk.write.requests',
'volume.size',
'volume.snapshot.size',
'volume.backup.size',
'hardware.cpu.util',
'hardware.memory.used',
'hardware.memory.total',
'hardware.memory.buffer',
'hardware.memory.cached',
'hardware.memory.swap.avail',
'hardware.memory.swap.total',
'hardware.system_stats.io.outgoing.blocks',
'hardware.system_stats.io.incoming.blocks',
'hardware.network.ip.incoming.datagrams',
'hardware.network.ip.outgoing.datagrams',
]
case $::osfamily { case $::osfamily {
'RedHat': { 'RedHat': {

View File

@@ -0,0 +1,6 @@
---
features:
- |
New parameter ceilometer::agent::polling::polling_meters can now be used to
populate the list of pollers in the ceilometer polling.yaml file. The default
values in this file is still the same.

View File

@@ -3,142 +3,180 @@ require 'spec_helper'
describe 'ceilometer::agent::polling' do describe 'ceilometer::agent::polling' do
let :pre_condition do let :pre_condition do
"include nova\n" + "include nova
"include nova::compute\n" + include nova::compute
"class { 'ceilometer': telemetry_secret => 's3cr3t' }" class { 'ceilometer': telemetry_secret => 's3cr3t' }"
end end
let :params do let :params do
{ :enabled => true, {}
:manage_service => true,
:package_ensure => 'latest',
:central_namespace => true,
:compute_namespace => true,
:ipmi_namespace => true,
:coordination_url => 'redis://localhost:6379',
}
end end
shared_examples_for 'ceilometer-polling' do shared_examples 'ceilometer::agent::polling' do
context 'with default params' do
it { should contain_class('ceilometer::deps') }
it { should contain_class('ceilometer::params') }
it { is_expected.to contain_class('ceilometer::deps') } it {
it { is_expected.to contain_class('ceilometer::params') }
context 'when compute_namespace => true' do
it 'adds ceilometer user to nova group and, if required, to libvirt group' do
if platform_params[:libvirt_group] if platform_params[:libvirt_group]
is_expected.to contain_user('ceilometer').with_groups(['nova', "#{platform_params[:libvirt_group]}"]) should contain_user('ceilometer').with_groups(['nova', "#{platform_params[:libvirt_group]}"])
else else
is_expected.to contain_user('ceilometer').with_groups(['nova']) should contain_user('ceilometer').with_groups(['nova'])
end end
end }
it 'ensures nova-common is installed before the package ceilometer-common' do it { should contain_package('nova-common').with(
is_expected.to contain_package('nova-common').with( :before => /Package\[ceilometer-common\]/
:before => /Package\[ceilometer-common\]/ )}
)
end
it 'configures agent compute' do it { should contain_ceilometer_config('compute/instance_discovery_method').with_value('<SERVICE DEFAULT>') }
is_expected.to contain_ceilometer_config('compute/instance_discovery_method').with_value('<SERVICE DEFAULT>')
end
end
it 'installs ceilometer-polling package' do it { should contain_package('ceilometer-polling').with(
is_expected.to contain_package('ceilometer-polling').with( :ensure => 'present',
:ensure => 'latest',
:name => platform_params[:agent_package_name], :name => platform_params[:agent_package_name],
:tag => ['openstack', 'ceilometer-package'], :tag => ['openstack', 'ceilometer-package'],
) )}
it { should contain_ceilometer_config('DEFAULT/polling_namespaces').with_value('central,compute,ipmi') }
it { should contain_service('ceilometer-polling').with(
:ensure => 'running',
:name => platform_params[:agent_service_name],
:enable => true,
:hasstatus => true,
:hasrestart => true,
:tag => 'ceilometer-service',
)}
it { should_not contain_ceilometer_config('coordination/backend_url') }
it { should_not contain_file('polling') }
end end
it 'configures polling namespaces' do context 'when setting package_ensure' do
is_expected.to contain_ceilometer_config('DEFAULT/polling_namespaces').with_value('central,compute,ipmi') before do
end params.merge!( :package_ensure => 'latest' )
[{:enabled => true}, {:enabled => false}].each do |param_hash|
context "when service should be #{param_hash[:enabled] ? 'enabled' : 'disabled'}" do
before do
params.merge!(param_hash)
end
it 'configures ceilometer-polling service' do
is_expected.to contain_service('ceilometer-polling').with(
:ensure => (params[:manage_service] && params[:enabled]) ? 'running' : 'stopped',
:name => platform_params[:agent_service_name],
:enable => params[:enabled],
:hasstatus => true,
:hasrestart => true,
:tag => 'ceilometer-service',
)
end
end end
end
it { should contain_package('ceilometer-polling').with(
:ensure => 'latest',
)}
end
context 'when setting instance_discovery_method' do context 'when setting instance_discovery_method' do
before do before do
params.merge!({ :instance_discovery_method => 'naive' }) params.merge!( :instance_discovery_method => 'naive' )
end end
it 'configures agent compute instance discovery' do it { should contain_ceilometer_config('compute/instance_discovery_method').with_value('naive') }
is_expected.to contain_ceilometer_config('compute/instance_discovery_method').with_value('naive')
end
end end
context 'with central and ipmi polling namespaces disabled' do context 'with central and ipmi polling namespaces disabled' do
before do before do
params.merge!({ params.merge!( :central_namespace => false,
:central_namespace => false, :ipmi_namespace => false )
:ipmi_namespace => false })
end end
it 'configures compute polling namespace' do it { should contain_ceilometer_config('DEFAULT/polling_namespaces').with_value('compute') }
is_expected.to contain_ceilometer_config('DEFAULT/polling_namespaces').with_value('compute')
end
end end
context 'with disabled service managing' do context 'with disabled service managing' do
before do before do
params.merge!({ params.merge!( :manage_service => false,
:manage_service => false, :enabled => false )
:enabled => false })
end end
it 'configures ceilometer-polling service' do it { should contain_service('ceilometer-polling').with(
is_expected.to contain_service('ceilometer-polling').with( :ensure => nil,
:ensure => nil, :name => platform_params[:agent_service_name],
:name => platform_params[:agent_service_name], :enable => false,
:enable => false, :hasstatus => true,
:hasstatus => true, :hasrestart => true,
:hasrestart => true, :tag => 'ceilometer-service',
:tag => 'ceilometer-service', )}
) end
context 'with polling management enabled and default meters' do
before do
params.merge!( :manage_polling => true )
end
it { should contain_file('polling').with(
:ensure => 'present',
:path => '/etc/ceilometer/polling.yaml',
:content => '---
sources:
- name: some_pollsters
interval: 600
meters:
- cpu
- cpu_l3_cache
- memory.usage
- network.incoming.bytes
- network.incoming.packets
- network.outgoing.bytes
- network.outgoing.packets
- disk.read.bytes
- disk.read.requests
- disk.write.bytes
- disk.write.requests
- volume.size
- volume.snapshot.size
- volume.backup.size
- hardware.cpu.util
- hardware.memory.used
- hardware.memory.total
- hardware.memory.buffer
- hardware.memory.cached
- hardware.memory.swap.avail
- hardware.memory.swap.total
- hardware.system_stats.io.outgoing.blocks
- hardware.system_stats.io.incoming.blocks
- hardware.network.ip.incoming.datagrams
- hardware.network.ip.outgoing.datagrams
',
:selinux_ignore_defaults => true,
:tag => 'ceilometer-yamls',
)}
end
context 'with polling and custom config' do
before do
params.merge!( :manage_polling => true,
:polling_interval => 30,
:polling_meters => ['meter1', 'meter2'] )
end end
it { should contain_file('polling').with(
:ensure => 'present',
:path => '/etc/ceilometer/polling.yaml',
:content => '---
sources:
- name: some_pollsters
interval: 30
meters:
- meter1
- meter2
',
:selinux_ignore_defaults => true,
:tag => 'ceilometer-yamls',
)}
end end
context "with polling management enabled" do context 'with polling management disabled' do
before { params.merge!( before do
:manage_polling => true params.merge!( :manage_polling => false )
) } end
it { is_expected.to contain_file('polling').with( it { should_not contain_file('polling') }
'path' => '/etc/ceilometer/polling.yaml',
) }
end end
context "with polling management disabled" do context 'when setting coordination_url' do
before { params.merge!( before do
:manage_polling => false params.merge!( :coordination_url => 'redis://localhost:6379' )
) } end
it { is_expected.not_to contain_file('polling') } it { should contain_ceilometer_config('coordination/backend_url').with_value('redis://localhost:6379') }
end end
it 'configures central agent' do
is_expected.to contain_ceilometer_config('coordination/backend_url').with_value( params[:coordination_url] )
end
end end
on_supported_os({ on_supported_os({
@@ -152,16 +190,20 @@ describe 'ceilometer::agent::polling' do
let :platform_params do let :platform_params do
case facts[:osfamily] case facts[:osfamily]
when 'Debian' when 'Debian'
{ :agent_package_name => 'ceilometer-polling', {
:agent_package_name => 'ceilometer-polling',
:agent_service_name => 'ceilometer-polling', :agent_service_name => 'ceilometer-polling',
:libvirt_group => 'libvirt' } :libvirt_group => 'libvirt'
}
when 'RedHat' when 'RedHat'
{ :agent_package_name => 'openstack-ceilometer-polling', {
:agent_service_name => 'openstack-ceilometer-polling' } :agent_package_name => 'openstack-ceilometer-polling',
:agent_service_name => 'openstack-ceilometer-polling'
}
end end
end end
it_behaves_like 'ceilometer-polling' it_behaves_like 'ceilometer::agent::polling'
end end
end end

View File

@@ -3,28 +3,6 @@ sources:
- name: some_pollsters - name: some_pollsters
interval: <%= @polling_interval %> interval: <%= @polling_interval %>
meters: meters:
- cpu <% @polling_meters.each do |meter| -%>
- cpu_l3_cache - <%= meter %>
- memory.usage <% end -%>
- network.incoming.bytes
- network.incoming.packets
- network.outgoing.bytes
- network.outgoing.packets
- disk.read.bytes
- disk.read.requests
- disk.write.bytes
- disk.write.requests
- volume.size
- volume.snapshot.size
- volume.backup.size
- hardware.cpu.util
- hardware.memory.used
- hardware.memory.total
- hardware.memory.buffer
- hardware.memory.cached
- hardware.memory.swap.avail
- hardware.memory.swap.total
- hardware.system_stats.io.outgoing.blocks
- hardware.system_stats.io.incoming.blocks
- hardware.network.ip.incoming.datagrams
- hardware.network.ip.outgoing.datagrams