nixos/hosts/vm/victoriametrics/victoriametrics.nix

104 lines
3.4 KiB
Nix

{ config, lib, pkgs, ... }:
let
mkScrapeConfig = name: config: let
relabelAddress = lib.optional (builtins.hasAttr "replacementAddress" config) {
source_labels = [ "__address__" ];
target_label = "__address__";
replacement = config.replacementAddress;
};
relabelTarget = lib.optional (builtins.hasAttr "replacementTarget" config) {
source_labels = [ "__address__" ];
target_label = "__param_target";
replacement = config.replacementTarget;
};
in {
job_name = name;
metrics_path = config.path or "/metrics";
static_configs = [ { targets = config.targets; } ];
params = config.params or { };
relabel_configs = [
{ source_labels = [ "__address__" ]; target_label = "instance"; }
# { source_labels = [ "__address__" ]; target_label = "__param_target"; }
# { source_labels = [ "__param_target" ]; target_label = "instance"; }
] ++ relabelTarget ++ relabelAddress;
scrape_timeout = config.timeout or "15s";
scrape_interval = config.interval or "1m";
};
mkScrapeConfigs = lib.attrsets.mapAttrsToList mkScrapeConfig;
critical = { severity = "critical"; };
warning = { severity = "warning"; };
mkRuleGroups = lib.attrsets.mapAttrsToList (name: path: {
inherit name;
rules = let
rules = import path { inherit critical warning; };
alerts = lib.attrsets.mapAttrsToList
(alert: attrs: attrs // { inherit alert; })
(rules.alerts or {});
records = lib.attrsets.mapAttrsToList
(record: attrs: attrs // { inherit record; })
(rules.records or {});
in alerts ++ records;
});
in
{
age.secrets.snmp-env = {
file = ../../../secrets/victoriametrics/snmp.age;
owner = "root";
group = "root";
};
networking.firewall.allowedTCPPorts = [ 8428 9116 ];
services.victoriametrics = let
scrapeConfigs = mkScrapeConfigs (import ./scrape.nix {});
in {
enable = true;
retentionPeriod = "30d";
extraOptions = [
"-enableTCP6"
# Compatibilité avec la datasource Prometheus de Grafana
"-vmalert.proxyURL=http://localhost:8880"
];
prometheusConfig.scrape_configs = scrapeConfigs;
};
services.vmalert.instances.default = {
enable = true;
rules.groups = mkRuleGroups (import ./rules {});
settings = let
victoriametricsUrl = "http://localhost:8428";
in {
"datasource.url" = victoriametricsUrl;
"remoteWrite.url" = victoriametricsUrl;
"remoteRead.url" = victoriametricsUrl;
"enableTCP6" = true;
#"notifier.url" = [ "http://docker-ovh.adm.auro.re:9093" ]; # A MODIFIER #####################################
};
};
services.prometheus.exporters.snmp = let
generator = import ./snmp.nix {};
configSnmp = pkgs.runCommand "snmp.yml" { # Nous avons des doutes sur ce fichier? faut-il l'importer?
nativeBuildInputs = [ pkgs.prometheus-snmp-exporter ];
generator = builtins.toJSON generator;
passAsFile = [ "generator" ];
} ''
${lib.getExe' pkgs.prometheus-snmp-exporter "generator"} \
generate \
--mibs-dir=${./mibs} \
--generator-path=$generatorPath \
--output-path=$out
'';
in {
enable = true;
enableConfigCheck = false;
environmentFile = config.age.secrets.snmp-env.path;
configurationPath = configSnmp;
};
environment.systemPackages = with pkgs; [
net-snmp
];
}