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 )