OpenTelemetry-Instrumentation-namespace
view release on metacpan or search on metacpan
lib/OpenTelemetry/Instrumentation/namespace.pm view on Meta::CPAN
package OpenTelemetry::Instrumentation::namespace;
# ABSTRACT: OpenTelemetry instrumentation for a namespace
our $VERSION = '0.034';
use v5.38;
use experimental 'try';
use Class::Method::Modifiers 'install_modifier';
use Devel::Peek;
use List::Util 'pairs';
use Module::Runtime ();
use OpenTelemetry::Common;
use OpenTelemetry;
use Ref::Util qw( is_regexpref is_coderef is_hashref );
use YAML::PP;
use namespace::clean ();
use parent 'OpenTelemetry::Instrumentation';
my $LOGGER = OpenTelemetry::Common::internal_logger;
my %CACHE;
sub install {
my $class = shift;
my ( $rules, $options ) = $class->parse_options(@_);
return !!1 unless @$rules;
# Loop over loaded modules
for my $module ( keys %INC ) {
if ( lc $module eq $module ) {
# $LOGGER->trace("Not auto-instrumenting $module because it is a pragma");
next;
}
if ( $module =~ /^[0-9]/ ) {
# $LOGGER->trace("Not auto-instrumenting $module because it is a version");
next;
}
$class->wrap_module( $module, $rules, $options )
}
$class->wrap_require( $rules, $options );
return !!1;
}
sub wrap_require ($class, $rules, $options ) {
my $old_hook = ${^HOOK}{require__before};
${^HOOK}{require__before} = sub {
my ($name) = @_;
my $return;
$return = $old_hook->($name) if $old_hook;
return sub {
$return->() if ref $return && is_coderef $return;
return unless $INC{$name};
$class->wrap_module($name, $rules, $options);
};
};
}
sub parse_options ( $class, @config ) {
my %options = (
-ignore_constants => 1,
-ignore_private => 1,
-ignore_import => 1,
-prefer_instrumentations => 1,
);
my @rules;
( run in 1.599 second using v1.01-cache-2.11-cpan-39bf76dae61 )