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