{ config, pkgs, lib, ... }: with lib; let cfg = config.my.monitoring.prometheus; in { options.my.monitoring.prometheus = { enable = lib.mkEnableOption "Enable prometheus as a data scraper"; extraScrapeConfigs = lib.mkOption { default = [ ]; type = lib.types.listOf lib.types.attrs; description = '' Additional scrape configurations to add to Prometheus. ''; }; proxy = { enable = lib.mkEnableOption "Set the proxy entry for this service"; domain = lib.mkOption { default = "example.com"; type = lib.types.str; description = '' The domain where Caddy is reachable ''; }; subdomain = lib.mkOption { default = "prometheus"; type = lib.types.str; description = '' The subdomain where Prometheus is reachable ''; }; host = lib.mkOption { default = "localhost"; type = lib.types.str; description = '' Host name where the Prometheus is running ''; }; }; }; config = lib.mkMerge [ (lib.mkIf cfg.enable { services.prometheus = { enable = true; scrapeConfigs = [ { job_name = "download-mgr-stack"; static_configs = [ { targets = [ "localhost:${toString config.services.prometheus.exporters.exportarr-prowlarr.port}" "localhost:${toString config.services.prometheus.exporters.exportarr-radarr.port}" "localhost:${toString config.services.prometheus.exporters.exportarr-sonarr.port}" "localhost:${toString config.services.prometheus.exporters.exportarr-lidarr.port}" "localhost:${toString config.services.prometheus.exporters.exportarr-readarr.port}" ]; } ]; } ] ++ cfg.extraScrapeConfigs; }; services.grafana = { provision.datasources.settings = { datasources = [ { name = "Prometheus localhost"; url = "http://localhost:9090"; type = "prometheus"; isDefault = true; } ]; }; }; networking.firewall.allowedTCPPorts = [ 9090 ]; }) (lib.mkIf cfg.proxy.enable { services.caddy = with cfg.proxy; { virtualHosts."${subdomain}.ts.${domain}".extraConfig = '' reverse_proxy http://${host}:9090 import cloudflare_${domain} ''; }; }) ]; }