Alt-NewRelic-Agent-FFI-Empty
view release on metacpan or search on metacpan
lib/NewRelic/Agent/FFI/Procedural.pm view on Meta::CPAN
321322323324325326327328329330331332333334335336337338339340341my
$seg
= newrelic_segment_generic_begin
$tx
,
$parent_seg
,
$name
;
Begins a new generic segment. C<
$parent_seg
> is a parent segment id (C<
undef
>
no
parent). C<
$name
> is a string.
=head2 newrelic_segment_datastore_begin
my $seg = newrelic_segment_datastore_begin $tx, $parent_seg, $table, $operation, $sql, $sql_trace_rollup_name;
my $seg = newrelic_segment_datastore_begin $tx, $parent_seg, $table, $operation, $sql, $sql_trace_rollup_name, $sql_obfuscator;
Begins a new datastore segment. C<$parent_seg> is a parent segment id (C<undef> no parent). C<$operation> should be
one of C<select>, C<insert>, C<update> or C<delete>.
If you want to provide your own obfuscator, you need to pass in the address of a C function. To do that from Perl you can
create a closure with L<FFI::Platypus>, like so:
use 5.010;
use FFI::Platypus;
use FFI::Platypus::Memory qw( strdup free );
sub myobfuscator
{
t/newrelic_agent_ffi__live.t view on Meta::CPAN
626364656667686970717273747576777879808182
note
"seg = $seg"
;
sleep
rand
.5;
is
$nr
->end_segment(
$tx
,
$seg
), 0,
'end_segment'
;
};
subtest
'datastore segment'
=>
sub
{
my
$seg
=
$nr
->begin_datastore_segment(
$tx
,
undef
,
'users'
,
'selecting users'
,
'SELECT * FROM users WHERE id = ?'
,
'get_user_account'
);
ok
$seg
,
'begin_datastore_segment'
;
note
"seg = $seg"
;
sleep
rand
.5;
is
$nr
->end_segment(
$tx
,
$seg
), 0,
'end_segment'
;
};
subtest
'external segment'
=>
sub
{
t/newrelic_agent_ffi_procedural.t view on Meta::CPAN
4647484950515253545556575859606162636465666768697071727374757677787980subtest
'newrelic_segment_datastore_begin'
=>
sub
{
my
$tx
= newrelic_transaction_begin;
ok
$tx
,
'newrelic_transaction_begin'
;
our
$sql_in
;
sub
myobfuscator
{
(
$sql_in
) =
@_
;
note
"myobfuscator($sql_in)"
;
my
$sql_out
=
'select * from users where password = ?'
;
state
$ptr
= 0;
free(
$ptr
)
if
$ptr
;
$ptr
= strdup
$sql_out
;
}
my
$ffi
= FFI::Platypus->new;
$ffi
->type(
'(string)->opaque'
=>
'ob'
);
my
$myobfuscator_closure
=
$ffi
->closure(\
&myobfuscator
);
my
$myobfuscator_ptr
=
$ffi
->cast(
ob
=>
opaque
=>
$myobfuscator_closure
);
note
"\$myobfuscator_ptr = $myobfuscator_ptr"
;
my
$seg
= newrelic_segment_datastore_begin
$tx
, NEWRELIC_ROOT_SEGMENT,
'mytable'
,
'select'
,
"select * from users where password = 'secret'"
,
'get_user_pw'
,
$myobfuscator_ptr
;
ok
$seg
,
'newrelic_segment_datastore_begin'
;
#is $sql_in, "select * from users where password = 'secret'", 'myobfuscator called';
sleep
rand
.5;
my
$rc
= newrelic_segment_end
$tx
,
$seg
;
is
$rc
, 0,
'newrelic_segment_end'
;
newrelic_transaction_end
$tx
;
ok 1,
'newrelic_transaction_end'
;
};
( run in 0.482 second using v1.01-cache-2.11-cpan-65fba6d93b7 )