OpenTelemetry

 view release on metacpan or  search on metacpan

lib/Log/Any/Adapter/OpenTelemetry.pm  view on Meta::CPAN

package Log::Any::Adapter::OpenTelemetry;

use strict;
use warnings;
use experimental 'signatures';

our $VERSION = '0.033';

use Log::Any::Adapter::Util ();
use OpenTelemetry qw( otel_config otel_span_from_context otel_logger_provider );
use Ref::Util 'is_hashref';
use Time::HiRes 'time';

use OpenTelemetry::Constants qw(
    LOG_LEVEL_TRACE
    LOG_LEVEL_DEBUG
    LOG_LEVEL_INFO
    LOG_LEVEL_WARN
    LOG_LEVEL_ERROR
    LOG_LEVEL_FATAL
);

use base 'Log::Any::Adapter::Base';

my %LOG2OTEL = (
    trace => LOG_LEVEL_TRACE,
    debug => LOG_LEVEL_DEBUG,
    info  => LOG_LEVEL_INFO,
    warn  => LOG_LEVEL_WARN,
    error => LOG_LEVEL_ERROR,
    fatal => LOG_LEVEL_FATAL,
);

my %OTEL2LOG = (
    trace => 8,
    debug => 7,
    info  => 6,
    warn  => 4,
    error => 3,
    fatal => 2,
);

sub init ( $self, @ ) {
    # FIXME: It would be good to get a logger early and cache
    # it for eventual calls. However, this suffers from the same
    # issue with caching tracers that is documented in the POD
    # for OpenTelemetry::Trace::Tracer: namely, that if we get
    # the no-op logger before we've set up a real logger provider
    # that can generate real loggers, we'll be stuck with a no-op.
    # It might be that we need to revisit the proxy classes removed
    # in d9e321bd1bf65d510b12ef34fe2b5a0c51da0bf2, although the
    # rationale for why they were removed is still sound. We'd just
    # have to come up with a way to make sure its delegate continues
    # to point to the right place even if the tracer provider changes
    # $self->{logger} = otel_logger_provider->logger;
}

for my $method ( Log::Any::Adapter::Util::logging_methods() ) {
    no strict 'refs';
    *$method = sub ( $self, @args) {
        $self->structured( $method, $self->category, @args );
    };
}

for my $method ( Log::Any::Adapter::Util::detection_methods() ) {
    my $numeric = Log::Any::Adapter::Util::numeric_level( $method =~ s/^is_//r );

    no strict 'refs';
    *$method = sub {
        my $level = $OTEL2LOG{ lc( otel_config('LOG_LEVEL') // 'info' ) };
        $numeric <= ( $level // $OTEL2LOG{info} );



( run in 2.194 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )