Net-Prometheus
view release on metacpan or search on metacpan
lib/Net/Prometheus/ProcessCollector/linux.pm view on Meta::CPAN
my $BOOTTIME;
sub new ( $class, %args )
{
# To report process_start_time_seconds correctly, we need the machine boot
# time
if( !defined $BOOTTIME ) {
foreach my $line ( do { open my $fh, "<", "/proc/stat"; <$fh> } ) {
next unless $line =~ m/^btime /;
$BOOTTIME = +( split m/\s+/, $line )[1];
last;
}
}
my $self = $class->__new( %args );
$self->{pid} = $args{pid} || "self";
return $self;
}
lib/Net/Prometheus/ProcessCollector/linux.pm view on Meta::CPAN
return $count;
}
sub _limit_fds ( $self )
{
my $line = ( grep m/^Max open files/, $self->_read_procfile( "limits" ) )[0];
defined $line or return undef;
# Max open files $SOFT $HARD
return +( split m/\s+/, $line )[3];
}
sub collect ( $self, $opts = undef )
{
my $statline = $self->_read_procfile( "stat" );
defined $statline or return; # process missing
# /proc/PID/stat contains PID (COMM) more fields here
my @statfields = split( m/\s+/,
( $statline =~ m/\)\s+(.*)/ )[0]
lib/Net/Prometheus/_FutureIO.pm view on Meta::CPAN
my $f = repeat {
Future::IO->sysread( $fh, 8192 )->then( sub ( $more ) {
$buf .= $more;
Future->done;
} );
} until => sub ( $f ) { $f->failure or $buf =~ m/\x0d\x0a\x0d\x0a/ };
# Parse request and generate a response code
$f = $f->then( sub ( @ ) {
my ( $req ) = $buf =~ m/^(.*\x0d\x0a\x0d\x0a)/s;
( my ( $firstline, $headers ) = split m/\x0d\x0a/, $req, 2 ) == 2 or
return Future->done( 400 );
my ( $method, $path, $proto ) = split m/\s+/, $firstline;
return Future->done( 400 ) unless $proto =~ m(^HTTP/1\.[01]$);
return Future->done( 200 ) if $method eq "GET";
return Future->done( 200, 1 ) if $method eq "HEAD";
return Future->done( 405 );
});
# Render an actual response and send it
$f = $f->then( sub ( $code, $is_head = undef ) {
t/21label-rendering.t view on Meta::CPAN
) );
sub test_label
{
my ( $label, $str, $name ) = @_;
$sample = $metric->make_sample(
"", $metric->labels( $label )->labelkey, 0
);
is( ( split m/\n/, $client->render )[2],
qq(metric{lab="$str"} 0),
"render for $name"
);
}
test_label( "a", "a",
'basic label',
);
test_label( "val here", "val here",
t/21label-rendering.t view on Meta::CPAN
my $metric = $client->register( Net::Prometheus::Metric->new(
name => "metric",
labels => [ "x", "y" ],
help => "",
) );
$sample = $metric->make_sample(
"", $metric->labels( "a", "b" )->labelkey, 0
);
is( ( split m/\n/, $client->render )[2],
q(metric{x="a",y="b"} 0),
'_render_value for multi-dimensional label' );
$client->unregister( $metric );
}
done_testing;
t/51perl-collector-detail.t view on Meta::CPAN
use constant HAVE_TEST_MEMORYGROWTH => defined eval { require Test::MemoryGrowth; };
$Net::Prometheus::PerlCollector::DETAIL = 1;
# Client should automatically include ::PerlCollector
my $client = Net::Prometheus->new;
# perl_heap_svs_by_type
{
my @by_type = grep { m/^perl_heap_svs_by_type/ } split m/\n/, $client->render;
# Don't need to test all the SV types but this should be sufficient
ok( (grep { m/^perl_heap_svs_by_type\{type="ARRAY"} [1-9]\d+/ } @by_type),
'Render output contains a non-zero count of ARRAYs' );
ok( (grep { m/^perl_heap_svs_by_type\{type="CODE"} [1-9]\d+/ } @by_type),
'Render output contains a non-zero count of CODEs' );
ok( (grep { m/^perl_heap_svs_by_type\{type="HASH"} [1-9]\d+/ } @by_type),
'Render output contains a non-zero count of HASHs' );
ok( (grep { m/^perl_heap_svs_by_type\{type="SCALAR"} [1-9]\d+/ } @by_type),
'Render output contains a non-zero count of SCALARs' );
( run in 0.686 second using v1.01-cache-2.11-cpan-71847e10f99 )