Skip to content

Commit

Permalink
chore(axiom): create nr_user_error_t struct
Browse files Browse the repository at this point in the history
  • Loading branch information
hahuja2 committed Sep 3, 2024
1 parent 468e301 commit a2ad43b
Show file tree
Hide file tree
Showing 10 changed files with 126 additions and 182 deletions.
41 changes: 23 additions & 18 deletions agent/php_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "php_hash.h"
#include "php_user_instrument.h"
#include "fw_drupal_common.h"
#include "nr_errors.h"
#include "nr_rum.h"
#include "util_logging.h"
#include "util_memory.h"
Expand Down Expand Up @@ -71,16 +72,17 @@ PHP_FUNCTION(newrelic_notice_error) {
const char* errclass = "NoticedError";
char* errormsgstr = NULL;
nr_string_len_t errormsglen = 0;
zend_long error_number = 0;
char* error_file = NULL;
nr_string_len_t error_file_len = 0;
zend_long error_line = 0;
char* user_error_message = NULL;
nr_string_len_t user_error_message_len = 0;
zend_long user_error_number = 0;
char* user_error_file = NULL;
nr_string_len_t user_error_file_len = 0;
zend_long user_error_line = 0;
zval* exc = NULL;
nr_string_len_t error_context_len = 0;
char* error_context = NULL;
nr_string_len_t user_error_context_len = 0;
char* user_error_context = NULL;
int priority = 0;
zval* ignore = NULL;
bool determine = false;
bool five_params = false;

NR_UNUSED_RETURN_VALUE;
NR_UNUSED_RETURN_VALUE_PTR;
Expand Down Expand Up @@ -134,11 +136,11 @@ PHP_FUNCTION(newrelic_notice_error) {
case 2:
if (FAILURE
== zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,
ZEND_NUM_ARGS() TSRMLS_CC, "zo!", &ignore,
ZEND_NUM_ARGS() TSRMLS_CC, "s!o!", &user_error_message, &user_error_message_len,
&exc)) {
nrl_debug(NRL_API,
"newrelic_notice_error: invalid two arguments: expected "
"exception as second argument");
"string as first argument and exception as second argument");
RETURN_NULL();
}
break;
Expand All @@ -147,13 +149,13 @@ PHP_FUNCTION(newrelic_notice_error) {
if (FAILURE
== zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,
ZEND_NUM_ARGS() TSRMLS_CC, "ls!s!ls!",
&error_number, &errormsgstr, &errormsglen,
&error_file, &error_file_len, &error_line,
&error_context, &error_context_len)) {
&user_error_number, &user_error_message, &user_error_message_len,
&user_error_file, &user_error_file_len, &user_error_line,
&user_error_context, &user_error_context_len)) {
nrl_debug(NRL_API, "newrelic_notice_error: invalid five arguments");
RETURN_NULL();
}
determine = true;
five_params = true;
break;

default:
Expand All @@ -172,11 +174,14 @@ PHP_FUNCTION(newrelic_notice_error) {
}
}

if (determine) {
if (five_params) {
nr_user_error_t* user_error = nr_user_error_create(
user_error_message, user_error_number, user_error_file, user_error_line,
user_error_context);
char* stack_json = nr_php_backtrace_to_json(NULL TSRMLS_CC);
nr_txn_record_error_with_additional_attributes(
NRPRG(txn), priority, true, errormsgstr, errclass, error_file,
error_line, error_context, error_number, stack_json);
nr_txn_record_error_with_additional_attributes(NRPRG(txn), priority, true,
user_error_message, errclass,
stack_json, user_error);
nr_free(stack_json);
RETURN_TRUE;
}
Expand Down
65 changes: 22 additions & 43 deletions axiom/nr_errors.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,13 @@ nr_error_t* nr_error_create(int priority,
if (NULL == message || NULL == klass || NULL == stacktrace_json) {
return 0;
}
return nr_error_create_additional_params(priority, message, klass, NULL, 0, NULL, 0,
stacktrace_json, span_id, when);
return nr_error_create_additional_params(priority, message, klass, NULL, stacktrace_json, span_id, when);
}

nr_error_t* nr_error_create_additional_params(int priority,
const char* message,
const char* klass,
const char* error_file,
int error_line,
const char* error_context,
int error_no,
nr_user_error_t* user_error,
const char* stacktrace_json,
const char* span_id,
nrtime_t when) {
Expand All @@ -47,63 +43,47 @@ nr_error_t* nr_error_create_additional_params(int priority,
error->when = when;
error->klass = nr_strdup(klass);
error->stacktrace_json = nr_strdup(stacktrace_json);
error->error_line = error_line;
error->error_no = error_no;
error->user_error = user_error;
if (NULL != message) {
error->message = nr_strdup(message);
}
if (NULL != error_file) {
error->error_file = nr_strdup(error_file);
}
if (NULL != error_context) {
error->error_context = nr_strdup(error_context);
}
if (NULL != span_id) {
error->span_id = nr_strdup(span_id);
}
return error;
}

const char* nr_error_get_message(const nr_error_t* error) {
if (NULL == error) {
return NULL;
}
return error->message;
nr_user_error_t* nr_user_error_create(const char* user_error_message, int user_error_number, const char* user_error_file, int user_error_line, const char* user_error_context) {
nr_user_error_t* user_error = (nr_user_error_t*)nr_malloc(sizeof(nr_user_error_t));
user_error->user_error_message = nr_strdup(user_error_message);
user_error->user_error_number = user_error_number;
user_error->user_error_file = nr_strdup(user_error_file);
user_error->user_error_line = user_error_line;
user_error->user_error_context = nr_strdup(user_error_context);
return user_error;
}

const char* nr_error_get_klass(const nr_error_t* error) {
if (NULL == error) {
return NULL;
void nr_user_error_destroy(nr_user_error_t* user_error) {
if (NULL != user_error) {
nr_free(user_error->user_error_message);
nr_free(user_error->user_error_file);
nr_free(user_error->user_error_context);
nr_free(user_error);
}
return error->klass;
}

const char* nr_error_get_file(const nr_error_t* error) {
const char* nr_error_get_message(const nr_error_t* error) {
if (NULL == error) {
return NULL;
}
return error->error_file;
}

int nr_error_get_line(const nr_error_t* error) {
if (NULL == error) {
return 0;
}
return error->error_line;
return error->message;
}

const char* nr_error_get_context(const nr_error_t* error) {
const char* nr_error_get_klass(const nr_error_t* error) {
if (NULL == error) {
return NULL;
}
return error->error_context;
}

int nr_error_get_no(const nr_error_t* error) {
if (NULL == error) {
return 0;
}
return error->error_no;
return error->klass;
}

nrtime_t nr_error_get_time(const nr_error_t* error) {
Expand Down Expand Up @@ -141,8 +121,7 @@ void nr_error_destroy(nr_error_t** error_ptr) {
nr_free(error->klass);
nr_free(error->span_id);
nr_free(error->stacktrace_json);
nr_free(error->error_file);
nr_free(error->error_context);
nr_user_error_destroy(error->user_error);
nr_realfree((void**)error_ptr);
}

Expand Down
49 changes: 17 additions & 32 deletions axiom/nr_errors.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@
*/
typedef struct _nr_error_t nr_error_t;

typedef struct _nr_user_error_t {
char* user_error_message; /* User error message */
char* user_error_file; /* User error file */
char* user_error_context; /* User error context */
int user_error_line; /* User error line */
int user_error_number; /* User error number */
} nr_user_error_t;

/*
* Purpose : Create a new error.
*
Expand All @@ -38,6 +46,14 @@ extern nr_error_t* nr_error_create(int priority,
const char* span_id,
nrtime_t when);

extern void nr_user_error_destroy(nr_user_error_t* user_error_ptr);

extern nr_user_error_t* nr_user_error_create(const char* user_error_message,
int user_error_number,
const char* user_error_file,
int user_error_line,
const char* user_error_context);

/*
* Purpose : Create a new error for the use case where additional parameters are
* passed in. The following parameters are required and can not be NULL: klass
Expand All @@ -64,10 +80,7 @@ extern nr_error_t* nr_error_create_additional_params(
int priority,
const char* message,
const char* klass,
const char* error_file,
int error_line,
const char* error_context,
int error_no,
nr_user_error_t* user_error,
const char* stacktrace_json,
const char* span_id,
nrtime_t when);
Expand All @@ -89,34 +102,6 @@ extern const char* nr_error_get_message(const nr_error_t* error);
*/
extern const char* nr_error_get_klass(const nr_error_t* error);

/*
* Purpose : Get the error file of an error.
*
* Returns : The error file of the error or NULL if not defined.
*/
extern const char* nr_error_get_file(const nr_error_t* error);

/*
* Purpose : Get the error line of an error.
*
* Returns : The error line of the error or 0 if not defined.
*/
extern int nr_error_get_line(const nr_error_t* error);

/*
* Purpose : Get the error context of an error.
*
* Returns : The error context of the error or NULL if not defined.
*/
extern const char* nr_error_get_context(const nr_error_t* error);

/*
* Purpose : Get the error number of an error.
*
* Returns : The error number of the error or 0 if not defined.
*/
extern int nr_error_get_no(const nr_error_t* error);

/*
* Purpose : Get the span_id of an error.
*
Expand Down
5 changes: 1 addition & 4 deletions axiom/nr_errors_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,10 @@ struct _nr_error_t {
int priority; /* Error priority - lowest to highest */
char* message; /* Error message */
char* klass; /* Error class */
char* error_file; /* User provided error file */
int error_line; /* User provided error line */
char* error_context; /* User provided error context */
int error_no; /* User provided error number */
char* stacktrace_json; /* Stack trace in JSON format */
char* span_id; /* ID of the current executing span at the time the error
occurred */
nr_user_error_t* user_error;
};

#endif /* NR_ERRORS_PRIVATE_HDR */
22 changes: 5 additions & 17 deletions axiom/nr_segment.c
Original file line number Diff line number Diff line change
Expand Up @@ -1176,17 +1176,13 @@ void nr_segment_set_error(nr_segment_t* segment,
if ((NULL == segment) || (NULL == error_message && NULL == error_class)) {
return;
}
nr_segment_set_error_with_additional_params(segment, error_message, error_class, NULL, 0,
NULL, 0);
nr_segment_set_error_with_additional_params(segment, error_message, error_class, NULL);
}

void nr_segment_set_error_with_additional_params(nr_segment_t* segment,
const char* error_message,
const char* error_class,
const char* error_file,
int error_line,
char* error_context,
int error_no) {
nr_user_error_t* user_error) {
if (NULL == segment || NULL == error_class) {
return;
}
Expand All @@ -1197,21 +1193,13 @@ void nr_segment_set_error_with_additional_params(nr_segment_t* segment,

nr_free(segment->error->error_message);
nr_free(segment->error->error_class);
nr_free(segment->error->error_file);
nr_free(segment->error->error_context);
nr_free(segment->error->user_error);

segment->error->error_class = error_class ? nr_strdup(error_class) : NULL;
segment->error->error_no = error_no;
segment->error->error_line = error_line;
if (NULL != error_message) {
segment->error->error_message = error_message ? nr_strdup(error_message) : NULL;
}
if (NULL != error_file) {
segment->error->error_file = error_file ? nr_strdup(error_file) : NULL;
}
if (NULL != error_context) {
segment->error->error_context = error_context ? nr_strdup(error_context) : NULL;
}
segment->error->error_class = error_class ? nr_strdup(error_class) : NULL;
segment->error->user_error = user_error;
}

bool nr_segment_attributes_user_add(nr_segment_t* segment,
Expand Down
10 changes: 2 additions & 8 deletions axiom/nr_segment.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,7 @@ typedef struct _nr_segment_metric_t {
typedef struct _nr_segment_error_t {
char* error_message; /* The error message that will appear on a span event. */
char* error_class; /* The error class that will appear on a span event. */
char* error_file; /* The error file that will appear on a span event. */
int error_line; /* The error line that will appear on a span event. */
char* error_context; /* The error context that will appear on a span event. */
int error_no; /* The error number that will appear on a span event. */
nr_user_error_t* user_error; /* The user error that will appear on a span event.*/
} nr_segment_error_t;

/*
Expand Down Expand Up @@ -668,10 +665,7 @@ extern void nr_segment_set_error_with_additional_params(
nr_segment_t* segment,
const char* error_message,
const char* error_class,
const char* errfile,
int errline,
char* errcontext,
int error_no);
nr_user_error_t* user_error);

/*
* Purpose : Gets the child_ix of a segment.
Expand Down
4 changes: 2 additions & 2 deletions axiom/nr_segment_private.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include "nr_axiom.h"

#include "nr_errors.h"
#include "nr_segment_private.h"
#include "nr_segment.h"
#include "nr_txn.h"
Expand Down Expand Up @@ -87,7 +88,6 @@ void nr_segment_error_destroy_fields(nr_segment_error_t* segment_error) {

nr_free(segment_error->error_message);
nr_free(segment_error->error_class);
nr_free(segment_error->error_file);
nr_free(segment_error->error_context);
nr_user_error_destroy(segment_error->user_error);
nr_free(segment_error);
}
Loading

0 comments on commit a2ad43b

Please sign in to comment.