python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / services / monitoring / metricbeat.nix
blob310c9d8ed5094d32d7771d381dfd77cbf71231fb
1 { config, lib, pkgs, ... }:
3 let
4   inherit (lib)
5     attrValues
6     literalExpression
7     mkEnableOption
8     mkIf
9     mkOption
10     types
11     ;
12   cfg = config.services.metricbeat;
14   settingsFormat = pkgs.formats.yaml {};
18   options = {
20     services.metricbeat = {
22       enable = mkEnableOption (lib.mdDoc "metricbeat");
24       package = mkOption {
25         type = types.package;
26         default = pkgs.metricbeat;
27         defaultText = literalExpression "pkgs.metricbeat";
28         example = literalExpression "pkgs.metricbeat7";
29         description = lib.mdDoc ''
30           The metricbeat package to use
31         '';
32       };
34       modules = mkOption {
35         description = lib.mdDoc ''
36           Metricbeat modules are responsible for reading metrics from the various sources.
38           This is like `services.metricbeat.settings.metricbeat.modules`,
39           but structured as an attribute set. This has the benefit that multiple
40           NixOS modules can contribute settings to a single metricbeat module.
42           A module can be specified multiple times by choosing a different `<name>`
43           for each, but setting [](#opt-services.metricbeat.modules._name_.module) to the same value.
45           See <https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-modules.html>.
46         '';
47         default = {};
48         type = types.attrsOf (types.submodule ({ name, ... }: {
49           freeformType = settingsFormat.type;
50           options = {
51             module = mkOption {
52               type = types.str;
53               default = name;
54               description = lib.mdDoc ''
55                 The name of the module.
57                 Look for the value after `module:` on the individual
58                 module pages linked from <https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-modules.html>.
59               '';
60             };
61           };
62         }));
63         example = {
64           system = {
65             metricsets = ["cpu" "load" "memory" "network" "process" "process_summary" "uptime" "socket_summary"];
66             enabled = true;
67             period = "10s";
68             processes = [".*"];
69             cpu.metrics = ["percentages" "normalized_percentages"];
70             core.metrics = ["percentages"];
71           };
72         };
73       };
75       settings = mkOption {
76         type = types.submodule {
77           freeformType = settingsFormat.type;
78           options = {
80             name = mkOption {
81               type = types.str;
82               default = "";
83               description = lib.mdDoc ''
84                 Name of the beat. Defaults to the hostname.
85                 See <https://www.elastic.co/guide/en/beats/metricbeat/current/configuration-general-options.html#_name>.
86               '';
87             };
89             tags = mkOption {
90               type = types.listOf types.str;
91               default = [];
92               description = lib.mdDoc ''
93                 Tags to place on the shipped metrics.
94                 See <https://www.elastic.co/guide/en/beats/metricbeat/current/configuration-general-options.html#_tags_2>.
95               '';
96             };
98             metricbeat.modules = mkOption {
99               type = types.listOf settingsFormat.type;
100               default = [];
101               internal = true;
102               description = lib.mdDoc ''
103                 The metric collecting modules. Use [](#opt-services.metricbeat.modules) instead.
105                 See <https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-modules.html>.
106               '';
107             };
108           };
109         };
110         default = {};
111         description = lib.mdDoc ''
112           Configuration for metricbeat. See <https://www.elastic.co/guide/en/beats/metricbeat/current/configuring-howto-metricbeat.html> for supported values.
113         '';
114       };
116     };
117   };
119   config = mkIf cfg.enable {
121     assertions = [
122       {
123         # empty modules would cause a failure at runtime
124         assertion = cfg.settings.metricbeat.modules != [];
125         message = "services.metricbeat: You must configure one or more modules.";
126       }
127     ];
129     services.metricbeat.settings.metricbeat.modules = attrValues cfg.modules;
131     systemd.services.metricbeat = {
132       description = "metricbeat metrics shipper";
133       wantedBy = [ "multi-user.target" ];
134       serviceConfig = {
135         ExecStart = ''
136           ${cfg.package}/bin/metricbeat \
137             -c ${settingsFormat.generate "metricbeat.yml" cfg.settings} \
138             --path.data $STATE_DIRECTORY \
139             --path.logs $LOGS_DIRECTORY \
140             ;
141         '';
142         Restart = "always";
143         DynamicUser = true;
144         ProtectSystem = "strict";
145         ProtectHome = "tmpfs";
146         StateDirectory = "metricbeat";
147         LogsDirectory = "metricbeat";
148       };
149     };
150   };