grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / monitoring / telegraf.nix
blobdfff80e1bac211c962ebec6cca0d7eff71d2611e
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.telegraf;
8   settingsFormat = pkgs.formats.toml {};
9   configFile = settingsFormat.generate "config.toml" cfg.extraConfig;
10 in {
11   ###### interface
12   options = {
13     services.telegraf = {
14       enable = mkEnableOption "telegraf server";
16       package = mkPackageOption pkgs "telegraf" { };
18       environmentFiles = mkOption {
19         type = types.listOf types.path;
20         default = [];
21         example = [ "/run/keys/telegraf.env" ];
22         description = ''
23           File to load as environment file. Environment variables from this file
24           will be interpolated into the config file using envsubst with this
25           syntax: `$ENVIRONMENT` or `''${VARIABLE}`.
26           This is useful to avoid putting secrets into the nix store.
27         '';
28       };
30       extraConfig = mkOption {
31         default = {};
32         description = "Extra configuration options for telegraf";
33         type = settingsFormat.type;
34         example = {
35           outputs.influxdb = {
36             urls = ["http://localhost:8086"];
37             database = "telegraf";
38           };
39           inputs.statsd = {
40             service_address = ":8125";
41             delete_timings = true;
42           };
43         };
44       };
45     };
46   };
49   ###### implementation
50   config = mkIf config.services.telegraf.enable {
51     services.telegraf.extraConfig = {
52       inputs = {};
53       outputs = {};
54     };
55     systemd.services.telegraf = let
56       finalConfigFile = if config.services.telegraf.environmentFiles == []
57                         then configFile
58                         else "/var/run/telegraf/config.toml";
59     in {
60       description = "Telegraf Agent";
61       wantedBy = [ "multi-user.target" ];
62       wants = [ "network-online.target" ];
63       after = [ "network-online.target" ];
64       path = lib.optional (config.services.telegraf.extraConfig.inputs ? procstat) pkgs.procps
65              ++ lib.optional (config.services.telegraf.extraConfig.inputs ? ping) pkgs.iputils;
66       serviceConfig = {
67         EnvironmentFile = config.services.telegraf.environmentFiles;
68         ExecStartPre = lib.optional (config.services.telegraf.environmentFiles != [])
69           (pkgs.writeShellScript "pre-start" ''
70             umask 077
71             ${pkgs.envsubst}/bin/envsubst -i "${configFile}" > /var/run/telegraf/config.toml
72           '');
73         ExecStart="${cfg.package}/bin/telegraf -config ${finalConfigFile}";
74         ExecReload="${pkgs.coreutils}/bin/kill -HUP $MAINPID";
75         RuntimeDirectory = "telegraf";
76         User = "telegraf";
77         Group = "telegraf";
78         Restart = "on-failure";
79         # for ping probes
80         AmbientCapabilities = [ "CAP_NET_RAW" ];
81       };
82     };
84     users.users.telegraf = {
85       uid = config.ids.uids.telegraf;
86       group = "telegraf";
87       description = "telegraf daemon user";
88     };
90     users.groups.telegraf = {};
91   };