1{
2 name = "prometheus-remote-write";
3
4 nodes = {
5 receiver =
6 { config, pkgs, ... }:
7 {
8 environment.systemPackages = [ pkgs.jq ];
9
10 networking.firewall.allowedTCPPorts = [ config.services.prometheus.port ];
11
12 services.prometheus = {
13 enable = true;
14 globalConfig.scrape_interval = "2s";
15
16 extraFlags = [ "--web.enable-remote-write-receiver" ];
17 };
18 };
19
20 prometheus =
21 { config, pkgs, ... }:
22 {
23 environment.systemPackages = [ pkgs.jq ];
24
25 networking.firewall.allowedTCPPorts = [ config.services.prometheus.port ];
26
27 services.prometheus = {
28 enable = true;
29 globalConfig.scrape_interval = "2s";
30
31 remoteWrite = [ { url = "http://receiver:9090/api/v1/write"; } ];
32
33 scrapeConfigs = [
34 {
35 job_name = "node";
36 static_configs = [
37 { targets = [ "node:${toString config.services.prometheus.exporters.node.port}" ]; }
38 ];
39 }
40 ];
41 };
42 };
43
44 node =
45 { config, pkgs, ... }:
46 {
47 services.prometheus.exporters.node = {
48 enable = true;
49 openFirewall = true;
50 };
51 };
52 };
53
54 testScript = ''
55 node.wait_for_unit("prometheus-node-exporter")
56 node.wait_for_open_port(9100)
57
58 for machine in prometheus, receiver:
59 machine.wait_for_unit("prometheus")
60 machine.wait_for_open_port(9090)
61
62 # Verify both servers got the same data from the exporter
63 for machine in prometheus, receiver:
64 machine.wait_until_succeeds(
65 "curl -sf 'http://127.0.0.1:9090/api/v1/query?query=node_exporter_build_info\{instance=\"node:9100\"\}' | "
66 + "jq '.data.result[0].value[1]' | grep '\"1\"'"
67 )
68 '';
69}