{ lib, config, ... }: let cfg = config.monitoring; in { config = lib.mkIf (cfg.monitorAll && config.services.matrix-synapse.enable) { services.matrix-synapse.settings.enable_metrics = true; services.matrix-synapse.settings.listeners = [ { type = "metrics"; port = 9200; tls = false; resources = []; } ]; #services.matrix-synapse.workers = ( # let # workerNames = config.services.matrix-synapse.workers; # hasMetricsListener = # (workerName: # lib.any ( # listener: listener.type == "http" && (lib.any (resourceName: resourceName == "metrics") listener.resources) # ) config.services.matrix-synapse.workers.${workerName}.worker_listeners); # workerNamesWithoutMetrics = lib.traceVal lib.filter (workerName: (!hasMetricsListener workerName)) workerNames; # in # lib.listToAttrs ( # lib.imap (index: workerName: { # name = workerName; # value = { # worker_listeners = [ # { # type = "http"; # port = 9200 + index; # resources = [ # { # names = [ "metrics" ]; # compress = false; # } # ]; # } # ]; # }; # }) workerNamesWithoutMetrics # ) #); services.matrix-synapse.workers = ( lib.listToAttrs ( lib.imap (index: workerName: { name = workerName; value = { worker_listeners = [ { type = "metrics"; port = 9200 + index + 1; resources = []; } ]; }; }) config.monitoring.synapse.workerNames ) ); services.prometheus.scrapeConfigs = ( (lib.map (interval: { job_name = "synapse-main-${toString interval}s"; scrape_interval = "${toString interval}s"; static_configs = [ { targets = [ "localhost:9200" ]; } ]; metrics_path = "_synapse/metrics"; }) cfg.prometheusScrapeIntervals) ++ lib.flatten ( lib.imap ( index: workerName: lib.map (interval: { job_name = "synapse-${workerName}-${toString interval}s"; scrape_interval = "${toString interval}s"; static_configs = [ { targets = [ "localhost:${toString (9200 + index + 1)}" ]; } ]; metrics_path = "_synapse/metrics"; }) cfg.prometheusScrapeIntervals ) config.monitoring.synapse.workerNames ) ); services.grafana.provision.dashboards.settings = { apiVersion = 1; providers = [ { name = "matrix-synapse"; orgId = 1; type = "file"; options = { path = builtins.fetchurl { url = "https://raw.githubusercontent.com/element-hq/synapse/master/contrib/grafana/synapse.json"; sha256 = "07qlr0waw9phmyd38bv22bn5v303w3397b89l44l3lzwhpnhs16s"; }; }; } ]; }; }; }