Create a file in python lib directory and add following code:
for example: /usr/local/lib/python2.7/dist-packages/print_call_frame.py
{ dataSrc: "unbound", render: "code", id: "ii0", dataSrcObj: { noAutoLoad: true }, renderObj: { style: "border: 1px solid #88c; border-radius: 6px; width: 80%; background-color: #ddf; white-space: pre; font-family: courier;" }, obj: { body: "<div><span><span>import inspect</span></span><br></div><div><br></div><div><span><span>def print_frame():</span></span></div><div><span><span> stack = inspect.stack()<br> for s in reversed(stack[1:-2]):<br> print \"%s()\\t\\t%s #%s -> \" % (s[3], s[1], s[2])</span></span><br><br></div><div><span><span> print \"%s()\\t\\t%s #%s\" % (s[3], s[1], s[2])</span></span> <br></div>" }}
import inspect
def print_frame():
stack = inspect.stack()
for s in reversed(stack[1:-2]):
print "%s()\t\t%s #%s -> " % (s[3], s[1], s[2])
for s in reversed(stack[1:-2]):
print "%s()\t\t%s #%s -> " % (s[3], s[1], s[2])
print "%s()\t\t%s #%s" % (s[3], s[1], s[2])
Then you can add following line in the function that want to print the call frame
{ dataSrc: "unbound", dataSrcObj: { noAutoLoad: true }, render: "code", renderObj: { style: "border: 1px solid #88c; border-radius: 6px; width: 80%; background-color: #ddf; white-space: pre; font-family: courier;" }, obj: { body: "<div><span><span>from print_call_frame import print_frame</span></span><br></div><div><span><span>print_frame()</span></span> <br></div>" }, id: "ii1"}
from print_call_frame import print_frame
print_frame()
If you are using devstack, the logs will be printed in the stack screen.
A sample output should be like this:
{ dataSrc: "unbound", dataSrcObj: { noAutoLoad: true }, render: "code", renderObj: { style: "border: 1px solid #88c; border-radius: 6px; width: 80%; background-color: #ddf; white-space: pre; font-family: courier;" }, obj: { body: "spawn_n_impl() /usr/local/lib/python2.7/dist-packages/eventlet/greenpool.py #82 -><br><div><span style=\"font-family:courier new,courier,monospace;\">__call__() /usr/local/lib/python2.7/dist-packages/futurist/_green.py #70 -><br>run() /usr/local/lib/python2.7/dist-packages/futurist/_utils.py #43 -><br>run() /usr/local/lib/python2.7/dist-packages/oslo_messaging/_utils.py #81 -><br>_dispatch_and_reply() /usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py #142 -><br>_dispatch() /usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py #186 -><br>_do_dispatch() /usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py #129 -><br>update_vip() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/agent/agent_manager.py #233 -><br>update_vip() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #357 -><br>_refresh_device() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #348 -><br>inner() /usr/local/lib/python2.7/dist-packages/oslo_concurrency/lockutils.py #271 -><br>deploy_instance() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #340 -><br>create() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #93 -><br>_plug() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #249 -><br></span></div><div><span style=\"font-family:courier new,courier,monospace;\">plug_vip_port() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/agent/agent_api.py #68</span> <br></div>" }, id: "ii5"}
spawn_n_impl() /usr/local/lib/python2.7/dist-packages/eventlet/greenpool.py #82 ->
__call__() /usr/local/lib/python2.7/dist-packages/futurist/_green.py #70 ->
run() /usr/local/lib/python2.7/dist-packages/futurist/_utils.py #43 ->
run() /usr/local/lib/python2.7/dist-packages/oslo_messaging/_utils.py #81 ->
_dispatch_and_reply() /usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py #142 ->
_dispatch() /usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py #186 ->
_do_dispatch() /usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py #129 ->
update_vip() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/agent/agent_manager.py #233 ->
update_vip() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #357 ->
_refresh_device() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #348 ->
inner() /usr/local/lib/python2.7/dist-packages/oslo_concurrency/lockutils.py #271 ->
deploy_instance() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #340 ->
create() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #93 ->
_plug() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #249 ->
run() /usr/local/lib/python2.7/dist-packages/futurist/_utils.py #43 ->
run() /usr/local/lib/python2.7/dist-packages/oslo_messaging/_utils.py #81 ->
_dispatch_and_reply() /usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py #142 ->
_dispatch() /usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py #186 ->
_do_dispatch() /usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py #129 ->
update_vip() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/agent/agent_manager.py #233 ->
update_vip() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #357 ->
_refresh_device() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #348 ->
inner() /usr/local/lib/python2.7/dist-packages/oslo_concurrency/lockutils.py #271 ->
deploy_instance() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #340 ->
create() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #93 ->
_plug() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/drivers/haproxy/namespace_driver.py #249 ->
plug_vip_port() /opt/stack/neutron-lbaas/neutron_lbaas/services/loadbalancer/agent/agent_api.py #68