at 21.11-pre 4.5 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.influxdb; 7 8 configOptions = recursiveUpdate { 9 meta = { 10 bind-address = ":8088"; 11 commit-timeout = "50ms"; 12 dir = "${cfg.dataDir}/meta"; 13 election-timeout = "1s"; 14 heartbeat-timeout = "1s"; 15 hostname = "localhost"; 16 leader-lease-timeout = "500ms"; 17 retention-autocreate = true; 18 }; 19 20 data = { 21 dir = "${cfg.dataDir}/data"; 22 wal-dir = "${cfg.dataDir}/wal"; 23 max-wal-size = 104857600; 24 wal-enable-logging = true; 25 wal-flush-interval = "10m"; 26 wal-partition-flush-delay = "2s"; 27 }; 28 29 cluster = { 30 shard-writer-timeout = "5s"; 31 write-timeout = "5s"; 32 }; 33 34 retention = { 35 enabled = true; 36 check-interval = "30m"; 37 }; 38 39 http = { 40 enabled = true; 41 auth-enabled = false; 42 bind-address = ":8086"; 43 https-enabled = false; 44 log-enabled = true; 45 pprof-enabled = false; 46 write-tracing = false; 47 }; 48 49 monitor = { 50 store-enabled = false; 51 store-database = "_internal"; 52 store-interval = "10s"; 53 }; 54 55 admin = { 56 enabled = true; 57 bind-address = ":8083"; 58 https-enabled = false; 59 }; 60 61 graphite = [{ 62 enabled = false; 63 }]; 64 65 udp = [{ 66 enabled = false; 67 }]; 68 69 collectd = [{ 70 enabled = false; 71 typesdb = "${pkgs.collectd-data}/share/collectd/types.db"; 72 database = "collectd_db"; 73 bind-address = ":25826"; 74 }]; 75 76 opentsdb = [{ 77 enabled = false; 78 }]; 79 80 continuous_queries = { 81 enabled = true; 82 log-enabled = true; 83 recompute-previous-n = 2; 84 recompute-no-older-than = "10m"; 85 compute-runs-per-interval = 10; 86 compute-no-more-than = "2m"; 87 }; 88 89 hinted-handoff = { 90 enabled = true; 91 dir = "${cfg.dataDir}/hh"; 92 max-size = 1073741824; 93 max-age = "168h"; 94 retry-rate-limit = 0; 95 retry-interval = "1s"; 96 }; 97 } cfg.extraConfig; 98 99 configFile = pkgs.runCommand "config.toml" { 100 buildInputs = [ pkgs.remarshal ]; 101 preferLocalBuild = true; 102 } '' 103 remarshal -if json -of toml \ 104 < ${pkgs.writeText "config.json" (builtins.toJSON configOptions)} \ 105 > $out 106 ''; 107in 108{ 109 110 ###### interface 111 112 options = { 113 114 services.influxdb = { 115 116 enable = mkOption { 117 default = false; 118 description = "Whether to enable the influxdb server"; 119 type = types.bool; 120 }; 121 122 package = mkOption { 123 default = pkgs.influxdb; 124 defaultText = "pkgs.influxdb"; 125 description = "Which influxdb derivation to use"; 126 type = types.package; 127 }; 128 129 user = mkOption { 130 default = "influxdb"; 131 description = "User account under which influxdb runs"; 132 type = types.str; 133 }; 134 135 group = mkOption { 136 default = "influxdb"; 137 description = "Group under which influxdb runs"; 138 type = types.str; 139 }; 140 141 dataDir = mkOption { 142 default = "/var/db/influxdb"; 143 description = "Data directory for influxd data files."; 144 type = types.path; 145 }; 146 147 extraConfig = mkOption { 148 default = {}; 149 description = "Extra configuration options for influxdb"; 150 type = types.attrs; 151 }; 152 }; 153 }; 154 155 156 ###### implementation 157 158 config = mkIf config.services.influxdb.enable { 159 160 systemd.tmpfiles.rules = [ 161 "d '${cfg.dataDir}' 0770 ${cfg.user} ${cfg.group} - -" 162 ]; 163 164 systemd.services.influxdb = { 165 description = "InfluxDB Server"; 166 wantedBy = [ "multi-user.target" ]; 167 after = [ "network.target" ]; 168 serviceConfig = { 169 ExecStart = ''${cfg.package}/bin/influxd -config "${configFile}"''; 170 User = cfg.user; 171 Group = cfg.group; 172 }; 173 postStart = 174 let 175 scheme = if configOptions.http.https-enabled then "-k https" else "http"; 176 bindAddr = (ba: if hasPrefix ":" ba then "127.0.0.1${ba}" else "${ba}")(toString configOptions.http.bind-address); 177 in 178 mkBefore '' 179 until ${pkgs.curl.bin}/bin/curl -s -o /dev/null ${scheme}://${bindAddr}/ping; do 180 sleep 1; 181 done 182 ''; 183 }; 184 185 users.users = optionalAttrs (cfg.user == "influxdb") { 186 influxdb = { 187 uid = config.ids.uids.influxdb; 188 description = "Influxdb daemon user"; 189 }; 190 }; 191 192 users.groups = optionalAttrs (cfg.group == "influxdb") { 193 influxdb.gid = config.ids.gids.influxdb; 194 }; 195 }; 196 197}