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:
parent
e59f38083b
commit
1fca78dc63
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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],
|
||||
}
|
||||
}
|
|
@ -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'],
|
||||
}
|
||||
}
|
|
@ -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'
|
||||
|
|
|
@ -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>
|
|
@ -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
|
||||
^^^^^^^^
|
||||
|
||||
|
|
|
@ -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}
|
||||
|
|
Loading…
Reference in New Issue