OpenTelemetry

 view release on metacpan or  search on metacpan

lib/OpenTelemetry/Instrumentation/HTTP/Tiny.pm  view on Meta::CPAN

package OpenTelemetry::Instrumentation::HTTP::Tiny;
# ABSTRACT: OpenTelemetry instrumentation for HTTP::Tiny

our $VERSION = '0.033';

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

use Class::Inspector;
use Class::Method::Modifiers 'install_modifier';
use Feature::Compat::Defer;
use List::Util 'any';
use OpenTelemetry::Constants qw( SPAN_KIND_CLIENT SPAN_STATUS_ERROR );
use OpenTelemetry::Context;
use OpenTelemetry::Trace;
use OpenTelemetry;
use Ref::Util qw( is_arrayref is_coderef );
use Syntax::Keyword::Dynamically;
use isa 'URI::http';

use parent 'OpenTelemetry::Instrumentation';

sub dependencies { 'HTTP::Tiny' }

my sub get_headers ( $have, $want, $prefix ) {
    return unless @$want;

    map {
        my ( $k, $v ) = ( $_->[0], $have->{ $_->[1] } );
        "$prefix.$k" => is_arrayref $v ? $v : [ $v ]
    }
    grep { my $k = $_->[0]; any { $k =~ $_ } @$want }
    map { [ lc tr/-/_/r, $_ ] }
    keys %$have;
}

my ( $original, $loaded );

sub uninstall ( $class ) {
    return unless $original;
    no strict 'refs';
    no warnings 'redefine';
    delete $Class::Method::Modifiers::MODIFIER_CACHE{'HTTP::Tiny'}{request};
    *{'HTTP::Tiny::request'} = $original;
    undef $loaded;
    return;
}

sub install ( $class, %config ) {
    return if $loaded;
    return unless Class::Inspector->loaded('HTTP::Tiny');

    require URI;

    my @wanted_request_headers = map qr/^\Q$_\E$/i, map tr/-/_/r,
        @{ delete $config{request_headers}  // [] };

    my @wanted_response_headers = map qr/^\Q$_\E$/i, map tr/-/_/r,
        @{ delete $config{response_headers} // [] };

    $original = \&HTTP::Tiny::request;
    install_modifier 'HTTP::Tiny' => around => request => sub {
        my ( $code, $self, $method, $url, $options ) = @_;

        my $uri = URI->new("$url");

        my %url_data;
        if ( isa_URI_http $uri ) {
            $uri->userinfo('REDACTED:REDACTED') if $uri->userinfo;
            %url_data = (
                'server.address' => $uri->host,
                'server.port'    => $uri->port,
            );
        }

        my $span = OpenTelemetry->tracer_provider->tracer(
            name    => __PACKAGE__,



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