126 lines
3.8 KiB
Nix
126 lines
3.8 KiB
Nix
{ pkgs, lib, config, network, ... }:
|
|
let
|
|
cfg = config.services.victoriametrics;
|
|
victoriametricsPort = 8428;
|
|
alertmanagerPort = config.services.prometheus.alertmanager.port;
|
|
alertbotPort = config.services.alertbot.listenPort;
|
|
blackboxPort = config.services.prometheus.exporters.blackbox.port;
|
|
nodePort = 9100;
|
|
mkScrapeConfig = name: config: {
|
|
job_name = name;
|
|
metrics_path = config.path;
|
|
static_configs = [ { targets = config.targets; } ];
|
|
params = config.params or { };
|
|
relabel_configs = [
|
|
{ source_labels = [ "__address__"]; target_label = "__param_target"; }
|
|
{ source_labels = [ "__param_target"]; target_label = "instance"; }
|
|
{
|
|
source_labels = [ "__param_target"];
|
|
target_label = "__address__";
|
|
replacement = config.replacement;
|
|
}
|
|
];
|
|
};
|
|
mkScrapeConfigs = lib.attrsets.mapAttrsToList mkScrapeConfig;
|
|
critical = { severity = "critical"; };
|
|
warning = { severity = "warning"; };
|
|
mkRuleGroups = lib.attrsets.mapAttrsToList (name: path: {
|
|
inherit name;
|
|
rules = lib.attrsets.mapAttrsToList
|
|
(alert: attrs: attrs // { inherit alert; })
|
|
(import path { inherit critical warning; });
|
|
});
|
|
in {
|
|
imports = [
|
|
../../modules/alertbot.nix
|
|
./blackbox.nix
|
|
./alertbot.nix
|
|
];
|
|
|
|
backups.directories = [ "/var/lib/${cfg.stateDir}" ];
|
|
|
|
services.victoriametrics = {
|
|
enable = true;
|
|
extraOptions = [ "-enableTCP6" ];
|
|
listenAddress = "localhost:${toString victoriametricsPort}";
|
|
prometheusConfig = {
|
|
scrape_configs = mkScrapeConfigs {
|
|
node = {
|
|
path = "/metrics";
|
|
replacement = "$1.infra.federez.net:${toString nodePort}";
|
|
targets = lib.attrsets.mapAttrsToList (n: _: n) network.infra.nodes;
|
|
};
|
|
blackbox_https_get_200 = {
|
|
path = "/probe";
|
|
replacement = "localhost:${toString blackboxPort}";
|
|
params.module = [ "https_get_200" ];
|
|
targets = [
|
|
"https://federez.net/"
|
|
"https://re2o.federez.net/"
|
|
"https://gitlab2.federez.net/federez/nix"
|
|
"https://www.federez.net/"
|
|
"https://events.federez.net/"
|
|
"https://wiki.federez.net/"
|
|
"https://wiki-backup.federez.net/"
|
|
"https://lists.federez.net/postorius/lists/"
|
|
"https://element.federez.net/"
|
|
"https://chat.federez.net/login"
|
|
"https://nextcloud.federez.net/index.php/login"
|
|
"https://watch.federez.net/"
|
|
];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
services.vmalert = {
|
|
enable = true;
|
|
rules = {
|
|
groups = mkRuleGroups {
|
|
common = ./rules/common.nix;
|
|
node = ./rules/node.nix;
|
|
blackbox = ./rules/blackbox.nix;
|
|
};
|
|
};
|
|
settings = let
|
|
victoriametricsUrl = "http://localhost:${toString victoriametricsPort}";
|
|
alertmanagerUrl = "http://localhost:${toString alertmanagerPort}";
|
|
in {
|
|
"datasource.url" = victoriametricsUrl;
|
|
"remoteWrite.url" = victoriametricsUrl;
|
|
"remoteRead.url" = victoriametricsUrl;
|
|
"notifier.url" = [ alertmanagerUrl ];
|
|
};
|
|
};
|
|
|
|
services.prometheus.alertmanager = {
|
|
enable = true;
|
|
configuration = {
|
|
route = {
|
|
group_by = [ "alertname" "instance" ];
|
|
group_wait = "30s";
|
|
group_interval = "30s";
|
|
repeat_interval = "24h";
|
|
receiver = "webhook";
|
|
};
|
|
inhibit_rules = [
|
|
{
|
|
source_match = critical;
|
|
target_match = warning;
|
|
equal = [ "alertname" "instance" ];
|
|
}
|
|
];
|
|
receivers = [
|
|
{
|
|
name = "webhook";
|
|
webhook_configs = [
|
|
{
|
|
url = "http://localhost:${toString alertbotPort}/webhook";
|
|
send_resolved = true;
|
|
}
|
|
];
|
|
}
|
|
];
|
|
};
|
|
};
|
|
}
|