Changeset 3342

Show
Ignore:
Timestamp:
02/06/10 21:37:26 (6 months ago)
Author:
steve.schnepp
Message:

- custom format for graph_data_size
- per field & plugin graph_data_size

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • people/snide/pre_1.5/master/lib/Munin/Master/UpdateWorker.pm

    r3322 r3342  
    400400        for my $ds_name (keys %{$service_config}) { 
    401401            $self->_set_rrd_data_source_defaults($service_config->{$ds_name}); 
    402  
    403             unless (defined($service_config->{$ds_name}{label})) { 
     402            my $ds_config = $service_config->{$ds_name}; 
     403 
     404            unless (defined($ds_config->{label})) { 
    404405                ERROR "[ERROR] Unable to update $service on $nodedesignation -> $ds_name: Missing data source configuration attribute: label"; 
    405406                next; 
    406407            } 
    407  
    408             my $rrd_file  
    409                 = $self->_create_rrd_file_if_needed($service, $ds_name,  
    410                                                     $service_config->{$ds_name}); 
     408             
     409            # Sets the DS resolution, searching in that order :  
     410            # - per field  
     411            # - per plugin 
     412            # - globally 
     413            my $configref = $self->{node}{configref}; 
     414            $ds_config->{graph_data_size} ||= $configref->{"$service.$ds_name.graph_data_size"}; 
     415            $ds_config->{graph_data_size} ||= $configref->{"$service.graph_data_size"}; 
     416            $ds_config->{graph_data_size} ||= $config->{graph_data_size}; 
     417 
     418            DEBUG "[DEBUG] asking for a rrd of size : " . $ds_config->{graph_data_size}; 
     419            my $rrd_file = $self->_create_rrd_file_if_needed($service, $ds_name, $ds_config); 
    411420 
    412421            if (defined($service_data) and defined($service_data->{$ds_name})) { 
     
    469478                                $file); 
    470479         
    471     DEBUG "[DEBUG] Made rrd filename: $file\n"; 
     480    DEBUG "[DEBUG] rrd filename: $file\n"; 
    472481 
    473482    return $file; 
     
    485494                $ds_config->{type}, $ds_config->{min}, $ds_config->{max}), 
    486495    ); 
    487              
    488     my $resolution = $config->{graph_data_size}; 
     496 
     497    my $resolution = $ds_config->{graph_data_size}; 
     498    my $update_rate = $ds_config->{update_rate} || 300; # 5 min per default  
    489499    if ($resolution eq 'normal') { 
    490500        push (@args, 
     
    507517              "RRA:MIN:0.5:1:115200", 
    508518              "RRA:MAX:0.5:1:115200");  
    509     } 
     519    } elsif ($resolution =~ /^custom (.+)/) { 
     520        # Parsing resolution to achieve computer format as defined on the RFC : 
     521        # FULL_NB, MULTIPLIER_1 MULTIPLIER_1_NB, ... MULTIPLIER_NMULTIPLIER_N_NB  
     522        my @resolutions_computer = parse_custom_resolution($1, $update_rate); 
     523        foreach my $resolution_computer(@resolutions_computer) { 
     524            my ($multiplier, $multiplier_nb) = @{$resolution_computer}; 
     525            push (@args,  
     526                "RRA:AVERAGE:0.5:$multiplier:$multiplier_nb", 
     527                "RRA:MIN:0.5:$multiplier:$multiplier_nb", 
     528                "RRA:MAX:0.5:$multiplier:$multiplier_nb" 
     529            );  
     530        } 
     531    } 
     532    DEBUG "[DEBUG] RRDs::create @args"; 
    510533    RRDs::create @args; 
    511534    if (my $ERROR = RRDs::error) { 
     
    514537} 
    515538 
     539sub parse_custom_resolution { 
     540        my @elems = split(',\s*', shift); 
     541        my $update_rate = shift; 
     542 
     543        DEBUG "[DEBUG] update_rate: $update_rate"; 
     544 
     545        my @computer_format; 
     546        foreach my $elem (@elems) { 
     547                if ($elem =~ m/(\d+) (\d+)/) { 
     548                        # nothing to do, already in computer format 
     549                        push @computer_format, [$1, $2]; 
     550                } elsif ($elem =~ m/(\w+) for (\w+)/) { 
     551                        my $nb_sec = to_sec($1); 
     552                        my $for_sec = to_sec($2); 
     553                         
     554                        my $multiplier = int ($nb_sec / $update_rate); 
     555                        my $multiplier_nb = int ($for_sec / $nb_sec); 
     556 
     557                        DEBUG "[DEBUG] $elem" 
     558                                . " -> nb_sec:$nb_sec, for_sec:$for_sec" 
     559                                . " -> multiplier:$multiplier, multiplier_nb:$multiplier_nb" 
     560                        ; 
     561                        push @computer_format, [$multiplier, $multiplier_nb]; 
     562                } 
     563        } 
     564 
     565        return @computer_format; 
     566} 
     567 
     568# return the number of seconds  
     569# for the human readable format 
     570# s : second,  m : minute, h : hour 
     571# d : day, w : week, t : month, y : year 
     572sub to_sec { 
     573        my $secs_table = { 
     574                "s" => 1, 
     575                "m" => 60, 
     576                "h" => 60 * 60, 
     577                "d" => 60 * 60 * 24, 
     578                "w" => 60 * 60 * 24 * 7, 
     579                "t" => 60 * 60 * 24 * 31, # a month always has 31 days 
     580                "y" => 60 * 60 * 24 * 365, # a year always has 365 days  
     581        }; 
     582 
     583        my ($target) = @_; 
     584        if ($target =~ m/(\d+)([smhdwty])/i) { 
     585                return $1 * $secs_table->{$2};   
     586        } 
     587} 
     588 
     589sub to_mul { 
     590        my ($base, $target) = @_; 
     591        my $target_sec = to_sec($target); 
     592        if ($target %% $base != 0) { 
     593                return 0; 
     594        } 
     595 
     596        return round($target / $base);  
     597} 
     598 
     599sub to_mul_nb { 
     600        my ($base, $target) = @_; 
     601        my $target_sec = to_sec($target); 
     602        if ($target %% $base != 0) { 
     603                return 0; 
     604        } 
     605} 
    516606 
    517607sub _update_rrd_file {