def __init__(self): self.docker_util = DockerUtil() try: config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) check_config = check_yaml(config_file_path) instance = check_config['instances'][0] # kubernetes.yaml was not found except IOError as ex: log.error(ex.message) instance = {} except Exception: log.error('Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...') instance = {} self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self.host = instance.get("host") or self.docker_util.get_hostname() self.cadvisor_port = instance.get('port', KubeUtil.DEFAULT_CADVISOR_PORT) self.kubelet_port = instance.get('kubelet_port', KubeUtil.DEFAULT_KUBELET_PORT) self.metrics_url = urljoin( '%s://%s:%d' % (self.method, self.host, self.cadvisor_port), KubeUtil.METRICS_PATH) self.pods_list_url = urljoin( '%s://%s:%d' % (self.method, self.host, self.kubelet_port), KubeUtil.PODS_LIST_PATH) self.kube_health_url = '%s://%s:%d/healthz' % (self.method, self.host, self.kubelet_port)
def get_check_config(self): """Read the config from docker_daemon.yaml""" from util import check_yaml from utils.checkfiles import get_conf_path init_config, instances = {}, [] try: conf_path = get_conf_path(CHECK_NAME) except IOError as ex: log.debug(ex.message) return init_config, {} if conf_path is not None and os.path.exists(conf_path): try: check_config = check_yaml(conf_path) init_config, instances = check_config.get('init_config', {}), check_config['instances'] init_config = {} if init_config is None else init_config except Exception: log.exception('Docker check configuration file is invalid. The docker check and ' 'other Docker related components will not work.') init_config, instances = {}, [] if len(instances) > 0: instance = instances[0] else: instance = {} log.error('No instance was found in the docker check configuration.' ' Docker related collection will not work.') return init_config, instance
def __init__(self): try: config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) check_config = check_yaml(config_file_path) instance = check_config['instances'][0] except IOError as ex: log.error(ex.message) instance = {} except Exception: log.error( 'Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...') instance = {} self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self.host = instance.get("host") or self._get_default_router() self.cadvisor_port = instance.get('port', KubeUtil.DEFAULT_CADVISOR_PORT) self.kubelet_port = instance.get('kubelet_port', KubeUtil.DEFAULT_KUBELET_PORT) self.metrics_url = urljoin( '%s://%s:%d' % (self.method, self.host, self.cadvisor_port), KubeUtil.METRICS_PATH) self.pods_list_url = urljoin( '%s://%s:%d' % (self.method, self.host, self.kubelet_port), KubeUtil.PODS_LIST_PATH) self.kube_health_url = '%s://%s:%d/healthz' % (self.method, self.host, self.kubelet_port)
def __init__(self): config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) try: check_config = check_yaml(config_file_path) instance = check_config['instances'][0] except Exception: log.error('Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...') instance = {} self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self.host = instance.get("host") or self._get_default_router() self.master_host = instance.get('master_host', self.host) self.cadvisor_port = instance.get('port', KubeUtil.DEFAULT_CADVISOR_PORT) self.kubelet_port = instance.get('kubelet_port', KubeUtil.DEFAULT_KUBELET_PORT) self.master_port = instance.get('master_port', KubeUtil.DEFAULT_MASTER_PORT) self.metrics_url = urljoin( '%s://%s:%d' % (self.method, self.host, self.cadvisor_port), KubeUtil.METRICS_PATH) self.pods_list_url = urljoin( '%s://%s:%d' % (self.method, self.host, self.kubelet_port), KubeUtil.PODS_LIST_PATH) self.master_url_nodes = '%s://%s:%d/api/v1/nodes' % (self.method, self.master_host, self.master_port) self.kube_health_url = '%s://%s:%d/healthz' % (self.method, self.host, self.kubelet_port)
def get_check_config(self): """Read the config from docker_daemon.yaml""" from util import check_yaml from utils.checkfiles import get_conf_path init_config, instances = {}, [] try: conf_path = get_conf_path(CHECK_NAME) except IOError: log.debug("Couldn't find docker settings, trying with defaults.") return init_config, {} if conf_path is not None and os.path.exists(conf_path): try: check_config = check_yaml(conf_path) init_config, instances = check_config.get( 'init_config', {}), check_config['instances'] init_config = {} if init_config is None else init_config except Exception: log.exception( 'Docker check configuration file is invalid. The docker check and ' 'other Docker related components will not work.') init_config, instances = {}, [] if len(instances) > 0: instance = instances[0] else: instance = {} log.error( 'No instance was found in the docker check configuration.' ' Docker related collection will not work.') return init_config, instance
def get_check_config(self): from util import check_yaml from utils.checkfiles import get_conf_path init_config, instances = {}, [] try: conf_path = get_conf_path(CHECK_NAME) except IOError as ex: log.debug(ex.message) return init_config, {} if conf_path is not None and os.path.exists(conf_path): try: check_config = check_yaml(conf_path) init_config, instances = check_config.get('init_config', {}), check_config['instances'] init_config = {} if init_config is None else init_config except Exception: log.exception('Docker check configuration file is invalid. The docker check and ' 'other Docker related components will not work.') init_config, instances = {}, [] if len(instances) > 0: instance = instances[0] else: instance = {} log.error('No instance was found in the docker check configuration.' ' Docker related collection will not work.') return init_config, instance
def __init__(self, instance=None): self.docker_util = DockerUtil() if instance is None: try: config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) check_config = check_yaml(config_file_path) instance = check_config['instances'][0] # kubernetes.yaml was not found except IOError as ex: log.error(ex.message) instance = {} except Exception: log.error('Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...') instance = {} self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self.host = instance.get("host") or self.docker_util.get_hostname() self._node_ip = self._node_name = None # lazy evaluation self.host_name = os.environ.get('HOSTNAME') self.cadvisor_port = instance.get('port', KubeUtil.DEFAULT_CADVISOR_PORT) self.kubelet_port = instance.get('kubelet_port', KubeUtil.DEFAULT_KUBELET_PORT) self.kubelet_api_url = '%s://%s:%d' % (self.method, self.host, self.kubelet_port) self.cadvisor_url = '%s://%s:%d' % (self.method, self.host, self.cadvisor_port) self.kubernetes_api_url = 'https://%s/api/v1' % (os.environ.get('KUBERNETES_SERVICE_HOST') or self.DEFAULT_MASTER_NAME) self.metrics_url = urljoin(self.cadvisor_url, KubeUtil.METRICS_PATH) self.pods_list_url = urljoin(self.kubelet_api_url, KubeUtil.PODS_LIST_PATH) self.kube_health_url = urljoin(self.kubelet_api_url, 'healthz') # keep track of the latest k8s event we collected and posted # default value is 0 but TTL for k8s events is one hour anyways self.last_event_collection_ts = defaultdict(int)
def __init__(self, instance=None): self.docker_util = DockerUtil() if instance is None: try: config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) check_config = check_yaml(config_file_path) instance = check_config['instances'][0] # kubernetes.yaml was not found except IOError as ex: log.error(ex.message) instance = {} except Exception: log.error( 'Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...' ) instance = {} self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self._node_ip = self._node_name = None # lazy evaluation self.host_name = os.environ.get('HOSTNAME') self.tls_settings = self._init_tls_settings(instance) # apiserver self.kubernetes_api_url = 'https://%s/api/v1' % ( os.environ.get('KUBERNETES_SERVICE_HOST') or self.DEFAULT_MASTER_NAME) # kubelet try: self.kubelet_api_url = self._locate_kubelet(instance) if not self.kubelet_api_url: raise Exception( "Couldn't find a method to connect to kubelet.") except Exception as ex: log.error( "Kubernetes check exiting, cannot run without access to kubelet." ) raise ex self.kubelet_host = self.kubelet_api_url.split(':')[1].lstrip('/') self.pods_list_url = urljoin(self.kubelet_api_url, KubeUtil.PODS_LIST_PATH) self.kube_health_url = urljoin(self.kubelet_api_url, KubeUtil.KUBELET_HEALTH_PATH) # cadvisor self.cadvisor_port = instance.get('port', KubeUtil.DEFAULT_CADVISOR_PORT) self.cadvisor_url = '%s://%s:%d' % (self.method, self.kubelet_host, self.cadvisor_port) self.metrics_url = urljoin(self.cadvisor_url, KubeUtil.METRICS_PATH) self.machine_info_url = urljoin(self.cadvisor_url, KubeUtil.MACHINE_INFO_PATH) # keep track of the latest k8s event we collected and posted # default value is 0 but TTL for k8s events is one hour anyways self.last_event_collection_ts = 0
def detect_is_k8s(): """ Logic for DockerUtil to detect whether to enable Kubernetes code paths It check whether we have a KUBERNETES_PORT environment variable (running in a pod) or a valid kubernetes.yaml conf file """ if 'KUBERNETES_PORT' in os.environ: return True else: try: k8_config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) k8_check_config = check_yaml(k8_config_file_path) return len(k8_check_config['instances']) > 0 except Exception as err: log.debug("Error detecting kubernetes: %s" % str(err)) return False
def __init__(self, **kwargs): self.docker_util = DockerUtil() if 'init_config' in kwargs and 'instance' in kwargs: init_config = kwargs.get('init_config', {}) instance = kwargs.get('instance', {}) else: try: config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) check_config = check_yaml(config_file_path) init_config = check_config['init_config'] or {} instance = check_config['instances'][0] or {} # kubernetes.yaml was not found except IOError as ex: log.error(ex.message) init_config, instance = {}, {} except Exception: log.error( 'Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...' ) init_config, instance = {}, {} self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self._node_ip = self._node_name = None # lazy evaluation self.host_name = os.environ.get('HOSTNAME') self.pod_name = os.environ.get('KUBERNETES_POD_NAME') or self.host_name self.tls_settings = self._init_tls_settings(instance) # apiserver if 'api_server_url' in instance: self.kubernetes_api_root_url = instance.get('api_server_url') else: master_host = os.environ.get( 'KUBERNETES_SERVICE_HOST') or self.DEFAULT_MASTER_NAME master_port = os.environ.get( 'KUBERNETES_SERVICE_PORT') or self.DEFAULT_MASTER_PORT self.kubernetes_api_root_url = 'https://%s:%s' % (master_host, master_port) self.kubernetes_api_url = '%s/api/v1' % self.kubernetes_api_root_url # Service mapping helper class self._service_mapper = PodServiceMapper(self) from config import _is_affirmative self.collect_service_tag = _is_affirmative( instance.get('collect_service_tags', KubeUtil.DEFAULT_COLLECT_SERVICE_TAG)) # leader status triggers event collection self.is_leader = False self.leader_elector = None self.leader_lease_duration = instance.get('leader_lease_duration') # kubelet # If kubelet_api_url is None, init_kubelet didn't succeed yet. self.init_success = False self.kubelet_api_url = None self.init_retry_interval = init_config.get('init_retry_interval', DEFAULT_RETRY_INTERVAL) self.last_init_retry = None self.left_init_retries = init_config.get('init_retries', DEFAULT_INIT_RETRIES) + 1 self.init_kubelet(instance) self.kube_label_prefix = instance.get('label_to_tag_prefix', KubeUtil.DEFAULT_LABEL_PREFIX) self.kube_node_labels = instance.get('node_labels_to_host_tags', {}) # keep track of the latest k8s event we collected and posted # default value is 0 but TTL for k8s events is one hour anyways self.last_event_collection_ts = 0
def __init__(self, instance=None): self.docker_util = DockerUtil() if instance is None: try: config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) check_config = check_yaml(config_file_path) instance = check_config['instances'][0] # kubernetes.yaml was not found except IOError as ex: log.error(ex.message) instance = {} except Exception: log.error( 'Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...' ) instance = {} self.timeoutSeconds = instance.get("timeoutSeconds", KubeUtil.DEFAULT_TIMEOUT_SECONDS) self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self.host = instance.get("host") or self.docker_util.get_hostname() self._node_ip = self._node_name = None # lazy evaluation self.host_name = os.environ.get('HOSTNAME') self.cadvisor_port = instance.get('port', KubeUtil.DEFAULT_CADVISOR_PORT) self.kubelet_port = instance.get('kubelet_port', KubeUtil.DEFAULT_KUBELET_PORT) self.master_method = instance.get('master_method', KubeUtil.DEFAULT_MASTER_METHOD) self.master_name = instance.get('master_name', KubeUtil.DEFAULT_MASTER_NAME) self.master_port = instance.get('master_port', KubeUtil.DEFAULT_MASTER_PORT) self.use_kube_auth = instance.get('use_kube_auth', KubeUtil.DEFAULT_USE_KUBE_AUTH) self.kubelet_api_url = '%s://%s:%d' % (self.method, self.host, self.kubelet_port) self.cadvisor_url = '%s://%s:%d' % (self.method, self.host, self.cadvisor_port) self.master_host = os.environ.get('KUBERNETES_SERVICE_HOST') or ( '%s:%d' % (self.master_name, self.master_port)) self.kubernetes_api_url = '%s://%s/api/v1/' % (self.master_method, self.master_host) self.kubernetes_api_extension_url = '%s://%s/apis/extensions/v1beta1/' % ( self.master_method, self.master_host) self.metrics_url = urljoin(self.cadvisor_url, KubeUtil.METRICS_PATH) self.machine_info_url = urljoin(self.cadvisor_url, KubeUtil.MACHINE_INFO_PATH) self.nodes_list_url = urljoin(self.kubernetes_api_url, KubeUtil.NODES_LIST_PATH) self.services_list_url = urljoin(self.kubernetes_api_url, KubeUtil.SERVICES_LIST_PATH) self.endpoints_list_url = urljoin(self.kubernetes_api_url, KubeUtil.ENDPOINTS_LIST_PATH) self.pods_list_url = urljoin(self.kubernetes_api_url, KubeUtil.PODS_LIST_PATH) self.deployments_list_url = urljoin(self.kubernetes_api_extension_url, KubeUtil.DEPLOYMENTS_LIST_PATH) self.kube_health_url = urljoin(self.kubelet_api_url, 'healthz') # keep track of the latest k8s event we collected and posted # default value is 0 but TTL for k8s events is one hour anyways self.last_event_collection_ts = defaultdict(int)
def __init__(self, **kwargs): self.docker_util = DockerUtil() if 'init_config' in kwargs and 'instance' in kwargs: init_config = kwargs.get('init_config', {}) instance = kwargs.get('instance', {}) else: try: config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) check_config = check_yaml(config_file_path) init_config = check_config['init_config'] or {} instance = check_config['instances'][0] or {} # kubernetes.yaml was not found except IOError as ex: log.error(ex.message) init_config, instance = {}, {} except Exception: log.error('Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...') init_config, instance = {}, {} self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self._node_ip = self._node_name = None # lazy evaluation self.host_name = os.environ.get('HOSTNAME') self.pod_name = os.environ.get('KUBERNETES_POD_NAME') or self.host_name self.tls_settings = self._init_tls_settings(instance) # apiserver if 'api_server_url' in instance: self.kubernetes_api_root_url = instance.get('api_server_url') else: master_host = os.environ.get('KUBERNETES_SERVICE_HOST') or self.DEFAULT_MASTER_NAME master_port = os.environ.get('KUBERNETES_SERVICE_PORT') or self.DEFAULT_MASTER_PORT self.kubernetes_api_root_url = 'https://%s:%s' % (master_host, master_port) self.kubernetes_api_url = '%s/api/v1' % self.kubernetes_api_root_url # Service mapping helper class self._service_mapper = PodServiceMapper(self) from config import _is_affirmative self.collect_service_tag = _is_affirmative(instance.get('collect_service_tags', KubeUtil.DEFAULT_COLLECT_SERVICE_TAG)) # leader status triggers event collection self.is_leader = False self.leader_elector = None self.leader_lease_duration = instance.get('leader_lease_duration') # kubelet # If kubelet_api_url is None, init_kubelet didn't succeed yet. self.init_success = False self.kubelet_api_url = None self.init_retry_interval = init_config.get('init_retry_interval', DEFAULT_RETRY_INTERVAL) self.last_init_retry = None self.left_init_retries = init_config.get('init_retries', DEFAULT_INIT_RETRIES) + 1 self.init_kubelet(instance) self.kube_label_prefix = instance.get('label_to_tag_prefix', KubeUtil.DEFAULT_LABEL_PREFIX) self.kube_node_labels = instance.get('node_labels_to_host_tags', {}) # keep track of the latest k8s event we collected and posted # default value is 0 but TTL for k8s events is one hour anyways self.last_event_collection_ts = 0
def __init__(self, instance=None): self.docker_util = DockerUtil() if instance is None: try: config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) check_config = check_yaml(config_file_path) instance = check_config['instances'][0] # kubernetes.yaml was not found except IOError as ex: log.error(ex.message) instance = {} except Exception: log.error('Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...') instance = {} self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self._node_ip = self._node_name = None # lazy evaluation self.host_name = os.environ.get('HOSTNAME') self.tls_settings = self._init_tls_settings(instance) # apiserver if 'api_server_url' in instance: self.kubernetes_api_root_url = instance.get('api_server_url') else: master_host = os.environ.get('KUBERNETES_SERVICE_HOST') or self.DEFAULT_MASTER_NAME master_port = os.environ.get('KUBERNETES_SERVICE_PORT') or self.DEFAULT_MASTER_PORT self.kubernetes_api_root_url = 'https://%s:%s' % (master_host, master_port) self.kubernetes_api_url = '%s/api/v1' % self.kubernetes_api_root_url # leader status triggers event collection self.is_leader = False self.leader_elector = None self.leader_lease_duration = instance.get('lease_duration') # kubelet try: self.kubelet_api_url = self._locate_kubelet(instance) if not self.kubelet_api_url: raise Exception("Couldn't find a method to connect to kubelet.") except Exception as ex: log.error("Kubernetes check exiting, cannot run without access to kubelet.") raise ex # Service mapping helper class self._service_mapper = PodServiceMapper(self) self.kubelet_host = self.kubelet_api_url.split(':')[1].lstrip('/') self.pods_list_url = urljoin(self.kubelet_api_url, KubeUtil.PODS_LIST_PATH) self.kube_health_url = urljoin(self.kubelet_api_url, KubeUtil.KUBELET_HEALTH_PATH) self.kube_label_prefix = instance.get('label_to_tag_prefix', KubeUtil.DEFAULT_LABEL_PREFIX) self.kube_node_labels = instance.get('node_labels_to_host_tags', {}) # cadvisor self.cadvisor_port = instance.get('port', KubeUtil.DEFAULT_CADVISOR_PORT) self.cadvisor_url = '%s://%s:%d' % (self.method, self.kubelet_host, self.cadvisor_port) self.metrics_url = urljoin(self.cadvisor_url, KubeUtil.METRICS_PATH) self.machine_info_url = urljoin(self.cadvisor_url, KubeUtil.MACHINE_INFO_PATH) try: self.self_namespace = self.get_self_namespace() except Exception: log.warning("Failed to get the agent pod namespace, defaulting to default.") self.self_namespace = DEFAULT_NAMESPACE from config import _is_affirmative self.collect_service_tag = _is_affirmative(instance.get('collect_service_tags', KubeUtil.DEFAULT_COLLECT_SERVICE_TAG)) # keep track of the latest k8s event we collected and posted # default value is 0 but TTL for k8s events is one hour anyways self.last_event_collection_ts = 0
def __init__(self, instance=None): self.docker_util = DockerUtil() if instance is None: try: config_file_path = get_conf_path(KUBERNETES_CHECK_NAME) check_config = check_yaml(config_file_path) instance = check_config['instances'][0] # kubernetes.yaml was not found except IOError as ex: log.error(ex.message) instance = {} except Exception: log.error('Kubernetes configuration file is invalid. ' 'Trying connecting to kubelet with default settings anyway...') instance = {} self.method = instance.get('method', KubeUtil.DEFAULT_METHOD) self._node_ip = self._node_name = None # lazy evaluation self.host_name = os.environ.get('HOSTNAME') self.tls_settings = self._init_tls_settings(instance) # apiserver if 'api_server_url' in instance: self.kubernetes_api_root_url = instance.get('api_server_url') else: master_host = os.environ.get('KUBERNETES_SERVICE_HOST') or self.DEFAULT_MASTER_NAME master_port = os.environ.get('KUBERNETES_SERVICE_PORT') or self.DEFAULT_MASTER_PORT self.kubernetes_api_root_url = 'https://%s:%s' % (master_host, master_port) self.kubernetes_api_url = '%s/api/v1' % self.kubernetes_api_root_url # kubelet try: self.kubelet_api_url = self._locate_kubelet(instance) if not self.kubelet_api_url: raise Exception("Couldn't find a method to connect to kubelet.") except Exception as ex: log.error("Kubernetes check exiting, cannot run without access to kubelet.") raise ex # Service mapping helper class self._service_mapper = PodServiceMapper(self) self.kubelet_host = self.kubelet_api_url.split(':')[1].lstrip('/') self.pods_list_url = urljoin(self.kubelet_api_url, KubeUtil.PODS_LIST_PATH) self.kube_health_url = urljoin(self.kubelet_api_url, KubeUtil.KUBELET_HEALTH_PATH) self.kube_label_prefix = instance.get('label_to_tag_prefix', KubeUtil.DEFAULT_LABEL_PREFIX) self.kube_node_labels = instance.get('node_labels_to_host_tags', {}) # cadvisor self.cadvisor_port = instance.get('port', KubeUtil.DEFAULT_CADVISOR_PORT) self.cadvisor_url = '%s://%s:%d' % (self.method, self.kubelet_host, self.cadvisor_port) self.metrics_url = urljoin(self.cadvisor_url, KubeUtil.METRICS_PATH) self.machine_info_url = urljoin(self.cadvisor_url, KubeUtil.MACHINE_INFO_PATH) from config import _is_affirmative self.collect_service_tag = _is_affirmative(instance.get('collect_service_tags', KubeUtil.DEFAULT_COLLECT_SERVICE_TAG)) # keep track of the latest k8s event we collected and posted # default value is 0 but TTL for k8s events is one hour anyways self.last_event_collection_ts = 0