mirror of
https://github.com/jcwimer/openstack-exporter
synced 2026-03-24 17:44:42 +00:00
76 lines
3.2 KiB
Python
76 lines
3.2 KiB
Python
from selenium import webdriver
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
from selenium.webdriver.common.by import By
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.common.exceptions import TimeoutException
|
|
import os
|
|
import time
|
|
import openstack
|
|
import datetime
|
|
import prometheus_client as prom
|
|
|
|
openstack_username = os.getenv('OS_USERNAME')
|
|
openstack_password = os.getenv('OS_PASSWORD')
|
|
api_metrics = prom.Gauge('openstack_horizon_response_seconds', 'Time for horizon login via Chrome.', ['cloud_name'])
|
|
api_status = prom.Gauge('openstack_horizon_status', 'Horizon current status. 1 = up 0 = down.',['cloud_name'])
|
|
|
|
def get_metrics(horizon_url,cloud_name):
|
|
chrome_options = webdriver.ChromeOptions()
|
|
chrome_options.binary_location = "/usr/bin/chromium"
|
|
chrome_options.add_argument('--ignore-certificate-errors')
|
|
chrome_options.add_argument('--disable-popup-blocking')
|
|
chrome_options.add_argument('--disable-translate')
|
|
chrome_options.add_argument('--disable-notifications')
|
|
chrome_options.add_argument('--disable-gpu')
|
|
chrome_options.add_argument('--no-sandbox')
|
|
chrome_options.add_argument('--disable-dev-shm-usage')
|
|
|
|
driver=webdriver.Chrome(chrome_options=chrome_options)
|
|
driver.implicitly_wait(10)
|
|
|
|
# driver.get("https://httpstat.us/200")
|
|
|
|
# if "200 OK" in driver.page_source:
|
|
# print('Selenium successfully opened with Chrome (under the Xvfb display) and navigated to "https://httpstat.us/200", you\'re all set!')
|
|
|
|
print(f"Attempting to log into Horizon at {horizon_url}")
|
|
timeout = 30
|
|
driver.get(horizon_url)
|
|
try:
|
|
# wait till page loads
|
|
WebDriverWait(driver, timeout).until(EC.title_contains("OpenStack"))
|
|
except TimeoutException:
|
|
print("Timed out waiting for root url to load")
|
|
api_status.labels(cloud_name).set(0)
|
|
return None
|
|
|
|
#Print Page
|
|
# the following javascript scrolls down the entire page body. Since Twitter
|
|
# uses "inifinite scrolling", more content will be added to the bottom of the
|
|
# DOM as you scroll... since it is in the loop, it will scroll down up to 100
|
|
# times.
|
|
for _ in range(100):
|
|
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
|
|
# print all of the page source that was loaded
|
|
# print(driver.page_source.encode("utf-8"))
|
|
|
|
# Log in
|
|
driver.find_element_by_id("id_username").send_keys(f"{openstack_username}")
|
|
driver.find_element_by_id ("id_password").send_keys(f"{openstack_password}")
|
|
start_time = datetime.datetime.now()
|
|
driver.find_element_by_id("loginBtn").click()
|
|
|
|
try:
|
|
WebDriverWait(driver, timeout).until(EC.title_contains("OpenStack"))
|
|
end_time = datetime.datetime.now()
|
|
time_took = end_time - start_time
|
|
seconds_took = time_took.seconds
|
|
print(f"Horizon took {seconds_took} seconds to log in.")
|
|
api_metrics.labels(cloud_name).set(seconds_took)
|
|
api_status.labels(cloud_name).set(1)
|
|
except:
|
|
print("Timed out waiting for login to load")
|
|
api_status.labels(cloud_name).set(1)
|
|
|
|
finally:
|
|
driver.quit() |