~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/scripts/utilities/pageperformancereport.py

Generate pageids, categories and combined reports simultaneously

Show diffs side-by-side

added added

removed removed

Lines of Context:
122
122
        if request.ticks is not None:
123
123
            self.ticks.append(request.ticks)
124
124
 
 
125
    _stats = None
 
126
 
125
127
    def stats(self):
126
128
        """Generate statistics about our request times.
127
129
 
135
137
        """
136
138
        if not self.request_times:
137
139
            return empty_stats
 
140
 
 
141
        if self._stats is not None:
 
142
            return self._stats
 
143
 
138
144
        stats = Stats()
139
145
 
140
146
        # Time stats
166
172
        stats.std_sqlstatements = numpy.std(array)
167
173
        stats.var_sqlstatements = numpy.var(array)
168
174
 
 
175
        # Cache for next invocation.
 
176
        self._stats = stats
169
177
        return stats
170
178
 
171
179
    def __str__(self):
178
186
 
179
187
def main():
180
188
    parser = LPOptionParser("%prog [args] tracelog [...]")
 
189
 
181
190
    parser.add_option(
182
191
        "-c", "--config", dest="config",
183
192
        default=os.path.join(
203
212
        "--no-pageids", dest="pageids",
204
213
        action="store_false", default=True,
205
214
        help="Do not produce pageids report")
 
215
    parser.add_option(
 
216
        "--directory", dest="directory",
 
217
        default=os.getcwd(), metavar="DIR",
 
218
        help="Output reports in DIR directory")
 
219
 
206
220
    options, args = parser.parse_args()
 
221
 
 
222
    if not os.path.isdir(options.directory):
 
223
        parser.error("Directory %s does not exist" % options.directory)
 
224
 
207
225
    if len(args) == 0:
208
226
        parser.error("At least one zserver tracelog file must be provided")
209
227
 
242
260
 
243
261
    parse(args, categories, pageid_times, options)
244
262
 
245
 
    print_html_report(options, categories, pageid_times)
 
263
    # Category only report.
 
264
    if options.categories:
 
265
        report_filename = os.path.join(options.directory,'categories.html')
 
266
        log.info("Generating %s", report_filename)
 
267
        html_report(open(report_filename, 'w'), categories, None)
 
268
 
 
269
    # Pageid only report.
 
270
    if options.pageids:
 
271
        report_filename = os.path.join(options.directory,'pageids.html')
 
272
        log.info("Generating %s", report_filename)
 
273
        html_report(open(report_filename, 'w'), None, pageid_times)
 
274
 
 
275
    # Combined report.
 
276
    if options.categories and options.pageids:
 
277
        report_filename = os.path.join(options.directory,'combined.html')
 
278
        html_report(open(report_filename, 'w'), categories, pageid_times)
246
279
 
247
280
    return 0
248
281
 
398
431
            "Unknown extension prefix %s" % prefix)
399
432
 
400
433
 
401
 
def print_html_report(options, categories, pageid_times):
 
434
def html_report(outf, categories, pageid_times):
402
435
 
403
 
    print dedent('''\
 
436
    print >> outf, dedent('''\
404
437
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
405
438
                "http://www.w3.org/TR/html4/loose.dtd">
406
439
        <html>
488
521
    def handle_times(html_title, times):
489
522
        stats = times.stats()
490
523
        histograms.append(stats.histogram)
491
 
        print dedent("""\
 
524
        print >> outf, dedent("""\
492
525
            <tr>
493
526
            <th class="category-title">%s</th>
494
527
            <td class="numeric total_hits">%d</td>
516
549
                html_title,
517
550
                stats.total_hits, stats.total_time,
518
551
                stats.mean, stats.std, stats.var, stats.median,
519
 
                len(histograms)-1,
 
552
                len(histograms) - 1,
520
553
                stats.total_sqltime, stats.mean_sqltime,
521
554
                stats.std_sqltime, stats.var_sqltime, stats.median_sqltime,
522
555
                stats.total_sqlstatements, stats.mean_sqlstatements,
524
557
                stats.median_sqlstatements))
525
558
 
526
559
    # Table of contents
527
 
    print '<ol>'
528
 
    if options.categories:
529
 
        print '<li><a href="#catrep">Category Report</a></li>'
530
 
    if options.pageids:
531
 
        print '<li><a href="#pageidrep">Pageid Report</a></li>'
532
 
    print '</ol>'
 
560
    if categories and pageid_times:
 
561
        print >> outf, dedent('''\
 
562
            <ol>
 
563
            <li><a href="#catrep">Category Report</a></li>
 
564
            <li><a href="#pageidrep">Pageid Report</a></li>
 
565
            </ol>
 
566
            ''')
533
567
 
534
 
    if options.categories:
535
 
        print '<h2 id="catrep">Category Report</h2>'
536
 
        print table_header
 
568
    if categories:
 
569
        print >> outf, '<h2 id="catrep">Category Report</h2>'
 
570
        print >> outf, table_header
537
571
        for category in categories:
538
572
            html_title = '%s<br/><span class="regexp">%s</span>' % (
539
573
                html_quote(category.title), html_quote(category.regexp))
540
574
            handle_times(html_title, category.times)
541
 
        print table_footer
 
575
        print >> outf, table_footer
542
576
 
543
 
    if options.pageids:
544
 
        print '<h2 id="pageidrep">Pageid Report</h2>'
545
 
        print table_header
 
577
    if pageid_times:
 
578
        print >> outf, '<h2 id="pageidrep">Pageid Report</h2>'
 
579
        print >> outf, table_header
546
580
        for pageid, times in sorted(pageid_times.items()):
547
581
            handle_times(html_quote(pageid), times)
548
 
        print table_footer
 
582
        print >> outf, table_footer
549
583
 
550
584
    # Ourput the javascript to render our histograms nicely, replacing
551
585
    # the placeholder <div> tags output earlier.
552
 
    print dedent("""\
 
586
    print >> outf, dedent("""\
553
587
        <script language="javascript" type="text/javascript">
554
588
        $(function () {
555
589
            var options = {
587
621
    for i, histogram in enumerate(histograms):
588
622
        if histogram is None:
589
623
            continue
590
 
        print dedent("""\
 
624
        print >> outf, dedent("""\
591
625
            var d = %s;
592
626
 
593
627
            $.plot(
596
630
 
597
631
            """ % (json.dumps(histogram), i))
598
632
 
599
 
    print dedent("""\
 
633
    print >> outf, dedent("""\
600
634
            });
601
635
        </script>
602
636
        </body>