nixosTests.victoriametrics: handleTest -> runTest

This commit is contained in:
Sizhe Zhao 2025-07-09 11:51:48 +08:00
parent a698ac1214
commit c8df61539d
No known key found for this signature in database
GPG Key ID: ED1807251A7DA08F
5 changed files with 283 additions and 338 deletions

View File

@ -1511,7 +1511,7 @@ in
velocity = runTest ./velocity.nix; velocity = runTest ./velocity.nix;
vengi-tools = runTest ./vengi-tools.nix; vengi-tools = runTest ./vengi-tools.nix;
victorialogs = runTest ./victorialogs.nix; victorialogs = runTest ./victorialogs.nix;
victoriametrics = handleTest ./victoriametrics { }; victoriametrics = import ./victoriametrics { inherit runTest; };
vikunja = runTest ./vikunja.nix; vikunja = runTest ./vikunja.nix;
virtualbox = handleTestOn [ "x86_64-linux" ] ./virtualbox.nix { }; virtualbox = handleTestOn [ "x86_64-linux" ] ./virtualbox.nix { };
vm-variant = handleTest ./vm-variant.nix { }; vm-variant = handleTest ./vm-variant.nix { };

View File

@ -1,11 +1,6 @@
{ runTest }:
{ {
system ? builtins.currentSystem, remote-write = runTest ./remote-write.nix;
config ? { }, vmalert = runTest ./vmalert.nix;
pkgs ? import ../../.. { inherit system config; }, external-promscrape-config = runTest ./external-promscrape-config.nix;
}:
{
remote-write = import ./remote-write.nix { inherit system pkgs; };
vmalert = import ./vmalert.nix { inherit system pkgs; };
external-promscrape-config = import ./external-promscrape-config.nix { inherit system pkgs; };
} }

View File

@ -1,82 +1,70 @@
import ../make-test-python.nix ( { lib, pkgs, ... }:
{ let
lib, nodeExporterPort = 9100;
pkgs, promscrapeConfig = {
... global = {
}: scrape_interval = "2s";
let
nodeExporterPort = 9100;
promscrapeConfig = {
global = {
scrape_interval = "2s";
};
scrape_configs = [
{
job_name = "node";
static_configs = [
{
targets = [
"node:${toString nodeExporterPort}"
];
}
];
}
];
}; };
settingsFormat = pkgs.formats.yaml { }; scrape_configs = [
promscrapeConfigYaml = settingsFormat.generate "prometheusConfig.yaml" promscrapeConfig; {
in job_name = "node";
{ static_configs = [
name = "victoriametrics-external-promscrape-config"; {
meta = with pkgs.lib.maintainers; { targets = [
maintainers = [ "node:${toString nodeExporterPort}"
ryan4yin
];
};
nodes = {
victoriametrics =
{
config,
pkgs,
...
}:
{
environment.systemPackages = [ pkgs.jq ];
networking.firewall.allowedTCPPorts = [ 8428 ];
services.victoriametrics = {
enable = true;
extraOptions = [
"-promscrape.config=${toString promscrapeConfigYaml}"
]; ];
}; }
}; ];
}
];
};
settingsFormat = pkgs.formats.yaml { };
promscrapeConfigYaml = settingsFormat.generate "prometheusConfig.yaml" promscrapeConfig;
in
{
name = "victoriametrics-external-promscrape-config";
meta = with lib.maintainers; {
maintainers = [
ryan4yin
];
};
node = nodes = {
{ ... }: victoriametrics =
{ { pkgs, ... }:
services.prometheus.exporters.node = { {
enable = true; environment.systemPackages = [ pkgs.jq ];
openFirewall = true; networking.firewall.allowedTCPPorts = [ 8428 ];
}; services.victoriametrics = {
enable = true;
extraOptions = [
"-promscrape.config=${toString promscrapeConfigYaml}"
];
}; };
};
node = {
services.prometheus.exporters.node = {
enable = true;
openFirewall = true;
};
}; };
};
testScript = '' testScript = ''
node.wait_for_unit("prometheus-node-exporter") node.wait_for_unit("prometheus-node-exporter")
node.wait_for_open_port(${toString nodeExporterPort}) node.wait_for_open_port(${toString nodeExporterPort})
victoriametrics.wait_for_unit("victoriametrics") victoriametrics.wait_for_unit("victoriametrics")
victoriametrics.wait_for_open_port(8428) victoriametrics.wait_for_open_port(8428)
promscrape_config = victoriametrics.succeed("journalctl -u victoriametrics -o cat | grep 'promscrape.config'") promscrape_config = victoriametrics.succeed("journalctl -u victoriametrics -o cat | grep 'promscrape.config'")
assert '${toString promscrapeConfigYaml}' in promscrape_config assert '${toString promscrapeConfigYaml}' in promscrape_config
victoriametrics.wait_until_succeeds( victoriametrics.wait_until_succeeds(
"curl -sf 'http://localhost:8428/api/v1/query?query=node_exporter_build_info\{instance=\"node:9100\"\}' | " "curl -sf 'http://localhost:8428/api/v1/query?query=node_exporter_build_info\{instance=\"node:9100\"\}' | "
+ "jq '.data.result[0].value[1]' | grep '\"1\"'" + "jq '.data.result[0].value[1]' | grep '\"1\"'"
) )
''; '';
} }
)

View File

@ -1,103 +1,87 @@
# Primarily reference the implementation of <nixos/tests/prometheus/remote-write.nix> # Primarily reference the implementation of <nixos/tests/prometheus/remote-write.nix>
import ../make-test-python.nix ( { lib, pkgs, ... }:
{ let
lib, username = "vmtest";
pkgs, password = "fsddfy8233rb"; # random string
... passwordFile = pkgs.writeText "password-file" password;
}: in
let {
username = "vmtest"; name = "victoriametrics-remote-write";
password = "fsddfy8233rb"; # random string meta = with lib.maintainers; {
passwordFile = pkgs.writeText "password-file" password; maintainers = [
in yorickvp
{ ryan4yin
name = "victoriametrics-remote-write"; ];
meta = with pkgs.lib.maintainers; { };
maintainers = [
yorickvp
ryan4yin
];
};
nodes = { nodes = {
victoriametrics = victoriametrics =
{ { pkgs, ... }:
config, {
pkgs, environment.systemPackages = [ pkgs.jq ];
... networking.firewall.allowedTCPPorts = [ 8428 ];
}: services.victoriametrics = {
{ enable = true;
environment.systemPackages = [ pkgs.jq ]; extraOptions = [
networking.firewall.allowedTCPPorts = [ 8428 ]; "-httpAuth.username=${username}"
services.victoriametrics = { "-httpAuth.password=file://${toString passwordFile}"
enable = true; ];
extraOptions = [ };
"-httpAuth.username=${username}" };
"-httpAuth.password=file://${toString passwordFile}"
vmagent =
{ config, pkgs, ... }:
{
environment.systemPackages = [ pkgs.jq ];
services.vmagent = {
enable = true;
remoteWrite = {
url = "http://victoriametrics:8428/api/v1/write";
basicAuthUsername = username;
basicAuthPasswordFile = toString passwordFile;
};
prometheusConfig = {
global = {
scrape_interval = "2s";
};
scrape_configs = [
{
job_name = "node";
static_configs = [
{
targets = [
"node:${toString config.services.prometheus.exporters.node.port}"
];
}
];
}
]; ];
}; };
}; };
};
vmagent = node = {
{ services.prometheus.exporters.node = {
config, enable = true;
pkgs, openFirewall = true;
... };
}:
{
environment.systemPackages = [ pkgs.jq ];
services.vmagent = {
enable = true;
remoteWrite = {
url = "http://victoriametrics:8428/api/v1/write";
basicAuthUsername = username;
basicAuthPasswordFile = toString passwordFile;
};
prometheusConfig = {
global = {
scrape_interval = "2s";
};
scrape_configs = [
{
job_name = "node";
static_configs = [
{
targets = [
"node:${toString config.services.prometheus.exporters.node.port}"
];
}
];
}
];
};
};
};
node =
{ ... }:
{
services.prometheus.exporters.node = {
enable = true;
openFirewall = true;
};
};
}; };
};
testScript = '' testScript = ''
node.wait_for_unit("prometheus-node-exporter") node.wait_for_unit("prometheus-node-exporter")
node.wait_for_open_port(9100) node.wait_for_open_port(9100)
victoriametrics.wait_for_unit("victoriametrics") victoriametrics.wait_for_unit("victoriametrics")
victoriametrics.wait_for_open_port(8428) victoriametrics.wait_for_open_port(8428)
vmagent.wait_for_unit("vmagent") vmagent.wait_for_unit("vmagent")
# check remote write # check remote write
victoriametrics.wait_until_succeeds( victoriametrics.wait_until_succeeds(
"curl --user '${username}:${password}' -sf 'http://localhost:8428/api/v1/query?query=node_exporter_build_info\{instance=\"node:9100\"\}' | " "curl --user '${username}:${password}' -sf 'http://localhost:8428/api/v1/query?query=node_exporter_build_info\{instance=\"node:9100\"\}' | "
+ "jq '.data.result[0].value[1]' | grep '\"1\"'" + "jq '.data.result[0].value[1]' | grep '\"1\"'"
) )
''; '';
} }
)

View File

@ -1,179 +1,157 @@
# Primarily reference the implementation of <nixos/tests/prometheus/alertmanager.nix> # Primarily reference the implementation of <nixos/tests/prometheus/alertmanager.nix>
import ../make-test-python.nix ( { lib, pkgs, ... }:
{ {
lib, name = "victoriametrics-vmalert";
pkgs, meta = with lib.maintainers; {
... maintainers = [
}: yorickvp
{ ryan4yin
name = "victoriametrics-vmalert"; ];
meta = with pkgs.lib.maintainers; { };
maintainers = [
yorickvp nodes = {
ryan4yin victoriametrics =
]; { config, pkgs, ... }:
{
environment.systemPackages = [ pkgs.jq ];
networking.firewall.allowedTCPPorts = [ 8428 ];
services.victoriametrics = {
enable = true;
prometheusConfig = {
global = {
scrape_interval = "2s";
};
scrape_configs = [
{
job_name = "alertmanager";
static_configs = [
{
targets = [
"alertmanager:${toString config.services.prometheus.alertmanager.port}"
];
}
];
}
{
job_name = "node";
static_configs = [
{
targets = [
"node:${toString config.services.prometheus.exporters.node.port}"
];
}
];
}
];
};
};
services.vmalert.instances."" = {
enable = true;
settings = {
"datasource.url" = "http://localhost:8428"; # victoriametrics' api
"notifier.url" = [
"http://alertmanager:${toString config.services.prometheus.alertmanager.port}"
]; # alertmanager's api
rule = [
(pkgs.writeText "instance-down.yml" ''
groups:
- name: test
rules:
- alert: InstanceDown
expr: up == 0
for: 5s
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} down"
'')
];
};
};
};
alertmanager = {
services.prometheus.alertmanager = {
enable = true;
openFirewall = true;
configuration = {
global = {
resolve_timeout = "1m";
};
route = {
# Root route node
receiver = "test";
group_by = [ "..." ];
continue = false;
group_wait = "1s";
group_interval = "15s";
repeat_interval = "24h";
};
receivers = [
{
name = "test";
webhook_configs = [
{
url = "http://logger:6725";
send_resolved = true;
max_alerts = 0;
}
];
}
];
};
};
}; };
nodes = { logger = {
victoriametrics = networking.firewall.allowedTCPPorts = [ 6725 ];
{
config,
pkgs,
...
}:
{
environment.systemPackages = [ pkgs.jq ];
networking.firewall.allowedTCPPorts = [ 8428 ];
services.victoriametrics = {
enable = true;
prometheusConfig = {
global = {
scrape_interval = "2s";
};
scrape_configs = [
{
job_name = "alertmanager";
static_configs = [
{
targets = [
"alertmanager:${toString config.services.prometheus.alertmanager.port}"
];
}
];
}
{
job_name = "node";
static_configs = [
{
targets = [
"node:${toString config.services.prometheus.exporters.node.port}"
];
}
];
}
];
};
};
services.vmalert.instances."" = { services.prometheus.alertmanagerWebhookLogger.enable = true;
enable = true;
settings = {
"datasource.url" = "http://localhost:8428"; # victoriametrics' api
"notifier.url" = [
"http://alertmanager:${toString config.services.prometheus.alertmanager.port}"
]; # alertmanager's api
rule = [
(pkgs.writeText "instance-down.yml" ''
groups:
- name: test
rules:
- alert: InstanceDown
expr: up == 0
for: 5s
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} down"
'')
];
};
};
};
alertmanager =
{
config,
pkgs,
...
}:
{
services.prometheus.alertmanager = {
enable = true;
openFirewall = true;
configuration = {
global = {
resolve_timeout = "1m";
};
route = {
# Root route node
receiver = "test";
group_by = [ "..." ];
continue = false;
group_wait = "1s";
group_interval = "15s";
repeat_interval = "24h";
};
receivers = [
{
name = "test";
webhook_configs = [
{
url = "http://logger:6725";
send_resolved = true;
max_alerts = 0;
}
];
}
];
};
};
};
logger =
{
config,
pkgs,
...
}:
{
networking.firewall.allowedTCPPorts = [ 6725 ];
services.prometheus.alertmanagerWebhookLogger.enable = true;
};
}; };
};
testScript = '' testScript = ''
alertmanager.wait_for_unit("alertmanager") alertmanager.wait_for_unit("alertmanager")
alertmanager.wait_for_open_port(9093) alertmanager.wait_for_open_port(9093)
alertmanager.wait_until_succeeds("curl -s http://127.0.0.1:9093/-/ready") alertmanager.wait_until_succeeds("curl -s http://127.0.0.1:9093/-/ready")
logger.wait_for_unit("alertmanager-webhook-logger") logger.wait_for_unit("alertmanager-webhook-logger")
logger.wait_for_open_port(6725) logger.wait_for_open_port(6725)
victoriametrics.wait_for_unit("victoriametrics") victoriametrics.wait_for_unit("victoriametrics")
victoriametrics.wait_for_unit("vmalert") victoriametrics.wait_for_unit("vmalert")
victoriametrics.wait_for_open_port(8428) victoriametrics.wait_for_open_port(8428)
victoriametrics.wait_until_succeeds( victoriametrics.wait_until_succeeds(
"curl -sf 'http://127.0.0.1:8428/api/v1/query?query=count(up\{job=\"alertmanager\"\}==1)' | " "curl -sf 'http://127.0.0.1:8428/api/v1/query?query=count(up\{job=\"alertmanager\"\}==1)' | "
+ "jq '.data.result[0].value[1]' | grep '\"1\"'" + "jq '.data.result[0].value[1]' | grep '\"1\"'"
) )
victoriametrics.wait_until_succeeds( victoriametrics.wait_until_succeeds(
"curl -sf 'http://127.0.0.1:8428/api/v1/query?query=sum(alertmanager_build_info)%20by%20(version)' | " "curl -sf 'http://127.0.0.1:8428/api/v1/query?query=sum(alertmanager_build_info)%20by%20(version)' | "
+ "jq '.data.result[0].metric.version' | grep '\"${pkgs.prometheus-alertmanager.version}\"'" + "jq '.data.result[0].metric.version' | grep '\"${pkgs.prometheus-alertmanager.version}\"'"
) )
victoriametrics.wait_until_succeeds( victoriametrics.wait_until_succeeds(
"curl -sf 'http://127.0.0.1:8428/api/v1/query?query=count(up\{job=\"node\"\}!=1)' | " "curl -sf 'http://127.0.0.1:8428/api/v1/query?query=count(up\{job=\"node\"\}!=1)' | "
+ "jq '.data.result[0].value[1]' | grep '\"1\"'" + "jq '.data.result[0].value[1]' | grep '\"1\"'"
) )
victoriametrics.wait_until_succeeds( victoriametrics.wait_until_succeeds(
"curl -sf 'http://127.0.0.1:8428/api/v1/query?query=alertmanager_notifications_total\{integration=\"webhook\"\}' | " "curl -sf 'http://127.0.0.1:8428/api/v1/query?query=alertmanager_notifications_total\{integration=\"webhook\"\}' | "
+ "jq '.data.result[0].value[1]' | grep -v '\"0\"'" + "jq '.data.result[0].value[1]' | grep -v '\"0\"'"
) )
logger.wait_until_succeeds( logger.wait_until_succeeds(
"journalctl -o cat -u alertmanager-webhook-logger.service | grep '\"alertname\":\"InstanceDown\"'" "journalctl -o cat -u alertmanager-webhook-logger.service | grep '\"alertname\":\"InstanceDown\"'"
) )
logger.log(logger.succeed("systemd-analyze security alertmanager-webhook-logger.service | grep -v ''")) logger.log(logger.succeed("systemd-analyze security alertmanager-webhook-logger.service | grep -v ''"))
alertmanager.log(alertmanager.succeed("systemd-analyze security alertmanager.service | grep -v ''")) alertmanager.log(alertmanager.succeed("systemd-analyze security alertmanager.service | grep -v ''"))
''; '';
} }
)