在Google App Engine中衡量任务队列成本 - java

我正在通过检查x-appengine-estimated-cpm-us-dollars标头来衡量向GAE发出请求的费用。结合使用x-appengine-resource-usage和
x-traceurl我什至可以获得更详细的信息。

但是,我的应用程序很大一部分是在任务队列的上下文中运行的。因此,队列消耗了实例小时成本的很大一部分。每次在请求之外执行代码时,其费用都不会包含在x-appengine-estimated-cpm-us-dollars标头中。

我正在寻找一种衡量每个请求消耗的全部成本的方法。即请求本身生成的成本以及此请求添加的任务成本。

参考方案

这太过分了。有一个工具,您可以下载Google App Engine日志并将其转换为sqlite。
http://code.google.com/p/google-app-engine-samples/source/browse/trunk/logparser/logparser.py

使用此工具,用于任务请求和常规请求的cpm usd将全部一起下载。您可以将每日日志存储到单独的sqlite文件中,并根据需要进行尽可能多的分析。

在关联方面,任务成本与原始请求有关。使用此工具下载的日志数据包括logging模块的完整输出。

因此,您只需在原始请求中记录一个生成ID
将ID传递给任务。
在任务请求中再次记录接收到的ID。
通过ID查找正常和任务请求对。

例如:

# in org request
a_id = genereate_a_random_id() 
logging.info(a_id) # the id will be included 

taskqueue.add(url='/path_to_task', params={'id': a_id})


# in task request
a_id = self.request.get('id')
logging.info(a_id)

编辑1

我认为还有另一种可能的方式可以估算正常请求+任务请求的成本。
诀窍是将异步任务更改为同步(假设成本相同)。
我没有尝试过,但是尝试起来容易得多。

# in org request, add a variable to identify debug
debug = self.request.get('DEBUG')

if debug:
    self.redirect('/path_to_task')
else:
    taskqueue.add(url='/path_to_task')

因此,在测试带有DEBUG参数的正常请求时。它将首先处理正常请求,然后返回正常请求的x-appengine-estimated-cpm-us-dollars。稍后,它将把您的测试客户端重定向到相对的任务请求(任务请求也可以作为正常请求通过url客户端进行访问和触发),并返回x-appengine-estimated-cpm-us-dollars作为任务请求。您可以简单地将它们加在一起以获得总成本。

使用对象化进行多对多关系? - java

我正在将我的应用程序从关系数据库移到对象化/谷歌应用程序引擎。该应用程序具有如下所示的关系:一个Message可以发送给许多Users。每个User可以有多个Message寻址到它们。我需要能够扫描寻址到特定Message的所有User。我该如何使用Objectify? 参考方案 有很多方法可以做到这一点。您可以在用户对象中保存消息列表。由于不需要进行查询,…

使用URLFetch到发送通道消息的服务的SocketTimeoutException - java

我们有两个AppEngine(Java)应用程序。其中一个使用URLFetch来创建约会。在接收器中,我们添加了一项功能,其中我们使用Channel API来查看是否有任何开放的通道,并让他们知道新数据。URLFetch调用失败,并出现SocketTimeoutException。接收器中的所有代码均已执行(包括所有已通知的开放通道),但调用应用程序仍会收到…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…