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