1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs combinators kernel math
4 math.statistics namespaces sequences sorting xml.syntax
8 SYMBOL: network-failures
12 : record-broken-page ( url spider-result -- )
13 headers>> [ code>> ] [ message>> ] bi 2array 2array
16 : record-page-timings ( url spider-result -- )
17 fetched-in>> 2array timings get push ;
19 : record-network-failure ( url -- )
20 network-failures get push ;
22 : process-result ( url spider-result -- )
24 { f [ record-network-failure ] }
26 dup headers>> code>> 200 =
27 [ record-page-timings ] [ record-broken-page ] if
38 : process-timings ( -- )
39 timings get sort-values
40 [ slowest short tail* reverse slowest-pages set ]
43 [ mean 1000000 /f mean-time set ]
44 [ median 1000000 /f median-time set ]
45 [ std 1000000 /f time-std set ] tri
48 : process-results ( results -- )
49 V{ } clone network-failures set
50 V{ } clone broken-pages set
51 V{ } clone timings set
52 [ process-result ] assoc-each
55 : info-table ( alist -- html )
57 first2 dupd 1000000 /f
59 <tr><td><a href=<->><-></a></td><td><-> seconds</td></tr>
61 ] map [XML <table border="1"><-></table> XML] ;
63 : report-broken-pages ( -- html )
64 broken-pages get info-table ;
66 : report-network-failures ( -- html )
67 network-failures get [
68 dup [XML <li><a href=<->><-></a></li> XML]
69 ] map [XML <ul><-></ul> XML] ;
71 : slowest-pages-table ( -- html )
72 slowest-pages get info-table ;
74 : timing-summary-table ( -- html )
80 <tr><th>Mean</th><td><-> seconds</td></tr>
81 <tr><th>Median</th><td><-> seconds</td></tr>
82 <tr><th>Standard deviation</th><td><-> seconds</td></tr>
86 : report-timings ( -- html )
90 <h2>Slowest pages</h2>
97 : generate-report ( -- html )
99 report-network-failures
102 <h1>Broken pages</h1>
105 <h1>Network failures</h1>
112 : spider-report ( spider -- html )
113 [ spidered>> process-results generate-report ] with-scope ;