1import ./make-test-python.nix (
2 { pkgs, ... }:
3 let
4 port = 4318;
5 in
6 {
7 name = "opentelemetry-collector";
8 meta = with pkgs.lib.maintainers; {
9 maintainers = [ tylerjl ];
10 };
11
12 nodes.machine =
13 { ... }:
14 {
15 networking.firewall.allowedTCPPorts = [ port ];
16 services.opentelemetry-collector = {
17 enable = true;
18 settings = {
19 exporters.logging.verbosity = "detailed";
20 receivers.otlp.protocols = {
21 http.endpoint = "0.0.0.0:${toString port}";
22 };
23 service = {
24 pipelines.logs = {
25 receivers = [ "otlp" ];
26 exporters = [ "logging" ];
27 };
28 };
29 };
30 };
31 virtualisation.forwardPorts = [
32 {
33 host.port = port;
34 guest.port = port;
35 }
36 ];
37 };
38
39 extraPythonPackages = p: [
40 p.requests
41 p.types-requests
42 ];
43
44 # Send a log event through the OTLP pipeline and check for its
45 # presence in the collector logs.
46 testScript = # python
47 ''
48 import requests
49 import time
50
51 from uuid import uuid4
52
53 flag = str(uuid4())
54
55 machine.wait_for_unit("opentelemetry-collector.service")
56 machine.wait_for_open_port(${toString port})
57
58 event = {
59 "resourceLogs": [
60 {
61 "resource": {"attributes": []},
62 "scopeLogs": [
63 {
64 "logRecords": [
65 {
66 "timeUnixNano": str(time.time_ns()),
67 "severityNumber": 9,
68 "severityText": "Info",
69 "name": "logTest",
70 "body": {
71 "stringValue": flag
72 },
73 "attributes": []
74 },
75 ]
76 }
77 ]
78 }
79 ]
80 }
81
82 response = requests.post("http://localhost:${toString port}/v1/logs", json=event)
83 assert response.status_code == 200
84 assert flag in machine.execute("journalctl -u opentelemetry-collector")[-1]
85 '';
86 }
87)