我通常在我的沙箱appid上全职运行appstats。然而,我有一个复杂的操作(基本上是重建股票数据库)会导致appstats破坏我的实例,抛出OutOfMemoryErrors。即使使用较大的实例大小,它仍然会失败。Appstats只是想要太多的RAM。
我不需要此请求的appstats。理想情况下,我会在负责appstats集合的任何ThreadLocal对象上调用一个方法,并告诉它转动拇指几分钟。
我曾考虑过扩展AppstatsFilter以忽略某些URL,但有问题的请求作为延迟任务执行,并且通过路径识别它有点复杂。
如何告诉appstats暂停?
以防万一:我现在正在做的是上传一个禁用了appstats的应用程序版本,运行我的任务,然后上传一个启用了apptats的版本。我不想这么做。
我所做的是编写自己的CustomAppstatsFilter并排除某些url。
public class CustomAppstatsFilter extends AppstatsFilter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
String url = ((HttpServletRequest) request).getRequestURL().toString();
// We do not want these to show up in appstats
if ((url.contains("appstats"))
|| url.contains("_ah/")
|| url.contains("cron/")
|| url.contains("batch/")) {
chain.doFilter(request, response);
return;
} else {
super.doFilter(request, response, chain);
}
}
}
}
EDIT-这可以与ZiglioNZ结合使用
<!-- Appstats filter for profiling application -->
<filter>
<filter-name>appstats</filter-name>
<filter-class>my.company.filter.CustomAppstatsFilter</filter-class>
<init-param>
<param-name>maxLinesOfStackTrace</param-name>
<param-value>5</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- excludes are in CustomAppstatsFilter -->
<filter-name>appstats</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
好问题。对于Python,答案很简单:
from google.appengine.ext.appstats import recording
class ...(webapp.RequestHandler):
def get(self):
recording.dont_record()
...
也许在Java中也有类似的API?
或者,Python版本也有一种灵活的方式来过滤需要记录的请求;我认为在Java版本中,您可以通过使用web.xml中的和条目来完成类似的事情
Jeff,我想知道这是否能帮助您减少OutOfMemoryErrors的发生:如何减少Appstats在谷歌应用引擎Java 上的内存使用
<filter>
<filter-name>appstats</filter-name>
<filter-class>com.google.appengine.tools.appstats.AppstatsFilter</filter-class>
<init-param>
<param-name>maxLinesOfStackTrace</param-name>
<param-value>16</param-value>
</init-param>
</filter>