Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

$WebService::Raygun::Message::VERSION = '0.030';
# VERSION
use Mouse;
use Carp 'croak';
=head1 NAME
WebService::Raygun::Message - A message to be sent to raygun.io
=head1 SYNOPSIS
use WebService::Raygun::Message;
my $message = WebService::Raygun::Message->new(
occurred_on => '2014-06-27T03:15:10+1300',
error => "This is my error!",
environment => {
processor_count => 2,
cpu => 34,
architecture => 'x84',
total_physical_memory => 3
},
request => HTTP::Request->new(
[ 'Content-Type' => 'text/html', ]
),
);
# test stuff
=head1 DESCRIPTION
You generally should not need to create instances of this class
=head1 DESCRIPTION
This module assembles a request for raygun.io.
=head1 INTERFACE
=cut
use POSIX ();
subtype 'RaygunMessage' => as 'Object' => where {
$_->isa('WebService::Raygun::Message');
};
coerce 'RaygunMessage' => from 'HashRef' => via {
return WebService::Raygun::Message->new( %{$_} );
};
subtype 'OccurredOnDateTime' => as 'Object' => where {
$_->isa('DateTime');
};
coerce 'OccurredOnDateTime' => from 'Str' => via {
my $parser = DateTime::Format::Strptime->new(
pattern => '%FT%T%z',
time_zone => 'UTC',
on_error => sub {
confess
'Expect time in the following format: yyyy-mm-ddTHH:MM:SS+HHMM';
}
);
return $parser->parse_datetime($_);
};
no Mouse::Util::TypeConstraints;
=head2 occurred_on
Time the error occurred. This can be either:
=over 2
=item L<DateTime|DateTime> object
=item C<string>
Should have format C<YYYY-mm-ddTHH:MM:SSz>.
=back
Must be a valid datetime with timezone offset, eg 2014-06-30T04:30:30+100. Defaults to current time.
=cut
has occurred_on => (
is => 'rw',
isa => 'OccurredOnDateTime',
coerce => 1,
default => sub {
return DateTime->now( time_zone => 'UTC' );
},
);
=head2 error
The error. Can be one of the following:
=over 2
=item C<string>
This could be the output of something like L<croak|Carp/croak> or C<die>.
=item An exception object
See L<WebService::Raygun::Message::Error|WebService::Raygun::Message::Error> for a list of supported exception types.
=item L<WebService::Raygun::Message::Error|WebService::Raygun::Message::Error>
If possible, the other data types are converted to an instance of this class.
=back
=cut
has error => (
is => 'rw',
isa => 'MessageError',
coerce => 1,
default => sub {
my $exception;
try {
croak "Default error message. If you are seeing this,"
."it means the developer has not passed in an error object.";
}
catch {
$exception = $_;
};
return $exception;
},
);
=head2 user
Accepts any one of the following:
=over 2
=item C<string>
A string containing an email (eg. C<test@test.com>).
=item C<integer>
=item C<HASHREF>
Key/values should be a subset of the following:
{
identifier => "someidentifier",
email => 'test@test.com',
is_anonymous => 1|0|undef,
full_name => 'Firstname Lastname',
first_name => 'Firstname',
uuid => '783491e1-d4a9-46bc-9fde-9b1dd9ef6c6e'
}
All the fields are optional, however if C<uuid> is not supplied, one will be generated automatically.
=back
These will all be coerced into an object of type L<WebService::Raygun::Message::User|WebService::Raygun::Message::User>.
=cut
has user => (
is => 'rw',
isa => 'RaygunUser',
coerce => 1,
default => sub {
return {};
}
);
=head2 request
A I<request> object. See L<WebService::Raygun::Message::Request|WebService::Raygun::Message::Request> for a list of supported types.
=cut
has request => (
is => 'rw',
isa => 'Request',
coerce => 1,
default => sub { return {}; },
);
=head2 environment
See L<WebService::Raygun::Message::Environment|WebService::Raygun::Message::Environment>.
=cut
has environment => (
is => 'rw',
isa => 'Environment',
coerce => 1,
default => sub {
return {};
}
);
=head2 user_custom_data
Some data from the user.
=cut
has user_custom_data => (
is => 'rw',
isa => 'HashRef',
default => sub {
return {};
},
);
=head2 tags
=cut
has tags => (
is => 'rw',
isa => 'ArrayRef',
default => sub {
return [];
},
);
=head2 grouping_key
=cut
has grouping_key => (
is => 'rw',
isa => 'Str',
default => '',
);
=head2 version
=cut
has version => (
is => 'rw',
isa => 'Str',
default => sub {
return '0.1';
},
);
=head2 machine_name
=cut
has machine_name => (
is => 'rw',
isa => 'Str',
default => sub {
return (POSIX::uname)[1];
},
);
=head2 response_status_code
Default is 200.
=cut
has response_status_code => (
is => 'rw',
isa => 'Int',
default => sub {
return 200;
},
);
=head2 client
=cut
sub client {
my $self = shift;
return {
name => 'WebService::Raygun',
version => $self->VERSION,
};
}
=head2 prepare_raygun
Converts a Perl hash to JSON.
=cut
sub prepare_raygun {
my $self = shift;
my $formatter = DateTime::Format::Strptime->new(
pattern => '%FT%TZ',
time_zone => 'UTC',
);
my $occurred_on = $formatter->format_datetime( $self->occurred_on );
my $data = {
occurredOn => $occurred_on,
details => {
groupingKey => $self->grouping_key,
userCustomData => $self->user_custom_data,
machineName => $self->machine_name,
error => $self->error->prepare_raygun,
version => $self->version,
client => $self->client,
request => $self->request->prepare_raygun,
environment => $self->environment->prepare_raygun,
tags => $self->tags,
user => $self->user->prepare_raygun,
response => {
statusCode => $self->response_status_code,
}
}
};
return $data;
}
=head1 DEPENDENCIES
=cut
=head1 SEE ALSO
=over 2
=item L<WebService::Raygun::Message::Request|WebService::Raygun::Message::Request>
=item L<WebService::Raygun::Message::Environment|WebService::Raygun::Message::Environment>
=item L<WebService::Raygun::Message::Error|WebService::Raygun::Message::Error>
=item L<WebService::Raygun::Message::Error::StackTrace|WebService::Raygun::Message::Error::StackTrace>
=back
=cut
__PACKAGE__->meta->make_immutable();
1;
__END__