def __init__(self, config_file=None): if not config_file: self.config_file = '/etc/openshift_tools/container_metrics.yml' else: self.config_file = config_file self.config = None self.parse_config() self.cli = AutoVersionClient(base_url='unix://var/run/docker.sock', timeout=120) self.docker_util = DockerUtil(self.cli) self.zagg_sender = ZaggSender(verbose=True)
#print docker_p.memory_info().vms docker_memoryusage['rss'] = docker_p.memory_info().rss docker_memoryusage['vms'] = docker_p.memory_info().vms except psutil.NoSuchProcess: print 'error' return docker_memoryusage if __name__ == "__main__": keys = None ms = MetricSender() try: cli = DockerClient(version='auto', base_url='unix://var/run/docker.sock', timeout=120) du = DockerUtil(cli) du_dds = du.get_disk_usage() docker_memoryusages = getRssVmsofDocker() keys = { 'docker.storage.is_loopback': int(du.is_loopback), 'docker.ping': 1, # Docker is up } # These storage metrics are only available in devicemapper and loopback if du.is_devicemapper or du.is_loopback: keys['docker.storage.data.space.used'] = du_dds.data_space_used keys['docker.storage.data.space.available'] = du_dds.data_space_available keys['docker.storage.data.space.percent_available'] = du_dds.data_space_percent_available keys['docker.storage.data.space.total'] = du_dds.data_space_total
class DockerContainerUsageCli(object): ''' This is the class that actually pulls eveyrthing together into a cli script. ''' def __init__(self, config_file=None): if not config_file: self.config_file = '/etc/openshift_tools/container_metrics.yml' else: self.config_file = config_file self.config = None self.parse_config() self.cli = AutoVersionClient(base_url='unix://var/run/docker.sock', timeout=120) self.docker_util = DockerUtil(self.cli) self.metric_sender = MetricSender(verbose=True) def parse_config(self): """ parse config file """ if not self.config: if not os.path.exists(self.config_file): raise IOError(self.config_file + " does not exist.") self.config = yaml.load(file(self.config_file)) def format_ctr_name(self, ctr_name): ''' Takes a container name and if there's a name_format_regex specified, it applies it ''' for item in self.config['usage_checks']: name_match_regex = item['name_match_regex'] if item.has_key('name_format_regex') and re.match( name_match_regex, ctr_name): try: name_format_regex = item['name_format_regex'] new_name = re.sub(name_match_regex, name_format_regex, ctr_name) return new_name except sre_constants.error as ex: # Just use the full name (we don't want to die because of name formatting) print "\nError: %s: [%s]. Using full name [%s].\n" % ( ex.message, name_format_regex, ctr_name) return ctr_name return ctr_name def main(self): ''' The main entrypoint of the cli ''' ctr_regexes = [ uchk['name_match_regex'] for uchk in self.config['usage_checks'] ] use_cgroups = self.config.get('use_cgroups', False) ctrs = self.docker_util.get_ctrs_matching_names(ctr_regexes) for ctr_name, ctr in ctrs.iteritems(): (cpu_stats, mem_stats) = self.docker_util.get_ctr_stats( ctr, use_cgroups=use_cgroups) formatted_ctr_name = self.format_ctr_name(ctr_name) # Add the container hostnames as macros for the dynamic item. self.metric_sender.add_dynamic_metric(ZBX_DOCKER_DISC_KEY, ZBX_DOCKER_DISC_MACRO, [formatted_ctr_name]) data = { '%s[%s]' % (ZBX_CTR_CPU_USED_PCT_KEY, formatted_ctr_name): cpu_stats.used_pct, '%s[%s]' % (ZBX_CTR_MEM_USED_KEY, formatted_ctr_name): mem_stats.used, '%s[%s]' % (ZBX_CTR_MEM_LIMIT_KEY, formatted_ctr_name): mem_stats.limit, '%s[%s]' % (ZBX_CTR_MEM_LIMIT_USED_PCT_KEY, formatted_ctr_name): mem_stats.limit_used_pct, '%s[%s]' % (ZBX_CTR_MEM_FAILCNT_KEY, formatted_ctr_name): mem_stats.failcnt, } print "%s:" % formatted_ctr_name for k, v in data.iteritems(): print " %s: %s" % (k, v) print self.metric_sender.add_metric(data) # Actually send the metrics self.metric_sender.send_metrics()
# pylint: disable=invalid-name from docker import AutoVersionClient from docker.errors import DockerException from openshift_tools.monitoring.zagg_sender import ZaggSender from openshift_tools.timeout import TimeoutException from openshift_tools.monitoring.dockerutil import DockerUtil import json if __name__ == "__main__": keys = None zs = ZaggSender() try: cli = AutoVersionClient(base_url='unix://var/run/docker.sock') du = DockerUtil(cli) du_dds = du.get_disk_usage() keys = { 'docker.storage.data.space.used': du_dds.data_space_used, 'docker.storage.data.space.available': du_dds.data_space_available, 'docker.storage.data.space.percent_available': du_dds.data_space_percent_available, 'docker.storage.data.space.total': du_dds.data_space_total, 'docker.storage.metadata.space.used': du_dds.metadata_space_used, 'docker.storage.metadata.space.available': du_dds.metadata_space_available, 'docker.storage.metadata.space.percent_available': du_dds.metadata_space_percent_available, 'docker.storage.metadata.space.total': du_dds.metadata_space_total, 'docker.storage.is_loopback': int(du_dds.is_loopback), 'docker.ping': 1, # Docker is up
from docker import AutoVersionClient from docker.errors import DockerException from openshift_tools.monitoring.zagg_sender import ZaggSender from openshift_tools.timeout import TimeoutException from openshift_tools.monitoring.dockerutil import DockerUtil import json import time if __name__ == "__main__": keys = None zs = ZaggSender() try: cli = AutoVersionClient(base_url="unix://var/run/docker.sock") du = DockerUtil(cli, max_wait=360) # Wait up to 6 minutes time_start = time.time() du.get_disk_usage() time_stop = time.time() elapsed_ms = int((time_stop - time_start) * 1000) keys = {"docker.info_elapsed_ms": elapsed_ms} except (DockerException, TimeoutException) as ex: print "\nERROR talking to docker: %s\n" % ex.message keys = {"docker.info_elapsed_ms": 360000} # 360000 = 6 minutes zs.add_zabbix_keys(keys) print "Sending these metrics:"
from docker import APIClient as DockerClient from docker.errors import DockerException from openshift_tools.monitoring.metric_sender import MetricSender from openshift_tools.timeout import TimeoutException from openshift_tools.monitoring.dockerutil import DockerUtil import json import time if __name__ == "__main__": keys = None mts = MetricSender() try: cli = DockerClient(version='auto', base_url='unix://var/run/docker.sock', timeout=120) du = DockerUtil(cli, max_wait=360) # Wait up to 6 minutes time_start = time.time() du.get_disk_usage() time_stop = time.time() elapsed_ms = int((time_stop - time_start) * 1000) keys = { 'docker.info_elapsed_ms': elapsed_ms } except (DockerException, TimeoutException) as ex: print "\nERROR talking to docker: %s\n" % ex.message keys = { 'docker.info_elapsed_ms': 360000 # 360000 = 6 minutes }