]> gitweb.factorcode.org Git - factor.git/blob - extra/spider/report/report.factor
Merge branch 'master' of git://factorcode.org/git/factor into clean-linux-x86-32
[factor.git] / extra / spider / report / report.factor
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
5 spider ;
6 IN: spider.report
7
8 SYMBOL: network-failures
9 SYMBOL: broken-pages
10 SYMBOL: timings
11
12 : record-broken-page ( url spider-result -- )
13     headers>> [ code>> ] [ message>> ] bi 2array 2array
14     broken-pages push ;
15
16 : record-page-timings ( url spider-result -- )
17     fetch-time>> 2array timings get push ;
18
19 : record-network-failure ( url -- )
20     network-failures get push ;
21
22 : process-result ( url spider-result -- )
23     {
24         { f [ record-network-failure ] }
25         [
26             dup headers>> code>> 200 =
27             [ record-page-timings ] [ record-broken-page ] if
28         ]
29     } case ;
30
31 CONSTANT: slowest 5
32
33 SYMBOL: slowest-pages
34 SYMBOL: mean-time
35 SYMBOL: median-time
36 SYMBOL: time-std
37
38 : process-timings ( -- )
39     timings get sort-values
40     [ slowest short tail* reverse slowest-pages set ]
41     [
42         values
43         [ mean 1000000 /f mean-time set ]
44         [ median 1000000 /f median-time set ]
45         [ std 1000000 /f time-std set ] tri
46     ] bi ;
47
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
53     process-timings ;
54
55 : info-table ( alist -- html )
56     [
57         first2 dupd 1000000 /f
58         [XML
59         <tr><td><a href=<->><-></a></td><td><-> seconds</td></tr>
60         XML]
61     ] map [XML <table border="1"><-></table> XML] ;
62
63 : report-broken-pages ( -- html )
64     broken-pages get info-table ;
65
66 : report-network-failures ( -- html )
67     network-failures get [
68         dup [XML <li><a href=<->><-></a></li> XML]
69     ] map [XML <ul><-></ul> XML] ;
70
71 : slowest-pages-table ( -- html )
72     slowest-pages get info-table ;
73
74 : timing-summary-table ( -- html )
75     mean-time get
76     median-time get
77     time-std get
78     [XML
79     <table border="1">
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>
83     </table>
84     XML] ;
85
86 : report-timings ( -- html )
87     slowest-pages-table
88     timing-summary-table
89     [XML
90     <h2>Slowest pages</h2>
91     <->
92
93     <h2>Summary</h2>
94     <->
95     XML] ;
96
97 : generate-report ( -- html )
98     report-broken-pages
99     report-network-failures
100     report-timings
101     [XML
102     <h1>Broken pages</h1>
103     <->
104
105     <h1>Network failures</h1>
106     <->
107
108     <h1>Load times</h1>
109     <->
110     XML] ;
111
112 : spider-report ( spider -- html )
113     [ spidered>> process-results generate-report ] with-scope ;