Grafana: Difference between revisions
imported>Iraizo m missed opening bracket |
Add infobox and Template:File-based codeblocks |
||
(16 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
[https://grafana.com/ Grafana] is an open-source, general purpose dashboarding tool, which runs as a web application. It can be used to create | '''[https://grafana.com/grafana/ Grafana]''' is an open-source, general purpose visualization and dashboarding tool, which runs as a web application. It can be used to create time-series graphs and display logs. For data sources, it supports [[Prometheus]], graphite, InfluxDB, opentsdb, [[Grafana Loki]], [[PostgreSQL]] and more. | ||
{{infobox application | |||
|name=Grafana | |||
|image=Grafana logo.svg | |||
|developer=Grafana Labs | |||
|type=Visualization and dashboarding tool | |||
|status=Active | |||
|license=GNU Affero General Public License v3.0 only | |||
|programmingLanguage=Go and TypeScript | |||
|github=grafana/grafana | |||
|documentation=https://grafana.com/docs/grafana/latest/ | |||
}} | |||
== Installation == | == Installation == | ||
Grafana is available as NixOS module | Grafana is available as NixOS module: {{nixos:option|services.grafana}}. [https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/ Official documentation] for the options inside <code>settings</code>. Here is a basic config: | ||
< | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
services.grafana = { | { | ||
services.grafana = { | |||
enable = true; | |||
settings = { | |||
server = { | |||
http_addr = "127.0.0.1"; | |||
http_port = 3000; | |||
enforce_domain = true; | |||
enable_gzip = true; | |||
domain = "grafana.your.domain"; | |||
# Alternatively, if you want to serve Grafana from a subpath: | |||
# domain = "your.domain"; | |||
# root_url = "https://your.domain/grafana/"; | |||
# serve_from_sub_path = true; | |||
}; | |||
# Prevents Grafana from phoning home | |||
#analytics.reporting_enabled = false; | |||
}; | }; | ||
}; | }; | ||
} | } | ||
</ | </nowiki>}} | ||
== Usage == | |||
Grafana can be used through tunnels, like a SSH tunnel, or a VPN tunnel like Wireguard or Headscale. This way, Grafana can be completely shielded from the outside. | |||
Another way is to make it publicly available, usually behind a reverse proxy. | |||
==== Nginx ==== | |||
< | Here is how to setup [[Nginx]] such that it proxies <code>your.domain/grafana</code> to your Grafana instance: | ||
services.nginx.virtualHosts."your.domain" = { | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
{ | |||
services.nginx.virtualHosts."your.domain" = { | |||
addSSL = true; | |||
proxyPass = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port} | enableACME = true; | ||
locations."/grafana/" = { | |||
proxyPass = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}"; | |||
proxyWebsockets = true; | proxyWebsockets = true; | ||
recommendedProxySettings = true; | |||
}; | |||
}; | }; | ||
}; | } | ||
</nowiki>}} | |||
==== Traefik ==== | |||
[[Traefik]] is another common reverse proxy, for which the configuration relevant to Grafana would like this: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
{ | |||
services.traefik = { | |||
# ... | |||
dynamicConfigOptions = { | |||
http.routers."your.domain" = { | |||
rule = "Host(`your.domain`) && PathPrefix(`/grafana`)"; | |||
service = "grafana"; | |||
} | |||
http.services."grafana" = { | |||
loadBalancer.servers = [ { | |||
url = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}"; | |||
} ] | |||
}; | |||
# ... | |||
}; | |||
} | |||
</nowiki>}} | |||
Alternatively, to use Grafana on <code>grafana.your.domain</code> instead of <code>your.domain/grafana</code>, you could change line 5 above to: | |||
<syntaxhighlight lang="diff"> | |||
-rule = "Host(`your.domain`) && PathPrefix(`/grafana`)"; | |||
+rule = "Host(`grafana.your.domain`)"; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == Configuration == | ||
Everything (data sources, users, dashboards, ...) can be configured either in the Web UI or provisioned as code using Nix. | |||
=== Via Web UI === | |||
Log into the Grafana web application (using default user: admin, password: admin) | Log into the Grafana web application (using default user: admin, password: admin). Refer to the official documentation on how to do it: | ||
* [https://grafana.com/docs/grafana/latest/datasources/add-a-data-source/ Add a data source] | * [https://grafana.com/docs/grafana/latest/datasources/add-a-data-source/ Add a data source] | ||
* [https://grafana.com/docs/grafana/latest/administration/manage-users-and-permissions/manage-server-users/add-user/ Add a user] | * [https://grafana.com/docs/grafana/latest/administration/manage-users-and-permissions/manage-server-users/add-user/ Add a user] | ||
* [https://grafana.com/docs/grafana/latest/dashboards/dashboard-create/ Create dashboard] | * [https://grafana.com/docs/grafana/latest/dashboards/dashboard-create/ Create dashboard] | ||
=== Declarative configuration === | |||
Grafana supports [https://grafana.com/docs/grafana/latest/administration/provisioning/ provisioning] data sources, dashboards and alerting using {{nixos:option|services.grafana.provision}}. Note that removing a provision and switching to the new NixOS configuration does not currently remove the provisioned items; you have to define them, for example, in <code>deleteDatasources</code>. | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
{ | |||
services.grafana = { | |||
declarativePlugins = with pkgs.grafanaPlugins; [ ... ]; | |||
provision = { | |||
enable = true; | |||
# Creates a *mutable* dashboard provider, pulling from /etc/grafana-dashboards. | |||
# With this, you can manually provision dashboards from JSON with `environment.etc` like below. | |||
dashboards.settings.providers = [{ | |||
name = "my dashboards"; | |||
disableDeletion = true; | |||
options = { | |||
path = "/etc/grafana-dashboards"; | |||
foldersFromFilesStructure = true; | |||
}; | |||
}]; | |||
datasources.settings.datasources = [ | |||
# Provisioning a built-in data source | |||
{ | |||
name = "Prometheus"; | |||
type = "prometheus"; | |||
url = "http://${config.services.prometheus.listenAddress}:${toString config.services.prometheus.port}"; | |||
isDefault = true; | |||
editable = false; | |||
} | |||
# All plugins can be provisioned but it's not always documented: https://github.com/fr-ser/grafana-sqlite-datasource/blob/main/docs/faq.md#can-i-use-provisioning-with-this-plugin | |||
# Compare below with https://grafana.com/docs/plugins/yesoreyeram-infinity-datasource/latest/setup/provisioning/ | |||
{ | |||
name = "Infinity"; | |||
type = "yesoreyeram-infinity-datasource"; | |||
editable = false; | |||
} | |||
]; | |||
# Note: removing attributes from the above `datasources.settings.datasources` is not currently enough for them to be deleted; | |||
# One needs to use the following option: | |||
# datasources.settings.deleteDatasources = [ { name = "foo"; orgId = 1; } { name = "bar"; orgId = 1; } ]; | |||
}; | |||
}; | |||
# see `dashboards.settings.providers` above | |||
environment.etc."grafana-dashboards/some-dashboard.json".source = ./some-dashboard.json; | |||
} | |||
</nowiki>}} | |||
== External Links == | == External Links == | ||
Line 49: | Line 161: | ||
* [https://grafana.com/ grafana.com] | * [https://grafana.com/ grafana.com] | ||
* [https://xeiaso.net/blog/prometheus-grafana-loki-nixos-2020-11-20 How to Setup Prometheus, Grafana and Loki on NixOS] | * [https://xeiaso.net/blog/prometheus-grafana-loki-nixos-2020-11-20 How to Setup Prometheus, Grafana and Loki on NixOS] | ||
[[Category:Server]] | |||
[[Category:Web Applications]] |