From b6198f08e3cdbf607d9bcae4ddc2a836c59be2eb Mon Sep 17 00:00:00 2001 From: Jaka Hudoklin Date: Sun, 28 Dec 2014 20:21:41 +0100 Subject: [PATCH] nixos: add cadvisor service --- nixos/modules/misc/ids.nix | 1 + nixos/modules/module-list.nix | 1 + .../modules/services/monitoring/cadvisor.nix | 106 ++++++++++++++++++ nixos/release.nix | 1 + nixos/tests/cadvisor.nix | 30 +++++ 5 files changed, 139 insertions(+) create mode 100644 nixos/modules/services/monitoring/cadvisor.nix create mode 100644 nixos/tests/cadvisor.nix diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix index bf8365e34645..ed9ff367977d 100644 --- a/nixos/modules/misc/ids.nix +++ b/nixos/modules/misc/ids.nix @@ -174,6 +174,7 @@ chronos = 164; gitlab = 165; tox-bootstrapd = 166; + cadvisor = 167; # When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399! diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 2c52ebb37bcb..503dd87ad4d9 100755 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -197,6 +197,7 @@ ./services/misc/zookeeper.nix ./services/monitoring/apcupsd.nix ./services/monitoring/bosun.nix + ./services/monitoring/cadvisor.nix ./services/monitoring/collectd.nix ./services/monitoring/dd-agent.nix ./services/monitoring/graphite.nix diff --git a/nixos/modules/services/monitoring/cadvisor.nix b/nixos/modules/services/monitoring/cadvisor.nix new file mode 100644 index 000000000000..d9c165970eca --- /dev/null +++ b/nixos/modules/services/monitoring/cadvisor.nix @@ -0,0 +1,106 @@ +{ config, pkgs, lib, ... }: + +with lib; + +let + cfg = config.services.cadvisor; + +in { + options = { + services.cadvisor = { + enable = mkOption { + default = false; + type = types.bool; + description = "Wherther to enable cadvisor service."; + }; + + host = mkOption { + default = "127.0.0.1"; + type = types.str; + description = "Cadvisor listening host"; + }; + + port = mkOption { + default = 8080; + type = types.int; + description = "Cadvisor listening port"; + }; + + storageDriver = mkOption { + default = null; + type = types.nullOr types.str; + example = "influxdb"; + description = "Cadvisor storage driver."; + }; + + storageDriverHost = mkOption { + default = "localhost:8086"; + type = types.str; + description = "Cadvisor storage driver host."; + }; + + storageDriverDb = mkOption { + default = "root"; + type = types.str; + description = "Cadvisord storage driver database name."; + }; + + storageDriverUser = mkOption { + default = "root"; + type = types.str; + description = "Cadvisor storage driver username."; + }; + + storageDriverPassword = mkOption { + default = "root"; + type = types.str; + description = "Cadvisor storage driver password."; + }; + + storageDriverSecure = mkOption { + default = false; + type = types.bool; + description = "Cadvisor storage driver, enable secure communication."; + }; + }; + }; + + config = mkIf cfg.enable { + systemd.services.cadvisor = { + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "docker.service" "influxdb.service" ]; + + postStart = mkBefore '' + until ${pkgs.curl}/bin/curl -s -o /dev/null 'http://${cfg.host}:${toString cfg.port}/containers/'; do + sleep 1; + done + ''; + + serviceConfig = { + ExecStart = ''${pkgs.cadvisor}/bin/cadvisor \ + -logtostderr=true \ + -listen_ip=${cfg.host} \ + -port=${toString cfg.port} \ + ${optionalString (cfg.storageDriver != null) '' + -storage_driver ${cfg.storageDriver} \ + -storage_driver_user ${cfg.storageDriverHost} \ + -storage_driver_db ${cfg.storageDriverDb} \ + -storage_driver_user ${cfg.storageDriverUser} \ + -storage_driver_password ${cfg.storageDriverPassword} \ + ${optionalString cfg.storageDriverSecure "-storage_driver_secure"} + ''} + ''; + User = "cadvisor"; + }; + }; + + virtualisation.docker.enable = true; + + users.extraUsers = singleton { + name = "cadvisor"; + uid = config.ids.uids.cadvisor; + description = "Cadvisor user"; + extraGroups = [ "docker" ]; + }; + }; +} diff --git a/nixos/release.nix b/nixos/release.nix index 04b8fd9bf675..c2760965d200 100644 --- a/nixos/release.nix +++ b/nixos/release.nix @@ -242,6 +242,7 @@ in rec { tests.avahi = callTest tests/avahi.nix {}; tests.bittorrent = callTest tests/bittorrent.nix {}; tests.blivet = callTest tests/blivet.nix {}; + tests.cadvisor = scrubDrv (import tests/cadvisor.nix { system = "x86_64-linux"; }); tests.chromium = callTest tests/chromium.nix {}; tests.cjdns = callTest tests/cjdns.nix {}; tests.containers = callTest tests/containers.nix {}; diff --git a/nixos/tests/cadvisor.nix b/nixos/tests/cadvisor.nix new file mode 100644 index 000000000000..225bf1a7483d --- /dev/null +++ b/nixos/tests/cadvisor.nix @@ -0,0 +1,30 @@ +import ./make-test.nix { + name = "cadvisor"; + + nodes = { + machine = { config, pkgs, ... }: { + services.cadvisor.enable = true; + }; + + influxdb = { config, pkgs, lib, ... }: with lib; { + services.cadvisor.enable = true; + services.cadvisor.storageDriver = "influxdb"; + services.influxdb.enable = true; + systemd.services.influxdb.postStart = mkAfter '' + ${pkgs.curl}/bin/curl -X POST 'http://localhost:8086/db?u=root&p=root' \ + -d '{"name": "root"}' + ''; + }; + }; + + testScript = + '' + startAll; + $machine->waitForUnit("cadvisor.service"); + $machine->succeed("curl http://localhost:8080/containers/"); + + $influxdb->waitForUnit("influxdb.service"); + $influxdb->waitForUnit("cadvisor.service"); + $influxdb->succeed("curl http://localhost:8080/containers/"); + ''; +}