python312Packages.yoda: 2.0.1 -> 2.0.2
[NixPkgs.git] / nixos / modules / services / monitoring / grafana-image-renderer.nix
blobe477f73adaa13000c804defb6188e6fc0f8b8c0e
1 { lib, pkgs, config, ... }:
2 let
3   cfg = config.services.grafana-image-renderer;
5   format = pkgs.formats.json { };
7   configFile = format.generate "grafana-image-renderer-config.json" cfg.settings;
8 in {
9   options.services.grafana-image-renderer = {
10     enable = lib.mkEnableOption "grafana-image-renderer";
12     chromium = lib.mkOption {
13       type = lib.types.package;
14       description = ''
15         The chromium to use for image rendering.
16       '';
17     };
19     verbose = lib.mkEnableOption "verbosity for the service";
21     provisionGrafana = lib.mkEnableOption "Grafana configuration for grafana-image-renderer";
23     settings = lib.mkOption {
24       type = lib.types.submodule {
25         freeformType = format.type;
27         options = {
28           service = {
29             port = lib.mkOption {
30               type = lib.types.port;
31               default = 8081;
32               description = ''
33                 The TCP port to use for the rendering server.
34               '';
35             };
36             logging.level = lib.mkOption {
37               type = lib.types.enum [ "error" "warning" "info" "debug" ];
38               default = "info";
39               description = ''
40                 The log-level of the {file}`grafana-image-renderer.service`-unit.
41               '';
42             };
43           };
44           rendering = {
45             width = lib.mkOption {
46               default = 1000;
47               type = lib.types.ints.positive;
48               description = ''
49                 Width of the PNG used to display the alerting graph.
50               '';
51             };
52             height = lib.mkOption {
53               default = 500;
54               type = lib.types.ints.positive;
55               description = ''
56                 Height of the PNG used to display the alerting graph.
57               '';
58             };
59             mode = lib.mkOption {
60               default = "default";
61               type = lib.types.enum [ "default" "reusable" "clustered" ];
62               description = ''
63                 Rendering mode of `grafana-image-renderer`:
65                 - `default:` Creates on browser-instance
66                   per rendering request.
67                 - `reusable:` One browser instance
68                   will be started and reused for each rendering request.
69                 - `clustered:` allows to precisely
70                   configure how many browser-instances are supposed to be used. The values
71                   for that mode can be declared in `rendering.clustering`.
72               '';
73             };
74             args = lib.mkOption {
75               type = lib.types.listOf lib.types.str;
76               default = [ "--no-sandbox" ];
77               description = ''
78                 List of CLI flags passed to `chromium`.
79               '';
80             };
81           };
82         };
83       };
85       default = {};
87       description = ''
88         Configuration attributes for `grafana-image-renderer`.
90         See <https://github.com/grafana/grafana-image-renderer/blob/ce1f81438e5f69c7fd7c73ce08bab624c4c92e25/default.json>
91         for supported values.
92       '';
93     };
94   };
96   config = lib.mkIf cfg.enable {
97     assertions = [
98       { assertion = cfg.provisionGrafana -> config.services.grafana.enable;
99         message = ''
100           To provision a Grafana instance to use grafana-image-renderer,
101           `services.grafana.enable` must be set to `true`!
102         '';
103       }
104     ];
106     services.grafana.settings.rendering = lib.mkIf cfg.provisionGrafana {
107       server_url = "http://localhost:${toString cfg.settings.service.port}/render";
108       callback_url = "http://${config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}";
109     };
111     services.grafana-image-renderer.chromium = lib.mkDefault pkgs.chromium;
113     services.grafana-image-renderer.settings = {
114       rendering = lib.mapAttrs (lib.const lib.mkDefault) {
115         chromeBin = "${cfg.chromium}/bin/chromium";
116         verboseLogging = cfg.verbose;
117         timezone = config.time.timeZone;
118       };
120       service = {
121         logging.level = lib.mkIf cfg.verbose (lib.mkDefault "debug");
122         metrics.enabled = lib.mkDefault false;
123       };
124     };
126     systemd.services.grafana-image-renderer = {
127       wantedBy = [ "multi-user.target" ];
128       after = [ "network.target" ];
129       description = " A Grafana backend plugin that handles rendering of panels & dashboards to PNGs using headless browser (Chromium/Chrome)";
131       environment = {
132         PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = "true";
133       };
135       serviceConfig = {
136         DynamicUser = true;
137         PrivateTmp = true;
138         ExecStart = "${pkgs.grafana-image-renderer}/bin/grafana-image-renderer server --config=${configFile}";
139         Restart = "always";
140       };
141     };
142   };
144   meta.maintainers = with lib.maintainers; [ ma27 ];