at 22.05-pre 5.0 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 "grafana-image-renderer"; 14 15 chromium = mkOption { 16 type = types.package; 17 description = '' 18 The chromium to use for image rendering. 19 ''; 20 }; 21 22 verbose = mkEnableOption "verbosity for the service"; 23 24 provisionGrafana = mkEnableOption "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 = '' 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 = '' 43 The log-level of the <filename>grafana-image-renderer.service</filename>-unit. 44 ''; 45 }; 46 }; 47 rendering = { 48 width = mkOption { 49 default = 1000; 50 type = types.ints.positive; 51 description = '' 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 = '' 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 = '' 66 Rendering mode of <package>grafana-image-renderer</package>: 67 <itemizedlist> 68 <listitem><para><literal>default:</literal> Creates on browser-instance 69 per rendering request.</para></listitem> 70 <listitem><para><literal>reusable:</literal> One browser instance 71 will be started and reused for each rendering request.</para></listitem> 72 <listitem><para><literal>clustered:</literal> allows to precisely 73 configure how many browser-instances are supposed to be used. The values 74 for that mode can be declared in <literal>rendering.clustering</literal>. 75 </para></listitem> 76 </itemizedlist> 77 ''; 78 }; 79 args = mkOption { 80 type = types.listOf types.str; 81 default = [ "--no-sandbox" ]; 82 description = '' 83 List of CLI flags passed to <package>chromium</package>. 84 ''; 85 }; 86 }; 87 }; 88 }; 89 90 default = {}; 91 92 description = '' 93 Configuration attributes for <package>grafana-image-renderer</package>. 94 95 See <link xlink:href="https://github.com/grafana/grafana-image-renderer/blob/ce1f81438e5f69c7fd7c73ce08bab624c4c92e25/default.json" /> 96 for supported values. 97 ''; 98 }; 99 }; 100 101 config = mkIf cfg.enable { 102 assertions = [ 103 { assertion = cfg.provisionGrafana -> config.services.grafana.enable; 104 message = '' 105 To provision a Grafana instance to use grafana-image-renderer, 106 `services.grafana.enable` must be set to `true`! 107 ''; 108 } 109 ]; 110 111 services.grafana.extraOptions = mkIf cfg.provisionGrafana { 112 RENDERING_SERVER_URL = "http://localhost:${toString cfg.settings.service.port}/render"; 113 RENDERING_CALLBACK_URL = "http://localhost:${toString config.services.grafana.port}"; 114 }; 115 116 services.grafana-image-renderer.chromium = mkDefault pkgs.chromium; 117 118 services.grafana-image-renderer.settings = { 119 rendering = mapAttrs (const mkDefault) { 120 chromeBin = "${cfg.chromium}/bin/chromium"; 121 verboseLogging = cfg.verbose; 122 timezone = config.time.timeZone; 123 }; 124 125 service = { 126 logging.level = mkIf cfg.verbose (mkDefault "debug"); 127 metrics.enabled = mkDefault false; 128 }; 129 }; 130 131 systemd.services.grafana-image-renderer = { 132 wantedBy = [ "multi-user.target" ]; 133 after = [ "network.target" ]; 134 description = " A Grafana backend plugin that handles rendering of panels & dashboards to PNGs using headless browser (Chromium/Chrome)"; 135 136 environment = { 137 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = "true"; 138 }; 139 140 serviceConfig = { 141 DynamicUser = true; 142 PrivateTmp = true; 143 ExecStart = "${pkgs.grafana-image-renderer}/bin/grafana-image-renderer server --config=${configFile}"; 144 Restart = "always"; 145 }; 146 }; 147 }; 148 149 meta.maintainers = with maintainers; [ ma27 ]; 150}