1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
# You may distribute under the terms of either the GNU General Public License
# or the Artistic License (the same terms as Perl itself)
#
# (C) Paul Evans, 2016-2024 -- leonerd@leonerd.org.uk
package Net::Prometheus::Summary 0.14;
use v5.14;
use warnings;
use base qw( Net::Prometheus::Metric );
use Carp;
use List::Util 1.33 qw( any );
use constant _type => "summary";
__PACKAGE__->MAKE_child_class;
=head1 NAME
C<Net::Prometheus::Summary> - summarise individual numeric observations
=head1 SYNOPSIS
=for highlighter language=perl
use Net::Prometheus;
use Time::HiRes qw( time );
my $client = Net::Prometheus->new;
my $summary = $client->new_summary(
name => "request_seconds",
help => "Summary request processing time",
);
sub handle_request
{
my $start = time();
...
$summary->observe( time() - $start );
}
=head1 DESCRIPTION
This class provides a summary metric - a combination of a running total and a
counter, that can be used to report on total and average values of
observations, usually times. It is a subclass of L<Net::Prometheus::Metric>.
=cut
=head1 CONSTRUCTOR
Instances of this class are not usually constructed directly, but instead via
the L<Net::Prometheus> object that will serve it:
$summary = $prometheus->new_summary( %args )
This takes the same constructor arguments as documented in
L<Net::Prometheus::Metric>.
=cut
sub new
{
my $class = shift;
my %opts = @_;
$opts{labels} and any { $_ eq "quantile" } @{ $opts{labels} } and
croak "A Summary may not have a label called 'quantile'";
my $self = $class->SUPER::new( @_ );
$self->{counts} = {};
$self->{sums} = {};
if( !$self->labelcount ) {
$self->{counts}{""} = $self->{sums}{""} = 0;
}
return $self;
}
=head2 observe
$summary->observe( @label_values, $value )
$summary->observe( \%labels, $value )
$child->observe( $value )
Increment the summary sum by the given value, and the count by 1.
=cut
__PACKAGE__->MAKE_child_method( 'observe' );
sub _observe_child
{
my $self = shift;
my ( $labelkey, $value ) = @_;
$self->{counts}{$labelkey} += 1;
$self->{sums} {$labelkey} += $value;
}
# remove is generated automatically
sub _remove_child
{
my $self = shift;
my ( $labelkey ) = @_;
delete $self->{counts}{$labelkey};
delete $self->{sums}{$labelkey};
}
sub clear
{
my $self = shift;
undef %{ $self->{counts} };
undef %{ $self->{sums} };
}
sub samples
{
my $self = shift;
my $counts = $self->{counts};
my $sums = $self->{sums};
return map {
$self->make_sample( count => $_, $counts->{$_} ),
$self->make_sample( sum => $_, $sums->{$_} )
} sort keys %$counts;
}
=head1 AUTHOR
Paul Evans <leonerd@leonerd.org.uk>
=cut
0x55AA;
|