import functools
import inspect
import importlib
import sys
import types
def instrument_queue_code(queue_name, module_path):
"""
Instruments message queue code for backward compatibility without async logic.
Args:
queue_name (str): The name of the queue to instrument (e.g., "my_queue").
module_path (str): The path to the module containing the queue implementation.
"""
try:
module = importlib.import_module(module_path)
except ImportError as e:
print(f"Error importing module {module_path}: {e}")
return
queue_class = None
for name, obj in inspect.getmembers(module):
if name == queue_name and inspect.isclass(obj):
queue_class = obj
break
if queue_class is None:
print(f"Queue class '{queue_name}' not found in module {module_path}")
return
original_put = None
original_get = None
original_size = None
# Store original methods for later restoration
try:
original_put = queue_class.put
except AttributeError:
pass
try:
original_get = queue_class.get
except AttributeError:
pass
try:
original_size = queue_class.size
except AttributeError:
pass
def wrapped_put(item):
"""
Wraps the put method to add instrumentation.
"""
print(f"Putting item: {item} into queue: {queue_name}")
if original_put:
original_put(item)
return
def wrapped_get():
"""
Wraps the get method to add instrumentation.
"""
print(f"Getting item from queue: {queue_name}")
if original_get:
return original_get()
return None
def wrapped_size():
"""
Wraps the size method to add instrumentation.
"""
print(f"Queue {queue_name} size: {len(queue_class._queue)}")
if original_size:
return original_size()
return len(queue_class._queue) #Default return
# Replace the original methods with the wrapped versions
queue_class.put = wrapped_put
queue_class.get = wrapped_get
queue_class.size = wrapped_size
print(f"Instrumented queue '{queue_name}' in module '{module_path}'")
return queue_class #Return the modified class for potential use
if __name__ == '__main__':
# Example usage (replace with your actual queue implementation)
# Create a dummy queue class for testing
class DummyQueue:
def __init__(self):
self._queue = []
def put(self, item):
self._queue.append(item)
def get(self):
if self._queue:
return self._queue.pop(0)
else:
return None
def size(self):
return len(self._queue)
# Save the dummy queue class to a file
with open("dummy_queue.py", "w") as f:
f.write("""
class DummyQueue:
def __init__(self):
self._queue = []
def put(self, item):
self._queue.append(item)
def get(self):
if self._queue:
return self._queue.pop(0)
else:
return None
def size(self):
return len(self._queue)
""")
#Instrument the dummy queue
instrument_queue_code("DummyQueue", "dummy_queue")
#Test the instrumented queue
import dummy_queue
q = dummy_queue.DummyQueue()
q.put("item1")
q.put("item2")
print(q.get())
print(q.size())
Add your comment