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