Grafana: Difference between revisions

From NixOS Wiki
Klinger (talk | contribs)
Dander (talk | contribs)
simply explanation of setting up subpath / subdomain
Line 7: Line 7:
Grafana is available as NixOS module, it can be enabled using the following config:
Grafana is available as NixOS module, it can be enabled using the following config:


<syntaxhighlight lang=nix>
<syntaxhighlight lang="nix">
services.grafana = {
services.grafana = {
   enable = true;
   enable = true;
   settings = {
   settings = {
     server = {
     server = {
      # Listening Address
       http_addr = "127.0.0.1";
       http_addr = "127.0.0.1";
      # and Port
       http_port = 3000;
       http_port = 3000;
       # Grafana needs to know on which domain and URL it's running
      domain = "grafana.your.domain";
       domain = "your.domain";
 
       root_url = "https://your.domain/grafana/"; # Not needed if it is `https://your.domain/`
       # Alternatively, if you want to server Grafana from a subpath:
       serve_from_sub_path = true;
       # domain = "your.domain";
       # root_url = "https://your.domain/grafana/";
       # serve_from_sub_path = true;
     };
     };
   };
   };

Revision as of 21:15, 22 October 2024

Grafana is an open-source, general purpose dashboarding tool, which runs as a web application. It can be used to create a variety of time-series graphs and also for displaying logs. It supports Prometheus, graphite, InfluxDB, opentsdb, Grafana Loki, PostgreSQL and many other data sources.

See Grafana options

Installation

Grafana is available as NixOS module, it can be enabled using the following config:

services.grafana = {
  enable = true;
  settings = {
    server = {
      http_addr = "127.0.0.1";
      http_port = 3000;
      domain = "grafana.your.domain";

      # Alternatively, if you want to server Grafana from a subpath:
      # domain = "your.domain";
      # root_url = "https://your.domain/grafana/";
      # serve_from_sub_path = true;
    };
  };
};

This will make Grafana available only at localhost. On a server, it might be used through SSH tunnel or made publicly available using nginx with TLS. For example the follwing Nginx configuration can be used:

services.nginx.virtualHosts."your.domain" = {
  addSSL = true;
  enableACME = true;
  locations."/grafana/" = {
      proxyPass = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}";
      proxyWebsockets = true;
      recommendedProxySettings = true;
  };
};

Configuration

Everything else (data sources, users, dashboards, ...) can be configured either in the Web UI, or as code.

Via Web UI

Log into the Grafana web application (using default user: admin, password: admin). Refer to the official documentation on how to do it:

Declarative configuration

services.grafana = {
  declarativePlugins = with pkgs.grafanaPlugins; [ ... ];

  provision = {
    enable = true;

    dashboards.settings.providers = [{
      name = "my dashboards";
      options.path = "/etc/grafana-dashboards";
    }];

    datasources.settings.datasources = [
      # "Built-in" datasources can be provisioned - c.f. https://grafana.com/docs/grafana/latest/administration/provisioning/#data-sources
      {
        name = "Prometheus";
        type = "prometheus";
        url = "http://${config.services.prometheus.listenAddress}:${toString config.services.prometheus.port}";
      }
      # Some plugins also can - c.f. https://grafana.com/docs/plugins/yesoreyeram-infinity-datasource/latest/setup/provisioning/
      {
        name = "Infinity";
        type = "yesoreyeram-infinity-datasource";
      }
      # But not all - c.f. https://github.com/fr-ser/grafana-sqlite-datasource/issues/141
    ];

    # Note: removing attributes from the above `datasources.settings.datasources` is not enough for them to be deleted on `grafana`;
    # One needs to use the following option:
    # datasources.settings.deleteDatasources = [ { name = "foo"; orgId = 1; } { name = "bar"; orgId = 1; } ];
  };
};

environment.etc = [{
  source = ./. + "/grafana-dashboards/some-dashboard.json";
  group = "grafana";
  user = "grafana";
}];

External Links