at 23.11-pre 5.3 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.logstash; 7 ops = lib.optionalString; 8 verbosityFlag = "--log.level " + cfg.logLevel; 9 10 logstashConf = pkgs.writeText "logstash.conf" '' 11 input { 12 ${cfg.inputConfig} 13 } 14 15 filter { 16 ${cfg.filterConfig} 17 } 18 19 output { 20 ${cfg.outputConfig} 21 } 22 ''; 23 24 logstashSettingsYml = pkgs.writeText "logstash.yml" cfg.extraSettings; 25 26 logstashJvmOptionsFile = pkgs.writeText "jvm.options" cfg.extraJvmOptions; 27 28 logstashSettingsDir = pkgs.runCommand "logstash-settings" { 29 inherit logstashJvmOptionsFile; 30 inherit logstashSettingsYml; 31 preferLocalBuild = true; 32 } '' 33 mkdir -p $out 34 ln -s $logstashSettingsYml $out/logstash.yml 35 ln -s $logstashJvmOptionsFile $out/jvm.options 36 ''; 37in 38 39{ 40 imports = [ 41 (mkRenamedOptionModule [ "services" "logstash" "address" ] [ "services" "logstash" "listenAddress" ]) 42 (mkRemovedOptionModule [ "services" "logstash" "enableWeb" ] "The web interface was removed from logstash") 43 ]; 44 45 ###### interface 46 47 options = { 48 49 services.logstash = { 50 51 enable = mkOption { 52 type = types.bool; 53 default = false; 54 description = lib.mdDoc "Enable logstash."; 55 }; 56 57 package = mkOption { 58 type = types.package; 59 default = pkgs.logstash; 60 defaultText = literalExpression "pkgs.logstash"; 61 description = lib.mdDoc "Logstash package to use."; 62 }; 63 64 plugins = mkOption { 65 type = types.listOf types.path; 66 default = [ ]; 67 example = literalExpression "[ pkgs.logstash-contrib ]"; 68 description = lib.mdDoc "The paths to find other logstash plugins in."; 69 }; 70 71 dataDir = mkOption { 72 type = types.str; 73 default = "/var/lib/logstash"; 74 description = lib.mdDoc '' 75 A path to directory writable by logstash that it uses to store data. 76 Plugins will also have access to this path. 77 ''; 78 }; 79 80 logLevel = mkOption { 81 type = types.enum [ "debug" "info" "warn" "error" "fatal" ]; 82 default = "warn"; 83 description = lib.mdDoc "Logging verbosity level."; 84 }; 85 86 filterWorkers = mkOption { 87 type = types.int; 88 default = 1; 89 description = lib.mdDoc "The quantity of filter workers to run."; 90 }; 91 92 listenAddress = mkOption { 93 type = types.str; 94 default = "127.0.0.1"; 95 description = lib.mdDoc "Address on which to start webserver."; 96 }; 97 98 port = mkOption { 99 type = types.str; 100 default = "9292"; 101 description = lib.mdDoc "Port on which to start webserver."; 102 }; 103 104 inputConfig = mkOption { 105 type = types.lines; 106 default = "generator { }"; 107 description = lib.mdDoc "Logstash input configuration."; 108 example = literalExpression '' 109 ''' 110 # Read from journal 111 pipe { 112 command => "''${config.systemd.package}/bin/journalctl -f -o json" 113 type => "syslog" codec => json {} 114 } 115 ''' 116 ''; 117 }; 118 119 filterConfig = mkOption { 120 type = types.lines; 121 default = ""; 122 description = lib.mdDoc "logstash filter configuration."; 123 example = '' 124 if [type] == "syslog" { 125 # Keep only relevant systemd fields 126 # http://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html 127 prune { 128 whitelist_names => [ 129 "type", "@timestamp", "@version", 130 "MESSAGE", "PRIORITY", "SYSLOG_FACILITY" 131 ] 132 } 133 } 134 ''; 135 }; 136 137 outputConfig = mkOption { 138 type = types.lines; 139 default = "stdout { codec => rubydebug }"; 140 description = lib.mdDoc "Logstash output configuration."; 141 example = '' 142 redis { host => ["localhost"] data_type => "list" key => "logstash" codec => json } 143 elasticsearch { } 144 ''; 145 }; 146 147 extraSettings = mkOption { 148 type = types.lines; 149 default = ""; 150 description = lib.mdDoc "Extra Logstash settings in YAML format."; 151 example = '' 152 pipeline: 153 batch: 154 size: 125 155 delay: 5 156 ''; 157 }; 158 159 extraJvmOptions = mkOption { 160 type = types.lines; 161 default = ""; 162 description = lib.mdDoc "Extra JVM options, one per line (jvm.options format)."; 163 example = '' 164 -Xms2g 165 -Xmx2g 166 ''; 167 }; 168 169 }; 170 }; 171 172 173 ###### implementation 174 175 config = mkIf cfg.enable { 176 systemd.services.logstash = { 177 description = "Logstash Daemon"; 178 wantedBy = [ "multi-user.target" ]; 179 path = [ pkgs.bash ]; 180 serviceConfig = { 181 ExecStartPre = ''${pkgs.coreutils}/bin/mkdir -p "${cfg.dataDir}" ; ${pkgs.coreutils}/bin/chmod 700 "${cfg.dataDir}"''; 182 ExecStart = concatStringsSep " " (filter (s: stringLength s != 0) [ 183 "${cfg.package}/bin/logstash" 184 "-w ${toString cfg.filterWorkers}" 185 (concatMapStringsSep " " (x: "--path.plugins ${x}") cfg.plugins) 186 "${verbosityFlag}" 187 "-f ${logstashConf}" 188 "--path.settings ${logstashSettingsDir}" 189 "--path.data ${cfg.dataDir}" 190 ]); 191 }; 192 }; 193 }; 194}