2019-06-16 21:59:06 +02:00
|
|
|
{ config, lib, pkgs, ... }:
|
2018-11-01 21:52:17 +01:00
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
let
|
|
|
|
cfg = config.services.kapacitor;
|
|
|
|
|
|
|
|
kapacitorConf = pkgs.writeTextFile {
|
|
|
|
name = "kapacitord.conf";
|
|
|
|
text = ''
|
|
|
|
hostname="${config.networking.hostName}"
|
|
|
|
data_dir="${cfg.dataDir}"
|
|
|
|
|
|
|
|
[http]
|
|
|
|
bind-address = "${cfg.bind}:${toString cfg.port}"
|
|
|
|
log-enabled = false
|
|
|
|
auth-enabled = false
|
|
|
|
|
|
|
|
[task]
|
|
|
|
dir = "${cfg.dataDir}/tasks"
|
|
|
|
snapshot-interval = "${cfg.taskSnapshotInterval}"
|
|
|
|
|
|
|
|
[replay]
|
|
|
|
dir = "${cfg.dataDir}/replay"
|
|
|
|
|
|
|
|
[storage]
|
|
|
|
boltdb = "${cfg.dataDir}/kapacitor.db"
|
|
|
|
|
|
|
|
${optionalString (cfg.loadDirectory != null) ''
|
|
|
|
[load]
|
|
|
|
enabled = true
|
|
|
|
dir = "${cfg.loadDirectory}"
|
|
|
|
''}
|
|
|
|
|
|
|
|
${optionalString (cfg.defaultDatabase.enable) ''
|
|
|
|
[[influxdb]]
|
|
|
|
name = "default"
|
|
|
|
enabled = true
|
|
|
|
default = true
|
|
|
|
urls = [ "${cfg.defaultDatabase.url}" ]
|
|
|
|
username = "${cfg.defaultDatabase.username}"
|
|
|
|
password = "${cfg.defaultDatabase.password}"
|
|
|
|
''}
|
|
|
|
|
2018-11-08 22:34:23 +01:00
|
|
|
${optionalString (cfg.alerta.enable) ''
|
|
|
|
[alerta]
|
|
|
|
enabled = true
|
|
|
|
url = "${cfg.alerta.url}"
|
|
|
|
token = "${cfg.alerta.token}"
|
|
|
|
environment = "${cfg.alerta.environment}"
|
|
|
|
origin = "${cfg.alerta.origin}"
|
|
|
|
''}
|
|
|
|
|
2018-11-01 21:52:17 +01:00
|
|
|
${cfg.extraConfig}
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
in
|
|
|
|
{
|
|
|
|
options.services.kapacitor = {
|
|
|
|
enable = mkEnableOption "kapacitor";
|
|
|
|
|
|
|
|
dataDir = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
example = "/var/lib/kapacitor";
|
|
|
|
default = "/var/lib/kapacitor";
|
|
|
|
description = "Location where Kapacitor stores its state";
|
|
|
|
};
|
|
|
|
|
|
|
|
port = mkOption {
|
|
|
|
type = types.int;
|
|
|
|
default = 9092;
|
|
|
|
description = "Port of Kapacitor";
|
|
|
|
};
|
|
|
|
|
|
|
|
bind = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "";
|
|
|
|
example = literalExample "0.0.0.0";
|
|
|
|
description = "Address to bind to. The default is to bind to all addresses";
|
|
|
|
};
|
|
|
|
|
|
|
|
extraConfig = mkOption {
|
|
|
|
description = "These lines go into kapacitord.conf verbatim.";
|
|
|
|
default = "";
|
|
|
|
type = types.lines;
|
|
|
|
};
|
|
|
|
|
|
|
|
user = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "kapacitor";
|
|
|
|
description = "User account under which Kapacitor runs";
|
|
|
|
};
|
|
|
|
|
|
|
|
group = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "kapacitor";
|
|
|
|
description = "Group under which Kapacitor runs";
|
|
|
|
};
|
|
|
|
|
|
|
|
taskSnapshotInterval = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
description = "Specifies how often to snapshot the task state (in InfluxDB time units)";
|
|
|
|
default = "1m0s";
|
|
|
|
example = "1m0s";
|
|
|
|
};
|
|
|
|
|
|
|
|
loadDirectory = mkOption {
|
|
|
|
type = types.nullOr types.path;
|
|
|
|
description = "Directory where to load services from, such as tasks, templates and handlers (or null to disable service loading on startup)";
|
|
|
|
default = null;
|
|
|
|
};
|
|
|
|
|
|
|
|
defaultDatabase = {
|
|
|
|
enable = mkEnableOption "kapacitor.defaultDatabase";
|
|
|
|
|
|
|
|
url = mkOption {
|
|
|
|
description = "The URL to an InfluxDB server that serves as the default database";
|
|
|
|
example = "http://localhost:8086";
|
2019-08-08 22:48:27 +02:00
|
|
|
type = types.str;
|
2018-11-01 21:52:17 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
username = mkOption {
|
|
|
|
description = "The username to connect to the remote InfluxDB server";
|
2019-08-08 22:48:27 +02:00
|
|
|
type = types.str;
|
2018-11-01 21:52:17 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
password = mkOption {
|
|
|
|
description = "The password to connect to the remote InfluxDB server";
|
2019-08-08 22:48:27 +02:00
|
|
|
type = types.str;
|
2018-11-01 21:52:17 +01:00
|
|
|
};
|
|
|
|
};
|
2018-11-08 22:34:23 +01:00
|
|
|
|
|
|
|
alerta = {
|
|
|
|
enable = mkEnableOption "kapacitor alerta integration";
|
|
|
|
|
|
|
|
url = mkOption {
|
|
|
|
description = "The URL to the Alerta REST API";
|
|
|
|
default = "http://localhost:5000";
|
|
|
|
example = "http://localhost:5000";
|
2019-08-08 22:48:27 +02:00
|
|
|
type = types.str;
|
2018-11-08 22:34:23 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
token = mkOption {
|
|
|
|
description = "Default Alerta authentication token";
|
|
|
|
type = types.str;
|
|
|
|
default = "";
|
|
|
|
};
|
|
|
|
|
|
|
|
environment = mkOption {
|
|
|
|
description = "Default Alerta environment";
|
|
|
|
type = types.str;
|
|
|
|
default = "Production";
|
|
|
|
};
|
|
|
|
|
|
|
|
origin = mkOption {
|
|
|
|
description = "Default origin of alert";
|
|
|
|
type = types.str;
|
|
|
|
default = "kapacitor";
|
|
|
|
};
|
|
|
|
};
|
2018-11-01 21:52:17 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
environment.systemPackages = [ pkgs.kapacitor ];
|
|
|
|
|
2019-02-24 18:39:56 +01:00
|
|
|
systemd.tmpfiles.rules = [
|
|
|
|
"d '${cfg.dataDir}' - ${cfg.user} ${cfg.group} - -"
|
|
|
|
];
|
|
|
|
|
2018-11-01 21:52:17 +01:00
|
|
|
systemd.services.kapacitor = {
|
|
|
|
description = "Kapacitor Real-Time Stream Processing Engine";
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
after = [ "networking.target" ];
|
|
|
|
serviceConfig = {
|
|
|
|
ExecStart = "${pkgs.kapacitor}/bin/kapacitord -config ${kapacitorConf}";
|
|
|
|
User = "kapacitor";
|
|
|
|
Group = "kapacitor";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
users.users.kapacitor = {
|
|
|
|
uid = config.ids.uids.kapacitor;
|
|
|
|
description = "Kapacitor user";
|
|
|
|
home = cfg.dataDir;
|
|
|
|
};
|
|
|
|
|
|
|
|
users.groups.kapacitor = {
|
|
|
|
gid = config.ids.gids.kapacitor;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|