vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / monitoring / prometheus / exporters / rspamd.nix
blob8993aee5d248256d7773ede64570fc3053149a96
1 { config, lib, pkgs, options, ... }:
3 let
4   cfg = config.services.prometheus.exporters.rspamd;
5   inherit (lib)
6     mkOption
7     types
8     replaceStrings
9     mkRemovedOptionModule
10     recursiveUpdate
11     concatStringsSep
12     literalExpression
13     ;
15   mkFile = conf:
16     pkgs.writeText "rspamd-exporter-config.yml" (builtins.toJSON conf);
18   generateConfig = extraLabels: {
19     modules.default.metrics = (map (path: {
20       name = "rspamd_${replaceStrings [ "[" "." " " "]" "\\" "'" ] [ "_" "_" "_" "" "" "" ] path}";
21       path = "{ .${path} }";
22       labels = extraLabels;
23     }) [
24       "actions['add\\ header']"
25       "actions['no\\ action']"
26       "actions['rewrite\\ subject']"
27       "actions['soft\\ reject']"
28       "actions.greylist"
29       "actions.reject"
30       "bytes_allocated"
31       "chunks_allocated"
32       "chunks_freed"
33       "chunks_oversized"
34       "connections"
35       "control_connections"
36       "ham_count"
37       "learned"
38       "pools_allocated"
39       "pools_freed"
40       "read_only"
41       "scanned"
42       "shared_chunks_allocated"
43       "spam_count"
44       "total_learns"
45     ]) ++ [{
46       name = "rspamd_statfiles";
47       type = "object";
48       path = "{.statfiles[*]}";
49       labels = recursiveUpdate {
50         symbol = "{.symbol}";
51         type = "{.type}";
52       } extraLabels;
53       values = {
54         revision = "{.revision}";
55         size = "{.size}";
56         total = "{.total}";
57         used = "{.used}";
58         languages = "{.languages}";
59         users = "{.users}";
60       };
61     }];
62   };
65   port = 7980;
66   extraOpts = {
67     extraLabels = mkOption {
68       type = types.attrsOf types.str;
69       default = {
70         host = config.networking.hostName;
71       };
72       defaultText = literalExpression "{ host = config.networking.hostName; }";
73       example = literalExpression ''
74         {
75           host = config.networking.hostName;
76           custom_label = "some_value";
77         }
78       '';
79       description = "Set of labels added to each metric.";
80     };
81   };
82   serviceOpts.serviceConfig.ExecStart = ''
83     ${pkgs.prometheus-json-exporter}/bin/json_exporter \
84       --config.file ${mkFile (generateConfig cfg.extraLabels)} \
85       --web.listen-address "${cfg.listenAddress}:${toString cfg.port}" \
86       ${concatStringsSep " \\\n  " cfg.extraFlags}
87   '';
89   imports = [
90     (mkRemovedOptionModule [ "url" ] ''
91       This option was removed. The URL of the rspamd metrics endpoint
92       must now be provided to the exporter by prometheus via the url
93       parameter `target'.
95       In prometheus a scrape URL would look like this:
97         http://some.rspamd-exporter.host:7980/probe?target=http://some.rspamd.host:11334/stat
99       For more information, take a look at the official documentation
100       (https://github.com/prometheus-community/json_exporter) of the json_exporter.
101     '')
102      ({ options.warnings = options.warnings; options.assertions = options.assertions; })
103   ];