aboutsummaryrefslogtreecommitdiffstats
path: root/modules/by-name/mo/monitoring/components/prometheus.nix
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2026-07-30 14:05:39 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2026-07-30 14:05:39 +0200
commitc153a351659e4596acfc31f00bf594343cbfcd68 (patch)
treea9ed83de07711d6424fbea09aad28891bae5bfe4 /modules/by-name/mo/monitoring/components/prometheus.nix
parenthosts/server3: Setup prometheus server in agent mode (diff)
downloadnixos-server-c153a351659e4596acfc31f00bf594343cbfcd68.zip
modules: Use namespaces
That might make it easier in the future to merge different server configs together (and thusly facilitate code-reuse.).
Diffstat (limited to 'modules/by-name/mo/monitoring/components/prometheus.nix')
-rw-r--r--modules/by-name/mo/monitoring/components/prometheus.nix272
1 files changed, 0 insertions, 272 deletions
diff --git a/modules/by-name/mo/monitoring/components/prometheus.nix b/modules/by-name/mo/monitoring/components/prometheus.nix
deleted file mode 100644
index ca947d3..0000000
--- a/modules/by-name/mo/monitoring/components/prometheus.nix
+++ /dev/null
@@ -1,272 +0,0 @@
-{
- lib,
- config,
- nixLib,
- ...
-}: let
- cfg = config.vhack.monitoring.prometheus;
-
- commonLabels = {
- hostname = config.networking.hostName;
- };
-
- prom_cfg = config.services.prometheus;
-in {
- options.vhack.monitoring.prometheus = {
- enable = lib.mkEnableOption "prometheus";
-
- port = lib.mkOption {
- type = lib.types.port;
- description = "Port where Prometheus listens to HTTP requests.";
- default = 3001;
- };
-
- remoteWriteReceiver = lib.mkOption {
- example = "https://prometheus.server2.vhack.eu";
- type = lib.types.nullOr lib.types.str;
- default = null;
- description = ''
- If not null, this prometheus server will be exposed via a reverse proxy and allow
- other prometheus servers to write metrics to it.
- '';
- };
- remoteWriteTo = lib.mkOption {
- example = "https://prometheus.server3.vhack.eu";
- type = lib.types.nullOr (lib.types.submodule {
- options = {
- port = lib.mkOption {
- type = lib.types.nullOr lib.types.port;
- default = null;
- };
- url = lib.mkOption {
- type = lib.types.str;
- };
- };
- });
- default = null;
- description = ''
- If not null, this prometheus server will run in agent mode, writing all recived
- metrics to the specified remote prometheus server.
- '';
- };
-
- sources = lib.mkOption {
- type = lib.types.listOf (lib.types.submodule {
- options = {
- name = lib.mkOption {
- type = lib.types.str;
- };
- target = lib.mkOption {
- type = lib.types.str;
- description = "The target url to scrape from.";
- };
- extra = lib.mkOption {
- type = lib.types.attrsOf lib.types.anything;
- };
- };
- });
- };
- };
-
- config = lib.mkIf cfg.enable {
- vhack = {
- nginx.enable = true;
-
- persist.directories = [
- {
- directory = "/var/lib/prometheus2";
- user = "prometheus";
- group = "prometheus";
- mode = "0700";
- }
- ];
-
- monitoring.prometheus.sources = [
- {
- name = "node";
- target = "127.0.0.1:${toString prom_cfg.exporters.node.port}";
- }
- {
- name = "prometheus_internal";
- target = "127.0.0.1:${toString prom_cfg.port}";
- }
- {
- name = "systemd";
- target = "127.0.0.1:${toString prom_cfg.exporters.systemd.port}";
- }
- ];
- };
-
- services.nginx = lib.mkIf (cfg.remoteWriteReceiver != null) {
- virtualHosts.${cfg.remoteWriteReceiver} = {
- locations."/" = {
- proxyPass = "http://127.0.0.1:${toString cfg.port}/api/v1/write";
-
- recommendedProxySettings = true;
- proxyWebsockets = true;
- };
-
- enableACME = true;
- forceSSL = true;
- };
- };
-
- users = {
- groups = {
- node-exporter.gid = config.vhack.constants.ids.gids.node-exporter;
- };
- users = {
- node-exporter = {
- isSystemUser = true;
- group = "node-exporter";
- uid = config.vhack.constants.ids.uids.node-exporter;
- };
- };
- };
-
- services = {
- prometheus = {
- enable = true;
- inherit (cfg) port;
-
- globalConfig = {
- scrape_interval = "15s";
- };
- remoteWrite = lib.optionals (cfg.remoteWriteTo != null) [
- {
- url = let
- port =
- if (cfg.remoteWriteTo.port != null)
- then ":${toString cfg.remoteWriteTo.port}"
- else "";
- in "${cfg.remoteWriteTo.url}${port}";
- # TODO: Needs RFC42 for prometheus <2026-07-19>
- # protobuf_message = "io.prometheus.write.v2.Request";
- }
- ];
-
- enableAgentMode = cfg.remoteWriteTo != null;
- extraFlags = lib.mkMerge [
- (
- lib.mkIf (cfg.remoteWriteReceiver != null) [
- "--web.enable-remote-write-receiver"
- # "--web.remote-write-receiver.accepted-protobuf-messages=io.prometheus.write.v2.Request"
- ]
- )
- ];
-
- scrapeConfigs = builtins.map (attr:
- nixLib.warnMerge {
- job_name = attr.name;
- static_configs = [
- {
- targets = [attr.target];
- labels = commonLabels;
- }
- ];
- }
- attr.extra "prometheus scrapeConfig '${attr.name}'")
- cfg.sources;
- # ++ (lib.optional (builtins.length (lib.attrNames config.services.redis.servers) > 0) {
- # job_name = "redis";
- # static_configs = [
- # {
- # targets = ["127.0.0.1:${toString config.services.prometheus.exporters.redis.port}"];
- # }
- # ];
- # }) ++ (lib.optional (builtins.length (lib.attrNames config.services.openvpn.servers) > 0) {
- # job_name = "openvpn";
- # static_configs = [
- # {
- # targets = ["127.0.0.1:${toString config.services.prometheus.exporters.openvpn.port}"];
- # }
- # ];
- # })
- # ++ (lib.optional config.services.dnsmasq.enable {
- # job_name = "dnsmasq";
- # static_configs = [
- # {
- # targets = ["127.0.0.1:${toString config.services.prometheus.exporters.dnsmasq.port}"];
- # labels = commonLabels;
- # }
- # ];
- # });
-
- exporters = {
- node = {
- enable = true;
- # https://github.com/prometheus/node_exporter#collectors
- enabledCollectors = [
- "arp"
- "cpu"
- "cpufreq"
- "diskstats"
- "dmi"
- "edac"
- "entropy"
- "filefd"
- "filesystem"
- "hwmon"
- "loadavg"
- "meminfo"
- "netclass"
- "netdev"
- "netstat"
- "nvme"
- "os"
- "pressure"
- "rapl"
- "schedstat"
- "stat"
- "thermal_zone"
- "time"
- "uname"
- "vmstat"
- "zfs"
-
- # Disabled by default
- "cgroups"
- "drm"
- "ethtool"
- "logind"
- "wifi"
- ];
- port = 9112;
- listenAddress = "127.0.0.1";
- };
- # services.prometheus.exporters.redis = lib.mkIf (builtins.length (lib.attrNames config.services.redis.servers) > 0) {
- # enable = true;
- # port = 9119;
- # listenAddress = "127.0.0.1";
- # };
- # services.prometheus.exporters.openvpn = lib.mkIf (builtins.length (lib.attrNames config.services.openvpn.servers) > 0) {
- # enable = true;
- # port = 9121;
- # listenAddress = "127.0.0.1";
- # statusPaths = lib.mapAttrsToList (name: _config: "/tmp/openvpn/${name}.status") config.services.openvpn.servers;
- # };
- # dnsmasq = lib.mkIf config.services.dnsmasq.enable {
- # enable = true;
- # port = 9211;
- # listenAddress = "127.0.0.1";
- # };
- systemd = {
- enable = true;
- port = 9116;
- listenAddress = "127.0.0.1";
- extraFlags = [
- "--log.level=info"
- "--web.disable-exporter-metrics"
- # "--systemd.collector.enable-resolved"
- "--systemd.collector.enable-restart-count"
- # "--systemd.collector.enable-file-descriptor-size"
- "--systemd.collector.enable-ip-accounting"
- "--systemd.collector.unit-include=\".+\""
- "--systemd.collector.unit-exclude=\".+\\\\.(device)\""
- ];
- };
- };
- };
- };
- };
-}