# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import logging from collections import Counter, defaultdict from prometheus_client import CollectorRegistry, generate_latest, Gauge from base import OSBase logger = logging.getLogger(__name__) class CinderServiceStats(OSBase): """ Class to report the statistics on Cinder services. state of workers broken down by state """ def build_cache_data(self): aggregated_workers = defaultdict(Counter) stats = self.osclient.get_workers('cinderv3') for worker in stats: service = worker['service'] state = worker['state'] aggregated_workers[service][state] += 1 for service in aggregated_workers: totalw = sum(aggregated_workers[service].values()) for state in self.osclient.states: prct = (100.0 * aggregated_workers[service][state]) / totalw stats.append({ 'stat_name': "services_{}_{}_percent".format(service, state), 'stat_value': prct, 'state': state, 'service': service }) stats.append({ 'stat_name': "services_{}_{}_total".format(service, state), 'stat_value': aggregated_workers[service][state], 'state': state, 'service': service }) return stats def get_cache_key(self): return "cinder_services_stats" def get_stats(self): registry = CollectorRegistry() labels = ['region', 'host', 'service', 'state'] cinder_services_stats_cache = self.get_cache_data() for cinder_services_stat in cinder_services_stats_cache: stat_gauge = Gauge( self.gauge_name_sanitize( cinder_services_stat['stat_name']), 'Openstack Cinder Service statistic', labels, registry=registry) label_values = [self.osclient.region, cinder_services_stat.get('host', ''), cinder_services_stat.get('service', ''), cinder_services_stat.get('state', '')] stat_gauge.labels( * label_values).set( cinder_services_stat['stat_value']) return generate_latest(registry)