at master 2.2 kB view raw
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}