| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | { config, lib, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  |   cfg = config.services.logstash; | 
					
						
							| 
									
										
										
										
											2014-10-05 13:57:15 -04:00
										 |  |  |   pluginPath = lib.concatStringsSep ":" cfg.plugins; | 
					
						
							|  |  |  |   havePluginPath = lib.length cfg.plugins > 0; | 
					
						
							|  |  |  |   ops = lib.optionalString; | 
					
						
							| 
									
										
										
										
											2018-08-03 11:23:56 +01:00
										 |  |  |   verbosityFlag = "--log.level " + cfg.logLevel; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   pluginsPath = "--path.plugins ${pluginPath}"; | 
					
						
							| 
									
										
										
										
											2017-06-13 22:36:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   logstashConf = pkgs.writeText "logstash.conf" ''
 | 
					
						
							|  |  |  |     input { | 
					
						
							|  |  |  |       ${cfg.inputConfig} | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     filter { | 
					
						
							|  |  |  |       ${cfg.filterConfig} | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     output { | 
					
						
							|  |  |  |       ${cfg.outputConfig} | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   logstashSettingsYml = pkgs.writeText "logstash.yml" cfg.extraSettings; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-08 11:59:03 +01:00
										 |  |  |   logstashSettingsDir = pkgs.runCommand "logstash-settings" { | 
					
						
							|  |  |  |       inherit logstashSettingsYml; | 
					
						
							|  |  |  |       preferLocalBuild = true; | 
					
						
							|  |  |  |     } ''
 | 
					
						
							| 
									
										
										
										
											2017-06-13 22:36:08 +02:00
										 |  |  |     mkdir -p $out | 
					
						
							|  |  |  |     ln -s $logstashSettingsYml $out/logstash.yml | 
					
						
							|  |  |  |   '';
 | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   ###### interface | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   options = { | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |     services.logstash = { | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |       enable = mkOption { | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  |         type = types.bool; | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |         default = false; | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  |         description = "Enable logstash."; | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-05 13:57:15 -04:00
										 |  |  |       package = mkOption { | 
					
						
							|  |  |  |         type = types.package; | 
					
						
							|  |  |  |         default = pkgs.logstash; | 
					
						
							| 
									
										
										
										
											2016-01-17 19:34:55 +01:00
										 |  |  |         defaultText = "pkgs.logstash"; | 
					
						
							| 
									
										
										
										
											2018-08-03 11:23:56 +01:00
										 |  |  |         example = literalExample "pkgs.logstash5"; | 
					
						
							| 
									
										
										
										
											2014-10-05 13:57:15 -04:00
										 |  |  |         description = "Logstash package to use."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       plugins = mkOption { | 
					
						
							|  |  |  |         type = types.listOf types.path; | 
					
						
							|  |  |  |         default = [ ]; | 
					
						
							|  |  |  |         example = literalExample "[ pkgs.logstash-contrib ]"; | 
					
						
							|  |  |  |         description = "The paths to find other logstash plugins in."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-13 22:36:08 +02:00
										 |  |  |       dataDir = mkOption { | 
					
						
							|  |  |  |         type = types.str; | 
					
						
							|  |  |  |         default = "/var/lib/logstash"; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           A path to directory writable by logstash that it uses to store data. | 
					
						
							|  |  |  |           Plugins will also have access to this path. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 15:13:34 -04:00
										 |  |  |       logLevel = mkOption { | 
					
						
							|  |  |  |         type = types.enum [ "debug" "info" "warn" "error" "fatal" ]; | 
					
						
							|  |  |  |         default = "warn"; | 
					
						
							|  |  |  |         description = "Logging verbosity level."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-05 13:57:15 -04:00
										 |  |  |       filterWorkers = mkOption { | 
					
						
							|  |  |  |         type = types.int; | 
					
						
							|  |  |  |         default = 1; | 
					
						
							|  |  |  |         description = "The quantity of filter workers to run."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-20 18:27:29 +01:00
										 |  |  |       listenAddress = mkOption { | 
					
						
							| 
									
										
										
										
											2014-10-05 13:57:15 -04:00
										 |  |  |         type = types.str; | 
					
						
							| 
									
										
										
										
											2017-12-09 10:46:13 +01:00
										 |  |  |         default = "127.0.0.1"; | 
					
						
							| 
									
										
										
										
											2014-10-05 13:57:15 -04:00
										 |  |  |         description = "Address on which to start webserver."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       port = mkOption { | 
					
						
							|  |  |  |         type = types.str; | 
					
						
							|  |  |  |         default = "9292"; | 
					
						
							|  |  |  |         description = "Port on which to start webserver."; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |       inputConfig = mkOption { | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  |         type = types.lines; | 
					
						
							| 
									
										
										
										
											2016-12-20 18:26:49 +01:00
										 |  |  |         default = ''generator { }''; | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  |         description = "Logstash input configuration."; | 
					
						
							| 
									
										
										
										
											2016-02-29 01:47:12 +01:00
										 |  |  |         example = ''
 | 
					
						
							| 
									
										
										
										
											2013-10-31 15:59:59 +01:00
										 |  |  |           # Read from journal | 
					
						
							|  |  |  |           pipe { | 
					
						
							| 
									
										
										
										
											2015-09-24 11:42:32 +02:00
										 |  |  |             command => "''${pkgs.systemd}/bin/journalctl -f -o json" | 
					
						
							| 
									
										
										
										
											2013-10-31 15:59:59 +01:00
										 |  |  |             type => "syslog" codec => json {} | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       filterConfig = mkOption { | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  |         type = types.lines; | 
					
						
							| 
									
										
										
										
											2016-12-20 18:26:49 +01:00
										 |  |  |         default = ""; | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  |         description = "logstash filter configuration."; | 
					
						
							| 
									
										
										
										
											2016-02-29 01:47:12 +01:00
										 |  |  |         example = ''
 | 
					
						
							| 
									
										
										
										
											2013-10-31 15:59:59 +01:00
										 |  |  |           if [type] == "syslog" { | 
					
						
							|  |  |  |             # Keep only relevant systemd fields | 
					
						
							|  |  |  |             # http://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html | 
					
						
							|  |  |  |             prune { | 
					
						
							|  |  |  |               whitelist_names => [ | 
					
						
							|  |  |  |                 "type", "@timestamp", "@version", | 
					
						
							| 
									
										
										
										
											2016-06-20 21:21:55 -04:00
										 |  |  |                 "MESSAGE", "PRIORITY", "SYSLOG_FACILITY" | 
					
						
							| 
									
										
										
										
											2013-10-31 15:59:59 +01:00
										 |  |  |               ] | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       outputConfig = mkOption { | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  |         type = types.lines; | 
					
						
							| 
									
										
										
										
											2016-12-20 18:26:49 +01:00
										 |  |  |         default = ''stdout { codec => rubydebug }''; | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  |         description = "Logstash output configuration."; | 
					
						
							| 
									
										
										
										
											2013-10-31 15:59:59 +01:00
										 |  |  |         example = ''
 | 
					
						
							| 
									
										
										
										
											2016-12-20 18:26:49 +01:00
										 |  |  |           redis { host => ["localhost"] data_type => "list" key => "logstash" codec => json } | 
					
						
							|  |  |  |           elasticsearch { } | 
					
						
							| 
									
										
										
										
											2013-10-31 15:59:59 +01:00
										 |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2014-09-05 15:28:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-13 22:36:08 +02:00
										 |  |  |       extraSettings = mkOption { | 
					
						
							|  |  |  |         type = types.lines; | 
					
						
							|  |  |  |         default = ""; | 
					
						
							|  |  |  |         description = "Extra Logstash settings in YAML format."; | 
					
						
							|  |  |  |         example = ''
 | 
					
						
							|  |  |  |           pipeline: | 
					
						
							|  |  |  |             batch: | 
					
						
							|  |  |  |               size: 125 | 
					
						
							|  |  |  |               delay: 5 | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ###### implementation | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 12:28:48 +02:00
										 |  |  |   config = mkIf cfg.enable { | 
					
						
							| 
									
										
										
										
											2013-01-16 12:33:18 +01:00
										 |  |  |     systemd.services.logstash = with pkgs; { | 
					
						
							| 
									
										
										
										
											2014-06-18 13:36:53 +02:00
										 |  |  |       description = "Logstash Daemon"; | 
					
						
							| 
									
										
										
										
											2012-10-30 14:18:51 +01:00
										 |  |  |       wantedBy = [ "multi-user.target" ]; | 
					
						
							| 
									
										
										
										
											2014-07-21 16:24:18 +01:00
										 |  |  |       environment = { JAVA_HOME = jre; }; | 
					
						
							| 
									
										
										
										
											2015-09-06 14:52:36 +02:00
										 |  |  |       path = [ pkgs.bash ]; | 
					
						
							| 
									
										
										
										
											2013-10-12 12:28:48 +02:00
										 |  |  |       serviceConfig = { | 
					
						
							| 
									
										
										
										
											2017-06-13 22:36:08 +02:00
										 |  |  |         ExecStartPre = ''${pkgs.coreutils}/bin/mkdir -p "${cfg.dataDir}" ; ${pkgs.coreutils}/bin/chmod 700 "${cfg.dataDir}"''; | 
					
						
							|  |  |  |         ExecStart = concatStringsSep " " (filter (s: stringLength s != 0) [ | 
					
						
							|  |  |  |           "${cfg.package}/bin/logstash" | 
					
						
							|  |  |  |           "-w ${toString cfg.filterWorkers}" | 
					
						
							|  |  |  |           (ops havePluginPath pluginsPath) | 
					
						
							|  |  |  |           "${verbosityFlag}" | 
					
						
							|  |  |  |           "-f ${logstashConf}" | 
					
						
							| 
									
										
										
										
											2018-08-03 11:23:56 +01:00
										 |  |  |           "--path.settings ${logstashSettingsDir}" | 
					
						
							|  |  |  |           "--path.data ${cfg.dataDir}" | 
					
						
							| 
									
										
										
										
											2017-06-13 22:36:08 +02:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2013-10-12 12:28:48 +02:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2013-10-12 12:28:48 +02:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2012-07-11 11:22:16 -04:00
										 |  |  | } |