vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / monitoring / prometheus / exporters / sql.nix
blob59715f5d33e24a782dc6a662743e355061a73316
1 { config, lib, pkgs, options, ... }:
2 let
3   cfg = config.services.prometheus.exporters.sql;
4   inherit (lib)
5     mkOption
6     types
7     mapAttrs
8     mapAttrsToList
9     concatStringsSep
10     ;
11   cfgOptions = {
12     options = with types; {
13       jobs = mkOption {
14         type = attrsOf (submodule jobOptions);
15         default = { };
16         description = "An attrset of metrics scraping jobs to run.";
17       };
18     };
19   };
20   jobOptions = {
21     options = with types; {
22       interval = mkOption {
23         type = str;
24         description = ''
25           How often to run this job, specified in
26           [Go duration](https://golang.org/pkg/time/#ParseDuration) format.
27         '';
28       };
29       connections = mkOption {
30         type = listOf str;
31         description = "A list of connection strings of the SQL servers to scrape metrics from";
32       };
33       startupSql = mkOption {
34         type = listOf str;
35         default = [];
36         description = "A list of SQL statements to execute once after making a connection.";
37       };
38       queries = mkOption {
39         type = attrsOf (submodule queryOptions);
40         description = "SQL queries to run.";
41       };
42     };
43   };
44   queryOptions = {
45     options = with types; {
46       help = mkOption {
47         type = nullOr str;
48         default = null;
49         description = "A human-readable description of this metric.";
50       };
51       labels = mkOption {
52         type = listOf str;
53         default = [ ];
54         description = "A set of columns that will be used as Prometheus labels.";
55       };
56       query = mkOption {
57         type = str;
58         description = "The SQL query to run.";
59       };
60       values = mkOption {
61         type = listOf str;
62         description = "A set of columns that will be used as values of this metric.";
63       };
64     };
65   };
67   configFile =
68     if cfg.configFile != null
69     then cfg.configFile
70     else
71       let
72         nameInline = mapAttrsToList (k: v: v // { name = k; });
73         renameStartupSql = j: removeAttrs (j // { startup_sql = j.startupSql; }) [ "startupSql" ];
74         configuration = {
75           jobs = map renameStartupSql
76             (nameInline (mapAttrs (k: v: (v // { queries = nameInline v.queries; })) cfg.configuration.jobs));
77         };
78       in
79       builtins.toFile "config.yaml" (builtins.toJSON configuration);
82   extraOpts = {
83     configFile = mkOption {
84       type = with types; nullOr path;
85       default = null;
86       description = ''
87         Path to configuration file.
88       '';
89     };
90     configuration = mkOption {
91       type = with types; nullOr (submodule cfgOptions);
92       default = null;
93       description = ''
94         Exporter configuration as nix attribute set. Mutually exclusive with 'configFile' option.
95       '';
96     };
97   };
99   port = 9237;
100   serviceOpts = {
101     serviceConfig = {
102       ExecStart = ''
103         ${pkgs.prometheus-sql-exporter}/bin/sql_exporter \
104           -web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
105           -config.file ${configFile} \
106           ${concatStringsSep " \\\n  " cfg.extraFlags}
107       '';
108       RestrictAddressFamilies = [
109         # Need AF_UNIX to collect data
110         "AF_UNIX"
111       ];
112     };
113   };