OpenTelemetry

 view release on metacpan or  search on metacpan

lib/OpenTelemetry/Attributes.pm  view on Meta::CPAN

use Object::Pad ':experimental(init_expr)';
# ABSTRACT: A class encapsulating attribute validation for OpenTelemetry

package OpenTelemetry::Attributes;

our $VERSION = '0.033';

class OpenTelemetry::AttributeMap {
    use Log::Any;
    use OpenTelemetry::Common ();

    my $logger = OpenTelemetry::Common::internal_logger;

    use List::Util qw( any pairs );
    use Ref::Util qw( is_hashref is_arrayref );
    use Storable 'dclone';

    field $max_fields       :param  = undef;
    field $max_field_length :param  = undef;
    field $dropped_fields   :reader = 0;
    field $data                     = {};

    ADJUSTPARAMS ($params) {
        $self->set( %{ delete $params->{data} // {} } );
    }

    method $validate_attribute_value ( $value ) {
        # Attribute values cannot be undefined but logging this is noisy
        return unless defined $value;

        if ( is_arrayref $value ) {
            if ( any { ref } @$value ) {
                $logger->trace('Attribute values that are lists cannot themselves hold references');
                return;
            }

            # Make sure we do not store the same reference that was
            # passed as a value, since the list on the other side of
            # that reference can be modified without going through
            # our checks
            $value = $max_field_length ? [
                map {
                        defined ? substr( $_, 0, $max_field_length ) : $_
                } @$value
            ] : [ @$value ];
        }
        elsif ( ref $value ) {
            $logger->trace('Attribute values cannot be references');
            return;
        }
        elsif ( $max_field_length ) {
            $value = substr $value, 0, $max_field_length;
        }

        ( 1, $value );
    }

    method set ( %args ) {
        my $recorded = 0;
        for ( pairs %args ) {
            my ( $key, $value ) = @$_;

            $key ||= do {
                $logger->debugf("Attribute names should not be empty. Setting to 'null' instead");
                'null';
            };

            my $fields = scalar %$data;
            $fields++ unless exists $data->{$key};

            next if $max_fields && $fields > $max_fields;

            my $ok;
            ( $ok, $value ) = $self->$validate_attribute_value($value);



( run in 0.480 second using v1.01-cache-2.11-cpan-39bf76dae61 )