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.968 second using v1.01-cache-2.11-cpan-71847e10f99 )