nixpkgs/nixos/tests/prometheus/ui.nix

87 lines
2.7 KiB
Nix

{ lib, pkgs, ... }:
{
name = "prometheus-ui";
nodes = {
browser =
{ config, pkgs, ... }:
{
environment.systemPackages =
let
prometheusSeleniumScript =
pkgs.writers.writePython3Bin "prometheus-selenium-script"
{
libraries = with pkgs.python3Packages; [ selenium ];
}
''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
options = Options()
options.add_argument("--headless")
service = webdriver.FirefoxService(executable_path="${lib.getExe pkgs.geckodriver}") # noqa: E501
driver = webdriver.Firefox(options=options, service=service)
driver.implicitly_wait(10)
driver.get("http://prometheus:9090/")
wait = WebDriverWait(driver, 60)
assert len(driver.find_elements(By.CLASS_NAME, "mantine-AppShell-header")) > 0 # noqa: E501
assert len(driver.find_elements(By.CLASS_NAME, "mantine-AppShell-main")) > 0 # noqa: E501
driver.close()
'';
in
with pkgs;
[
curl
firefox-unwrapped
geckodriver
prometheusSeleniumScript
];
};
prometheus =
{ config, pkgs, ... }:
{
networking.firewall.allowedTCPPorts = [ config.services.prometheus.port ];
services.prometheus = {
enable = true;
globalConfig.scrape_interval = "2s";
scrapeConfigs = [
{
job_name = "prometheus";
static_configs = [
{
targets = [
"prometheus1:${toString config.services.prometheus.port}"
"prometheus2:${toString config.services.prometheus.port}"
];
}
];
}
];
};
};
};
testScript = ''
prometheus.wait_for_unit("prometheus")
prometheus.wait_for_open_port(9090)
prometheus.wait_until_succeeds("curl -sSf http://localhost:9090/-/healthy")
browser.systemctl("start network-online.target")
browser.wait_for_unit("network-online.target")
browser.succeed("curl -kLs http://prometheus:9090/query | grep 'Prometheus Time Series Collection and Processing Server'")
# Ensure the application is actually rendered by the Javascript
browser.succeed("PYTHONUNBUFFERED=1 prometheus-selenium-script")
'';
}