| 
									
										
										
										
											2019-05-31 22:01:27 +02:00
										 |  |  | { system ? builtins.currentSystem | 
					
						
							|  |  |  | , config ? {} | 
					
						
							|  |  |  | , pkgs ? import ../.. { inherit system config; } | 
					
						
							|  |  |  | }: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  | let | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |   inherit (import ../lib/testing-python.nix { inherit system pkgs; }) makeTest; | 
					
						
							| 
									
										
										
										
											2019-07-17 14:20:39 +02:00
										 |  |  |   inherit (pkgs.lib) concatStringsSep maintainers mapAttrs mkMerge | 
					
						
							|  |  |  |                      removeSuffix replaceChars singleton splitString; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * The attrset `exporterTests` contains one attribute | 
					
						
							|  |  |  |  * for each exporter test. Each of these attributes | 
					
						
							|  |  |  |  * is expected to be an attrset containing: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  `exporterConfig`: | 
					
						
							|  |  |  |  *    this attribute set contains config for the exporter itself | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  `exporterTest` | 
					
						
							|  |  |  |  *    this attribute set contains test instructions | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  `metricProvider` (optional) | 
					
						
							|  |  |  |  *    this attribute contains additional machine config | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2020-08-31 13:38:54 +02:00
										 |  |  |  *  `nodeName` (optional) | 
					
						
							|  |  |  |  *    override an incompatible testnode name | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |  *  Example: | 
					
						
							|  |  |  |  *    exporterTests.<exporterName> = { | 
					
						
							|  |  |  |  *      exporterConfig = { | 
					
						
							|  |  |  |  *        enable = true; | 
					
						
							|  |  |  |  *      }; | 
					
						
							|  |  |  |  *      metricProvider = { | 
					
						
							|  |  |  |  *        services.<metricProvider>.enable = true; | 
					
						
							|  |  |  |  *      }; | 
					
						
							|  |  |  |  *      exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |  *        wait_for_unit("prometheus-<exporterName>-exporter.service") | 
					
						
							|  |  |  |  *        wait_for_open_port("1234") | 
					
						
							|  |  |  |  *        succeed("curl -sSf 'localhost:1234/metrics'") | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |  *      '';
 | 
					
						
							|  |  |  |  *    }; | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  # this would generate the following test config: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *    nodes.<exporterName> = { | 
					
						
							|  |  |  |  *      services.prometheus.<exporterName> = { | 
					
						
							|  |  |  |  *        enable = true; | 
					
						
							|  |  |  |  *      }; | 
					
						
							|  |  |  |  *      services.<metricProvider>.enable = true; | 
					
						
							|  |  |  |  *    }; | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *    testScript = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |  *      <exporterName>.start() | 
					
						
							|  |  |  |  *      <exporterName>.wait_for_unit("prometheus-<exporterName>-exporter.service") | 
					
						
							|  |  |  |  *      <exporterName>.wait_for_open_port("1234") | 
					
						
							|  |  |  |  *      <exporterName>.succeed("curl -sSf 'localhost:1234/metrics'") | 
					
						
							|  |  |  |  *      <exporterName>.shutdown() | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |  *    '';
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   exporterTests = { | 
					
						
							| 
									
										
										
										
											2020-06-10 14:13:07 -04:00
										 |  |  |      apcupsd = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.apcupsd.enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("apcupsd.service") | 
					
						
							|  |  |  |         wait_for_open_port(3551) | 
					
						
							|  |  |  |         wait_for_unit("prometheus-apcupsd-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9162) | 
					
						
							|  |  |  |         succeed("curl -sSf http://localhost:9162/metrics | grep -q 'apcupsd_info'") | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-31 22:01:27 +02:00
										 |  |  |     bind = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.bind.enable = true; | 
					
						
							|  |  |  |         services.bind.extraConfig = ''
 | 
					
						
							|  |  |  |           statistics-channels { | 
					
						
							|  |  |  |             inet 127.0.0.1 port 8053 allow { localhost; }; | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-bind-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9119) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9119/metrics | grep -q 'bind_query_recursions_total 0'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-05-31 22:01:27 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-01 04:43:59 +00:00
										 |  |  |     bird = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.bird2.enable = true; | 
					
						
							|  |  |  |         services.bird2.config = ''
 | 
					
						
							|  |  |  |           protocol kernel MyObviousTestString { | 
					
						
							|  |  |  |             ipv4 { | 
					
						
							|  |  |  |               import all; | 
					
						
							|  |  |  |               export none; | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           protocol device { | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("prometheus-bird-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9324) | 
					
						
							|  |  |  |         succeed("curl -sSf http://localhost:9324/metrics | grep -q 'MyObviousTestString'") | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |     blackbox = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         configFile = pkgs.writeText "config.yml" (builtins.toJSON { | 
					
						
							|  |  |  |           modules.icmp_v6 = { | 
					
						
							|  |  |  |             prober = "icmp"; | 
					
						
							|  |  |  |             icmp.preferred_ip_protocol = "ip6"; | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-blackbox-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9115) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf 'http://localhost:9115/probe?target=localhost&module=icmp_v6' | grep -q 'probe_success 1'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     collectd = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         extraFlags = [ "--web.collectd-push-path /collectd" ]; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |       exporterTest = let postData = replaceChars [ "\n" ] [ "" ] ''
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |         [{ | 
					
						
							|  |  |  |           "values":[23], | 
					
						
							|  |  |  |           "dstypes":["gauge"], | 
					
						
							|  |  |  |           "type":"gauge", | 
					
						
							|  |  |  |           "interval":1000, | 
					
						
							|  |  |  |           "host":"testhost", | 
					
						
							|  |  |  |           "plugin":"testplugin", | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |           "time":DATE | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |         }] | 
					
						
							|  |  |  |         ''; in '' | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-collectd-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9103) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             'echo \'${postData}\'> /tmp/data.json' | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         succeed('sed -ie "s DATE $(date +%s) " /tmp/data.json') | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSfH 'Content-Type: application/json' -X POST --data @/tmp/data.json localhost:9103/collectd" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf localhost:9103/metrics | grep -q 'collectd_testplugin_gauge{instance=\"testhost\"} 23'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dnsmasq = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         leasesPath = "/var/lib/dnsmasq/dnsmasq.leases"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.dnsmasq.enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-dnsmasq-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9153) | 
					
						
							|  |  |  |         succeed("curl -sSf http://localhost:9153/metrics | grep -q 'dnsmasq_leases 0'") | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dovecot = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         scopes = [ "global" ]; | 
					
						
							|  |  |  |         socketPath = "/var/run/dovecot2/old-stats"; | 
					
						
							|  |  |  |         user = "root"; # <- don't use user root in production | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.dovecot2.enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-dovecot-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9166) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9166/metrics | grep -q 'dovecot_up{scope=\"global\"} 1'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fritzbox = { # TODO add proper test case | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-fritzbox-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9133) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9133/metrics | grep -q 'fritzbox_exporter_collect_errors 0'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     json = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         url = "http://localhost"; | 
					
						
							| 
									
										
										
										
											2021-01-01 23:59:06 +01:00
										 |  |  |         configFile = pkgs.writeText "json-exporter-conf.json" (builtins.toJSON { | 
					
						
							|  |  |  |           metrics = [ | 
					
						
							|  |  |  |             { name = "json_test_metric"; path = "$.test"; } | 
					
						
							|  |  |  |           ]; | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         systemd.services.prometheus-json-exporter.after = [ "nginx.service" ]; | 
					
						
							|  |  |  |         services.nginx = { | 
					
						
							|  |  |  |           enable = true; | 
					
						
							|  |  |  |           virtualHosts.localhost.locations."/".extraConfig = ''
 | 
					
						
							|  |  |  |             return 200 "{\"test\":1}"; | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("nginx.service") | 
					
						
							|  |  |  |         wait_for_open_port(80) | 
					
						
							|  |  |  |         wait_for_unit("prometheus-json-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(7979) | 
					
						
							| 
									
										
										
										
											2021-01-01 23:59:06 +01:00
										 |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf 'localhost:7979/probe?target=http://localhost' | grep -q 'json_test_metric 1'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-10 13:12:43 -04:00
										 |  |  |     keylight = { | 
					
						
							|  |  |  |       # A hardware device is required to properly test this exporter, so just | 
					
						
							|  |  |  |       # perform a couple of basic sanity checks that the exporter is running | 
					
						
							|  |  |  |       # and requires a target, but cannot reach a specified target. | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("prometheus-keylight-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9288) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sS --write-out '%{http_code}' -o /dev/null http://localhost:9288/metrics | grep -q '400'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sS --write-out '%{http_code}' -o /dev/null http://localhost:9288/metrics?target=nosuchdevice | grep -q '500'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-04 01:38:09 +02:00
										 |  |  |     lnd = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         lndTlsPath = "/var/lib/lnd/tls.cert"; | 
					
						
							|  |  |  |         lndMacaroonDir = "/var/lib/lnd"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         systemd.services.prometheus-lnd-exporter.serviceConfig.DynamicUser = false; | 
					
						
							|  |  |  |         services.bitcoind.enable = true; | 
					
						
							|  |  |  |         services.bitcoind.extraConfig = ''
 | 
					
						
							|  |  |  |           rpcauth=bitcoinrpc:e8fe33f797e698ac258c16c8d7aadfbe$872bdb8f4d787367c26bcfd75e6c23c4f19d44a69f5d1ad329e5adf3f82710f7 | 
					
						
							|  |  |  |           bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332 | 
					
						
							|  |  |  |           bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333 | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |         systemd.services.lnd = { | 
					
						
							|  |  |  |           serviceConfig.ExecStart = ''
 | 
					
						
							|  |  |  |           ${pkgs.lnd}/bin/lnd \ | 
					
						
							|  |  |  |             --datadir=/var/lib/lnd \ | 
					
						
							|  |  |  |             --tlscertpath=/var/lib/lnd/tls.cert \ | 
					
						
							|  |  |  |             --tlskeypath=/var/lib/lnd/tls.key \ | 
					
						
							|  |  |  |             --logdir=/var/log/lnd \ | 
					
						
							|  |  |  |             --bitcoin.active \ | 
					
						
							|  |  |  |             --bitcoin.mainnet \ | 
					
						
							|  |  |  |             --bitcoin.node=bitcoind \ | 
					
						
							|  |  |  |             --bitcoind.rpcuser=bitcoinrpc \ | 
					
						
							|  |  |  |             --bitcoind.rpcpass=hunter2 \ | 
					
						
							|  |  |  |             --bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332 \ | 
					
						
							|  |  |  |             --bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333 \ | 
					
						
							|  |  |  |             --readonlymacaroonpath=/var/lib/lnd/readonly.macaroon | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |           serviceConfig.StateDirectory = "lnd"; | 
					
						
							|  |  |  |           wantedBy = [ "multi-user.target" ]; | 
					
						
							|  |  |  |           after = [ "network.target" ]; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("lnd.service") | 
					
						
							|  |  |  |         wait_for_open_port(10009) | 
					
						
							|  |  |  |         wait_for_unit("prometheus-lnd-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9092) | 
					
						
							|  |  |  |         succeed("curl -sSf localhost:9092/metrics | grep -q '^promhttp_metric_handler'") | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-30 00:43:34 +02:00
										 |  |  |     mail = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         configuration = { | 
					
						
							|  |  |  |           monitoringInterval = "2s"; | 
					
						
							|  |  |  |           mailCheckTimeout = "10s"; | 
					
						
							|  |  |  |           servers = [ { | 
					
						
							|  |  |  |             name = "testserver"; | 
					
						
							|  |  |  |             server = "localhost"; | 
					
						
							|  |  |  |             port = 25; | 
					
						
							| 
									
										
										
										
											2019-08-02 15:23:23 +02:00
										 |  |  |             from = "mail-exporter@localhost"; | 
					
						
							|  |  |  |             to = "mail-exporter@localhost"; | 
					
						
							|  |  |  |             detectionDir = "/var/spool/mail/mail-exporter/new"; | 
					
						
							| 
									
										
										
										
											2019-07-30 00:43:34 +02:00
										 |  |  |           } ]; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.postfix.enable = true; | 
					
						
							|  |  |  |         systemd.services.prometheus-mail-exporter = { | 
					
						
							|  |  |  |           after = [ "postfix.service" ]; | 
					
						
							|  |  |  |           requires = [ "postfix.service" ]; | 
					
						
							|  |  |  |           preStart = ''
 | 
					
						
							| 
									
										
										
										
											2020-03-06 01:24:48 +01:00
										 |  |  |             mkdir -p -m 0700 mail-exporter/new | 
					
						
							| 
									
										
										
										
											2019-07-30 00:43:34 +02:00
										 |  |  |           '';
 | 
					
						
							|  |  |  |           serviceConfig = { | 
					
						
							|  |  |  |             ProtectHome = true; | 
					
						
							|  |  |  |             ReadOnlyPaths = "/"; | 
					
						
							|  |  |  |             ReadWritePaths = "/var/spool/mail"; | 
					
						
							|  |  |  |             WorkingDirectory = "/var/spool/mail"; | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         users.users.mailexporter.isSystemUser = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("postfix.service") | 
					
						
							|  |  |  |         wait_for_unit("prometheus-mail-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9225) | 
					
						
							|  |  |  |         wait_until_succeeds( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9225/metrics | grep -q 'mail_deliver_success{configname=\"testserver\"} 1'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-07-30 00:43:34 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-05 22:39:38 +01:00
										 |  |  |     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'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-16 14:37:09 -04:00
										 |  |  |     modemmanager = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         refreshRate = "10s"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         # ModemManager is installed when NetworkManager is enabled. Ensure it is | 
					
						
							|  |  |  |         # started and is wanted by NM and the exporter to start everything up | 
					
						
							|  |  |  |         # in the right order. | 
					
						
							|  |  |  |         networking.networkmanager.enable = true; | 
					
						
							|  |  |  |         systemd.services.ModemManager = { | 
					
						
							|  |  |  |           enable = true; | 
					
						
							|  |  |  |           wantedBy = [ "NetworkManager.service" "prometheus-modemmanager-exporter.service" ]; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("ModemManager.service") | 
					
						
							|  |  |  |         wait_for_unit("prometheus-modemmanager-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9539) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9539/metrics | grep -q 'modemmanager_info'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-12 22:35:30 +02:00
										 |  |  |     nextcloud = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         passwordFile = "/var/nextcloud-pwfile"; | 
					
						
							| 
									
										
										
										
											2021-01-17 12:15:40 +01:00
										 |  |  |         url = "http://localhost"; | 
					
						
							| 
									
										
										
										
											2019-10-12 22:35:30 +02:00
										 |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         systemd.services.nc-pwfile = let | 
					
						
							|  |  |  |           passfile = (pkgs.writeText "pwfile" "snakeoilpw"); | 
					
						
							|  |  |  |         in { | 
					
						
							|  |  |  |           requiredBy = [ "prometheus-nextcloud-exporter.service" ]; | 
					
						
							|  |  |  |           before = [ "prometheus-nextcloud-exporter.service" ]; | 
					
						
							|  |  |  |           serviceConfig.ExecStart = ''
 | 
					
						
							|  |  |  |             ${pkgs.coreutils}/bin/install -o nextcloud-exporter -m 0400 ${passfile} /var/nextcloud-pwfile | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         services.nginx = { | 
					
						
							|  |  |  |           enable = true; | 
					
						
							|  |  |  |           virtualHosts."localhost" = { | 
					
						
							|  |  |  |             basicAuth.nextcloud-exporter = "snakeoilpw"; | 
					
						
							|  |  |  |             locations."/" = { | 
					
						
							|  |  |  |               root = "${pkgs.prometheus-nextcloud-exporter.src}/serverinfo/testdata"; | 
					
						
							| 
									
										
										
										
											2021-01-17 12:15:40 +01:00
										 |  |  |               tryFiles = "/negative-space.xml =404"; | 
					
						
							| 
									
										
										
										
											2019-10-12 22:35:30 +02:00
										 |  |  |             }; | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("nginx.service") | 
					
						
							|  |  |  |         wait_for_unit("prometheus-nextcloud-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9205) | 
					
						
							| 
									
										
										
										
											2019-10-12 22:35:30 +02:00
										 |  |  |         succeed("curl -sSf http://localhost:9205/metrics | grep -q 'nextcloud_up 1'") | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |     nginx = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.nginx = { | 
					
						
							|  |  |  |           enable = true; | 
					
						
							|  |  |  |           statusPage = true; | 
					
						
							| 
									
										
										
										
											2020-03-02 20:48:40 +01:00
										 |  |  |           virtualHosts."test".extraConfig = "return 204;"; | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("nginx.service") | 
					
						
							|  |  |  |         wait_for_unit("prometheus-nginx-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9113) | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |         succeed("curl -sSf http://localhost:9113/metrics | grep -q 'nginx_up 1'") | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-13 18:26:13 +01:00
										 |  |  |     nginxlog = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         group = "nginx"; | 
					
						
							|  |  |  |         settings = { | 
					
						
							|  |  |  |           namespaces = [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               name = "filelogger"; | 
					
						
							|  |  |  |               source = { | 
					
						
							|  |  |  |                 files = [ "/var/log/nginx/filelogger.access.log" ]; | 
					
						
							|  |  |  |               }; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               name = "syslogger"; | 
					
						
							|  |  |  |               source = { | 
					
						
							|  |  |  |                 syslog = { | 
					
						
							|  |  |  |                   listen_address = "udp://127.0.0.1:10000"; | 
					
						
							|  |  |  |                   format = "rfc3164"; | 
					
						
							|  |  |  |                   tags = ["nginx"]; | 
					
						
							|  |  |  |                 }; | 
					
						
							|  |  |  |               }; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           ]; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.nginx = { | 
					
						
							|  |  |  |           enable = true; | 
					
						
							|  |  |  |           httpConfig = ''
 | 
					
						
							|  |  |  |             server { | 
					
						
							|  |  |  |               listen 80; | 
					
						
							|  |  |  |               server_name filelogger.local; | 
					
						
							|  |  |  |               access_log /var/log/nginx/filelogger.access.log; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             server { | 
					
						
							|  |  |  |               listen 81; | 
					
						
							|  |  |  |               server_name syslogger.local; | 
					
						
							|  |  |  |               access_log syslog:server=127.0.0.1:10000,tag=nginx,severity=info; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("nginx.service") | 
					
						
							|  |  |  |         wait_for_unit("prometheus-nginxlog-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9117) | 
					
						
							|  |  |  |         wait_for_open_port(80) | 
					
						
							|  |  |  |         wait_for_open_port(81) | 
					
						
							|  |  |  |         succeed("curl http://localhost") | 
					
						
							|  |  |  |         execute("sleep 1") | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9117/metrics | grep 'filelogger_http_response_count_total' | grep -q 1" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         succeed("curl http://localhost:81") | 
					
						
							|  |  |  |         execute("sleep 1") | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9117/metrics | grep 'syslogger_http_response_count_total' | grep -q 1" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |     node = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-node-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9100) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9100/metrics | grep -q 'node_exporter_build_info{.\\+} 1'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-25 12:24:09 +02:00
										 |  |  |     openvpn = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         group = "openvpn"; | 
					
						
							|  |  |  |         statusPaths = ["/run/openvpn-test"]; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         users.groups.openvpn = {}; | 
					
						
							|  |  |  |         services.openvpn.servers.test = { | 
					
						
							|  |  |  |           config = ''
 | 
					
						
							|  |  |  |             dev tun | 
					
						
							|  |  |  |             status /run/openvpn-test | 
					
						
							|  |  |  |             status-version 3 | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |           up = "chmod g+r /run/openvpn-test"; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         systemd.services."openvpn-test".serviceConfig.Group = "openvpn"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("openvpn-test.service") | 
					
						
							|  |  |  |         wait_for_unit("prometheus-openvpn-exporter.service") | 
					
						
							|  |  |  |         succeed("curl -sSf http://localhost:9176/metrics | grep -q 'openvpn_up{.*} 1'") | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |     postfix = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.postfix.enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-postfix-exporter.service") | 
					
						
							| 
									
										
										
										
											2020-09-25 14:27:29 +02:00
										 |  |  |         wait_for_file("/var/lib/postfix/queue/public/showq") | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_open_port(9154) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9154/metrics | grep -q 'postfix_smtpd_connects_total 0'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-09-25 14:27:29 +02:00
										 |  |  |         succeed("curl -sSf http://localhost:9154/metrics | grep -q 'postfix_up{.*} 1'") | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-01 23:10:08 +02:00
										 |  |  |     postgres = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         runAsLocalSuperUser = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.postgresql.enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-postgres-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9187) | 
					
						
							|  |  |  |         wait_for_unit("postgresql.service") | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9187/metrics | grep -q 'pg_exporter_last_scrape_error 0'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 1'") | 
					
						
							|  |  |  |         systemctl("stop postgresql.service") | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9187/metrics | grep -qv 'pg_exporter_last_scrape_error 0'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 0'") | 
					
						
							|  |  |  |         systemctl("start postgresql.service") | 
					
						
							|  |  |  |         wait_for_unit("postgresql.service") | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9187/metrics | grep -q 'pg_exporter_last_scrape_error 0'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 1'") | 
					
						
							| 
									
										
										
										
											2019-08-01 23:10:08 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-05 23:26:59 +00:00
										 |  |  |     py-air-control = { | 
					
						
							|  |  |  |       nodeName = "py_air_control"; | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         deviceHostname = "127.0.0.1"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("prometheus-py-air-control-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9896) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9896/metrics | grep -q 'py_air_control_sampling_error_total'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-18 07:46:52 +02:00
										 |  |  |     redis = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider.services.redis.enable = true; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("redis.service") | 
					
						
							|  |  |  |         wait_for_unit("prometheus-redis-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(6379) | 
					
						
							|  |  |  |         wait_for_open_port(9121) | 
					
						
							|  |  |  |         wait_until_succeeds("curl -sSf localhost:9121/metrics | grep -q 'redis_up 1'") | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 14:03:33 +02:00
										 |  |  |     rspamd = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.rspamd.enable = true; | 
					
						
							| 
									
										
										
										
											2020-03-06 10:14:47 +01:00
										 |  |  |         virtualisation.memorySize = 1024; | 
					
						
							| 
									
										
										
										
											2019-09-11 14:03:33 +02:00
										 |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("rspamd.service") | 
					
						
							|  |  |  |         wait_for_unit("prometheus-rspamd-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(11334) | 
					
						
							|  |  |  |         wait_for_open_port(7980) | 
					
						
							|  |  |  |         wait_until_succeeds( | 
					
						
							| 
									
										
										
										
											2021-01-01 23:59:06 +01:00
										 |  |  |             "curl -sSf 'localhost:7980/probe?target=http://localhost:11334/stat' | grep -q 'rspamd_scanned{host=\"rspamd\"} 0'" | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-09-11 14:03:33 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-28 23:10:58 +02:00
										 |  |  |     rtl_433 = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         # Mock rtl_433 binary to return a dummy metric stream. | 
					
						
							|  |  |  |         nixpkgs.overlays = [ (self: super: { | 
					
						
							|  |  |  |           rtl_433 = self.runCommand "rtl_433" {} ''
 | 
					
						
							|  |  |  |             mkdir -p "$out/bin" | 
					
						
							|  |  |  |             cat <<EOF > "$out/bin/rtl_433" | 
					
						
							|  |  |  |             #!/bin/sh | 
					
						
							|  |  |  |             while true; do | 
					
						
							|  |  |  |               printf '{"time" : "2020-04-26 13:37:42", "model" : "zopieux", "id" : 55, "channel" : 3, "temperature_C" : 18.000}\n' | 
					
						
							|  |  |  |               sleep 4 | 
					
						
							|  |  |  |             done | 
					
						
							|  |  |  |             EOF | 
					
						
							|  |  |  |             chmod +x "$out/bin/rtl_433" | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         }) ]; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("prometheus-rtl_433-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9550) | 
					
						
							|  |  |  |         wait_until_succeeds( | 
					
						
							|  |  |  |             "curl -sSf localhost:9550/metrics | grep -q '{}'".format( | 
					
						
							|  |  |  |                 'rtl_433_temperature_celsius{channel="3",id="55",location="",model="zopieux"} 18' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:47:58 +00:00
										 |  |  |     smokeping = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         hosts = ["127.0.0.1"]; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("prometheus-smokeping-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9374) | 
					
						
							|  |  |  |         wait_until_succeeds( | 
					
						
							|  |  |  |             "curl -sSf localhost:9374/metrics | grep '{}' | grep -qv ' 0$'".format( | 
					
						
							|  |  |  |                 'smokeping_requests_total{host="127.0.0.1",ip="127.0.0.1"} ' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         wait_until_succeeds( | 
					
						
							|  |  |  |             "curl -sSf localhost:9374/metrics | grep -q '{}'".format( | 
					
						
							|  |  |  |                 'smokeping_response_ttl{host="127.0.0.1",ip="127.0.0.1"}' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |     snmp = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         configuration.default = { | 
					
						
							|  |  |  |           version = 2; | 
					
						
							|  |  |  |           auth.community = "public"; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-snmp-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9116) | 
					
						
							|  |  |  |         succeed("curl -sSf localhost:9116/metrics | grep -q 'snmp_request_errors_total 0'") | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-06 09:56:35 +03:00
										 |  |  |     sql = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         configuration.jobs.points = { | 
					
						
							|  |  |  |           interval = "1m"; | 
					
						
							|  |  |  |           connections = [ | 
					
						
							|  |  |  |             "postgres://prometheus-sql-exporter@/data?host=/run/postgresql&sslmode=disable" | 
					
						
							|  |  |  |           ]; | 
					
						
							|  |  |  |           queries = { | 
					
						
							|  |  |  |             points = { | 
					
						
							|  |  |  |               labels = [ "name" ]; | 
					
						
							|  |  |  |               help = "Amount of points accumulated per person"; | 
					
						
							|  |  |  |               values = [ "amount" ]; | 
					
						
							|  |  |  |               query = "SELECT SUM(amount) as amount, name FROM points GROUP BY name"; | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         enable = true; | 
					
						
							| 
									
										
										
										
											2020-11-06 16:43:07 +01:00
										 |  |  |         user = "prometheus-sql-exporter"; | 
					
						
							| 
									
										
										
										
											2020-08-06 09:56:35 +03:00
										 |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         services.postgresql = { | 
					
						
							|  |  |  |           enable = true; | 
					
						
							|  |  |  |           initialScript = builtins.toFile "init.sql" ''
 | 
					
						
							|  |  |  |             CREATE DATABASE data; | 
					
						
							|  |  |  |             \c data; | 
					
						
							|  |  |  |             CREATE TABLE points (amount INT, name TEXT); | 
					
						
							|  |  |  |             INSERT INTO points(amount, name) VALUES (1, 'jack'); | 
					
						
							|  |  |  |             INSERT INTO points(amount, name) VALUES (2, 'jill'); | 
					
						
							|  |  |  |             INSERT INTO points(amount, name) VALUES (3, 'jack'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             CREATE USER "prometheus-sql-exporter"; | 
					
						
							|  |  |  |             GRANT ALL PRIVILEGES ON DATABASE data TO "prometheus-sql-exporter"; | 
					
						
							|  |  |  |             GRANT SELECT ON points TO "prometheus-sql-exporter"; | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         systemd.services.prometheus-sql-exporter.after = [ "postgresql.service" ]; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("prometheus-sql-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9237) | 
					
						
							|  |  |  |         succeed("curl http://localhost:9237/metrics | grep -c 'sql_points{' | grep -q 2") | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |     surfboard = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         modemAddress = "localhost"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         systemd.services.prometheus-surfboard-exporter.after = [ "nginx.service" ]; | 
					
						
							|  |  |  |         services.nginx = { | 
					
						
							|  |  |  |           enable = true; | 
					
						
							|  |  |  |           virtualHosts.localhost.locations."/cgi-bin/status".extraConfig = ''
 | 
					
						
							|  |  |  |             return 204; | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("nginx.service") | 
					
						
							|  |  |  |         wait_for_open_port(80) | 
					
						
							|  |  |  |         wait_for_unit("prometheus-surfboard-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9239) | 
					
						
							|  |  |  |         succeed("curl -sSf localhost:9239/metrics | grep -q 'surfboard_up 1'") | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 23:42:28 +02:00
										 |  |  |     tor = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         # Note: this does not connect the test environment to the Tor network. | 
					
						
							|  |  |  |         # Client, relay, bridge or exit connectivity are disabled by default. | 
					
						
							|  |  |  |         services.tor.enable = true; | 
					
						
							|  |  |  |         services.tor.controlPort = 9051; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("tor.service") | 
					
						
							|  |  |  |         wait_for_open_port(9051) | 
					
						
							|  |  |  |         wait_for_unit("prometheus-tor-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9130) | 
					
						
							|  |  |  |         succeed("curl -sSf localhost:9130/metrics | grep -q 'tor_version{.\\+} 1'") | 
					
						
							| 
									
										
										
										
											2018-10-13 23:42:28 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-12 14:10:08 +02:00
										 |  |  |     unifi-poller = { | 
					
						
							|  |  |  |       nodeName = "unifi_poller"; | 
					
						
							|  |  |  |       exporterConfig.enable = true; | 
					
						
							|  |  |  |       exporterConfig.controllers = [ { } ]; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							|  |  |  |         wait_for_unit("prometheus-unifi-poller-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9130) | 
					
						
							|  |  |  |         succeed( | 
					
						
							|  |  |  |             "curl -sSf localhost:9130/metrics | grep -q 'unifipoller_build_info{.\\+} 1'" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |     varnish = { | 
					
						
							|  |  |  |       exporterConfig = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         instance = "/var/spool/varnish/varnish"; | 
					
						
							|  |  |  |         group = "varnish"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         systemd.services.prometheus-varnish-exporter.after = [ | 
					
						
							|  |  |  |           "varnish.service" | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |         services.varnish = { | 
					
						
							|  |  |  |           enable = true; | 
					
						
							|  |  |  |           config = ''
 | 
					
						
							|  |  |  |             vcl 4.0; | 
					
						
							|  |  |  |             backend default { | 
					
						
							|  |  |  |               .host = "127.0.0.1"; | 
					
						
							|  |  |  |               .port = "80"; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-varnish-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(6081) | 
					
						
							|  |  |  |         wait_for_open_port(9131) | 
					
						
							| 
									
										
										
										
											2019-11-13 14:56:36 +01:00
										 |  |  |         succeed("curl -sSf http://localhost:9131/metrics | grep -q 'varnish_up 1'") | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2019-06-02 03:13:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     wireguard = let snakeoil = import ./wireguard/snakeoil-keys.nix; in { | 
					
						
							|  |  |  |       exporterConfig.enable = true; | 
					
						
							|  |  |  |       metricProvider = { | 
					
						
							|  |  |  |         networking.wireguard.interfaces.wg0 = { | 
					
						
							|  |  |  |           ips = [ "10.23.42.1/32" "fc00::1/128" ]; | 
					
						
							|  |  |  |           listenPort = 23542; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           inherit (snakeoil.peer0) privateKey; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           peers = singleton { | 
					
						
							|  |  |  |             allowedIPs = [ "10.23.42.2/32" "fc00::2/128" ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             inherit (snakeoil.peer1) publicKey; | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2019-07-21 15:32:43 +02:00
										 |  |  |         systemd.services.prometheus-wireguard-exporter.after = [ "wireguard-wg0.service" ]; | 
					
						
							| 
									
										
										
										
											2019-06-02 03:13:53 +02:00
										 |  |  |       }; | 
					
						
							|  |  |  |       exporterTest = ''
 | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |         wait_for_unit("prometheus-wireguard-exporter.service") | 
					
						
							|  |  |  |         wait_for_open_port(9586) | 
					
						
							|  |  |  |         wait_until_succeeds( | 
					
						
							|  |  |  |             "curl -sSf http://localhost:9586/metrics | grep '${snakeoil.peer1.publicKey}'" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-06-02 03:13:53 +02:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2019-05-31 22:01:27 +02:00
										 |  |  | in | 
					
						
							| 
									
										
										
										
											2020-08-31 13:38:54 +02:00
										 |  |  | mapAttrs (exporter: testConfig: (makeTest (let | 
					
						
							|  |  |  |   nodeName = testConfig.nodeName or exporter; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | in { | 
					
						
							| 
									
										
										
										
											2019-05-31 22:01:27 +02:00
										 |  |  |   name = "prometheus-${exporter}-exporter"; | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-31 13:38:54 +02:00
										 |  |  |   nodes.${nodeName} = mkMerge [{ | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |     services.prometheus.exporters.${exporter} = testConfig.exporterConfig; | 
					
						
							| 
									
										
										
										
											2019-05-31 22:01:27 +02:00
										 |  |  |   } testConfig.metricProvider or {}]; | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-31 22:01:27 +02:00
										 |  |  |   testScript = ''
 | 
					
						
							| 
									
										
										
										
											2020-08-31 13:38:54 +02:00
										 |  |  |     ${nodeName}.start() | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |     ${concatStringsSep "\n" (map (line: | 
					
						
							|  |  |  |       if (builtins.substring 0 1 line == " " || builtins.substring 0 1 line == ")") | 
					
						
							|  |  |  |       then line | 
					
						
							| 
									
										
										
										
											2020-08-31 13:38:54 +02:00
										 |  |  |       else "${nodeName}.${line}" | 
					
						
							| 
									
										
										
										
											2019-11-06 16:54:31 +01:00
										 |  |  |     ) (splitString "\n" (removeSuffix "\n" testConfig.exporterTest)))} | 
					
						
							| 
									
										
										
										
											2020-08-31 13:38:54 +02:00
										 |  |  |     ${nodeName}.shutdown() | 
					
						
							| 
									
										
										
										
											2019-05-31 22:01:27 +02:00
										 |  |  |   '';
 | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-31 22:01:27 +02:00
										 |  |  |   meta = with maintainers; { | 
					
						
							| 
									
										
										
										
											2020-08-31 13:38:54 +02:00
										 |  |  |     maintainers = [ willibutz elseym ]; | 
					
						
							| 
									
										
										
										
											2018-10-08 16:38:16 +02:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2020-08-31 13:38:54 +02:00
										 |  |  | }))) exporterTests |