summaryrefslogtreecommitdiffstats
path: root/pkgs/tools/networking/dd-agent/integrations-core.nix
blob: 5cd012ad4434fe9d09d10dd4eef0b4c944ac8797 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# The declarations in this file build the Datadog agent's core
# integrations. These integrations are tracked in a separate
# repository[1] outside of the agent's primary repository and provide
# checks for various kinds of services.
#
# Not all services are relevant for all users, however. As some of
# them depend on various tools and Python packages it is nonsensical
# to build *all* integrations by default.
#
# A set of default integrations is defined and built either way.
# Additional integrations can be specified by overriding
# `extraIntegrations` in datadog-integrations-core.
#
# In practice the syntax for using this with additional integrations
# is not the most beautiful, but it works. For example to use
# datadog-agent from the top-level with the `ntp`-integration
# included, one could say:
#
# let
#   integrationsWithNtp = datadog-integrations-core {
#     # Extra integrations map from the integration name (as in the
#     # integrations-core repository) to a function that receives the
#     # Python package set and returns the required dependencies.g
#     ntp = (ps: [ ps.ntplib ]);
#   };
#
# in ddAgentWithNtp = datadog-agent.overrideAttrs(_ : {
#   python = integrationsWithNtp.python;
# });
#
# The NixOS module 'datadog-agent' provides a simplified interface to
# this. Please see the module itself for more information.
#
# [1]: https://github.com/DataDog/integrations-core

{
  lib,
  fetchFromGitHub,
  python3Packages,
  extraIntegrations ? { },
}:

let
  inherit (lib) attrValues mapAttrs;
  version = "7.70.2";

  src = fetchFromGitHub {
    owner = "DataDog";
    repo = "integrations-core";
    tag = version;
    hash = "sha256-3H8nQpy/m53ZjtDfe6s89yowBXnPt+1ARfWxcx+JwQM=";
  };

  # Build helper to build a single datadog integration package.
  buildIntegration =
    { pname, ... }@args:
    python3Packages.buildPythonPackage (
      args
      // {
        inherit src version;
        name = "datadog-integration-${pname}-${version}";
        pyproject = true;

        sourceRoot = "${src.name}/${args.sourceRoot or pname}";
        buildInputs = with python3Packages; [
          hatchling
          setuptools
        ];
        doCheck = false;
      }
    );

  # Base package depended on by all other integrations.
  datadog_checks_base = buildIntegration {
    pname = "checks-base";
    sourceRoot = "datadog_checks_base";

    dependencies = with python3Packages; [
      binary
      cachetools
      cryptography
      immutables
      jellyfish
      lazy-loader
      prometheus-client
      protobuf
      pydantic
      python-dateutil
      pyyaml
      requests
      requests-toolbelt
      requests-unixsocket
      simplejson
      uptime
      wrapt
    ];

    pythonImportsCheck = [
      "datadog_checks.base"
      "datadog_checks.base.checks"
      "datadog_checks.checks"
    ];
  };

  # Default integrations that should be built:
  defaultIntegrations = {
    disk = (ps: [ ps.psutil ]);
    mongo = (ps: [ ps.pymongo ]);
    network = (ps: [ ps.psutil ]);
    nginx = (ps: [ ]);
    postgres = (
      ps: with ps; [
        pg8000
        psycopg2
        semver
      ]
    );
    process = (ps: [ ps.psutil ]);
  };

  # All integrations (default + extra):
  integrations = defaultIntegrations // extraIntegrations;
  builtIntegrations = mapAttrs (
    pname: fdeps:
    buildIntegration {
      inherit pname;
      propagatedBuildInputs = (fdeps python3Packages) ++ [ datadog_checks_base ];
    }
  ) integrations;

in
builtIntegrations
// {
  inherit datadog_checks_base;
  python = python3Packages.python.withPackages (_: (attrValues builtIntegrations));
}