Merge #361424: refactor lib.packagesFromDirectoryRecursive (v2)
[NixPkgs.git] / nixos / modules / services / monitoring / kapacitor.nix
blobdb4ed1beb12b5aa6bfb869343117ba595f43e3dd
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
7 let
8   cfg = config.services.kapacitor;
10   kapacitorConf = pkgs.writeTextFile {
11     name = "kapacitord.conf";
12     text = ''
13       hostname="${config.networking.hostName}"
14       data_dir="${cfg.dataDir}"
16       [http]
17         bind-address = "${cfg.bind}:${toString cfg.port}"
18         log-enabled = false
19         auth-enabled = false
21       [task]
22         dir = "${cfg.dataDir}/tasks"
23         snapshot-interval = "${cfg.taskSnapshotInterval}"
25       [replay]
26         dir = "${cfg.dataDir}/replay"
28       [storage]
29         boltdb = "${cfg.dataDir}/kapacitor.db"
31       ${lib.optionalString (cfg.loadDirectory != null) ''
32         [load]
33           enabled = true
34           dir = "${cfg.loadDirectory}"
35       ''}
37       ${lib.optionalString (cfg.defaultDatabase.enable) ''
38         [[influxdb]]
39           name = "default"
40           enabled = true
41           default = true
42           urls = [ "${cfg.defaultDatabase.url}" ]
43           username = "${cfg.defaultDatabase.username}"
44           password = "${cfg.defaultDatabase.password}"
45       ''}
47       ${lib.optionalString (cfg.alerta.enable) ''
48         [alerta]
49           enabled = true
50           url = "${cfg.alerta.url}"
51           token = "${cfg.alerta.token}"
52           environment = "${cfg.alerta.environment}"
53           origin = "${cfg.alerta.origin}"
54       ''}
56       ${cfg.extraConfig}
57     '';
58   };
61   options.services.kapacitor = {
62     enable = lib.mkEnableOption "kapacitor";
64     dataDir = lib.mkOption {
65       type = lib.types.path;
66       default = "/var/lib/kapacitor";
67       description = "Location where Kapacitor stores its state";
68     };
70     port = lib.mkOption {
71       type = lib.types.port;
72       default = 9092;
73       description = "Port of Kapacitor";
74     };
76     bind = lib.mkOption {
77       type = lib.types.str;
78       default = "";
79       example = "0.0.0.0";
80       description = "Address to bind to. The default is to bind to all addresses";
81     };
83     extraConfig = lib.mkOption {
84       description = "These lines go into kapacitord.conf verbatim.";
85       default = "";
86       type = lib.types.lines;
87     };
89     user = lib.mkOption {
90       type = lib.types.str;
91       default = "kapacitor";
92       description = "User account under which Kapacitor runs";
93     };
95     group = lib.mkOption {
96       type = lib.types.str;
97       default = "kapacitor";
98       description = "Group under which Kapacitor runs";
99     };
101     taskSnapshotInterval = lib.mkOption {
102       type = lib.types.str;
103       description = "Specifies how often to snapshot the task state  (in InfluxDB time units)";
104       default = "1m0s";
105     };
107     loadDirectory = lib.mkOption {
108       type = lib.types.nullOr lib.types.path;
109       description = "Directory where to load services from, such as tasks, templates and handlers (or null to disable service loading on startup)";
110       default = null;
111     };
113     defaultDatabase = {
114       enable = lib.mkEnableOption "kapacitor.defaultDatabase";
116       url = lib.mkOption {
117         description = "The URL to an InfluxDB server that serves as the default database";
118         example = "http://localhost:8086";
119         type = lib.types.str;
120       };
122       username = lib.mkOption {
123         description = "The username to connect to the remote InfluxDB server";
124         type = lib.types.str;
125       };
127       password = lib.mkOption {
128         description = "The password to connect to the remote InfluxDB server";
129         type = lib.types.str;
130       };
131     };
133     alerta = {
134       enable = lib.mkEnableOption "kapacitor alerta integration";
136       url = lib.mkOption {
137         description = "The URL to the Alerta REST API";
138         default = "http://localhost:5000";
139         type = lib.types.str;
140       };
142       token = lib.mkOption {
143         description = "Default Alerta authentication token";
144         type = lib.types.str;
145         default = "";
146       };
148       environment = lib.mkOption {
149         description = "Default Alerta environment";
150         type = lib.types.str;
151         default = "Production";
152       };
154       origin = lib.mkOption {
155         description = "Default origin of alert";
156         type = lib.types.str;
157         default = "kapacitor";
158       };
159     };
160   };
162   config = lib.mkIf cfg.enable {
163     environment.systemPackages = [ pkgs.kapacitor ];
165     systemd.tmpfiles.settings."10-kapacitor".${cfg.dataDir}.d = {
166       inherit (cfg) user group;
167     };
169     systemd.services.kapacitor = {
170       description = "Kapacitor Real-Time Stream Processing Engine";
171       wantedBy = [ "multi-user.target" ];
172       after = [ "networking.target" ];
173       serviceConfig = {
174         ExecStart = "${pkgs.kapacitor}/bin/kapacitord -config ${kapacitorConf}";
175         User = "kapacitor";
176         Group = "kapacitor";
177       };
178     };
180     users.users.kapacitor = {
181       uid = config.ids.uids.kapacitor;
182       description = "Kapacitor user";
183       home = cfg.dataDir;
184     };
186     users.groups.kapacitor = {
187       gid = config.ids.gids.kapacitor;
188     };
189   };