import threading from contextlib import contextmanager from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from socketserver import TCPServer class _CollectorServer(ThreadingHTTPServer): def server_bind(self): TCPServer.server_bind(self) self.server_name = str(self.server_address[0]) self.server_port = self.server_address[1] @contextmanager def otlp_collector(): received = [] class Handler(BaseHTTPRequestHandler): def do_POST(self): body = self.rfile.read(int(self.headers["Content-Length"])) received.append((self.path, body, self.headers)) self.send_response(200) self.send_header("Content-Type", "application/x-protobuf") self.end_headers() def log_message(self, format, *args): pass with _CollectorServer(("127.0.0.1", 0), Handler) as server: worker = threading.Thread(target=server.serve_forever, daemon=True) worker.start() try: yield f"http://127.0.0.1:{server.server_port}", received finally: server.shutdown() worker.join()