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 )