diff --git a/nixos/modules/services/monitoring/prometheus/exporters.nix b/nixos/modules/services/monitoring/prometheus/exporters.nix
index aeed55172daf..f9ad1457fc85 100644
--- a/nixos/modules/services/monitoring/prometheus/exporters.nix
+++ b/nixos/modules/services/monitoring/prometheus/exporters.nix
@@ -29,6 +29,7 @@ let
"fritzbox"
"json"
"mail"
+ "mikrotik"
"minio"
"nextcloud"
"nginx"
@@ -204,6 +205,14 @@ in
Please ensure you have either `services.prometheus.exporters.snmp.configuration'
or `services.prometheus.exporters.snmp.configurationPath' set!
'';
+ } {
+ assertion = cfg.mikrotik.enable -> (
+ (cfg.mikrotik.configFile == null) != (cfg.mikrotik.configuration == null)
+ );
+ message = ''
+ Please specify either `services.prometheus.exporters.mikrotik.configuration'
+ or `services.prometheus.exporters.mikrotik.configFile'.
+ '';
} {
assertion = cfg.mail.enable -> (
(cfg.mail.configFile == null) != (cfg.mail.configuration == null)
diff --git a/nixos/modules/services/monitoring/prometheus/exporters/mikrotik.nix b/nixos/modules/services/monitoring/prometheus/exporters/mikrotik.nix
new file mode 100644
index 000000000000..62c2cc568476
--- /dev/null
+++ b/nixos/modules/services/monitoring/prometheus/exporters/mikrotik.nix
@@ -0,0 +1,66 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.mikrotik;
+in
+{
+ port = 9436;
+ extraOpts = {
+ configFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = ''
+ Path to a mikrotik exporter configuration file. Mutually exclusive with
+ option.
+ '';
+ example = literalExample "./mikrotik.yml";
+ };
+
+ configuration = mkOption {
+ type = types.nullOr types.attrs;
+ default = null;
+ description = ''
+ Mikrotik exporter configuration as nix attribute set. Mutually exclusive with
+ option.
+
+ See
+ for the description of the configuration file format.
+ '';
+ example = literalExample ''
+ {
+ devices = [
+ {
+ name = "my_router";
+ address = "10.10.0.1";
+ user = "prometheus";
+ password = "changeme";
+ }
+ ];
+ features = {
+ bgp = true;
+ dhcp = true;
+ routes = true;
+ optics = true;
+ };
+ }
+ '';
+ };
+ };
+ serviceOpts = let
+ configFile = if cfg.configFile != null
+ then cfg.configFile
+ else "${pkgs.writeText "mikrotik-exporter.yml" (builtins.toJSON cfg.configuration)}";
+ in {
+ serviceConfig = {
+ # -port is misleading name, it actually accepts address too
+ ExecStart = ''
+ ${pkgs.prometheus-mikrotik-exporter}/bin/mikrotik-exporter \
+ -config-file=${escapeShellArg configFile} \
+ -port=${cfg.listenAddress}:${toString cfg.port} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/nixos/tests/prometheus-exporters.nix b/nixos/tests/prometheus-exporters.nix
index 00c7b915c883..4fc3668cfafb 100644
--- a/nixos/tests/prometheus-exporters.nix
+++ b/nixos/tests/prometheus-exporters.nix
@@ -245,6 +245,46 @@ let
'';
};
+ mikrotik = {
+ exporterConfig = {
+ enable = true;
+ extraFlags = [ "-timeout=1s" ];
+ configuration = {
+ devices = [
+ {
+ name = "router";
+ address = "192.168.42.48";
+ user = "prometheus";
+ password = "shh";
+ }
+ ];
+ features = {
+ bgp = true;
+ dhcp = true;
+ dhcpl = true;
+ dhcpv6 = true;
+ health = true;
+ routes = true;
+ poe = true;
+ pools = true;
+ optics = true;
+ w60g = true;
+ wlansta = true;
+ wlanif = true;
+ monitor = true;
+ ipsec = true;
+ };
+ };
+ };
+ exporterTest = ''
+ wait_for_unit("prometheus-mikrotik-exporter.service")
+ wait_for_open_port(9436)
+ succeed(
+ "curl -sSf http://localhost:9436/metrics | grep -q 'mikrotik_scrape_collector_success{device=\"router\"} 0'"
+ )
+ '';
+ };
+
nextcloud = {
exporterConfig = {
enable = true;
diff --git a/pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix b/pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix
new file mode 100644
index 000000000000..12341eee911e
--- /dev/null
+++ b/pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix
@@ -0,0 +1,22 @@
+{ stdenv, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+ pname = "mikrotik-exporter-unstable";
+ version = "2020-02-10";
+
+ src = fetchFromGitHub {
+ owner = "nshttpd";
+ repo = "mikrotik-exporter";
+ sha256 = "193zh06rqp9ybsnkxwmv7l4p2h2xisw4f01jjirshsb784j44bh6";
+ rev = "3b33400d24abcfdc07dc31c15ca5ba7b82de444f";
+ };
+
+ modSha256 = "1cqjn6j3dfq51ssjx0qrajprlac1h0lb1r4af44lfpigzmrfyi07";
+
+ meta = with stdenv.lib; {
+ inherit (src.meta) homepage;
+ description = "Prometheus MikroTik device(s) exporter";
+ license = licenses.bsd3;
+ maintainers = with maintainers; [ mmilata ];
+ };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 5574d0cc76aa..4671c25a67c0 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -15797,6 +15797,7 @@ in
prometheus-json-exporter = callPackage ../servers/monitoring/prometheus/json-exporter.nix { };
prometheus-mail-exporter = callPackage ../servers/monitoring/prometheus/mail-exporter.nix { };
prometheus-mesos-exporter = callPackage ../servers/monitoring/prometheus/mesos-exporter.nix { };
+ prometheus-mikrotik-exporter = callPackage ../servers/monitoring/prometheus/mikrotik-exporter.nix { };
prometheus-minio-exporter = callPackage ../servers/monitoring/prometheus/minio-exporter { };
prometheus-mysqld-exporter = callPackage ../servers/monitoring/prometheus/mysqld-exporter.nix { };
prometheus-nextcloud-exporter = callPackage ../servers/monitoring/prometheus/nextcloud-exporter.nix { };