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