at 22.05-pre 6.9 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.dd-agent; 7 8 ddConf = pkgs.writeText "datadog.conf" '' 9 [Main] 10 dd_url: https://app.datadoghq.com 11 skip_ssl_validation: no 12 api_key: ${cfg.api_key} 13 ${optionalString (cfg.hostname != null) "hostname: ${cfg.hostname}"} 14 15 collector_log_file: /var/log/datadog/collector.log 16 forwarder_log_file: /var/log/datadog/forwarder.log 17 dogstatsd_log_file: /var/log/datadog/dogstatsd.log 18 pup_log_file: /var/log/datadog/pup.log 19 20 # proxy_host: my-proxy.com 21 # proxy_port: 3128 22 # proxy_user: user 23 # proxy_password: password 24 25 # tags: mytag0, mytag1 26 ${optionalString (cfg.tags != null ) "tags: ${concatStringsSep ", " cfg.tags }"} 27 28 # collect_ec2_tags: no 29 # recent_point_threshold: 30 30 # use_mount: no 31 # listen_port: 17123 32 # graphite_listen_port: 17124 33 # non_local_traffic: no 34 # use_curl_http_client: False 35 # bind_host: localhost 36 37 # use_pup: no 38 # pup_port: 17125 39 # pup_interface: localhost 40 # pup_url: http://localhost:17125 41 42 # dogstatsd_port : 8125 43 # dogstatsd_interval : 10 44 # dogstatsd_normalize : yes 45 # statsd_forward_host: address_of_own_statsd_server 46 # statsd_forward_port: 8125 47 48 # device_blacklist_re: .*\/dev\/mapper\/lxc-box.* 49 50 # ganglia_host: localhost 51 # ganglia_port: 8651 52 ''; 53 54 diskConfig = pkgs.writeText "disk.yaml" '' 55 init_config: 56 57 instances: 58 - use_mount: no 59 ''; 60 61 networkConfig = pkgs.writeText "network.yaml" '' 62 init_config: 63 64 instances: 65 # Network check only supports one configured instance 66 - collect_connection_state: false 67 excluded_interfaces: 68 - lo 69 - lo0 70 ''; 71 72 postgresqlConfig = pkgs.writeText "postgres.yaml" cfg.postgresqlConfig; 73 nginxConfig = pkgs.writeText "nginx.yaml" cfg.nginxConfig; 74 mongoConfig = pkgs.writeText "mongo.yaml" cfg.mongoConfig; 75 jmxConfig = pkgs.writeText "jmx.yaml" cfg.jmxConfig; 76 processConfig = pkgs.writeText "process.yaml" cfg.processConfig; 77 78 etcfiles = 79 let 80 defaultConfd = import ./dd-agent-defaults.nix; 81 in 82 listToAttrs (map (f: { 83 name = "dd-agent/conf.d/${f}"; 84 value.source = "${pkgs.dd-agent}/agent/conf.d-system/${f}"; 85 }) defaultConfd) // 86 { 87 "dd-agent/datadog.conf".source = ddConf; 88 "dd-agent/conf.d/disk.yaml".source = diskConfig; 89 "dd-agent/conf.d/network.yaml".source = networkConfig; 90 } // 91 (optionalAttrs (cfg.postgresqlConfig != null) 92 { 93 "dd-agent/conf.d/postgres.yaml".source = postgresqlConfig; 94 }) // 95 (optionalAttrs (cfg.nginxConfig != null) 96 { 97 "dd-agent/conf.d/nginx.yaml".source = nginxConfig; 98 }) // 99 (optionalAttrs (cfg.mongoConfig != null) 100 { 101 "dd-agent/conf.d/mongo.yaml".source = mongoConfig; 102 }) // 103 (optionalAttrs (cfg.processConfig != null) 104 { 105 "dd-agent/conf.d/process.yaml".source = processConfig; 106 }) // 107 (optionalAttrs (cfg.jmxConfig != null) 108 { 109 "dd-agent/conf.d/jmx.yaml".source = jmxConfig; 110 }); 111 112in { 113 options.services.dd-agent = { 114 enable = mkOption { 115 description = '' 116 Whether to enable the dd-agent v5 monitoring service. 117 For datadog-agent v6, see <option>services.datadog-agent.enable</option>. 118 ''; 119 default = false; 120 type = types.bool; 121 }; 122 123 api_key = mkOption { 124 description = '' 125 The Datadog API key to associate the agent with your account. 126 127 Warning: this key is stored in cleartext within the world-readable 128 Nix store! Consider using the new v6 129 <option>services.datadog-agent</option> module instead. 130 ''; 131 example = "ae0aa6a8f08efa988ba0a17578f009ab"; 132 type = types.str; 133 }; 134 135 tags = mkOption { 136 description = "The tags to mark this Datadog agent"; 137 example = [ "test" "service" ]; 138 default = null; 139 type = types.nullOr (types.listOf types.str); 140 }; 141 142 hostname = mkOption { 143 description = "The hostname to show in the Datadog dashboard (optional)"; 144 default = null; 145 example = "mymachine.mydomain"; 146 type = types.nullOr types.str; 147 }; 148 149 postgresqlConfig = mkOption { 150 description = "Datadog PostgreSQL integration configuration"; 151 default = null; 152 type = types.nullOr types.lines; 153 }; 154 155 nginxConfig = mkOption { 156 description = "Datadog nginx integration configuration"; 157 default = null; 158 type = types.nullOr types.lines; 159 }; 160 161 mongoConfig = mkOption { 162 description = "MongoDB integration configuration"; 163 default = null; 164 type = types.nullOr types.lines; 165 }; 166 167 jmxConfig = mkOption { 168 description = "JMX integration configuration"; 169 default = null; 170 type = types.nullOr types.lines; 171 }; 172 173 processConfig = mkOption { 174 description = '' 175 Process integration configuration 176 See <link xlink:href="https://docs.datadoghq.com/integrations/process/"/> 177 ''; 178 default = null; 179 type = types.nullOr types.lines; 180 }; 181 182 }; 183 184 config = mkIf cfg.enable { 185 environment.systemPackages = [ pkgs.dd-agent pkgs.sysstat pkgs.procps ]; 186 187 users.users.datadog = { 188 description = "Datadog Agent User"; 189 uid = config.ids.uids.datadog; 190 group = "datadog"; 191 home = "/var/log/datadog/"; 192 createHome = true; 193 }; 194 195 users.groups.datadog.gid = config.ids.gids.datadog; 196 197 systemd.services = let 198 makeService = attrs: recursiveUpdate { 199 path = [ pkgs.dd-agent pkgs.python pkgs.sysstat pkgs.procps pkgs.gohai ]; 200 wantedBy = [ "multi-user.target" ]; 201 serviceConfig = { 202 User = "datadog"; 203 Group = "datadog"; 204 Restart = "always"; 205 RestartSec = 2; 206 PrivateTmp = true; 207 }; 208 restartTriggers = [ pkgs.dd-agent ddConf diskConfig networkConfig postgresqlConfig nginxConfig mongoConfig jmxConfig processConfig ]; 209 } attrs; 210 in { 211 dd-agent = makeService { 212 description = "Datadog agent monitor"; 213 serviceConfig.ExecStart = "${pkgs.dd-agent}/bin/dd-agent foreground"; 214 }; 215 216 dogstatsd = makeService { 217 description = "Datadog statsd"; 218 environment.TMPDIR = "/run/dogstatsd"; 219 serviceConfig = { 220 ExecStart = "${pkgs.dd-agent}/bin/dogstatsd start"; 221 Type = "forking"; 222 PIDFile = "/run/dogstatsd/dogstatsd.pid"; 223 RuntimeDirectory = "dogstatsd"; 224 }; 225 }; 226 227 dd-jmxfetch = lib.mkIf (cfg.jmxConfig != null) { 228 description = "Datadog JMX Fetcher"; 229 path = [ pkgs.dd-agent pkgs.python pkgs.sysstat pkgs.procps pkgs.jdk ]; 230 serviceConfig.ExecStart = "${pkgs.dd-agent}/bin/dd-jmxfetch"; 231 }; 232 }; 233 234 environment.etc = etcfiles; 235 }; 236}