From: Otto Moerbeek Date: Thu, 5 Jun 2025 11:47:44 +0000 (+0200) Subject: Optionally pass OT trace to a collector in ProtobufLogger.py X-Git-Tag: rec-5.3.0-alpha1^2~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=14e9d2244d855a954b3e04f2275b29a9631e8e11;p=thirdparty%2Fpdns.git Optionally pass OT trace to a collector in ProtobufLogger.py Signed-off-by: Otto Moerbeek --- diff --git a/contrib/ProtobufLogger.py b/contrib/ProtobufLogger.py index 2476a6680f..cab46bdf18 100644 --- a/contrib/ProtobufLogger.py +++ b/contrib/ProtobufLogger.py @@ -6,6 +6,7 @@ import socket import struct import sys import threading +import requests # run: protoc -I=../pdns/ --python_out=. ../pdns/dnsmessage.proto # to generate dnsmessage_pb2 @@ -29,8 +30,9 @@ except: class PDNSPBConnHandler(object): - def __init__(self, conn): + def __init__(self, conn, oturl): self._conn = conn + self._oturl = oturl def run(self): while True: @@ -55,6 +57,8 @@ class PDNSPBConnHandler(object): msg = dnsmessage_pb2.PBDNSMessage() try: msg.ParseFromString(data) + if opentelemetryAvailable and self._oturl is not None and msg.HasField('openTelemetryData'): + self.postOT(msg.openTelemetryData) if msg.type == dnsmessage_pb2.PBDNSMessage.DNSQueryType: self.printQueryMessage(msg) elif msg.type == dnsmessage_pb2.PBDNSMessage.DNSResponseType: @@ -71,6 +75,12 @@ class PDNSPBConnHandler(object): self._conn.close() + def postOT(self, msg): + print("- Posting OTData to " + oturl) + headers = {'Content-Type': 'application/x-protobuf'} + answer = requests.post(self._oturl, data = msg, headers = headers) + print(' - ' + answer) + def printQueryMessage(self, message): self.printSummary(message, 'Query') self.printQuery(message) @@ -102,15 +112,15 @@ class PDNSPBConnHandler(object): message.question.qType, message.question.qName)) def printOT(self, msg): - if msg.HasField('openTelemetryData'): - if opentelemetryAvailable: + if opentelemetryAvailable: + if msg.HasField('openTelemetryData'): json_string = None otmsg = opentelemetry.proto.trace.v1.trace_pb2.TracesData() otmsg.ParseFromString(msg.openTelemetryData) json_string = google.protobuf.json_format.MessageToJson(otmsg, preserving_proto_field_name=True) print("- openTelemetry: " + json_string) - else: - print("- openTelemetry decoding not available, see the comments in ProtoBuffer.py to make it available.x") + else: + print("- openTelemetry decoding not available, see the comments in ProtoBuffer.py to make it available.") @staticmethod def getAppliedPolicyTypeAsString(polType): @@ -295,7 +305,7 @@ class PDNSPBConnHandler(object): ednsVersion = "0x%08X" % socket.ntohl(msg.ednsVersion) openTelemetryData = "N/A" - if msg.HasField('openTelemetryData'): + if opentelemetryAvailable and msg.HasField('openTelemetryData'): openTelemetryData = str(len(msg.openTelemetryData)) print('[%s] %s of size %d: %s%s%s -> %s%s(%s) id: %d uuid: %s%s ' @@ -346,7 +356,8 @@ class PDNSPBConnHandler(object): class PDNSPBListener(object): - def __init__(self, addr, port): + def __init__(self, addr, port, oturl): + self._oturl = oturl res = socket.getaddrinfo(addr, port, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE) @@ -368,7 +379,7 @@ class PDNSPBListener(object): while True: (conn, _) = self._sock.accept() - handler = PDNSPBConnHandler(conn) + handler = PDNSPBConnHandler(conn, self._oturl) thread = threading.Thread(name='Connection Handler', target=PDNSPBConnHandler.run, args=[handler]) @@ -379,8 +390,12 @@ class PDNSPBListener(object): if __name__ == "__main__": - if len(sys.argv) != 3: - sys.exit('Usage: %s
' % (sys.argv[0])) - - PDNSPBListener(sys.argv[1], sys.argv[2]).run() + print(opentelemetryAvailable) + oturl = None + if len(sys.argv) == 4: + oturl = sys.argv[3] + if len(sys.argv) != 3 and len(sys.argv) != 4: + sys.exit('Usage: %s
[OpenTraceURL]' % (sys.argv[0])) + + PDNSPBListener(sys.argv[1], sys.argv[2], oturl).run() sys.exit(0) diff --git a/pdns/recursordist/pdns_recursor.cc b/pdns/recursordist/pdns_recursor.cc index 1e820abfdf..9a6ba7d005 100644 --- a/pdns/recursordist/pdns_recursor.cc +++ b/pdns/recursordist/pdns_recursor.cc @@ -1878,7 +1878,7 @@ void startDoResolve(void* arg) // NOLINT(readability-function-cognitive-complexi resolver.d_otTrace.close(); auto spans = resolver.d_eventTrace.convertToOT(resolver.d_otTrace); pdns::trace::TracesData otTrace{ - .resource_spans = { pdns::trace::ResourceSpans{.resource = {}, .scope_spans = {{.spans = spans}}}}}; + .resource_spans = { pdns::trace::ResourceSpans{.resource = {.attributes = {{"service.name", {{"rec"}}}}}, .scope_spans = {{.spans = spans}}}}}; string otData = otTrace.encode(); pbMessage.setOpenTelemetryData(otData); } diff --git a/pdns/recursordist/protozero-trace.cc b/pdns/recursordist/protozero-trace.cc new file mode 120000 index 0000000000..e55a75baee --- /dev/null +++ b/pdns/recursordist/protozero-trace.cc @@ -0,0 +1 @@ +../protozero-trace.cc \ No newline at end of file diff --git a/pdns/recursordist/protozero-trace.hh b/pdns/recursordist/protozero-trace.hh new file mode 120000 index 0000000000..3352190444 --- /dev/null +++ b/pdns/recursordist/protozero-trace.hh @@ -0,0 +1 @@ +../protozero-trace.hh \ No newline at end of file diff --git a/pdns/recursordist/rec-main.cc b/pdns/recursordist/rec-main.cc index ede884ffae..1f9cd1beea 100644 --- a/pdns/recursordist/rec-main.cc +++ b/pdns/recursordist/rec-main.cc @@ -667,7 +667,7 @@ void protobufLogResponse(const struct dnsheader* header, LocalStateHolder