]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Optionally pass OT trace to a collector in ProtobufLogger.py
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Thu, 5 Jun 2025 11:47:44 +0000 (13:47 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Thu, 12 Jun 2025 12:21:06 +0000 (14:21 +0200)
Signed-off-by: Otto Moerbeek <otto.moerbeek@open-xchange.com>
contrib/ProtobufLogger.py
pdns/recursordist/pdns_recursor.cc
pdns/recursordist/protozero-trace.cc [new symlink]
pdns/recursordist/protozero-trace.hh [new symlink]
pdns/recursordist/rec-main.cc

index 2476a6680f5ceff3c572db569726b0ab370aee24..cab46bdf182978afbf446355a2ff564dca82a205 100644 (file)
@@ -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 <address> <port>' % (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 <address> <port> [OpenTraceURL]' % (sys.argv[0]))
+
+    PDNSPBListener(sys.argv[1], sys.argv[2], oturl).run()
     sys.exit(0)
index 1e820abfdfaa131d85ec4af177619fee79dbdf5b..9a6ba7d005622eaa0f9093b43e0979e540dcdce8 100644 (file)
@@ -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 (symlink)
index 0000000..e55a75b
--- /dev/null
@@ -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 (symlink)
index 0000000..3352190
--- /dev/null
@@ -0,0 +1 @@
+../protozero-trace.hh
\ No newline at end of file
index ede884ffaec3aaefbb71995603fb6afa37625507..1f9cd1beea39bd0c56a580f7351fbfbedb969064 100644 (file)
@@ -667,7 +667,7 @@ void protobufLogResponse(const struct dnsheader* header, LocalStateHolder<LuaCon
     otTrace.close();
     auto spans = eventTrace.convertToOT(otTrace);
     pdns::trace::TracesData trace{
-      .resource_spans = { pdns::trace::ResourceSpans{.resource = {}, .scope_spans = {{.spans = spans}}}}};
+      .resource_spans = { pdns::trace::ResourceSpans{.resource = {.attributes = {{"service.name", {{"rec"}}}}}, .scope_spans = {{.spans = spans}}}}};
     pbMessage.setOpenTelemetryData(trace.encode());
   }
   pbMessage.addPolicyTags(policyTags);