{ 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 ]; }