6e43cc7fb0
* Content of `programlisting` shouldn't be indented, otherwise it's weirdly indented in the output. * Use `<xref linkend=.../>` in the release notes: then users can directly go to the option documentation when reading release notes. * Don't use docbook tags in `mkRemovedOptionModule`: it's only used during evaluation where docbook isn't rendered.
100 lines
2.7 KiB
Nix
100 lines
2.7 KiB
Nix
{ config, lib, pkgs, options }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
cfg = config.services.prometheus.exporters.rspamd;
|
|
|
|
prettyJSON = conf:
|
|
pkgs.runCommand "rspamd-exporter-config.yml" { } ''
|
|
echo '${builtins.toJSON conf}' | ${pkgs.buildPackages.jq}/bin/jq '.' > $out
|
|
'';
|
|
|
|
generateConfig = extraLabels: {
|
|
metrics = (map (path: {
|
|
name = "rspamd_${replaceStrings [ "." " " ] [ "_" "_" ] path}";
|
|
path = "$.${path}";
|
|
labels = extraLabels;
|
|
}) [
|
|
"actions.'add header'"
|
|
"actions.'no action'"
|
|
"actions.'rewrite subject'"
|
|
"actions.'soft reject'"
|
|
"actions.greylist"
|
|
"actions.reject"
|
|
"bytes_allocated"
|
|
"chunks_allocated"
|
|
"chunks_freed"
|
|
"chunks_oversized"
|
|
"connections"
|
|
"control_connections"
|
|
"ham_count"
|
|
"learned"
|
|
"pools_allocated"
|
|
"pools_freed"
|
|
"read_only"
|
|
"scanned"
|
|
"shared_chunks_allocated"
|
|
"spam_count"
|
|
"total_learns"
|
|
]) ++ [{
|
|
name = "rspamd_statfiles";
|
|
type = "object";
|
|
path = "$.statfiles[*]";
|
|
labels = recursiveUpdate {
|
|
symbol = "$.symbol";
|
|
type = "$.type";
|
|
} extraLabels;
|
|
values = {
|
|
revision = "$.revision";
|
|
size = "$.size";
|
|
total = "$.total";
|
|
used = "$.used";
|
|
languages = "$.languages";
|
|
users = "$.users";
|
|
};
|
|
}];
|
|
};
|
|
in
|
|
{
|
|
port = 7980;
|
|
extraOpts = {
|
|
extraLabels = mkOption {
|
|
type = types.attrsOf types.str;
|
|
default = {
|
|
host = config.networking.hostName;
|
|
};
|
|
defaultText = "{ host = config.networking.hostName; }";
|
|
example = literalExample ''
|
|
{
|
|
host = config.networking.hostName;
|
|
custom_label = "some_value";
|
|
}
|
|
'';
|
|
description = "Set of labels added to each metric.";
|
|
};
|
|
};
|
|
serviceOpts.serviceConfig.ExecStart = ''
|
|
${pkgs.prometheus-json-exporter}/bin/json_exporter \
|
|
--config.file ${prettyJSON (generateConfig cfg.extraLabels)} \
|
|
--web.listen-address "${cfg.listenAddress}:${toString cfg.port}" \
|
|
${concatStringsSep " \\\n " cfg.extraFlags}
|
|
'';
|
|
|
|
imports = [
|
|
(mkRemovedOptionModule [ "url" ] ''
|
|
This option was removed. The URL of the rspamd metrics endpoint
|
|
must now be provided to the exporter by prometheus via the url
|
|
parameter `target'.
|
|
|
|
In prometheus a scrape URL would look like this:
|
|
|
|
http://some.rspamd-exporter.host:7980/probe?target=http://some.rspamd.host:11334/stat
|
|
|
|
For more information, take a look at the official documentation
|
|
(https://github.com/prometheus-community/json_exporter) of the json_exporter.
|
|
'')
|
|
({ options.warnings = options.warnings; options.assertions = options.assertions; })
|
|
];
|
|
}
|