| 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); |
|---|
| 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"; |
|---|
| | 539 | sub 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 |
|---|
| | 572 | sub 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 | |
|---|
| | 589 | sub 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 | |
|---|
| | 599 | sub to_mul_nb { |
|---|
| | 600 | my ($base, $target) = @_; |
|---|
| | 601 | my $target_sec = to_sec($target); |
|---|
| | 602 | if ($target %% $base != 0) { |
|---|
| | 603 | return 0; |
|---|
| | 604 | } |
|---|
| | 605 | } |
|---|