Add Nova service state metrics

collect number of services in state disabled, up or down.
These metrics are collected from DB with collectd DBI plugin.

Change-Id: I546d9c14f1a0c2d5e3b3c96f8908d83d52720839
This commit is contained in:
Swann Croiset 2015-04-10 11:07:00 +02:00
parent e59f38083b
commit 1fca78dc63
9 changed files with 110 additions and 28 deletions

View File

@ -88,6 +88,18 @@ if $lma_collector['influxdb_mode'] != 'disabled' {
password => $nova['db_password'],
}
class { 'lma_collector::collectd::dbi':
}
lma_collector::collectd::dbi_services { 'nova':
username => 'nova',
dbname => 'nova',
password => $nova['db_password'],
report_interval => 60,
downtime_factor => 2,
require => Class['lma_collector::collectd::dbi'],
}
class { 'lma_collector::logs::metrics': }
if $enable_notifications {

View File

@ -25,28 +25,11 @@ class NovaStatsPlugin(openstack.CollectdPlugin):
""" Class to report the statistics on Nova service.
number of instances broken down by state
number of services by state enabled or disabled
"""
def config_callback(self, config):
super(NovaStatsPlugin, self).config_callback(config)
def _count_services_by_state(self):
r = self.get('nova', 'os-services')
if not r:
self.logger.warning("Could not get services statistics")
return {}
services = {}
for s in r.json().get('services'):
if s['binary'] not in services:
services[s['binary']] = {'enabled': 0, 'disabled': 0}
if s['status'] == 'enabled':
services[s['binary']]['enabled'] += 1
else:
services[s['binary']]['disabled'] += 1
return services
def read_callback(self):
servers_details = self.get_objects_details('nova', 'servers')
@ -57,12 +40,6 @@ class NovaStatsPlugin(openstack.CollectdPlugin):
for s, nb in status.iteritems():
self.dispatch_value('instances', s, nb)
services = self._count_services_by_state()
for service_name, states in services.iteritems():
for s in states.keys():
self.dispatch_value('services.' + service_name,
s, services[service_name][s])
def dispatch_value(self, plugin_instance, name, value):
v = collectd.Values(
plugin=PLUGIN_NAME, # metric source

View File

@ -127,6 +127,8 @@ function process_message ()
msg['Fields']['name'] = 'apache' .. sep .. string.gsub(metric_name, 'scoreboard', 'workers')
elseif metric_source == 'ceph' then
msg['Fields']['name'] = 'ceph' .. sep .. sample['plugin_instance'] .. sep .. sample['type_instance']
elseif metric_source == 'dbi' and sample['plugin_instance'] == 'services_nova' then
msg['Fields']['name'] = 'openstack.nova' .. sep .. sample['type_instance']
else
msg['Fields']['name'] = metric_name
end

View File

@ -0,0 +1,13 @@
class lma_collector::collectd::dbi {
include lma_collector::params
include lma_collector::collectd::service
package { $lma_collector::params::collectd_dbi_package:
ensure => present,
name => $lma_collector::params::collectd_dbi_package,
}
collectd::plugin { 'dbi':
require => Package[$lma_collector::params::collectd_dbi_package],
}
}

View File

@ -0,0 +1,29 @@
define lma_collector::collectd::dbi_services (
$database = undef,
$hostname = 'localhost',
$username = undef,
$password = undef,
$dbname = undef,
$report_interval = $lma_collector::params::worker_report_interval,
$downtime_factor = $lma_collector::params::worker_downtime_factor,
){
include collectd::params
include lma_collector::collectd::service
$service = $title
# A service is declared 'down' if no heartbeat has been received since
# "downtime_factor * report_interval" seconds,
# The "report_interval" must match the corresponding configuration of the service.
$downtime = $report_interval * $downtime_factor
$plugin_conf_dir = $collectd::params::plugin_conf_dir
file { "${plugin_conf_dir}/dbi_${service}_services.conf":
owner => 'root',
group => $collectd::params::root_group,
mode => '0640',
content => template('lma_collector/collectd_dbi_services.conf.erb'),
notify => Class['lma_collector::collectd::service'],
}
}

View File

@ -41,9 +41,11 @@ class lma_collector::params {
case $::osfamily {
'Debian': {
$python_module_path = '/usr/lib/collectd'
$collectd_dbi_package = 'libdbd-mysql'
}
'RedHat': {
$python_module_path = '/usr/lib64/collectd'
$collectd_dbi_package = 'libdbi-dbd-mysql'
}
default: {
fail("${::osfamily} not supported")
@ -61,6 +63,8 @@ class lma_collector::params {
$nova_cpu_allocation_ratio = 8.0
$heartbeat_timeout = 30
$worker_report_interval = 60
$worker_downtime_factor = 2
$elasticsearch_server = false
$elasticsearch_port = '9200'

View File

@ -0,0 +1,40 @@
<Plugin dbi>
<Query "down">
Statement "select concat_ws('.', 'services', replace(s1.binary, 'nova-', ''), 'down') as metric, count(s2.id) as value from services s1 left outer join services s2 on s1.id = s2.id and s1.disabled=0 and s1.deleted=0 and timestampdiff(SECOND,s1.updated_at,utc_timestamp())><%= @downtime %> group by s1.binary;"
MinVersion 50000
<Result>
Type "gauge"
InstancesFrom "metric"
ValuesFrom "value"
</Result>
</Query>
<Query "up">
Statement "select concat_ws('.', 'services', replace(s1.binary, 'nova-', ''), 'up') as metric, count(s2.id) as value from services s1 left outer join services s2 on s1.id = s2.id and s1.disabled=0 and s1.deleted=0 and timestampdiff(SECOND,s1.updated_at,utc_timestamp())<=<%= @downtime %> group by s1.binary;"
MinVersion 50000
<Result>
Type "gauge"
InstancesFrom "metric"
ValuesFrom "value"
</Result>
</Query>
<Query "disabled">
Statement "select concat_ws('.', 'services', replace(s1.binary, 'nova-', ''), 'disabled') as metric, count(s2.id) as value from services s1 left outer join services s2 on s1.id = s2.id and s2.disabled = 1 and s1.deleted=0 group by s1.binary;"
MinVersion 50000
<Result>
Type "gauge"
InstancesFrom "metric"
ValuesFrom "value"
</Result>
</Query>
<Database "services_<%= @service%>">
Driver "mysql"
DriverOption "host" "<%= @hostname %>"
DriverOption "username" "<%= @username %>"
DriverOption "password" "<%= @password %>"
DriverOption "dbname" "<%= @dbname %>"
SelectDB "<%= @dbname %>"
Query "disabled"
Query "up"
Query "down"
</Database>
</Plugin>

View File

@ -26,15 +26,19 @@ These metrics are emitted per compute node.
These metrics are retrieved from the Nova API.
* ``openstack.nova.instances.<state>``, the number of instances by state.
* ``openstack.nova.services.<service>.enabled``, the number of enabled Nova
services by service name.
* ``openstack.nova.services.<service>.disabled``, the number of disabled Nova
services by service name.
``<state>`` is one of 'active', 'deleted', 'error', 'paused', 'resumed', 'rescued', 'resized', 'shelved_offloaded' or 'suspended'.
These metrics are retrieved from the Nova database.
* ``openstack.nova.services.<service>.<service_state>``, the total number of Nova
services by state.
``<service>`` is one of service is one of 'compute', 'conductor', 'scheduler', 'cert' or 'consoleauth'.
``<service_state>`` is one of 'up', 'down' or 'disabled'.
Identity
^^^^^^^^

View File

@ -50,7 +50,8 @@ download_packages \
http://mirrors.kernel.org/ubuntu/pool/universe/c/collectd/collectd-core_5.4.0-3ubuntu2_amd64.deb \
http://mirrors.kernel.org/ubuntu/pool/main/libd/libdbi/libdbi1_0.9.0-1_amd64.deb \
http://mirrors.kernel.org/ubuntu/pool/main/r/rrdtool/librrd4_1.4.7-2ubuntu5_amd64.deb \
http://mirrors.kernel.org/ubuntu/pool/universe/c/collectd/collectd_5.4.0-3ubuntu2_amd64.deb
http://mirrors.kernel.org/ubuntu/pool/universe/c/collectd/collectd_5.4.0-3ubuntu2_amd64.deb \
http://mirrors.kernel.org/ubuntu/pool/main/libd/libdbi-drivers/libdbd-mysql_0.9.0-2ubuntu2_amd64.deb
# Extract dependent manifests from fuel-library
rm -rf ${MODULES_DIR}/{cinder,glance,heat,inifile,keystone,neutron,nova,openstack,stdlib,concat}