diff --git a/custom-openstack-exporter.py b/custom-openstack-exporter.py index cb0e1fe9117bb0f65fa0d98dc292a4091d8c1230..b30e08d1025ed014e4f2deee0a27b1c7b865690c 100755 --- a/custom-openstack-exporter.py +++ b/custom-openstack-exporter.py @@ -22,6 +22,7 @@ from prometheus_client import start_http_server, Gauge, REGISTRY, PROCESS_COLLEC from ping3 import ping import openstack from icmplib import traceroute +import keystoneauth1.exceptions.catalog as ks_exc import timeout @@ -346,55 +347,58 @@ class AppMetrics: # remove all statuses (clears delete loadbalancers) self.openstack_loadbalancer_status.clear() # Reports LBs inaccessible via FIP - for lb in self.os_connection.load_balancer.load_balancers(): - if lb.is_admin_state_up: - # catch partly created loadbalancers - ip_address = None - ports = [] - try: - vip_port = self.os_connection.network.find_port(lb.vip_port_id) - sg = self.os_connection.network.find_security_group(vip_port.security_group_ids[0]) - sg_rules = sg.security_group_rules - fips = list(self.os_connection.network.ips(port_id=lb.vip_port_id)) - ip_address = ipaddress.ip_address(lb.vip_address) - if fips: - ip_address = ipaddress.ip_address(fips[0].floating_ip_address) - - logging.debug(str(ip_address) + " | Loadbalancer security group: " + str(sg)) - - # ip address from private scopes, hidden from script - if ip_address.is_private: + try: + for lb in self.os_connection.load_balancer.load_balancers(): + if lb.is_admin_state_up: + # catch partly created loadbalancers + ip_address = None + ports = [] + try: + vip_port = self.os_connection.network.find_port(lb.vip_port_id) + sg = self.os_connection.network.find_security_group(vip_port.security_group_ids[0]) + sg_rules = sg.security_group_rules + fips = list(self.os_connection.network.ips(port_id=lb.vip_port_id)) + ip_address = ipaddress.ip_address(lb.vip_address) + if fips: + ip_address = ipaddress.ip_address(fips[0].floating_ip_address) + + logging.debug(str(ip_address) + " | Loadbalancer security group: " + str(sg)) + + # ip address from private scopes, hidden from script + if ip_address.is_private: + self.openstack_loadbalancer_status.labels( + id=lb.id, + status=IPAddressStatus.HIDDEN.value + ).set(1.0) + continue + # check opened ports in health monitor range (1025+) + for sg_rule in sg_rules: + ports.append(sg_rule.get('port_range_min') or 0) + # add manually if missing - kypo fix + if not AppMetrics.loadbalancer_accessibility_ports[0] in ports: + ports.append(AppMetrics.loadbalancer_accessibility_ports[0]) + + logging.info(str(ip_address) + " | Loadbalancer ports: " + str(ports)) + + except Exception: self.openstack_loadbalancer_status.labels( id=lb.id, - status=IPAddressStatus.HIDDEN.value + status=IPAddressStatus.UNREACHABLE.value ).set(1.0) continue - # check opened ports in health monitor range (1025+) - for sg_rule in sg_rules: - ports.append(sg_rule.get('port_range_min') or 0) - # add manually if missing - kypo fix - if not AppMetrics.loadbalancer_accessibility_ports[0] in ports: - ports.append(AppMetrics.loadbalancer_accessibility_ports[0]) - - logging.info(str(ip_address) + " | Loadbalancer ports: " + str(ports)) - - except Exception: - self.openstack_loadbalancer_status.labels( - id=lb.id, - status=IPAddressStatus.UNREACHABLE.value - ).set(1.0) - continue - lb_status = self.get_ip_accessibility_status_ports( - ip_address, - [port for port in ports if port in AppMetrics.loadbalancer_accessibility_ports] - ) - if lb_status == IPAddressStatus.UNREACHABLE.value: - ping_status = self.get_ip_accessibility_status_ping(ip_address) - logging.info(str(ip_address) + " | Loadbalancer, ports unreachable, pinged with status: " + str(ping_status)) - if ping_status: - lb_status = ping_status - logging.info(str(ip_address) + " | LB id: " + str(lb.id) + ", status: " + str(lb_status)) - self.openstack_loadbalancer_status.labels(id=lb.id, status=lb_status).set(1.0) + lb_status = self.get_ip_accessibility_status_ports( + ip_address, + [port for port in ports if port in AppMetrics.loadbalancer_accessibility_ports] + ) + if lb_status == IPAddressStatus.UNREACHABLE.value: + ping_status = self.get_ip_accessibility_status_ping(ip_address) + logging.info(str(ip_address) + " | Loadbalancer, ports unreachable, pinged with status: " + str(ping_status)) + if ping_status: + lb_status = ping_status + logging.info(str(ip_address) + " | LB id: " + str(lb.id) + ", status: " + str(lb_status)) + self.openstack_loadbalancer_status.labels(id=lb.id, status=lb_status).set(1.0) + except ks_exc.EndpointNotFound: + logging.info("Loadbalancer endpoint not found. Skipping loadbalancer checks...") def parse_arguments(script_summary="script"): """ argument parser """