2012-04-07 22 views
7

Tôi thường chạy appstats toàn thời gian trên appid sandbox của tôi. Tuy nhiên, tôi có một thao tác phức tạp (về cơ bản là xây dựng lại cơ sở dữ liệu chứng khoán) khiến cho các appstats làm nổ tung cá thể của tôi, ném OutOfMemoryErrors. Ngay cả với kích thước cá thể lớn hơn, nó vẫn không thành công. Appstats chỉ muốn quá nhiều RAM.Làm cách nào để tạm ngưng appstats cho một yêu cầu duy nhất trên App Engine/Java?

Tôi không cần appstats theo yêu cầu này. Lý tưởng nhất là tôi sẽ gọi một phương thức trên bất kỳ đối tượng ThreadLocal nào chịu trách nhiệm cho việc thu thập appstats và yêu cầu nó ghi lại các ngón tay cái của nó trong vài phút.

Tôi đã xem xét việc mở rộng AppstatsFilter để bỏ qua một số URL nhất định, nhưng yêu cầu vi phạm thực hiện như một nhiệm vụ bị trì hoãn và xác định nó bằng đường dẫn có phần phức tạp.

Tôi làm cách nào để yêu cầu appstats tạm dừng?

Chỉ trong trường hợp không rõ ràng: Tải lên phiên bản ứng dụng của tôi bị vô hiệu hóa ứng dụng, chạy nhiệm vụ của tôi, sau đó tải lên phiên bản có bật appstats là những gì tôi đang làm bây giờ. Tôi không muốn làm điều này.

+0

Tôi giả định chỉ chọn tham gia các url bạn muốn theo dõi không phải là một tùy chọn? FWIW Tôi muốn có thể làm những gì bạn yêu cầu nhiều hơn một lần nhưng tôi cắn viên đạn và chỉ cần tạo danh sách các url mà chúng tôi cần theo dõi và đưa chúng vào trong cấu hình. –

+0

Rất tiếc, URL tôi muốn loại trừ là/_ah/queue/__ deferred__. Tôi có lẽ có thể gắn kết DeferredTaskServlet trên một URL bổ sung và định tuyến yêu cầu cụ thể này cho nó, nhưng điều này có vẻ như đi khá xa khỏi đặt phòng. – stickfigure

+0

Bạn đã bao giờ tìm ra điều này chưa? – Keith

Trả lời

1

Câu hỏi hay. Đối với Python, câu trả lời rất đơn giản:

from google.appengine.ext.appstats import recording 

class ...(webapp.RequestHandler): 
    def get(self): 
    recording.dont_record() 
    ... 

Có thể có API tương tự trong Java?

Ngoài ra, một lần nữa phiên bản Python có một cách linh hoạt để lọc ra yêu cầu ghi lại; Tôi nghĩ rằng trong phiên bản Java, bạn có thể thực hiện một điều tương tự bằng cách sử dụng các mục và trong tệp tin web.xml của bạn. (Xem Java appstats tài liệu.)

+0

Tôi không thể tìm thấy mã Java tương đương trong mã nguồn SDK và tiếc là url có liên quan là url công việc __deferred__ chuẩn. Một phương pháp như thế này chính xác là những gì tôi đang tìm kiếm! – stickfigure

1

Jeff, tôi tự hỏi liệu điều này có thể giúp bạn giảm sự xuất hiện của OutOfMemoryErrors: How to reduce the memory usage of Appstats on Google App Engine 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> 
+1

Không phải là một giải pháp lý tưởng nhưng chắc chắn hữu ích - cảm ơn! – stickfigure

2

Những gì tôi đã làm là viết CustomAppstatsFilter của riêng tôi và không bao gồm một số 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 - Có thể kết hợp với câu trả lời tuyệt vời của 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> 
+0

Điều này hầu như không phải là lừa, nhưng URL là URL thực hiện nhiệm vụ trì hoãn, áp dụng cho tất cả các tác vụ bị trì hoãn. Những gì tôi cần là một cái gì đó tương đương với Python của dont_record() mà tôi có thể chạy trong mã của tôi. – stickfigure

+0

Giống như [bài viết này] (https://developers.google.com/appengine/articles/deferred) giải thích, nếu bạn cần kiểm soát hoàn toàn các nhiệm vụ được xếp hàng đợi và thực hiện như thế nào, bạn cần sử dụng API hàng đợi nhiệm vụ. ;-) – lucdc

+0

Tôi không cần hoặc muốn kiểm soát hoàn toàn các nhiệm vụ được xếp hàng đợi và thực hiện như thế nào; đó là swatting tại ruồi với sledgehammers. Tôi chỉ muốn appstats thất bại hơn. Python có một API cho nó, nhưng dường như Java không: ( – stickfigure

Các vấn đề liên quan