Skip to content

Commit 33fed1d

Browse files
authored
fix(agent): set oapi callbacks the right way (#700)
When wrapping a user function do not add special instrumentation if ANY special instrumentation (before/after/cleanup) has already been set. This approach matches pre-oapi instrumentation.
1 parent fdb79fd commit 33fed1d

File tree

2 files changed

+33
-35
lines changed

2 files changed

+33
-35
lines changed

agent/php_wrapper.c

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -23,45 +23,42 @@ nruserfn_t* nr_php_wrap_user_function_before_after_clean_with_transience(
2323
return wraprec;
2424
}
2525

26-
if (after_callback) {
27-
if (is_instrumentation_set(wraprec->special_instrumentation,
28-
after_callback)) {
29-
nrl_verbosedebug(
30-
NRL_INSTRUMENT,
31-
"%s: attempting to set special_instrumentation for %.*s, but "
32-
"it is already set",
33-
__func__, NRSAFELEN(namelen), NRBLANKSTR(name));
34-
} else {
35-
wraprec->special_instrumentation = after_callback;
36-
}
26+
/* If any of the callbacks we are attempting to set are already set to
27+
* something else, we want to exit without setting new callbacks */
28+
if (is_instrumentation_set_and_not_equal(wraprec->special_instrumentation,
29+
after_callback)) {
30+
nrl_verbosedebug(
31+
NRL_INSTRUMENT,
32+
"%s: attempting to set special_instrumentation for %.*s, but "
33+
"it is already set",
34+
__func__, NRSAFELEN(namelen), NRBLANKSTR(name));
35+
return wraprec;
3736
}
3837

39-
if (before_callback) {
40-
if (is_instrumentation_set(wraprec->special_instrumentation_before,
41-
before_callback)) {
42-
nrl_verbosedebug(NRL_INSTRUMENT,
43-
"%s: attempting to set special_instrumentation_before "
44-
"for %.*s, but "
45-
"it is already set",
46-
__func__, NRSAFELEN(namelen), NRBLANKSTR(name));
47-
} else {
48-
wraprec->special_instrumentation_before = before_callback;
49-
}
38+
if (is_instrumentation_set_and_not_equal(wraprec->special_instrumentation_before,
39+
before_callback)) {
40+
nrl_verbosedebug(NRL_INSTRUMENT,
41+
"%s: attempting to set special_instrumentation_before "
42+
"for %.*s, but "
43+
"it is already set",
44+
__func__, NRSAFELEN(namelen), NRBLANKSTR(name));
45+
return wraprec;
5046
}
5147

52-
if (clean_callback) {
53-
if (is_instrumentation_set(wraprec->special_instrumentation_clean,
54-
clean_callback)) {
55-
nrl_verbosedebug(NRL_INSTRUMENT,
56-
"%s: attempting to set special_instrumentation_clean "
57-
"for %.*s, but "
58-
"it is already set",
59-
__func__, NRSAFELEN(namelen), NRBLANKSTR(name));
60-
} else {
61-
wraprec->special_instrumentation_clean = clean_callback;
62-
}
48+
if (is_instrumentation_set_and_not_equal(wraprec->special_instrumentation_clean,
49+
clean_callback)) {
50+
nrl_verbosedebug(NRL_INSTRUMENT,
51+
"%s: attempting to set special_instrumentation_clean "
52+
"for %.*s, but "
53+
"it is already set",
54+
__func__, NRSAFELEN(namelen), NRBLANKSTR(name));
55+
return wraprec;
6356
}
6457

58+
wraprec->special_instrumentation = after_callback;
59+
wraprec->special_instrumentation_before = before_callback;
60+
wraprec->special_instrumentation_clean = clean_callback;
61+
6562
return wraprec;
6663
}
6764
#endif

agent/php_wrapper.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,9 @@ extern zval** nr_php_get_return_value_ptr(TSRMLS_D);
327327
was_executed = 1; \
328328
}
329329

330-
static inline bool is_instrumentation_set(nrspecialfn_t instrumentation,
331-
nrspecialfn_t callback) {
330+
static inline bool is_instrumentation_set_and_not_equal(
331+
nrspecialfn_t instrumentation,
332+
nrspecialfn_t callback) {
332333
if ((NULL != instrumentation) && (callback != instrumentation)) {
333334
return true;
334335
}

0 commit comments

Comments
 (0)