chiark / gitweb /
more work on stats report
[innduct.git] / innduct-stats-report
1 #!/usr/bin/perl
2
3 use warnings;
4 use strict;
5
6 use Data::Dumper;
7
8 our %counts;
9
10 # Input lines look like this:
11 # May 23 19:00:02 chiark innduct[23236]: news.relativity.greenend.org.uk| info: completed feedfile read=76 (+bl=7,+err=0) missing=0 offered=76 (ch=76,nc=0) accepted=75 (ch=75,nc=0) unwanted=1 (id=1,bod=0,nc=0) rejected=0 (id=0,bod=0,nc=0) deferred=0 (id=0,bod=0,nc=0) missing=0 (id=0,bod=0,nc=0) connretry=0 (id=0,bod=0,nc=0)
12
13 while (<>) {
14     next unless
15         m/^ [:0-9A-Za-z ]+[ ]
16             \w+[ ]
17             innduct\[\d+\]:[ ]
18             ([^|<>: \t]+)\|[ ]
19             info:[ ]
20             (?: completed | processed )[ ]
21             .*?
22             ( (?: [ ]
23                   (?: \w+ = \d+
24                     | \( [=+,0-9a-z]+ \)
25                    )
26                )+
27               )
28             $/x;
29     my ($site,$strs) = ($1,$2);
30     die unless $strs =~ m/^ read=/;
31
32     my $cur;
33     $strs .= ' ';
34     my $c= \%{ $counts{$site} };
35 #print Dumper($c);
36     for (;;) {
37         if ($strs =~ s/^[ ] (\w+) = (\d+) [ ]/ /x) {
38             $cur= $1;
39             $c->{$cur} += $2;
40         } elsif ($strs =~ s/^
41                  [ ] \(
42                    ( \+? \w+ ) = (\d+)
43                    (?: , ([^()]+) )?
44                  \) [ ]/ sprintf " (%s) ", defined $3 ? $3 : '' /xe) {
45             $c->{"${cur}_$1"} += $2;
46         } elsif ($strs =~ s/^ \(\) / /) {
47         } elsif ($strs eq ' ') {
48             last;
49         } else {
50             die "$_ // $strs ?";
51         }
52     }
53  
54 #    print "$site|";
55 #    foreach my $k (sort keys %$c) { printf " %s=%d", $k, $c->{$k}; }
56 #    print "\n";
57 }
58
59 #print STDERR Dumper(\%counts);;
60
61 our $cwr;
62 our $site;
63
64 foreach $site (sort keys %counts) {
65     $cwr= $counts{$site};
66     write;
67 }
68
69 sub pct ($$) {
70     my ($dend,$dor) = @_;
71     return undef unless defined($dend) and $dor;
72     return $dend * 100.0 / $dor;
73 }
74
75 sub amt ($) {
76     my ($v) = @_;
77     return '' unless defined $v;
78     if ($v < 9999) { return sprintf "%4d ", $v; }
79     if ($v < 9999e3) { return sprintf "%4dk", ($v / 1e3); }
80     return sprintf "%4dm", ($v / 1e3);
81 }
82
83 format STDOUT_TOP =
84 offrd acctd unwtd rejtd ac% rj% nochk nc% 
85 .
86 format STDOUT =
87 @>>>> @>>>> @>>>> @>>>> ^## ^## @>>>> ^## @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...
88 { (map { amt($cwr->{$_}) } qw(offered accepted unwanted rejected)),
89   (map { pct($cwr->{$_}, $cwr->{offered}) } qw(accepted rejected)),
90   ($cwr->{offered_nc} ? (amt($cwr->{offered_nc}),
91                          pct($cwr->{offered_nc}, $cwr->{offered}))
92                       : ('',undef)),
93   ($site)
94   }
95 .