Could this be considered a Statistics module? In which case a name might something like Statistics::GroupBy (the SQL clause just occurred to me while I was thinking it over).
Huh, and now looking at CPAN I see there is an Array::GroupBy module that has a small overlap with what you are doing. So it seems close, even if you don't think it belongs in Statistics. -john On Thu, November 21, 2013 7:43 am, Philippe Bruhat (BooK) wrote: > Hi, > > I'm having trouble naming a small module. > > This module provides a scoring function based on a given ruleset. > It is used to produce a single status out of an aggregate of statuses. > > The rules for deciding what is the result status can be stated in a very > simple mini-language. The parser reads some source code written in that > domain-specific language, and returns a code reference. That coderef > takes a hash reference with statuses as keys and counts as values, > and returns a single string (the "score" or summary). > > It's not an aggregation module. The hashref is actually the aggregation > from some dataset, for which we want to produce a single, summary > value. We can then create several rulesets that are applied to various > aggregations of our Nagios data, to provide more synthetic indicators. > > The use case for us is to be able to monitor at a service level, rather > than a host level. 5% of servers down from a pool might not be critical, > where 10% would. The module is just one of the components used to provide > this service level monitoring. > > * * * > > The module is currently named "Fleur", but that's more of a working title, > as it's going to make it very difficult to find on CPAN. > > Here's he SYNOPSIS of the module: > > # create a parser > my $parser = Fleur->new( > input => [qw( OK WARN CRIT UNKN )], > output => [qw( OK WARN CRIT UNKN )], # default: same as input > default => 'OK', # default: first item in > output > ); > > # generate a scoring function > my $score = $parser->parse( << 'CODE' ); > %OK > 90%, %CRIT < .1: OK; > %CRIT > 50%: CRIT; > %CRIT + %WARN > 25%: WARN; > UNKN; > CODE > > # OK > $status = $score->( { OK => 19, CRIT => 2 } ); > > # WARN > $status = $score->( { OK => 14, CRIT => 6, WARN => 1 } ); > > # CRIT > $status = $score->( { OK => 8, CRIT => 11, WARN => 1, UNKN => 1 } ); > > # UNKN > $status = $score->( { OK => 18, CRIT => 2, WARN => 1 } ); > > The $score subroutine would be compiled from the following source code > (generated from the lines above): > > sub { > my %count = %{ shift() }; > my $total = 0; > $total += $_ for values %count; > my %percent > = $total > ? map +( $_ => $count{$_} / $total ), keys %count > : map +( $_ => 0 ), keys %count; > return 'OK' > if $percent{OK} > 0.9 > && $percent{CRIT} < .1; > return 'CRIT' > if $percent{CRIT} > 0.5; > return 'WARN' > if $percent{CRIT} > 0.25; > return 'UNKN'; > } > > Without the %-prefix, names are translated to absolute values from %count. > > Thanks for your time and ideas, > > -- > Philippe Bruhat (BooK) > > Food and life were both meant to be shared with others. > (Moral from Groo The Wanderer #119 > (Epic)) > >