Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package perl-Metrics-Any for openSUSE:Factory checked in at 2022-12-14 14:11:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-Metrics-Any (Old) and /work/SRC/openSUSE:Factory/.perl-Metrics-Any.new.1835 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Metrics-Any" Wed Dec 14 14:11:08 2022 rev:4 rq:1042832 version:0.09 Changes: -------- --- /work/SRC/openSUSE:Factory/perl-Metrics-Any/perl-Metrics-Any.changes 2022-10-15 16:40:41.150618902 +0200 +++ /work/SRC/openSUSE:Factory/.perl-Metrics-Any.new.1835/perl-Metrics-Any.changes 2022-12-14 14:11:22.663610356 +0100 @@ -1,0 +2,11 @@ +Tue Nov 29 03:07:37 UTC 2022 - Tina Müller <timueller+p...@suse.de> + +- updated to 0.09 + see /usr/share/doc/packages/perl-Metrics-Any/Changes + + 0.09 2022-11-28 + [CHANGES] + * Define a new API for optional high-performance batch mode + collection of counter and gauge metrics + +------------------------------------------------------------------- Old: ---- Metrics-Any-0.08.tar.gz New: ---- Metrics-Any-0.09.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-Metrics-Any.spec ++++++ --- /var/tmp/diff_new_pack.S0pdHB/_old 2022-12-14 14:11:23.187613051 +0100 +++ /var/tmp/diff_new_pack.S0pdHB/_new 2022-12-14 14:11:23.191613072 +0100 @@ -18,7 +18,7 @@ %define cpan_name Metrics-Any Name: perl-Metrics-Any -Version: 0.08 +Version: 0.09 Release: 0 License: Artistic-1.0 OR GPL-1.0-or-later Summary: Abstract collection of monitoring metrics ++++++ Metrics-Any-0.08.tar.gz -> Metrics-Any-0.09.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/Changes new/Metrics-Any-0.09/Changes --- old/Metrics-Any-0.08/Changes 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/Changes 2022-11-28 18:54:45.000000000 +0100 @@ -1,5 +1,10 @@ Revision history for Metrics-Any +0.09 2022-11-28 + [CHANGES] + * Define a new API for optional high-performance batch mode + collection of counter and gauge metrics + 0.08 2022-10-11 [CHANGES] * Optionally allow the test adapter to store full values for diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/MANIFEST new/Metrics-Any-0.09/MANIFEST --- old/Metrics-Any-0.08/MANIFEST 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/MANIFEST 2022-11-28 18:54:45.000000000 +0100 @@ -9,7 +9,11 @@ lib/Metrics/Any/Adapter/Test.pm lib/Metrics/Any/AdapterBase/Stored.pm lib/Metrics/Any/Collector.pm +LICENSE MANIFEST This list of files +META.json +META.yml +README t/00use.t t/01collector.t t/02adapter-early.t @@ -24,7 +28,3 @@ t/21nonstrict.t t/22disable-package.t t/99pod.t -README -LICENSE -META.yml -META.json diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/META.json new/Metrics-Any-0.09/META.json --- old/Metrics-Any-0.08/META.json 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/META.json 2022-11-28 18:54:45.000000000 +0100 @@ -35,39 +35,39 @@ "provides" : { "Metrics::Any" : { "file" : "lib/Metrics/Any.pm", - "version" : "0.08" + "version" : "0.09" }, "Metrics::Any::Adapter" : { "file" : "lib/Metrics/Any/Adapter.pm", - "version" : "0.08" + "version" : "0.09" }, "Metrics::Any::Adapter::File" : { "file" : "lib/Metrics/Any/Adapter/File.pm", - "version" : "0.08" + "version" : "0.09" }, "Metrics::Any::Adapter::Null" : { "file" : "lib/Metrics/Any/Adapter/Null.pm", - "version" : "0.08" + "version" : "0.09" }, "Metrics::Any::Adapter::Stderr" : { "file" : "lib/Metrics/Any/Adapter/Stderr.pm", - "version" : "0.08" + "version" : "0.09" }, "Metrics::Any::Adapter::Tee" : { "file" : "lib/Metrics/Any/Adapter/Tee.pm", - "version" : "0.08" + "version" : "0.09" }, "Metrics::Any::Adapter::Test" : { "file" : "lib/Metrics/Any/Adapter/Test.pm", - "version" : "0.08" + "version" : "0.09" }, "Metrics::Any::AdapterBase::Stored" : { "file" : "lib/Metrics/Any/AdapterBase/Stored.pm", - "version" : "0.08" + "version" : "0.09" }, "Metrics::Any::Collector" : { "file" : "lib/Metrics/Any/Collector.pm", - "version" : "0.08" + "version" : "0.09" } }, "release_status" : "stable", @@ -76,6 +76,6 @@ "http://dev.perl.org/licenses/" ] }, - "version" : "0.08", - "x_serialization_backend" : "JSON::PP version 4.06" + "version" : "0.09", + "x_serialization_backend" : "JSON::PP version 4.07" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/META.yml new/Metrics-Any-0.09/META.yml --- old/Metrics-Any-0.08/META.yml 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/META.yml 2022-11-28 18:54:45.000000000 +0100 @@ -17,35 +17,35 @@ provides: Metrics::Any: file: lib/Metrics/Any.pm - version: '0.08' + version: '0.09' Metrics::Any::Adapter: file: lib/Metrics/Any/Adapter.pm - version: '0.08' + version: '0.09' Metrics::Any::Adapter::File: file: lib/Metrics/Any/Adapter/File.pm - version: '0.08' + version: '0.09' Metrics::Any::Adapter::Null: file: lib/Metrics/Any/Adapter/Null.pm - version: '0.08' + version: '0.09' Metrics::Any::Adapter::Stderr: file: lib/Metrics/Any/Adapter/Stderr.pm - version: '0.08' + version: '0.09' Metrics::Any::Adapter::Tee: file: lib/Metrics/Any/Adapter/Tee.pm - version: '0.08' + version: '0.09' Metrics::Any::Adapter::Test: file: lib/Metrics/Any/Adapter/Test.pm - version: '0.08' + version: '0.09' Metrics::Any::AdapterBase::Stored: file: lib/Metrics/Any/AdapterBase/Stored.pm - version: '0.08' + version: '0.09' Metrics::Any::Collector: file: lib/Metrics/Any/Collector.pm - version: '0.08' + version: '0.09' requires: List::Util: '1.29' perl: '5.014' resources: license: http://dev.perl.org/licenses/ -version: '0.08' +version: '0.09' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/File.pm new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/File.pm --- old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/File.pm 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/File.pm 2022-11-28 18:54:45.000000000 +0100 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2020 -- leon...@leonerd.org.uk -package Metrics::Any::Adapter::File 0.08; +package Metrics::Any::Adapter::File 0.09; use v5.14; use warnings; @@ -42,6 +42,8 @@ Distribution and timing metrics are tracked with a running total and count of observations. +This adapter type does not support batch mode reporting. + =head1 ARGUMENTS The following additional arguments are recognised diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/Null.pm new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/Null.pm --- old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/Null.pm 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/Null.pm 2022-11-28 18:54:45.000000000 +0100 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2020 -- leon...@leonerd.org.uk -package Metrics::Any::Adapter::Null 0.08; +package Metrics::Any::Adapter::Null 0.09; use v5.14; use warnings; @@ -21,6 +21,9 @@ A program would run with this adapter by default unless it has requested a different one, via the C<use Metrics::Any::Adapter> statement. +This adapter type claims to support batch mode, though the reporting callback +will never be invoked. + =cut sub new @@ -40,6 +43,10 @@ *$method = sub {}; } +# Batch mode is supported but does nothing +use constant HAVE_BATCH_MODE => 1; +sub add_batch_mode_callback {} + =head1 AUTHOR Paul Evans <leon...@leonerd.org.uk> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/Stderr.pm new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/Stderr.pm --- old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/Stderr.pm 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/Stderr.pm 2022-11-28 18:54:45.000000000 +0100 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2020 -- leon...@leonerd.org.uk -package Metrics::Any::Adapter::Stderr 0.08; +package Metrics::Any::Adapter::Stderr 0.09; use v5.14; use warnings; @@ -27,6 +27,8 @@ $ METRICS_ANY_ADAPTER=Stderr perl -Mblib t/01test.t +This adapter type does not support batch mode reporting. + =cut sub new diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/Tee.pm new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/Tee.pm --- old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/Tee.pm 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/Tee.pm 2022-11-28 18:54:45.000000000 +0100 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2020 -- leon...@leonerd.org.uk -package Metrics::Any::Adapter::Tee 0.08; +package Metrics::Any::Adapter::Tee 0.09; use v5.14; use warnings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/Test.pm new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/Test.pm --- old/Metrics-Any-0.08/lib/Metrics/Any/Adapter/Test.pm 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/lib/Metrics/Any/Adapter/Test.pm 2022-11-28 18:54:45.000000000 +0100 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2020-2022 -- leon...@leonerd.org.uk -package Metrics::Any::Adapter::Test 0.08; +package Metrics::Any::Adapter::Test 0.09; use v5.14; use warnings; @@ -47,6 +47,9 @@ For predictable output of timer metrics in unit tests, a unit test may wish to use the L</override_timer_duration> method. +This adapter type supports batch mode reporting. Callbacks are invoked at the +beginning of the L</metrics> method. + =cut my $singleton; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/lib/Metrics/Any/Adapter.pm new/Metrics-Any-0.09/lib/Metrics/Any/Adapter.pm --- old/Metrics-Any-0.08/lib/Metrics/Any/Adapter.pm 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/lib/Metrics/Any/Adapter.pm 2022-11-28 18:54:45.000000000 +0100 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2020 -- leon...@leonerd.org.uk -package Metrics::Any::Adapter 0.08; +package Metrics::Any::Adapter 0.09; use v5.14; use warnings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/lib/Metrics/Any/AdapterBase/Stored.pm new/Metrics-Any-0.09/lib/Metrics/Any/AdapterBase/Stored.pm --- old/Metrics-Any-0.08/lib/Metrics/Any/AdapterBase/Stored.pm 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/lib/Metrics/Any/AdapterBase/Stored.pm 2022-11-28 18:54:45.000000000 +0100 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2020 -- leon...@leonerd.org.uk -package Metrics::Any::AdapterBase::Stored 0.08; +package Metrics::Any::AdapterBase::Stored 0.09; use v5.14; use warnings; @@ -39,6 +39,7 @@ my $class = shift; # Metrics are keys of $self, named by handle + # Special non-metrics values can be stored by prefixing the name with "\x00" return bless {}, $class; } @@ -46,6 +47,16 @@ =cut +use constant HAVE_BATCH_MODE => 1; + +sub add_batch_mode_callback +{ + my $self = shift; + my ( $cb ) = @_; + + push @{ $self->{"\0batch_callbacks"} }, $cb; +} + sub _make { my $self = shift; @@ -112,7 +123,13 @@ my $self = shift; my ( $code ) = @_; + if( my $cbs = $self->{"\0batch_callbacks"} ) { + foreach my $cb ( @$cbs ) { $cb->() } + } + foreach my $handle ( sort keys %$self ) { + next if $handle =~ m/^\0/; + my $metric = $self->{$handle}; my $values = $metric->{values}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/lib/Metrics/Any/Collector.pm new/Metrics-Any-0.09/lib/Metrics/Any/Collector.pm --- old/Metrics-Any-0.08/lib/Metrics/Any/Collector.pm 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/lib/Metrics/Any/Collector.pm 2022-11-28 18:54:45.000000000 +0100 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2020 -- leon...@leonerd.org.uk -package Metrics::Any::Collector 0.08; +package Metrics::Any::Collector 0.09; use v5.14; use warnings; @@ -45,6 +45,54 @@ to allow programs to configure the metric reporting in a flexible manner during program startup. +=head2 Batch-Mode Reporting + +Some adapters may support an optional API for implementing metrics in a more +high-performance manner, suitable for use in low-level (perhaps even XS) code +that might be invoked at high speed or many times over. + +Such code often needs to keep simple counters of particular events that happen +a lot. Rather than incurring the cost of a full stack of method calls into the +collector and adapter implementation on every event, the instrumented code can +register a callback function that the adapter will call on some schedule, that +will report the actual metrics. In the meantime, the instrumented code can +maintain its own counters of events, using plain Perl scalars (or native +integers in XS code), to be reported in bulk when required. This reduces the +overall CPU cost involved in collecting metrics. + +This is most effective with pull-based adapters such as Test or Prometheus, +where the callback might only need to be invoked at the end of a test run, or +when the prometheus server polls the C</metrics> HTTP endpoint. + + my $evcounter = 0; + + $metrics->add_batch_mode_callback( sub { + $metrics->inc_counter_by( events => $evcounter ); + $evcounter = 0; + } ); + + sub do_thing { + $evcounter++; + ... + } + +Because not every adapter may implement this mode, instrumented code should be +prepared to fall back on the regular API to report its counters. + + my $evcounter = 0; + + my $use_batch = $metrics->add_batch_mode_callback( sub { + $metrics->inc_counter_by( events => $evcounter ); + $evcounter = 0; + } ); + + sub do_thing { + $use_batch ? $evcounter++ : $metrics->inc_counter( events => ); + ... + } + +Each adapter implementation should document if and how it handles batch mode. + =head1 ENVIRONMENT =head2 METRICS_ANY_DISABLE @@ -293,6 +341,10 @@ =head1 METHODS +=cut + +=head2 package + $package = $metrics->package Returns the package name that created the collector; the package in which the @@ -309,6 +361,33 @@ return $self->{package}; } +=head2 add_batch_mode_callback + + $ok = $metrics->add_batch_mode_callback( sub { ... } ) + +I<Since version 0.09.> + +If batch mode is supported on the underlying adapter, adds another callback to +its list of callbacks, to be invoked when it wishes to collect more metrics; +if this is supported then the method returns a true value. + +If batch mode is not supported, returns false. + +=cut + +sub add_batch_mode_callback +{ + my $self = shift; + my ( $cb ) = @_; + + unless( $self->adapter->can( "HAVE_BATCH_MODE" ) and $self->adapter->HAVE_BATCH_MODE ) { + return 0; + } + + $self->adapter->add_batch_mode_callback( $cb ); + return 1; +} + =head1 METRIC TYPES Each type of metric is created by one of the C<make_*> methods. They all take diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/lib/Metrics/Any.pm new/Metrics-Any-0.09/lib/Metrics/Any.pm --- old/Metrics-Any-0.08/lib/Metrics/Any.pm 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/lib/Metrics/Any.pm 2022-11-28 18:54:45.000000000 +0100 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2020-2021 -- leon...@leonerd.org.uk -package Metrics::Any 0.08; +package Metrics::Any 0.09; use v5.14; use warnings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/t/10adapter-null.t new/Metrics-Any-0.09/t/10adapter-null.t --- old/Metrics-Any-0.08/t/10adapter-null.t 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/t/10adapter-null.t 2022-11-28 18:54:45.000000000 +0100 @@ -43,6 +43,9 @@ ok( defined eval { $metrics->report_timer( "duration", 20 ); 1 }, '$metrics->report_timer' ) or diag( $@ ); +# batch mode is supported (though does nothing) +ok( $metrics->add_batch_mode_callback( sub {} ), 'Null adapter supports batch mode' ); + ok( !$metrics, '$metrics is still false at EOF' ); done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/t/13adapter-stored.t new/Metrics-Any-0.09/t/13adapter-stored.t --- old/Metrics-Any-0.08/t/13adapter-stored.t 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/t/13adapter-stored.t 2022-11-28 18:54:45.000000000 +0100 @@ -73,4 +73,34 @@ ], 'metrics to ->walk' ); } +# batch mode is supported +{ + Metrics::Any::Adapter->adapter->clear_values; + + my $called; + + my $batch_ok = $metrics->add_batch_mode_callback( sub { + $called++; + $metrics->inc_counter_by( counter => 100 ); + $metrics->set_gauge_to( gauge => 25 ); + } ); + ok( $batch_ok, 'Stored adapter supports batch mode' ); + + ok( !$called, 'Batch mode callback not yet invoked' ); + + my @walkdata; + Metrics::Any::Adapter->adapter->walk( sub { + my ( $type, $name, $labels, $value ) = @_; + push @walkdata, [ $type, $name, $labels, $value ]; + } ); + + is_deeply( \@walkdata, [ + [ counter => counter => [], 100 ], + + [ gauge => gauge => [], 25 ], + ], 'metrics to ->walk contained batch-reported values' ); + + ok( $called, 'Batch mode callback invoked by ->walk' ); +} + done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Metrics-Any-0.08/t/14adapter-test.t new/Metrics-Any-0.09/t/14adapter-test.t --- old/Metrics-Any-0.08/t/14adapter-test.t 2022-10-11 16:43:36.000000000 +0200 +++ new/Metrics-Any-0.09/t/14adapter-test.t 2022-11-28 18:54:45.000000000 +0100 @@ -147,6 +147,28 @@ ); } +# batch mode is supported +{ + Metrics::Any::Adapter::Test->clear; + + my $called; + + my $batch_ok = $metrics->add_batch_mode_callback( sub { + $called++; + $metrics->inc_counter_by( abc => 100 ); + $metrics->set_gauge_to( gauge => 25 ); + } ); + ok( $batch_ok, 'Test adapter supports batch mode' ); + + ok( !$called, 'Batch mode callback not yet invoked' ); + + is( Metrics::Any::Adapter::Test->metrics, + "the_ABC_counter = 100\n" . + "the_ABC_gauge = 25\n", + 'Metrics::Any::Adapter::Test->metrics contains batch-reported values' ); + ok( $called, 'Batch mode callback invoked by ->metrics' ); +} + ok( $metrics, '$metrics is still true at EOF' ); done_testing;