From 368a677c97f038f819c30d9ef0eb548b91ca1554 Mon Sep 17 00:00:00 2001 From: Austin Seipp Date: Fri, 2 May 2014 00:43:27 -0500 Subject: [PATCH] nixos: overhaul datadog module This overhauls the Datadog module a bit to be much more useful. In particular, it adds support for nginx and postgresql monitoring integrations to dd-agent. These have to exist in separate files under /etc/dd-agent, so the module just exposes then as separate options. In the future, more integrations could be added this way. In the process of doing this, I also had to rename the dd-agent user to datadog. Note the UIDs did not change, so this is strictly backwards compatible. The reason for this is to make it easier to create a 'datadog' postgres user with access to pg_stats, as 'dd-agent' typically isn't a valid username. This allows the out of the box configurations to be used. Signed-off-by: Austin Seipp --- nixos/modules/misc/ids.nix | 4 +- .../modules/services/monitoring/dd-agent.nix | 105 ++++++++++++++---- pkgs/tools/networking/dd-agent/default.nix | 24 ++-- 3 files changed, 98 insertions(+), 35 deletions(-) diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix index 3f6aaa15bb4f..207da2a39bfe 100644 --- a/nixos/modules/misc/ids.nix +++ b/nixos/modules/misc/ids.nix @@ -84,7 +84,7 @@ postgres = 71; smbguest = 74; varnish = 75; - dd-agent = 76; + datadog = 76; lighttpd = 77; lightdm = 78; freenet = 79; @@ -201,7 +201,7 @@ vboxsf = 73; smbguest = 74; varnish = 75; - dd-agent = 76; + datadog = 76; lighttpd = 77; lightdm = 78; freenet = 79; diff --git a/nixos/modules/services/monitoring/dd-agent.nix b/nixos/modules/services/monitoring/dd-agent.nix index bddf102ee517..5794ee7fe534 100644 --- a/nixos/modules/services/monitoring/dd-agent.nix +++ b/nixos/modules/services/monitoring/dd-agent.nix @@ -5,54 +5,113 @@ with lib; let cfg = config.services.dd-agent; - datadog_conf = pkgs.runCommand "datadog.conf" {} '' - sed -e 's|^api_key:|api_key: ${cfg.api_key}|' ${optionalString (cfg.hostname != null) - "-e 's|^#hostname: mymachine.mydomain|hostname: ${cfg.hostname}|'" - } ${pkgs.dd-agent}/etc/dd-agent/datadog.conf.example > $out + ddConf = pkgs.writeText "datadog.conf" '' + [Main] + dd_url: https://app.datadoghq.com + skip_ssl_validation: no + api_key: ${cfg.api_key} + ${optionalString (cfg.hostname != null) "hostname: ${cfg.hostname}"} + + collector_log_file: /var/log/datadog/collector.log + forwarder_log_file: /var/log/datadog/forwarder.log + dogstatsd_log_file: /var/log/datadog/dogstatsd.log + pup_log_file: /var/log/datadog/pup.log + + # proxy_host: my-proxy.com + # proxy_port: 3128 + # proxy_user: user + # proxy_password: password + + # tags: mytag0, mytag1 + + # collect_ec2_tags: no + # recent_point_threshold: 30 + # use_mount: no + # listen_port: 17123 + # graphite_listen_port: 17124 + # non_local_traffic: no + # use_curl_http_client: False + # bind_host: localhost + + # use_pup: no + # pup_port: 17125 + # pup_interface: localhost + # pup_url: http://localhost:17125 + + # dogstatsd_port : 8125 + # dogstatsd_interval : 10 + # dogstatsd_normalize : yes + # statsd_forward_host: address_of_own_statsd_server + # statsd_forward_port: 8125 + + # device_blacklist_re: .*\/dev\/mapper\/lxc-box.* + + # ganglia_host: localhost + # ganglia_port: 8651 ''; + + postgresqlConfig = pkgs.writeText "postgres.yaml" cfg.postgresqlConfig; + nginxConfig = pkgs.writeText "nginx.yaml" cfg.nginxConfig; + + etcfiles = + [ { source = ddConf; + target = "dd-agent/datadog.conf"; + } ] ++ + (optional (cfg.postgresqlConfig != null) + { source = postgresqlConfig; + target = "dd-agent/conf.d/postgres.yaml"; + }) ++ + (optional (cfg.nginxConfig != null) + { source = nginxConfig; + target = "dd-agent/conf.d/nginx.yaml"; + }); + in { options.services.dd-agent = { enable = mkOption { description = "Whether to enable the dd-agent montioring service"; - default = false; - type = types.bool; }; - # !!! This gets stored in the store (world-readable), wish we had https://github.com/NixOS/nix/issues/8 api_key = mkOption { description = "The Datadog API key to associate the agent with your account"; - example = "ae0aa6a8f08efa988ba0a17578f009ab"; - type = types.str; }; hostname = mkOption { description = "The hostname to show in the Datadog dashboard (optional)"; - default = null; - example = "mymachine.mydomain"; + type = types.uniq (types.nullOr types.string); + }; + postgresqlConfig = mkOption { + description = "Datadog PostgreSQL integration configuration"; + default = null; + type = types.uniq (types.nullOr types.string); + }; + + nginxConfig = mkOption { + description = "Datadog nginx integration configuration"; + default = null; type = types.uniq (types.nullOr types.string); }; }; config = mkIf cfg.enable { - environment.etc = [ { source = datadog_conf; target = "dd-agent/datadog.conf"; } ]; environment.systemPackages = [ pkgs."dd-agent" pkgs.sysstat pkgs.procps ]; - users.extraUsers."dd-agent" = { + users.extraUsers.datadog = { description = "Datadog Agent User"; - uid = config.ids.uids.dd-agent; - group = "dd-agent"; + uid = config.ids.uids.datadog; + group = "datadog"; home = "/var/log/datadog/"; createHome = true; }; - users.extraGroups.dd-agent.gid = config.ids.gids.dd-agent; + users.extraGroups.datadog.gid = config.ids.gids.datadog; systemd.services.dd-agent = { description = "Datadog agent monitor"; @@ -60,12 +119,12 @@ in { wantedBy = [ "multi-user.target" ]; serviceConfig = { ExecStart = "${pkgs.dd-agent}/bin/dd-agent foreground"; - User = "dd-agent"; - Group = "dd-agent"; + User = "datadog"; + Group = "datadog"; Restart = "always"; RestartSec = 2; }; - restartTriggers = [ pkgs.dd-agent datadog_conf ]; + restartTriggers = [ pkgs.dd-agent ddConf postgresqlConfig nginxConfig ]; }; systemd.services.dogstatsd = { @@ -74,14 +133,16 @@ in { wantedBy = [ "multi-user.target" ]; serviceConfig = { ExecStart = "${pkgs.dd-agent}/bin/dogstatsd start"; - User = "dd-agent"; - Group = "dd-agent"; + User = "datadog"; + Group = "datadog"; Type = "forking"; PIDFile = "/tmp/dogstatsd.pid"; Restart = "always"; RestartSec = 2; }; - restartTriggers = [ pkgs.dd-agent datadog_conf ]; + restartTriggers = [ pkgs.dd-agent ddConf postgresqlConfig nginxConfig ]; }; + + environment.etc = etcfiles; }; } diff --git a/pkgs/tools/networking/dd-agent/default.nix b/pkgs/tools/networking/dd-agent/default.nix index 87290d4061ae..1edfc02bb388 100644 --- a/pkgs/tools/networking/dd-agent/default.nix +++ b/pkgs/tools/networking/dd-agent/default.nix @@ -1,4 +1,5 @@ -{ stdenv, fetchurl, python, sysstat, unzip, tornado, makeWrapper }: +{ stdenv, fetchurl, python, pythonPackages, sysstat, unzip, tornado +, makeWrapper }: stdenv.mkDerivation rec { version = "4.2.1"; @@ -9,7 +10,7 @@ stdenv.mkDerivation rec { sha256 = "0s1lg7rqx86z0y111105gwkknzplq149cxd7v3yg30l22wn68dmv"; }; - buildInputs = [ python unzip makeWrapper ]; + buildInputs = [ python unzip makeWrapper pythonPackages.psycopg2 ]; propagatedBuildInputs = [ python tornado ]; postUnpack = "export sourceRoot=$sourceRoot/packaging"; @@ -21,18 +22,19 @@ stdenv.mkDerivation rec { postInstall = '' mv $out/usr/* $out rmdir $out/usr - wrapProgram $out/bin/dd-forwarder --prefix PYTHONPATH : $PYTHONPATH + wrapProgram $out/bin/dd-forwarder \ + --prefix PYTHONPATH : $PYTHONPATH + wrapProgram $out/bin/dd-agent \ + --prefix PYTHONPATH : $PYTHONPATH + wrapProgram $out/bin/dogstatsd \ + --prefix PYTHONPATH : $PYTHONPATH ''; meta = { description = "Event collector for the DataDog analysis service"; - - homepage = http://www.datadoghq.com; - - maintainers = [ stdenv.lib.maintainers.iElectric ]; - - license = stdenv.lib.licenses.bsd3; - - platforms = stdenv.lib.platforms.all; + homepage = http://www.datadoghq.com; + license = stdenv.lib.licenses.bsd3; + platforms = stdenv.lib.platforms.all; + maintainers = with stdenv.lib.maintainers; [ thoughtpolice iElectric ]; }; }