diff --git a/nixos/modules/services/databases/influxdb.nix b/nixos/modules/services/databases/influxdb.nix index 0161208d9af0..bb07dd16bb58 100644 --- a/nixos/modules/services/databases/influxdb.nix +++ b/nixos/modules/services/databases/influxdb.nix @@ -7,106 +7,7 @@ let cfg = config.services.influxdb; - configOptions = lib.recursiveUpdate { - meta = { - bind-address = ":8088"; - commit-timeout = "50ms"; - dir = "${cfg.dataDir}/meta"; - election-timeout = "1s"; - heartbeat-timeout = "1s"; - hostname = "localhost"; - leader-lease-timeout = "500ms"; - retention-autocreate = true; - }; - - data = { - dir = "${cfg.dataDir}/data"; - wal-dir = "${cfg.dataDir}/wal"; - max-wal-size = 104857600; - wal-enable-logging = true; - wal-flush-interval = "10m"; - wal-partition-flush-delay = "2s"; - }; - - cluster = { - shard-writer-timeout = "5s"; - write-timeout = "5s"; - }; - - retention = { - enabled = true; - check-interval = "30m"; - }; - - http = { - enabled = true; - auth-enabled = false; - bind-address = ":8086"; - https-enabled = false; - log-enabled = true; - pprof-enabled = false; - write-tracing = false; - }; - - monitor = { - store-enabled = false; - store-database = "_internal"; - store-interval = "10s"; - }; - - admin = { - enabled = true; - bind-address = ":8083"; - https-enabled = false; - }; - - graphite = [ - { - enabled = false; - } - ]; - - udp = [ - { - enabled = false; - } - ]; - - collectd = [ - { - enabled = false; - typesdb = "${pkgs.collectd-data}/share/collectd/types.db"; - database = "collectd_db"; - bind-address = ":25826"; - } - ]; - - opentsdb = [ - { - enabled = false; - } - ]; - - continuous_queries = { - enabled = true; - log-enabled = true; - recompute-previous-n = 2; - recompute-no-older-than = "10m"; - compute-runs-per-interval = 10; - compute-no-more-than = "2m"; - }; - - hinted-handoff = { - enabled = true; - dir = "${cfg.dataDir}/hh"; - max-size = 1073741824; - max-age = "168h"; - retry-rate-limit = 0; - retry-interval = "1s"; - }; - } cfg.extraConfig; - - configFile = (pkgs.formats.toml { }).generate "config.toml" configOptions; + settingsFormat = pkgs.formats.toml { }; in { @@ -116,11 +17,7 @@ in services.influxdb = { - enable = lib.mkOption { - default = false; - description = "Whether to enable the influxdb server"; - type = lib.types.bool; - }; + enable = lib.mkEnableOption "the influxdb server"; package = lib.mkPackageOption pkgs "influxdb" { }; @@ -142,10 +39,116 @@ in type = lib.types.path; }; - extraConfig = lib.mkOption { + settings = lib.mkOption { default = { }; description = "Extra configuration options for influxdb"; - type = lib.types.attrs; + type = lib.types.submodule { + freeformType = settingsFormat.type; + config = + let + mkAllOptionDefault = lib.mapAttrs (n: lib.mkOptionDefault); + in + { + meta = mkAllOptionDefault { + bind-address = ":8088"; + commit-timeout = "50ms"; + dir = "${cfg.dataDir}/meta"; + election-timeout = "1s"; + heartbeat-timeout = "1s"; + hostname = "localhost"; + leader-lease-timeout = "500ms"; + retention-autocreate = true; + }; + + data = mkAllOptionDefault { + dir = "${cfg.dataDir}/data"; + wal-dir = "${cfg.dataDir}/wal"; + max-wal-size = 104857600; + wal-enable-logging = true; + wal-flush-interval = "10m"; + wal-partition-flush-delay = "2s"; + }; + + cluster = mkAllOptionDefault { + shard-writer-timeout = "5s"; + write-timeout = "5s"; + }; + + retention = mkAllOptionDefault { + enabled = true; + check-interval = "30m"; + }; + + http = mkAllOptionDefault { + enabled = true; + auth-enabled = false; + bind-address = ":8086"; + https-enabled = false; + log-enabled = true; + pprof-enabled = false; + write-tracing = false; + }; + + monitor = mkAllOptionDefault { + store-enabled = false; + store-database = "_internal"; + store-interval = "10s"; + }; + + admin = mkAllOptionDefault { + enabled = true; + bind-address = ":8083"; + https-enabled = false; + }; + + # We can't make lists sensibly overrideable, so you have to override + # them whole + graphite = lib.mkOptionDefault [ + { + enabled = false; + } + ]; + + udp = lib.mkOptionDefault [ + { + enabled = false; + } + ]; + + collectd = lib.mkOptionDefault [ + { + enabled = false; + typesdb = "${pkgs.collectd-data}/share/collectd/types.db"; + database = "collectd_db"; + bind-address = ":25826"; + } + ]; + + opentsdb = lib.mkOptionDefault [ + { + enabled = false; + } + ]; + + continuous_queries = mkAllOptionDefault { + enabled = true; + log-enabled = true; + recompute-previous-n = 2; + recompute-no-older-than = "10m"; + compute-runs-per-interval = 10; + compute-no-more-than = "2m"; + }; + + hinted-handoff = mkAllOptionDefault { + enabled = true; + dir = "${cfg.dataDir}/hh"; + max-size = 1073741824; + max-age = "168h"; + retry-rate-limit = 0; + retry-interval = "1s"; + }; + }; + }; }; }; }; @@ -163,17 +166,16 @@ in wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; serviceConfig = { - ExecStart = ''${cfg.package}/bin/influxd -config "${configFile}"''; + ExecStart = ''${cfg.package}/bin/influxd -config "${settingsFormat.generate "config.toml" cfg.settings}"''; User = cfg.user; Group = cfg.group; Restart = "on-failure"; }; postStart = let - scheme = if configOptions.http.https-enabled then "-k https" else "http"; - bindAddr = (ba: if lib.hasPrefix ":" ba then "127.0.0.1${ba}" else "${ba}") ( - toString configOptions.http.bind-address - ); + scheme = if cfg.settings.http.https-enabled or false then "-k https" else "http"; + inherit (cfg.settings.http) bind-address; + bindAddr = if lib.hasPrefix ":" bind-address then "127.0.0.1${bind-address}" else bind-address; in lib.mkBefore '' until ${pkgs.curl.bin}/bin/curl -s -o /dev/null ${scheme}://${bindAddr}/ping; do @@ -182,7 +184,7 @@ in ''; }; - users.users = lib.optionalAttrs (cfg.user == "influxdb") { + users.users = lib.mkIf (cfg.user == "influxdb") { influxdb = { uid = config.ids.uids.influxdb; group = "influxdb"; @@ -190,9 +192,16 @@ in }; }; - users.groups = lib.optionalAttrs (cfg.group == "influxdb") { + users.groups = lib.mkIf (cfg.group == "influxdb") { influxdb.gid = config.ids.gids.influxdb; }; }; + imports = [ + # FIXME remove after 26.11 + (lib.mkRenamedOptionModule + [ "services" "influxdb" "extraConfig" ] + [ "services" "influxdb" "settings" ] + ) + ]; }