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}