NDB tasklet在appstats中不可见

时间:2013-01-11 09:59:38

标签: google-app-engine app-engine-ndb appstats

为什么appstats中没有使用@ndb.tasklet修饰的方法中的行号?

在我们的应用程序中,我们有一个约定,包括同步和异步版本的函数,如:

def do_something(self, param=None):
    return self.do_something_async(param=param).get_result()

@ndb.tasklet
def do_something_async(self, param=None):
    stuff = yield self.do_something_else_async(stuff=param)
    # ...
    raise ndb.Return(stuff)

...但即使将appegnine_config.appstats_MAX_STACK设置为巨大的内容并清空appengine_config.appstats_RE_STACK_SKIP,appstats中的报告仍会在第一次调用some_tasklet.get_result()时保留我的应用程序代码。

这是appstats的一个例子:

screenshot

learn.get_list_of_cards_to_learn()处的扩展堆栈帧只返回self.get_list_of_cards_to_learn_async().get_result(),这是一个tasklet,后者又调用了许多其他tasklet。但是这些tasklet在appstats中都不可见,我看到的只是ndb内部。

我不确定ndb究竟是如何执行这些装饰器的,但是如果我在其中一个装入pdb跟踪并运行我的测试套件,我可以看到堆栈帧一路走来直到我放在tasklet中的pdb行,所以我不明白为什么appstats中没有。

有些请求导致大量的RPC调用,但我不知道如何弄清楚我的应用程序的哪个部分正在制作它们,因为我无法通过appstats中的第一个tasklet跟踪它。

我可能需要在appengine_config中微调一下吗?

1 个答案:

答案 0 :(得分:2)

这与NDB调度程序管理tasklet的方式有关。你无能为力。