Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
WIP: Add support for logs
Browse files Browse the repository at this point in the history
Note that this branch will be rebased on a periodic basis to stay
on top of changes in main. If you are checking this out early, do
remember to do `git pull -r` to avoid conflicts.
jjatria committed Apr 19, 2024
1 parent ff4e4e6 commit 7c27214
Showing 11 changed files with 412 additions and 58 deletions.
2 changes: 2 additions & 0 deletions Changes
Original file line number Diff line number Diff line change
@@ -2,6 +2,8 @@ Revision history for OpenTelemetry

{{$NEXT}}

* EXPERIMENTAL: Add support for logs

0.019 2023-12-03 14:44:05+00:00 Europe/London

* Document OpenTelemetry->logger as deprecated, as this will soon
88 changes: 54 additions & 34 deletions META.json
Original file line number Diff line number Diff line change
@@ -79,133 +79,153 @@
}
},
"provides" : {
"Log::Any::Adapter::OpenTelemetry" : {
"file" : "lib/Log/Any/Adapter/OpenTelemetry.pm",
"version" : "0.020"
},
"OpenTelemetry" : {
"file" : "lib/OpenTelemetry.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Attributes" : {
"file" : "lib/OpenTelemetry/Attributes.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Baggage" : {
"file" : "lib/OpenTelemetry/Baggage.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Constants" : {
"file" : "lib/OpenTelemetry/Constants.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Context" : {
"file" : "lib/OpenTelemetry/Context.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Exporter" : {
"file" : "lib/OpenTelemetry/Exporter.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Integration" : {
"file" : "lib/OpenTelemetry/Integration.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Integration::DBI" : {
"file" : "lib/OpenTelemetry/Integration/DBI.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Integration::HTTP::Tiny" : {
"file" : "lib/OpenTelemetry/Integration/HTTP/Tiny.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Integration::LWP::UserAgent" : {
"file" : "lib/OpenTelemetry/Integration/LWP/UserAgent.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Logs::LogRecord::Processor" : {
"file" : "lib/OpenTelemetry/Logs/LogRecord/Processor.pm",
"version" : "0.020"
},
"OpenTelemetry::Logs::Logger" : {
"file" : "lib/OpenTelemetry/Logs/Logger.pm",
"version" : "0.020"
},
"OpenTelemetry::Logs::LoggerProvider" : {
"file" : "lib/OpenTelemetry/Logs/LoggerProvider.pm",
"version" : "0.020"
},
"OpenTelemetry::Processor" : {
"file" : "lib/OpenTelemetry/Processor.pm",
"version" : "0.020"
},
"OpenTelemetry::Propagator" : {
"file" : "lib/OpenTelemetry/Propagator.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Propagator::Baggage" : {
"file" : "lib/OpenTelemetry/Propagator/Baggage.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Propagator::Composite" : {
"file" : "lib/OpenTelemetry/Propagator/Composite.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Propagator::None" : {
"file" : "lib/OpenTelemetry/Propagator/None.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Propagator::TextMap" : {
"file" : "lib/OpenTelemetry/Propagator/TextMap.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Propagator::TraceContext" : {
"file" : "lib/OpenTelemetry/Propagator/TraceContext.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Propagator::TraceContext::TraceFlags" : {
"file" : "lib/OpenTelemetry/Propagator/TraceContext/TraceFlags.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Propagator::TraceContext::TraceParent" : {
"file" : "lib/OpenTelemetry/Propagator/TraceContext/TraceParent.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Propagator::TraceContext::TraceState" : {
"file" : "lib/OpenTelemetry/Propagator/TraceContext/TraceState.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Trace" : {
"file" : "lib/OpenTelemetry/Trace.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Trace::Event" : {
"file" : "lib/OpenTelemetry/Trace/Event.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Trace::Link" : {
"file" : "lib/OpenTelemetry/Trace/Link.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Trace::Span" : {
"file" : "lib/OpenTelemetry/Trace/Span.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Trace::Span::Processor" : {
"file" : "lib/OpenTelemetry/Trace/Span/Processor.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Trace::Span::Status" : {
"file" : "lib/OpenTelemetry/Trace/Span/Status.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Trace::SpanContext" : {
"file" : "lib/OpenTelemetry/Trace/SpanContext.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Trace::Tracer" : {
"file" : "lib/OpenTelemetry/Trace/Tracer.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::Trace::TracerProvider" : {
"file" : "lib/OpenTelemetry/Trace/TracerProvider.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::X" : {
"file" : "lib/OpenTelemetry/X.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::X::Invalid" : {
"file" : "lib/OpenTelemetry/X/Invalid.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::X::Parsing" : {
"file" : "lib/OpenTelemetry/X/Parsing.pm",
"version" : "0.019"
"version" : "0.020"
},
"OpenTelemetry::X::Unsupported" : {
"file" : "lib/OpenTelemetry/X/Unsupported.pm",
"version" : "0.019"
"version" : "0.020"
}
},
"release_status" : "stable",
@@ -219,7 +239,7 @@
"web" : "https://github.com/jjatria/perl-opentelemetry"
}
},
"version" : "0.019",
"version" : "0.020",
"x_Dist_Zilla" : {
"perl" : {
"version" : "5.036000"
@@ -450,7 +470,7 @@
"branch" : null,
"changelog" : "Changes",
"signed" : 0,
"tag" : "0.019",
"tag" : "0.020",
"tag_format" : "%v",
"tag_message" : ""
},
104 changes: 104 additions & 0 deletions lib/Log/Any/Adapter/OpenTelemetry.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package Log::Any::Adapter::OpenTelemetry;

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

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 {
$numeric <= $OTEL2LOG{ lc( otel_config('LOG_LEVEL') // 'info' ) };
};
}

sub structured ( $self, $method, $category, @parts ) {
my $level = $method;
for ($level) {
s/(?:emergency|alert|critical)/fatal/;
s/notice/info/;
s/warning/warn/;
}

# FIXME: This is a little finicky. The aim is for the first
# argument to be the body (even if it is structured), and
# anything else gets put into the attributes. If the log
# comes with structured data that is not a hash, we put it
# under a `payload` key. Maybe this can be simplified to
# always put the data under a given key, but then we add
# data to the arguably common operation of attaching a hash.
my %args = ( body => shift @parts );

$args{attributes} = @parts == 1
? is_hashref $parts[0]
? $parts[0] : { payload => $parts[0] }
: @parts % 2
? { payload => \@parts } : { @parts }
if @parts;

otel_logger_provider->logger->emit_record(
timestamp => time,
severity_text => $method,
severity_number => 0+$LOG2OTEL{$level},
%args,
);
}

1;
34 changes: 34 additions & 0 deletions lib/OpenTelemetry.pm
Original file line number Diff line number Diff line change
@@ -12,6 +12,7 @@ use OpenTelemetry::Common;
use OpenTelemetry::Context;
use OpenTelemetry::Propagator::None;
use OpenTelemetry::Trace::TracerProvider;
use OpenTelemetry::Logs::LoggerProvider;
use OpenTelemetry::X;
use Scalar::Util 'refaddr';
use Ref::Util 'is_coderef';
@@ -26,6 +27,7 @@ use Exporter::Shiny qw(
otel_error_handler
otel_handle_error
otel_logger
otel_logger_provider
otel_propagator
otel_span_from_context
otel_tracer_provider
@@ -55,6 +57,38 @@ sub _generate_otel_logger { \&logger }
sub tracer_provider :lvalue { sentinel get => sub { $instance }, set => $set }
}

# FIXME: The functions in this block mean that in all likelihood
# OpenTelemetry->logger will have to go away. It no longer fits,
# since we gain the concept of a logger, which is different from
# the logger we used to return (which is just a Log::Any logger).
# This is not such a big problem: it just means that users who
# want to use the same logger as the rest of the OpenTelemetry
# implementation need to do
#
# my $log = Log::Any->get_logger( category => 'OpenTelemetry' );
#
# but you can argue that that's not so onerous, and if it is, that
# logging on that given category rather than the default one is
# a pointless.
{
my $lock = Mutex->new;
my $instance = OpenTelemetry::Logs::LoggerProvider->new;

my $set = sub ( $new ) {
die OpenTelemetry::X->create(
Invalid => 'Global logger provider must be a subclass of OpenTelemetry::Logs::LoggerProvider, got instead ' . ( ref $new || 'a plain scalar' ),
) unless $new isa OpenTelemetry::Logs::LoggerProvider;

$lock->enter( sub { $instance = $new });
};

sub _generate_otel_logger_provider {
my $x = sub :lvalue { sentinel get => sub { $instance }, set => $set };
}

sub logger_provider :lvalue { sentinel get => sub { $instance }, set => $set }
}

{
my $lock = Mutex->new;
my $instance = OpenTelemetry::Propagator::None->new;
116 changes: 96 additions & 20 deletions lib/OpenTelemetry/Constants.pm
Original file line number Diff line number Diff line change
@@ -2,35 +2,101 @@ package OpenTelemetry::Constants;

our $VERSION = '0.020';

use Scalar::Util ();

use constant {
SPAN_STATUS_UNSET => 0,
SPAN_STATUS_OK => 1,
SPAN_STATUS_ERROR => 2,
SPAN_STATUS_UNSET => 0,
SPAN_STATUS_OK => 1,
SPAN_STATUS_ERROR => 2,

SPAN_KIND_INTERNAL => 1,
SPAN_KIND_SERVER => 2,
SPAN_KIND_CLIENT => 3,
SPAN_KIND_PRODUCER => 4,
SPAN_KIND_CONSUMER => 5,

SPAN_KIND_INTERNAL => 1,
SPAN_KIND_SERVER => 2,
SPAN_KIND_CLIENT => 3,
SPAN_KIND_PRODUCER => 4,
SPAN_KIND_CONSUMER => 5,
# TODO: the dualvar is nice in theory, but it might be a little
# too clever. It does mean we need to jump through some hoops
# when exporting. But if we don't keep this mapping here, then
# where? More constants? A utility function, like in
# Log::Any::Util? And if so, where? OpenTelemetry::Common?
# OpenTelemetry::Logs::Logger?
LOG_LEVEL_TRACE => Scalar::Util::dualvar( 1, 'TRACE' ),
LOG_LEVEL_TRACE2 => Scalar::Util::dualvar( 2, 'TRACE2' ),
LOG_LEVEL_TRACE3 => Scalar::Util::dualvar( 3, 'TRACE3' ),
LOG_LEVEL_TRACE4 => Scalar::Util::dualvar( 4, 'TRACE4' ),
LOG_LEVEL_DEBUG => Scalar::Util::dualvar( 5, 'DEBUG' ),
LOG_LEVEL_DEBUG2 => Scalar::Util::dualvar( 6, 'DEBUG2' ),
LOG_LEVEL_DEBUG3 => Scalar::Util::dualvar( 7, 'DEBUG3' ),
LOG_LEVEL_DEBUG4 => Scalar::Util::dualvar( 8, 'DEBUG4' ),
LOG_LEVEL_INFO => Scalar::Util::dualvar( 9, 'INFO' ),
LOG_LEVEL_INFO2 => Scalar::Util::dualvar( 10, 'INFO2' ),
LOG_LEVEL_INFO3 => Scalar::Util::dualvar( 11, 'INFO3' ),
LOG_LEVEL_INFO4 => Scalar::Util::dualvar( 12, 'INFO4' ),
LOG_LEVEL_WARN => Scalar::Util::dualvar( 13, 'WARN' ),
LOG_LEVEL_WARN2 => Scalar::Util::dualvar( 14, 'WARN2' ),
LOG_LEVEL_WARN3 => Scalar::Util::dualvar( 15, 'WARN3' ),
LOG_LEVEL_WARN4 => Scalar::Util::dualvar( 16, 'WARN4' ),
LOG_LEVEL_ERROR => Scalar::Util::dualvar( 17, 'ERROR' ),
LOG_LEVEL_ERROR2 => Scalar::Util::dualvar( 18, 'ERROR2' ),
LOG_LEVEL_ERROR3 => Scalar::Util::dualvar( 19, 'ERROR3' ),
LOG_LEVEL_ERROR4 => Scalar::Util::dualvar( 20, 'ERROR4' ),
LOG_LEVEL_FATAL => Scalar::Util::dualvar( 21, 'FATAL' ),
LOG_LEVEL_FATAL2 => Scalar::Util::dualvar( 22, 'FATAL2' ),
LOG_LEVEL_FATAL3 => Scalar::Util::dualvar( 23, 'FATAL3' ),
LOG_LEVEL_FATAL4 => Scalar::Util::dualvar( 24, 'FATAL4' ),

TRACE_EXPORT_SUCCESS => 0,
TRACE_EXPORT_FAILURE => 1,
TRACE_EXPORT_TIMEOUT => 2,
# TODO: Since these are now used for exporting both logs and
# traces, we cannot really give them the TRACE_ prefix. This
# name is arguably better, but it might be unfamiliar to
# non-Perl OpenTelemetry users.
EXPORT_RESULT_SUCCESS => 0,
EXPORT_RESULT_FAILURE => 1,
EXPORT_RESULT_TIMEOUT => 2,

INVALID_TRACE_ID => "\0" x 16,
INVALID_SPAN_ID => "\0" x 8,
INVALID_TRACE_ID => "\0" x 16,
INVALID_SPAN_ID => "\0" x 8,
};

use constant {
HEX_INVALID_TRACE_ID => unpack('H*', INVALID_TRACE_ID),
HEX_INVALID_SPAN_ID => unpack('H*', INVALID_SPAN_ID),
# TODO: Redefining these here for now so we don't break the
# code that still uses them. I think we can still break things
# but we should decide on a stability policy and come up with
# some deprecation strategy for the future.
TRACE_EXPORT_SUCCESS => EXPORT_RESULT_SUCCESS,
TRACE_EXPORT_FAILURE => EXPORT_RESULT_FAILURE,
TRACE_EXPORT_TIMEOUT => EXPORT_RESULT_TIMEOUT,

HEX_INVALID_TRACE_ID => unpack('H*', INVALID_TRACE_ID),
HEX_INVALID_SPAN_ID => unpack('H*', INVALID_SPAN_ID),
};

our %EXPORT_TAGS = (
span_status => [qw(
SPAN_STATUS_UNSET
SPAN_STATUS_OK
SPAN_STATUS_ERROR
log => [qw(
LOG_LEVEL_TRACE
LOG_LEVEL_TRACE2
LOG_LEVEL_TRACE3
LOG_LEVEL_TRACE4
LOG_LEVEL_DEBUG
LOG_LEVEL_DEBUG2
LOG_LEVEL_DEBUG3
LOG_LEVEL_DEBUG4
LOG_LEVEL_INFO
LOG_LEVEL_INFO2
LOG_LEVEL_INFO3
LOG_LEVEL_INFO4
LOG_LEVEL_WARN
LOG_LEVEL_WARN2
LOG_LEVEL_WARN3
LOG_LEVEL_WARN4
LOG_LEVEL_ERROR
LOG_LEVEL_ERROR2
LOG_LEVEL_ERROR3
LOG_LEVEL_ERROR4
LOG_LEVEL_FATAL
LOG_LEVEL_FATAL2
LOG_LEVEL_FATAL3
LOG_LEVEL_FATAL4
)],
span_kind => [qw(
SPAN_KIND_INTERNAL
@@ -39,11 +105,21 @@ our %EXPORT_TAGS = (
SPAN_KIND_PRODUCER
SPAN_KIND_CONSUMER
)],
span_status => [qw(
SPAN_STATUS_UNSET
SPAN_STATUS_OK
SPAN_STATUS_ERROR
)],
trace_export => [qw(
TRACE_EXPORT_SUCCESS
TRACE_EXPORT_FAILURE
TRACE_EXPORT_TIMEOUT
)],
export => [qw(
EXPORT_RESULT_SUCCESS
EXPORT_RESULT_FAILURE
EXPORT_RESULT_TIMEOUT
)],
);

$EXPORT_TAGS{span} = [
@@ -64,6 +140,6 @@ $EXPORT_TAGS{trace} = [

use Exporter::Shiny;

our @EXPORT_OK = map @$_, @EXPORT_TAGS{qw( trace span )};
our @EXPORT_OK = map @$_, @EXPORT_TAGS{qw( export trace span log )};

1;
10 changes: 10 additions & 0 deletions lib/OpenTelemetry/Logs/LogRecord/Processor.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
use Object::Pad;
# ABSTRACT: The abstract interface for OpenTelemetry log record processors

package OpenTelemetry::Logs::LogRecord::Processor;

our $VERSION = '0.015';

role OpenTelemetry::Logs::LogRecord::Processor :does(OpenTelemetry::Processor) {
method on_emit;
}
16 changes: 16 additions & 0 deletions lib/OpenTelemetry/Logs/Logger.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
use Object::Pad;
# ABSTRACT: A log factory for OpenTelemetry

package OpenTelemetry::Logs::Logger;

our $VERSION = '0.015';

# TODO: Should this implement an interface like that of Mojo::Log
# or Log::Any? It would mean that writing adapters like
# Log::Any::Adapter::OpenTelemetry for other loggers (eg. Log::ger,
# Dancer2::Logger) would be simpler, since the high-level logging
# interface would already exist. I don't think this goes against
# the standard.
class OpenTelemetry::Logs::Logger {
method emit_record ( %args ) { }
}
16 changes: 16 additions & 0 deletions lib/OpenTelemetry/Logs/LoggerProvider.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
use Object::Pad;
# ABSTRACT: Provides access to OpenTelemetry Loggers

package OpenTelemetry::Logs::LoggerProvider;

our $VERSION = '0.015';

class OpenTelemetry::Logs::LoggerProvider {
use OpenTelemetry::Logs::Logger;

field $logger;

method logger ( %args ) {
$logger //= OpenTelemetry::Logs::Logger->new;
}
}
21 changes: 21 additions & 0 deletions lib/OpenTelemetry/Processor.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
use Object::Pad;
# ABSTRACT: The abstract interface for OpenTelemetry processors

package OpenTelemetry::Processor;

our $VERSION = '0.015';

# NOTE: Moving this here creates a nice symmetry where we have
# OpenTelemetry::{Propagator,Processor,Exporter} at the top-level
# and allow for specific implementations to live under them.
# We should decide where we expect implementations that are
# specific to Traces / Logs / Metrics should live, though.
# For now, this ends up giving us
# * OpenTelemetry::Trace::Span::Processor
# * OpenTelemetry::Logs::LogRecord::Processor
# * OpenTelemetry::Metrics::Instrument::Processor (hypothetical)
# and the SDK implementations with `::SDK` in there somewhere.
role OpenTelemetry::Processor {
method shutdown;
method force_flush;
}
5 changes: 1 addition & 4 deletions lib/OpenTelemetry/Trace/Span/Processor.pm
Original file line number Diff line number Diff line change
@@ -5,10 +5,7 @@ package OpenTelemetry::Trace::Span::Processor;

our $VERSION = '0.020';

role OpenTelemetry::Trace::Span::Processor {
role OpenTelemetry::Trace::Span::Processor :does(OpenTelemetry::Processor) {
method on_start;
method on_end;

method shutdown;
method force_flush;
}
58 changes: 58 additions & 0 deletions t/OpenTelemetry/Constants.t
Original file line number Diff line number Diff line change
@@ -3,6 +3,32 @@
use Test2::V0 -target => 'OpenTelemetry::Constants';

is \%OpenTelemetry::Constants::EXPORT_TAGS, {
log => [qw(
LOG_LEVEL_TRACE
LOG_LEVEL_TRACE2
LOG_LEVEL_TRACE3
LOG_LEVEL_TRACE4
LOG_LEVEL_DEBUG
LOG_LEVEL_DEBUG2
LOG_LEVEL_DEBUG3
LOG_LEVEL_DEBUG4
LOG_LEVEL_INFO
LOG_LEVEL_INFO2
LOG_LEVEL_INFO3
LOG_LEVEL_INFO4
LOG_LEVEL_WARN
LOG_LEVEL_WARN2
LOG_LEVEL_WARN3
LOG_LEVEL_WARN4
LOG_LEVEL_ERROR
LOG_LEVEL_ERROR2
LOG_LEVEL_ERROR3
LOG_LEVEL_ERROR4
LOG_LEVEL_FATAL
LOG_LEVEL_FATAL2
LOG_LEVEL_FATAL3
LOG_LEVEL_FATAL4
)],
span => [qw(
INVALID_SPAN_ID
HEX_INVALID_SPAN_ID
@@ -39,9 +65,17 @@ is \%OpenTelemetry::Constants::EXPORT_TAGS, {
TRACE_EXPORT_FAILURE
TRACE_EXPORT_TIMEOUT
)],
export => [qw(
EXPORT_RESULT_SUCCESS
EXPORT_RESULT_FAILURE
EXPORT_RESULT_TIMEOUT
)],
}, 'Export tags are correct';

is \@OpenTelemetry::Constants::EXPORT_OK, [qw(
EXPORT_RESULT_SUCCESS
EXPORT_RESULT_FAILURE
EXPORT_RESULT_TIMEOUT
INVALID_TRACE_ID
HEX_INVALID_TRACE_ID
TRACE_EXPORT_SUCCESS
@@ -57,6 +91,30 @@ is \@OpenTelemetry::Constants::EXPORT_OK, [qw(
SPAN_KIND_CLIENT
SPAN_KIND_PRODUCER
SPAN_KIND_CONSUMER
LOG_LEVEL_TRACE
LOG_LEVEL_TRACE2
LOG_LEVEL_TRACE3
LOG_LEVEL_TRACE4
LOG_LEVEL_DEBUG
LOG_LEVEL_DEBUG2
LOG_LEVEL_DEBUG3
LOG_LEVEL_DEBUG4
LOG_LEVEL_INFO
LOG_LEVEL_INFO2
LOG_LEVEL_INFO3
LOG_LEVEL_INFO4
LOG_LEVEL_WARN
LOG_LEVEL_WARN2
LOG_LEVEL_WARN3
LOG_LEVEL_WARN4
LOG_LEVEL_ERROR
LOG_LEVEL_ERROR2
LOG_LEVEL_ERROR3
LOG_LEVEL_ERROR4
LOG_LEVEL_FATAL
LOG_LEVEL_FATAL2
LOG_LEVEL_FATAL3
LOG_LEVEL_FATAL4
)], 'Exportable functions are correct';

is \@OpenTelemetry::EXPORT, [], 'Exports nothing by default';

0 comments on commit 7c27214

Please sign in to comment.