diff --git a/nixos/modules/services/monitoring/graphite.nix b/nixos/modules/services/monitoring/graphite.nix index dbfe0ee182a0..b2c46123d16a 100644 --- a/nixos/modules/services/monitoring/graphite.nix +++ b/nixos/modules/services/monitoring/graphite.nix @@ -8,6 +8,16 @@ let dataDir = cfg.dataDir; + graphiteApiConfig = pkgs.writeText "graphite-api.yaml" '' + time_zone: ${config.time.timeZone} + search_index: ${dataDir}/index + ${optionalString (cfg.api.finders != []) ''finders:''} + ${concatMapStringsSep "\n" (f: " - " + f.moduleName) cfg.api.finders} + ${optionalString (cfg.api.functions != []) ''functions:''} + ${concatMapStringsSep "\n" (f: " - " + f) cfg.api.functions} + ${cfg.api.extraConfig} + ''; + configDir = pkgs.buildEnv { name = "graphite-config"; paths = lists.filter (el: el != null) [ @@ -65,6 +75,40 @@ in { }; }; + api = { + enable = mkOption { + description = "Whether to enable graphite api."; + default = false; + type = types.uniq types.bool; + }; + + finders = mkOption { + description = "List of finder plugins load."; + default = []; + example = [ pkgs.python27Packages.graphite_influxdb ]; + type = types.listOf types.package; + }; + + functions = mkOption { + description = "List of functions to load."; + default = [ + "graphite_api.functions.SeriesFunctions" + "graphite_api.functions.PieFunctions" + ]; + type = types.listOf types.str; + }; + + extraConfig = mkOption { + description = "Extra configuration for graphite api."; + default = '' + whisper: + directories: + - ${dataDir}/whisper + ''; + type = types.str; + }; + }; + carbon = { config = mkOption { description = "Content of carbon configuration file."; @@ -176,7 +220,7 @@ in { ###### implementation - config = mkIf (cfg.carbon.enableAggregator || cfg.carbon.enableCache || cfg.carbon.enableRelay || cfg.web.enable) { + config = mkIf (cfg.carbon.enableAggregator || cfg.carbon.enableCache || cfg.carbon.enableRelay || cfg.web.enable || cfg.api.enable) { systemd.services.carbonCache = { enable = cfg.carbon.enableCache; description = "Graphite Data Storage Backend"; @@ -189,10 +233,6 @@ in { Group = "graphite"; PermissionsStartOnly = true; }; - restartTriggers = [ - pkgs.pythonPackages.carbon - configDir - ]; preStart = '' mkdir -p ${cfg.dataDir}/whisper chmod 0700 ${cfg.dataDir}/whisper @@ -211,10 +251,6 @@ in { User = "graphite"; Group = "graphite"; }; - restartTriggers = [ - pkgs.pythonPackages.carbon - configDir - ]; }; systemd.services.carbonRelay = { @@ -228,10 +264,6 @@ in { User = "graphite"; Group = "graphite"; }; - restartTriggers = [ - pkgs.pythonPackages.carbon - configDir - ]; }; systemd.services.graphiteWeb = { @@ -243,7 +275,7 @@ in { environment = { PYTHONPATH = "${pkgs.python27Packages.graphite_web}/lib/python2.7/site-packages"; DJANGO_SETTINGS_MODULE = "graphite.settings"; - GRAPHITE_CONF_DIR = "/etc/graphite/"; + GRAPHITE_CONF_DIR = configDir; GRAPHITE_STORAGE_DIR = dataDir; }; serviceConfig = { @@ -271,9 +303,40 @@ in { chown -R graphite:graphite ${cfg.dataDir} fi ''; - restartTriggers = [ - pkgs.python27Packages.graphite_web - ]; + }; + + systemd.services.graphiteApi = { + enable = cfg.api.enable; + description = "Graphite Api Interface"; + wantedBy = [ "multi-user.target" ]; + after = [ "network-interfaces.target" ]; + environment = { + PYTHONPATH = + "${pkgs.python27Packages.graphite_api}/lib/python2.7/site-packages:" + + concatMapStringsSep ":" (f: f + "/lib/python2.7/site-packages") cfg.api.finders; + GRAPHITE_API_CONFIG = graphiteApiConfig; + LD_LIBRARY_PATH = "${pkgs.cairo}/lib"; + }; + serviceConfig = { + ExecStart = '' + ${pkgs.python27Packages.waitress}/bin/waitress-serve \ + --host=${cfg.web.host} --port=${toString cfg.web.port} \ + graphite_api.app:app + ''; + User = "graphite"; + Group = "graphite"; + PermissionsStartOnly = true; + }; + preStart = '' + if ! test -e ${dataDir}/db-created; then + mkdir -p ${dataDir}/cache/ + chmod 0700 ${dataDir}/cache/ + + touch ${dataDir}/db-created + + chown -R graphite:graphite ${cfg.dataDir} + fi + ''; }; environment.systemPackages = [ diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 712c64319db0..101e247976bd 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -10372,9 +10372,10 @@ rec { graphite_api = buildPythonPackage rec { name = "graphite-api-1.0.1"; - src = fetchurl { - url = "https://pypi.python.org/packages/source/g/graphite-api/${name}.tar.gz"; - md5 = "466c13a902744bed09a054da452140f0"; + src = fetchgit { + url = "https://github.com/brutasse/graphite-api.git"; + rev = "b6f75e8a08fae695c094fece6de611b893fc65fb"; + sha256 = "41b90d5f35e99a020a6b1b77938690652521d1841b3165574fcfcee807ce4e6a"; }; # ImportError: No module named tests @@ -10410,6 +10411,8 @@ rec { propagatedBuildInputs = [ influxdb graphite_api ]; + passthru.moduleName = "graphite_influxdb.InfluxdbFinder"; + meta = { description = "An influxdb backend for Graphite-web and graphite-api"; homepage = https://github.com/vimeo/graphite-influxdb;