summary refs log tree commit diff
path: root/nixos/modules/services/monitoring/datadog-agent.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/modules/services/monitoring/datadog-agent.nix')
-rw-r--r--nixos/modules/services/monitoring/datadog-agent.nix119
1 files changed, 63 insertions, 56 deletions
diff --git a/nixos/modules/services/monitoring/datadog-agent.nix b/nixos/modules/services/monitoring/datadog-agent.nix
index 65bc7da4e5dd..6b7359934f5c 100644
--- a/nixos/modules/services/monitoring/datadog-agent.nix
+++ b/nixos/modules/services/monitoring/datadog-agent.nix
@@ -18,21 +18,25 @@ let
   // optionalAttrs (cfg.tags != null ) { tags = concatStringsSep ", " cfg.tags; }
   // cfg.extraConfig;
 
-  makeConfigDir = entries: mapAttrsToList (name: conf: {
-    source = pkgs.writeText (baseNameOf name) (builtins.toJSON conf);
-    target = "datadog-agent/" + name;
-  }) (filterAttrs (name: conf: conf != null) entries);
-
-  etcfiles = makeConfigDir
-    { "datadog.yaml" = ddConf;
-      "conf.d/disk.yaml" = cfg.diskConfig;
-      "conf.d/network.yaml" = cfg.networkConfig;
-      "conf.d/postgres.d/conf.yaml" = cfg.postgresqlConfig;
-      "conf.d/nginx.d/conf.yaml" = cfg.nginxConfig;
-      "conf.d/mongo.d/conf.yaml" = cfg.mongoConfig;
-      "conf.d/process.yaml" = cfg.processConfig;
-      "conf.d/jmx.yaml" = cfg.jmxConfig;
-    };
+  # Generate Datadog configuration files for each configured checks.
+  # This works because check configurations have predictable paths,
+  # and because JSON is a valid subset of YAML.
+  makeCheckConfigs = entries: mapAttrsToList (name: conf: {
+    source = pkgs.writeText "${name}-check-conf.yaml" (builtins.toJSON conf);
+    target = "datadog-agent/conf.d/${name}.d/conf.yaml";
+  }) entries;
+
+  defaultChecks = {
+    disk = cfg.diskCheck;
+    network = cfg.networkCheck;
+  };
+
+  # Assemble all check configurations and the top-level agent
+  # configuration.
+  etcfiles = with pkgs; with builtins; [{
+    source = writeText "datadog.yaml" (toJSON ddConf);
+    target = "datadog-agent/datadog.yaml";
+  }] ++ makeCheckConfigs (cfg.checks // defaultChecks);
 
 in {
   options.services.datadog-agent = {
@@ -93,62 +97,65 @@ in {
       '';
      };
 
-    diskConfig = mkOption {
+    checks = mkOption {
+      description = ''
+        Configuration for all Datadog checks. Keys of this attribute
+        set will be used as the name of the check to create the
+        appropriate configuration in `conf.d/$check.d/conf.yaml`.
+
+        The configuration is converted into JSON from the plain Nix
+        language configuration, meaning that you should write
+        configuration adhering to Datadog's documentation - but in Nix
+        language.
+
+        Refer to the implementation of this module (specifically the
+        definition of `defaultChecks`) for an example.
+
+        Note: The 'disk' and 'network' check are configured in
+        separate options because they exist by default. Attempting to
+        override their configuration here will have no effect.
+      '';
+
+      example = {
+        http_check = {
+          init_config = null; # sic!
+          instances = [
+            {
+              name = "some-service";
+              url = "http://localhost:1337/healthz";
+              tags = [ "some-service" ];
+            }
+          ];
+        };
+      };
+
+      default = {};
+
+      # sic! The structure of the values is up to the check, so we can
+      # not usefully constrain the type further.
+      type = with types; attrsOf attrs;
+    };
+
+    diskCheck = mkOption {
       description = "Disk check config";
       type = types.attrs;
       default = {
         init_config = {};
         instances = [ { use-mount = "no"; } ];
       };
-     };
+    };
 
-    networkConfig = mkOption {
+    networkCheck = mkOption {
       description = "Network check config";
       type = types.attrs;
       default = {
         init_config = {};
         # Network check only supports one configured instance
         instances = [ { collect_connection_state = false;
-                        excluded_interfaces = [ "lo" "lo0" ]; } ];
+          excluded_interfaces = [ "lo" "lo0" ]; } ];
       };
     };
-
-    postgresqlConfig = mkOption {
-      description = "Datadog PostgreSQL integration configuration";
-      default = null;
-      type = types.nullOr types.attrs;
-    };
-
-    nginxConfig = mkOption {
-      description = "Datadog nginx integration configuration";
-      default = null;
-      type = types.nullOr types.attrs;
-    };
-
-    mongoConfig = mkOption {
-      description = "MongoDB integration configuration";
-      default = null;
-      type = types.nullOr types.attrs;
-    };
-
-    jmxConfig = mkOption {
-      description = "JMX integration configuration";
-      default = null;
-      type = types.nullOr types.attrs;
-    };
-
-    processConfig = mkOption {
-      description = ''
-        Process integration configuration
-
-        See http://docs.datadoghq.com/integrations/process/
-      '';
-      default = null;
-      type = types.nullOr types.attrs;
-    };
-
   };
-
   config = mkIf cfg.enable {
     environment.systemPackages = [ cfg.package pkgs.sysstat pkgs.procps ];
 
@@ -189,7 +196,7 @@ in {
         serviceConfig.PermissionsStartOnly = true;
       };
 
-      dd-jmxfetch = lib.mkIf (cfg.jmxConfig != null) (makeService {
+      dd-jmxfetch = lib.mkIf (lib.hasAttr "jmx" cfg.checks) (makeService {
         description = "Datadog JMX Fetcher";
         path = [ cfg.package pkgs.python pkgs.sysstat pkgs.procps pkgs.jdk ];
         serviceConfig.ExecStart = "${cfg.package}/bin/dd-jmxfetch";