Alt-NewRelic-Agent-FFI-Empty
view release on metacpan or search on metacpan
lib/NewRelic/Agent/FFI/Procedural.pm view on Meta::CPAN
my $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
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
subtest '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.445 second using v1.01-cache-2.11-cpan-49f99fa48dc )