mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-01-22 21:04:30 +00:00
181 lines
5.8 KiB
Markdown
181 lines
5.8 KiB
Markdown
|
# Prometheus exporters {#module-services-prometheus-exporters}
|
||
|
|
||
|
Prometheus exporters provide metrics for the
|
||
|
[prometheus monitoring system](https://prometheus.io).
|
||
|
|
||
|
## Configuration {#module-services-prometheus-exporters-configuration}
|
||
|
|
||
|
One of the most common exporters is the
|
||
|
[node exporter](https://github.com/prometheus/node_exporter),
|
||
|
it provides hardware and OS metrics from the host it's
|
||
|
running on. The exporter could be configured as follows:
|
||
|
```
|
||
|
services.prometheus.exporters.node = {
|
||
|
enable = true;
|
||
|
port = 9100;
|
||
|
enabledCollectors = [
|
||
|
"logind"
|
||
|
"systemd"
|
||
|
];
|
||
|
disabledCollectors = [
|
||
|
"textfile"
|
||
|
];
|
||
|
openFirewall = true;
|
||
|
firewallFilter = "-i br0 -p tcp -m tcp --dport 9100";
|
||
|
};
|
||
|
```
|
||
|
It should now serve all metrics from the collectors that are explicitly
|
||
|
enabled and the ones that are
|
||
|
[enabled by default](https://github.com/prometheus/node_exporter#enabled-by-default),
|
||
|
via http under `/metrics`. In this
|
||
|
example the firewall should just allow incoming connections to the
|
||
|
exporter's port on the bridge interface `br0` (this would
|
||
|
have to be configured separately of course). For more information about
|
||
|
configuration see `man configuration.nix` or search through
|
||
|
the [available options](https://nixos.org/nixos/options.html#prometheus.exporters).
|
||
|
|
||
|
Prometheus can now be configured to consume the metrics produced by the exporter:
|
||
|
```
|
||
|
services.prometheus = {
|
||
|
# ...
|
||
|
|
||
|
scrapeConfigs = [
|
||
|
{
|
||
|
job_name = "node";
|
||
|
static_configs = [{
|
||
|
targets = [ "localhost:${toString config.services.prometheus.exporters.node.port}" ];
|
||
|
}];
|
||
|
}
|
||
|
];
|
||
|
|
||
|
# ...
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Adding a new exporter {#module-services-prometheus-exporters-new-exporter}
|
||
|
|
||
|
To add a new exporter, it has to be packaged first (see
|
||
|
`nixpkgs/pkgs/servers/monitoring/prometheus/` for
|
||
|
examples), then a module can be added. The postfix exporter is used in this
|
||
|
example:
|
||
|
|
||
|
- Some default options for all exporters are provided by
|
||
|
`nixpkgs/nixos/modules/services/monitoring/prometheus/exporters.nix`:
|
||
|
|
||
|
- `enable`
|
||
|
- `port`
|
||
|
- `listenAddress`
|
||
|
- `extraFlags`
|
||
|
- `openFirewall`
|
||
|
- `firewallFilter`
|
||
|
- `user`
|
||
|
- `group`
|
||
|
- As there is already a package available, the module can now be added. This
|
||
|
is accomplished by adding a new file to the
|
||
|
`nixos/modules/services/monitoring/prometheus/exporters/`
|
||
|
directory, which will be called postfix.nix and contains all exporter
|
||
|
specific options and configuration:
|
||
|
```
|
||
|
# nixpgs/nixos/modules/services/prometheus/exporters/postfix.nix
|
||
|
{ config, lib, pkgs, options }:
|
||
|
|
||
|
with lib;
|
||
|
|
||
|
let
|
||
|
# for convenience we define cfg here
|
||
|
cfg = config.services.prometheus.exporters.postfix;
|
||
|
in
|
||
|
{
|
||
|
port = 9154; # The postfix exporter listens on this port by default
|
||
|
|
||
|
# `extraOpts` is an attribute set which contains additional options
|
||
|
# (and optional overrides for default options).
|
||
|
# Note that this attribute is optional.
|
||
|
extraOpts = {
|
||
|
telemetryPath = mkOption {
|
||
|
type = types.str;
|
||
|
default = "/metrics";
|
||
|
description = ''
|
||
|
Path under which to expose metrics.
|
||
|
'';
|
||
|
};
|
||
|
logfilePath = mkOption {
|
||
|
type = types.path;
|
||
|
default = /var/log/postfix_exporter_input.log;
|
||
|
example = /var/log/mail.log;
|
||
|
description = ''
|
||
|
Path where Postfix writes log entries.
|
||
|
This file will be truncated by this exporter!
|
||
|
'';
|
||
|
};
|
||
|
showqPath = mkOption {
|
||
|
type = types.path;
|
||
|
default = /var/spool/postfix/public/showq;
|
||
|
example = /var/lib/postfix/queue/public/showq;
|
||
|
description = ''
|
||
|
Path at which Postfix places its showq socket.
|
||
|
'';
|
||
|
};
|
||
|
};
|
||
|
|
||
|
# `serviceOpts` is an attribute set which contains configuration
|
||
|
# for the exporter's systemd service. One of
|
||
|
# `serviceOpts.script` and `serviceOpts.serviceConfig.ExecStart`
|
||
|
# has to be specified here. This will be merged with the default
|
||
|
# service configuration.
|
||
|
# Note that by default 'DynamicUser' is 'true'.
|
||
|
serviceOpts = {
|
||
|
serviceConfig = {
|
||
|
DynamicUser = false;
|
||
|
ExecStart = ''
|
||
|
${pkgs.prometheus-postfix-exporter}/bin/postfix_exporter \
|
||
|
--web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
|
||
|
--web.telemetry-path ${cfg.telemetryPath} \
|
||
|
${concatStringsSep " \\\n " cfg.extraFlags}
|
||
|
'';
|
||
|
};
|
||
|
};
|
||
|
}
|
||
|
```
|
||
|
- This should already be enough for the postfix exporter. Additionally one
|
||
|
could now add assertions and conditional default values. This can be done
|
||
|
in the 'meta-module' that combines all exporter definitions and generates
|
||
|
the submodules:
|
||
|
`nixpkgs/nixos/modules/services/prometheus/exporters.nix`
|
||
|
|
||
|
## Updating an exporter module {#module-services-prometheus-exporters-update-exporter-module}
|
||
|
|
||
|
Should an exporter option change at some point, it is possible to add
|
||
|
information about the change to the exporter definition similar to
|
||
|
`nixpkgs/nixos/modules/rename.nix`:
|
||
|
```
|
||
|
{ config, lib, pkgs, options }:
|
||
|
|
||
|
with lib;
|
||
|
|
||
|
let
|
||
|
cfg = config.services.prometheus.exporters.nginx;
|
||
|
in
|
||
|
{
|
||
|
port = 9113;
|
||
|
extraOpts = {
|
||
|
# additional module options
|
||
|
# ...
|
||
|
};
|
||
|
serviceOpts = {
|
||
|
# service configuration
|
||
|
# ...
|
||
|
};
|
||
|
imports = [
|
||
|
# 'services.prometheus.exporters.nginx.telemetryEndpoint' -> 'services.prometheus.exporters.nginx.telemetryPath'
|
||
|
(mkRenamedOptionModule [ "telemetryEndpoint" ] [ "telemetryPath" ])
|
||
|
|
||
|
# removed option 'services.prometheus.exporters.nginx.insecure'
|
||
|
(mkRemovedOptionModule [ "insecure" ] ''
|
||
|
This option was replaced by 'prometheus.exporters.nginx.sslVerify' which defaults to true.
|
||
|
'')
|
||
|
({ options.warnings = options.warnings; })
|
||
|
];
|
||
|
}
|
||
|
```
|