add telegraf
This commit is contained in:
129
modules/nixos/tools/telegraf/default.nix
Normal file
129
modules/nixos/tools/telegraf/default.nix
Normal file
@@ -0,0 +1,129 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
cfg = config.syscfg.monitoring.telegraf;
|
||||
hasCollector = name: builtins.elem name cfg.collectors;
|
||||
influxCfg = cfg.outputs.influxdb_v3;
|
||||
telegrafEnvFiles =
|
||||
lib.optional (influxCfg.secretName != null) "/run/secrets/${influxCfg.secretName}";
|
||||
dockerGroups =
|
||||
lib.optionals (cfg.enable && hasCollector "docker" && config.virtualisation.podman.enable) [ "podman" ]
|
||||
++ lib.optionals (cfg.enable && hasCollector "docker" && config.virtualisation.docker.enable) [ "docker" ];
|
||||
baseConfig = {
|
||||
agent = {
|
||||
interval = "10s";
|
||||
round_interval = true;
|
||||
metric_batch_size = 1000;
|
||||
metric_buffer_limit = 10000;
|
||||
flush_interval = "10s";
|
||||
hostname = config.syscfg.hostname;
|
||||
omit_hostname = false;
|
||||
};
|
||||
global_tags = {
|
||||
host = config.syscfg.hostname;
|
||||
};
|
||||
};
|
||||
inputsConfig = lib.mkMerge [
|
||||
(lib.mkIf (hasCollector "cpu") {
|
||||
inputs.cpu = {
|
||||
percpu = true;
|
||||
totalcpu = true;
|
||||
collect_cpu_time = false;
|
||||
report_active = false;
|
||||
};
|
||||
})
|
||||
(lib.mkIf (hasCollector "mem") {
|
||||
inputs.mem = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "swap") {
|
||||
inputs.swap = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "system") {
|
||||
inputs.system = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "disk") {
|
||||
inputs.disk = {
|
||||
ignore_fs = [ "tmpfs" "devtmpfs" "devfs" "overlay" "squashfs" ];
|
||||
};
|
||||
})
|
||||
(lib.mkIf (hasCollector "diskio") {
|
||||
inputs.diskio = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "kernel") {
|
||||
inputs.kernel = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "net") {
|
||||
inputs.net = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "netstat") {
|
||||
inputs.netstat = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "processes") {
|
||||
inputs.processes = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "temp") {
|
||||
inputs.temp = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "mdstat") {
|
||||
inputs.mdstat = { };
|
||||
})
|
||||
(lib.mkIf (hasCollector "smart") {
|
||||
inputs.smart = {
|
||||
use_sudo = true;
|
||||
attributes = true;
|
||||
};
|
||||
})
|
||||
(lib.mkIf (hasCollector "docker") {
|
||||
inputs.docker = {
|
||||
endpoint = "unix:///var/run/docker.sock";
|
||||
timeout = "5s";
|
||||
perdevice = true;
|
||||
total = false;
|
||||
};
|
||||
})
|
||||
(lib.mkIf (hasCollector "ping") {
|
||||
inputs.ping = {
|
||||
urls = [ "1.1.1.1" ];
|
||||
count = 4;
|
||||
interval = "60s";
|
||||
timeout = 5.0;
|
||||
binary = "${pkgs.iputils}/bin/ping";
|
||||
};
|
||||
})
|
||||
];
|
||||
outputsConfig = lib.mkMerge [{
|
||||
outputs.influxdb_v3 = {
|
||||
urls = influxCfg.urls;
|
||||
token = influxCfg.token;
|
||||
database = influxCfg.database or "telegraf";
|
||||
};
|
||||
}
|
||||
];
|
||||
in {
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.telegraf = {
|
||||
enable = true;
|
||||
environmentFiles = telegrafEnvFiles;
|
||||
extraConfig = lib.mkMerge [
|
||||
baseConfig
|
||||
inputsConfig
|
||||
outputsConfig
|
||||
cfg.extraConfig
|
||||
];
|
||||
};
|
||||
|
||||
users.users.telegraf.extraGroups = dockerGroups;
|
||||
|
||||
systemd.services.telegraf = {
|
||||
path = lib.optionals (hasCollector "smart") [ pkgs.smartmontools ];
|
||||
serviceConfig.SupplementaryGroups = dockerGroups;
|
||||
};
|
||||
|
||||
security.sudo.extraRules = lib.optionals (hasCollector "smart") [{
|
||||
users = [ "telegraf" ];
|
||||
commands = [{
|
||||
command = "${pkgs.smartmontools}/bin/smartctl";
|
||||
options = [ "NOPASSWD" ];
|
||||
}];
|
||||
}];
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user