Created
March 10, 2020 22:48
-
-
Save dalehamel/af8d12c6262b511f46a7e264df192ad5 to your computer and use it in GitHub Desktop.
Nginx USDT patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From d75537062f1f72b8dc6115f1960d6f56a47c3793 Mon Sep 17 00:00:00 2001 | |
From: Dale Hamel <[email protected]> | |
Date: Tue, 10 Mar 2020 18:46:03 -0400 | |
Subject: [PATCH] Pull patch onto 1.17.8, drop systemtap specifics | |
--- | |
README | 17 +++++++- | |
auto/make | 43 ++++++++++++++++++ | |
auto/modules | 3 +- | |
auto/options | 11 ++++- | |
auto/os/darwin | 3 ++ | |
auto/os/freebsd | 5 +++ | |
auto/os/linux | 2 + | |
auto/sources | 11 ++++- | |
auto/summary | 7 +++ | |
configure | 3 ++ | |
src/core/ngx_core_probe.h | 24 ++++++++++ | |
src/core/ngx_palloc.c | 3 ++ | |
src/dtrace/nginx_provider.d | 39 +++++++++++++++++ | |
src/event/ngx_event_probe.h | 32 ++++++++++++++ | |
src/event/ngx_event_timer.c | 19 ++++++++ | |
src/event/ngx_event_timer.h | 15 +++++++ | |
src/http/ngx_http.c | 4 ++ | |
src/http/ngx_http_core_module.c | 5 +++ | |
src/http/ngx_http_probe.h | 75 ++++++++++++++++++++++++++++++++ | |
src/http/ngx_http_request.c | 16 ++++++- | |
src/http/ngx_http_request_body.c | 3 ++ | |
21 files changed, 335 insertions(+), 5 deletions(-) | |
create mode 100644 src/core/ngx_core_probe.h | |
create mode 100644 src/dtrace/nginx_provider.d | |
create mode 100644 src/event/ngx_event_probe.h | |
create mode 100644 src/http/ngx_http_probe.h | |
diff --git a/README b/README | |
index 2f68e14..8fae7ce 100644 | |
--- a/README | |
+++ b/README | |
@@ -1,3 +1,18 @@ | |
+This is an Nginx fork that adds dtrace USDT probes, based on the | |
+OpenResty patch set. | |
-Documentation is available at http://nginx.org | |
+Installation: | |
+ | |
+ ./configure --with-dtrace-probes \ | |
+ --with-dtrace=/usr/sbin/dtrace \ | |
+ ... | |
+ make | |
+ make install | |
+ | |
+Usage on Linux (with bpftrace): | |
+ | |
+ # list all the static probes available in your nginx | |
+ bpftrace -l 'usdt:*' -p $(pidof nginx) | |
+ | |
+The original Nginx documentation is available at http://nginx.org | |
diff --git a/auto/make b/auto/make | |
index 34c40cd..a3335d6 100644 | |
--- a/auto/make | |
+++ b/auto/make | |
@@ -27,6 +27,9 @@ LINK = $LINK | |
END | |
+if [ $NGX_DTRACE = YES ]; then | |
+ echo DTRACE = $DTRACE >> $NGX_MAKEFILE | |
+fi | |
if test -n "$NGX_PERL_CFLAGS"; then | |
echo NGX_PERL_CFLAGS = $NGX_PERL_CFLAGS >> $NGX_MAKEFILE | |
@@ -209,6 +212,46 @@ ngx_objs=`echo $ngx_all_objs $ngx_modules_obj \ | |
| sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \ | |
-e "s/\//$ngx_regex_dirsep/g"` | |
+ | |
+if [ $NGX_DTRACE = YES ]; then | |
+ | |
+ ngx_dtrace_obj=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.$ngx_objext | |
+ | |
+ ngx_dtrace_h=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.h | |
+ | |
+ ngx_dtrace_d=$NGX_OBJS${ngx_dirsep}dtrace_providers.d | |
+ | |
+ ngx_dtrace_providers=`echo $NGX_DTRACE_PROVIDERS \ | |
+ | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \ | |
+ -e "s/\//$ngx_regex_dirsep/g"` | |
+ | |
+ cat << END >> $NGX_MAKEFILE | |
+ | |
+all: $NGX_OBJS${ngx_dirsep}nginx${ngx_binext} | |
+ | |
+$ngx_dtrace_d: $ngx_dtrace_providers | |
+ cat $ngx_dtrace_providers > $ngx_dtrace_d | |
+ | |
+$ngx_dtrace_h: $ngx_dtrace_d | |
+ \$(DTRACE) -h -o $ngx_dtrace_h -s $ngx_dtrace_d | |
+END | |
+ | |
+ if [ $DTRACE_PROBE_OBJ = YES ]; then | |
+ cat << END >> $NGX_MAKEFILE | |
+$ngx_dtrace_obj: $ngx_dtrace_d $ngx_deps$ngx_spacer | |
+ \$(DTRACE) -G -o $ngx_dtrace_obj -s $ngx_dtrace_d $ngx_objs | |
+END | |
+ | |
+ ngx_deps="$ngx_deps$ngx_long_cont$ngx_dtrace_obj" | |
+ ngx_objs="$ngx_objs$ngx_long_cont$ngx_dtrace_obj" | |
+ | |
+ if [ "$DTRACE_FROM_SYSTEMTAP" = YES ]; then | |
+ ngx_deps="$ngx_deps$ngx_long_cont$NGX_OBJS${ngx_dirsep}stap-nginx" | |
+ fi | |
+ fi | |
+fi | |
+ | |
+ | |
ngx_libs= | |
if test -n "$NGX_LD_OPT$CORE_LIBS"; then | |
ngx_libs=`echo $NGX_LD_OPT $CORE_LIBS \ | |
diff --git a/auto/modules b/auto/modules | |
index d78e282..8a7157b 100644 | |
--- a/auto/modules | |
+++ b/auto/modules | |
@@ -77,7 +77,8 @@ if [ $HTTP = YES ]; then | |
src/http/ngx_http_variables.h \ | |
src/http/ngx_http_script.h \ | |
src/http/ngx_http_upstream.h \ | |
- src/http/ngx_http_upstream_round_robin.h" | |
+ src/http/ngx_http_upstream_round_robin.h \ | |
+ src/http/ngx_http_probe.h" | |
ngx_module_srcs="src/http/ngx_http.c \ | |
src/http/ngx_http_core_module.c \ | |
src/http/ngx_http_special_response.c \ | |
diff --git a/auto/options b/auto/options | |
index 521c976..651fa00 100644 | |
--- a/auto/options | |
+++ b/auto/options | |
@@ -22,6 +22,12 @@ CPP= | |
NGX_OBJS=objs | |
NGX_DEBUG=NO | |
+NGX_DTRACE=NO | |
+DTRACE=dtrace | |
+ | |
+DTRACE_PROBE_OBJ=YES | |
+DTRACE_FROM_SYSTEMTAP=NO | |
+ | |
NGX_CC_OPT= | |
NGX_LD_OPT= | |
CPU=NO | |
@@ -347,7 +353,8 @@ use the \"--with-mail_ssl_module\" option instead" | |
--with-ld-opt=*) NGX_LD_OPT="$value" ;; | |
--with-cpu-opt=*) CPU="$value" ;; | |
--with-debug) NGX_DEBUG=YES ;; | |
- | |
+ --with-dtrace=*) DTRACE="$value" ;; | |
+ --with-dtrace-probes) NGX_DTRACE=YES ;; | |
--without-pcre) USE_PCRE=DISABLED ;; | |
--with-pcre) USE_PCRE=YES ;; | |
--with-pcre=*) PCRE="$value" ;; | |
@@ -582,6 +589,8 @@ cat << END | |
--with-openssl-opt=OPTIONS set additional build options for OpenSSL | |
--with-debug enable debug logging | |
+ --with-dtrace-probes enable dtrace USDT probes | |
+ --with-dtrace=PATH set dtrace utility pathname | |
END | |
diff --git a/auto/os/darwin b/auto/os/darwin | |
index 429468f..be2d78d 100644 | |
--- a/auto/os/darwin | |
+++ b/auto/os/darwin | |
@@ -118,3 +118,6 @@ ngx_feature_libs= | |
ngx_feature_test="int32_t lock = 0; | |
if (!OSAtomicCompareAndSwap32Barrier(0, 1, &lock)) return 1" | |
. auto/feature | |
+ | |
+DTRACE_PROBE_OBJ=NO | |
+ | |
diff --git a/auto/os/freebsd b/auto/os/freebsd | |
index 937ca20..d76b32b 100644 | |
--- a/auto/os/freebsd | |
+++ b/auto/os/freebsd | |
@@ -105,3 +105,8 @@ if [ $version -ge 701000 ]; then | |
echo " + cpuset_setaffinity() found" | |
have=NGX_HAVE_CPUSET_SETAFFINITY . auto/have | |
fi | |
+ | |
+if [ $NGX_DTRACE = YES ]; then | |
+ NGX_LD_OPT="$NGX_LD_OPT -lelf" | |
+fi | |
+ | |
diff --git a/auto/os/linux b/auto/os/linux | |
index 5e280ec..f04634a 100644 | |
--- a/auto/os/linux | |
+++ b/auto/os/linux | |
@@ -208,3 +208,5 @@ ngx_include="sys/vfs.h"; . auto/include | |
CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" | |
+ | |
+DTRACE_FROM_SYSTEMTAP=YES | |
diff --git a/auto/sources b/auto/sources | |
index 3dad111..2cdfaed 100644 | |
--- a/auto/sources | |
+++ b/auto/sources | |
@@ -40,10 +40,16 @@ CORE_DEPS="src/core/nginx.h \ | |
src/core/ngx_resolver.h \ | |
src/core/ngx_open_file_cache.h \ | |
src/core/ngx_crypt.h \ | |
+ src/core/ngx_core_probe.h \ | |
src/core/ngx_proxy_protocol.h \ | |
src/core/ngx_syslog.h" | |
+if [ $NGX_DTRACE = YES ]; then | |
+ CORE_DEPS="$CORE_DEPS objs/ngx_dtrace_provider.h" | |
+fi | |
+ | |
+ | |
CORE_SRCS="src/core/nginx.c \ | |
src/core/ngx_log.c \ | |
src/core/ngx_palloc.c \ | |
@@ -89,7 +95,8 @@ EVENT_DEPS="src/event/ngx_event.h \ | |
src/event/ngx_event_timer.h \ | |
src/event/ngx_event_posted.h \ | |
src/event/ngx_event_connect.h \ | |
- src/event/ngx_event_pipe.h" | |
+ src/event/ngx_event_pipe.h \ | |
+ src/event/ngx_event_probe.h" | |
EVENT_SRCS="src/event/ngx_event.c \ | |
src/event/ngx_event_timer.c \ | |
@@ -255,3 +262,5 @@ NGX_WIN32_RC="src/os/win32/nginx.rc" | |
HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c | |
+ | |
+NGX_DTRACE_PROVIDERS=src/dtrace/nginx_provider.d | |
diff --git a/auto/summary b/auto/summary | |
index 9aa776e..bfe4f33 100644 | |
--- a/auto/summary | |
+++ b/auto/summary | |
@@ -58,6 +58,13 @@ else | |
echo " nginx logs errors to stderr" | |
fi | |
+if [ $NGX_DTRACE = YES ]; then | |
+ cat << END | |
+ nginx dtrace static probes enabled | |
+END | |
+ | |
+fi | |
+ | |
cat << END | |
nginx http access log file: "$NGX_HTTP_LOG_PATH" | |
nginx http client request body temporary files: "$NGX_HTTP_CLIENT_TEMP_PATH" | |
diff --git a/configure b/configure | |
index 7e6e33a..c4ca23c 100755 | |
--- a/configure | |
+++ b/configure | |
@@ -23,6 +23,9 @@ if [ $NGX_DEBUG = YES ]; then | |
have=NGX_DEBUG . auto/have | |
fi | |
+if [ $NGX_DTRACE = YES ]; then | |
+ have=NGX_DTRACE . auto/have | |
+fi | |
if test -z "$NGX_PLATFORM"; then | |
echo "checking for OS" | |
diff --git a/src/core/ngx_core_probe.h b/src/core/ngx_core_probe.h | |
new file mode 100644 | |
index 0000000..1841df9 | |
--- /dev/null | |
+++ b/src/core/ngx_core_probe.h | |
@@ -0,0 +1,24 @@ | |
+#ifndef _NGX_CORE_PROBE_H_INCLUDED_ | |
+#define _NGX_CORE_PROBE_H_INCLUDED_ | |
+ | |
+ | |
+#include <ngx_config.h> | |
+#include <ngx_core.h> | |
+#include <ngx_event.h> | |
+ | |
+ | |
+#if (NGX_DTRACE) | |
+ | |
+#include <ngx_dtrace_provider.h> | |
+ | |
+#define ngx_core_probe_create_pool_done(pool, size) \ | |
+ NGINX_CREATE_POOL_DONE(pool, size) | |
+ | |
+#else /* !(NGX_DTRACE) */ | |
+ | |
+#define ngx_core_probe_create_pool_done(pool, size) | |
+ | |
+#endif | |
+ | |
+ | |
+#endif /* _NGX_CORE_PROBE_H_INCLUDED_ */ | |
diff --git a/src/core/ngx_palloc.c b/src/core/ngx_palloc.c | |
index d3044ac..d62ac45 100644 | |
--- a/src/core/ngx_palloc.c | |
+++ b/src/core/ngx_palloc.c | |
@@ -7,6 +7,7 @@ | |
#include <ngx_config.h> | |
#include <ngx_core.h> | |
+#include <ngx_core_probe.h> | |
static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size, | |
@@ -39,6 +40,8 @@ ngx_create_pool(size_t size, ngx_log_t *log) | |
p->cleanup = NULL; | |
p->log = log; | |
+ ngx_core_probe_create_pool_done(p, size); | |
+ | |
return p; | |
} | |
diff --git a/src/dtrace/nginx_provider.d b/src/dtrace/nginx_provider.d | |
new file mode 100644 | |
index 0000000..435adf4 | |
--- /dev/null | |
+++ b/src/dtrace/nginx_provider.d | |
@@ -0,0 +1,39 @@ | |
+typedef struct { int dummy; } ngx_str_t; | |
+typedef int64_t ngx_int_t; | |
+typedef uint64_t ngx_uint_t; | |
+typedef ngx_uint_t ngx_msec_t; | |
+typedef struct { int dummy; } ngx_module_t; | |
+typedef struct { int dummy; } ngx_http_module_t; | |
+typedef struct { int dummy; } ngx_table_elt_t; | |
+typedef struct { int dummy; } ngx_event_t; | |
+typedef struct { int dummy; } ngx_pool_t; | |
+typedef char unsigned u_char; | |
+ | |
+ | |
+provider nginx { | |
+ /* probes for subrequests */ | |
+ probe http__subrequest__cycle(void *pr, ngx_str_t *uri, ngx_str_t *args); | |
+ probe http__subrequest__start(void *r); | |
+ probe http__subrequest__finalize_writing(void *r); | |
+ probe http__subrequest__finalize_nonactive(void *r); | |
+ probe http__subrequest__wake__parent(void *r); | |
+ probe http__subrequest__done(void *r); | |
+ probe http__subrequest__post__start(void *r, ngx_int_t rc); | |
+ probe http__subrequest__post__done(void *r, ngx_int_t rc); | |
+ probe http__module__post__config(ngx_module_t *m); | |
+ probe http__read__body__done(void *r); | |
+ probe http__read__req__line__done(void *r); | |
+ probe http__read__req__header__done(void *r, ngx_table_elt_t *h); | |
+ probe timer__add(ngx_event_t *ev, ngx_msec_t timer); | |
+ probe timer__del(ngx_event_t *ev); | |
+ probe timer__expire(ngx_event_t *ev); | |
+ probe create__pool__done(ngx_pool_t *pool, size_t size); | |
+}; | |
+ | |
+ | |
+#pragma D attributes Evolving/Evolving/Common provider nginx provider | |
+#pragma D attributes Private/Private/Unknown provider nginx module | |
+#pragma D attributes Private/Private/Unknown provider nginx function | |
+#pragma D attributes Private/Private/Common provider nginx name | |
+#pragma D attributes Evolving/Evolving/Common provider nginx args | |
+ | |
diff --git a/src/event/ngx_event_probe.h b/src/event/ngx_event_probe.h | |
new file mode 100644 | |
index 0000000..b7b2749 | |
--- /dev/null | |
+++ b/src/event/ngx_event_probe.h | |
@@ -0,0 +1,32 @@ | |
+#ifndef _NGX_EVENT_PROBE_H_INCLUDED_ | |
+#define _NGX_EVENT_PROBE_H_INCLUDED_ | |
+ | |
+ | |
+#include <ngx_config.h> | |
+#include <ngx_core.h> | |
+#include <ngx_event.h> | |
+ | |
+ | |
+#if (NGX_DTRACE) | |
+ | |
+#include <ngx_dtrace_provider.h> | |
+ | |
+#define ngx_event_probe_timer_add(ev, timer) \ | |
+ NGINX_TIMER_ADD(ev, timer) | |
+ | |
+#define ngx_event_probe_timer_del(ev) \ | |
+ NGINX_TIMER_DEL(ev) | |
+ | |
+#define ngx_event_probe_timer_expire(ev) \ | |
+ NGINX_TIMER_EXPIRE(ev) | |
+ | |
+#else /* !(NGX_DTRACE) */ | |
+ | |
+#define ngx_event_probe_timer_add(ev, timer) | |
+#define ngx_event_probe_timer_del(ev) | |
+#define ngx_event_probe_timer_expire(ev) | |
+ | |
+#endif | |
+ | |
+ | |
+#endif /* _NGX_EVENT_PROBE_H_INCLUDED_ */ | |
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c | |
index 698b88f..591558d 100644 | |
--- a/src/event/ngx_event_timer.c | |
+++ b/src/event/ngx_event_timer.c | |
@@ -8,6 +8,7 @@ | |
#include <ngx_config.h> | |
#include <ngx_core.h> | |
#include <ngx_event.h> | |
+#include <ngx_event_probe.h> | |
ngx_rbtree_t ngx_event_timer_rbtree; | |
@@ -91,6 +92,8 @@ ngx_event_expire_timers(void) | |
ev->timedout = 1; | |
+ ngx_event_probe_timer_expire(ev); | |
+ | |
ev->handler(ev); | |
} | |
} | |
@@ -124,3 +127,19 @@ ngx_event_no_timers_left(void) | |
return NGX_OK; | |
} | |
+ | |
+ | |
+#if (NGX_DTRACE) | |
+void | |
+ngx_event_probe_timer_add_helper(ngx_event_t *ev, ngx_msec_t timer) | |
+{ | |
+ ngx_event_probe_timer_add(ev, timer); | |
+} | |
+ | |
+ | |
+void | |
+ngx_event_probe_timer_del_helper(ngx_event_t *ev) | |
+{ | |
+ ngx_event_probe_timer_del(ev); | |
+} | |
+#endif | |
diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h | |
index be81b15..c448771 100644 | |
--- a/src/event/ngx_event_timer.h | |
+++ b/src/event/ngx_event_timer.h | |
@@ -25,12 +25,23 @@ void ngx_event_expire_timers(void); | |
ngx_int_t ngx_event_no_timers_left(void); | |
+#if (NGX_DTRACE) | |
+void ngx_event_probe_timer_add_helper(ngx_event_t *ev, | |
+ ngx_msec_t timer); | |
+void ngx_event_probe_timer_del_helper(ngx_event_t *ev); | |
+#endif | |
+ | |
+ | |
extern ngx_rbtree_t ngx_event_timer_rbtree; | |
static ngx_inline void | |
ngx_event_del_timer(ngx_event_t *ev) | |
{ | |
+#if (NGX_DTRACE) | |
+ ngx_event_probe_timer_del_helper(ev); | |
+#endif | |
+ | |
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, | |
"event timer del: %d: %M", | |
ngx_event_ident(ev->data), ev->timer.key); | |
@@ -77,6 +88,10 @@ ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) | |
ev->timer.key = key; | |
+#if (NGX_DTRACE) | |
+ ngx_event_probe_timer_add_helper(ev, timer); | |
+#endif | |
+ | |
ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, | |
"event timer add: %d: %M:%M", | |
ngx_event_ident(ev->data), timer, ev->timer.key); | |
diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c | |
index 79ef9c6..f8d0dfe 100644 | |
--- a/src/http/ngx_http.c | |
+++ b/src/http/ngx_http.c | |
@@ -8,6 +8,7 @@ | |
#include <ngx_config.h> | |
#include <ngx_core.h> | |
#include <ngx_http.h> | |
+#include <ngx_http_probe.h> | |
static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); | |
@@ -305,6 +306,9 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
module = cf->cycle->modules[m]->ctx; | |
if (module->postconfiguration) { | |
+ | |
+ ngx_http_probe_module_post_config(ngx_modules[m]); | |
+ | |
if (module->postconfiguration(cf) != NGX_OK) { | |
return NGX_CONF_ERROR; | |
} | |
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c | |
index a603e09..d296287 100644 | |
--- a/src/http/ngx_http_core_module.c | |
+++ b/src/http/ngx_http_core_module.c | |
@@ -8,6 +8,7 @@ | |
#include <ngx_config.h> | |
#include <ngx_core.h> | |
#include <ngx_http.h> | |
+#include <ngx_http_probe.h> | |
typedef struct { | |
@@ -2228,6 +2229,8 @@ ngx_http_subrequest(ngx_http_request_t *r, | |
ngx_http_postponed_request_t *pr, *p; | |
if (r->subrequests == 0) { | |
+ ngx_http_probe_subrequest_cycle(r, uri, args); | |
+ | |
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
"subrequests cycle while processing \"%V\"", uri); | |
return NGX_ERROR; | |
@@ -2396,6 +2399,8 @@ ngx_http_subrequest(ngx_http_request_t *r, | |
ngx_http_update_location_config(sr); | |
} | |
+ ngx_http_probe_subrequest_start(sr); | |
+ | |
return ngx_http_post_request(sr, NULL); | |
} | |
diff --git a/src/http/ngx_http_probe.h b/src/http/ngx_http_probe.h | |
new file mode 100644 | |
index 0000000..d7d2d45 | |
--- /dev/null | |
+++ b/src/http/ngx_http_probe.h | |
@@ -0,0 +1,75 @@ | |
+#ifndef _NGX_HTTP_PROBE_H_INCLUDED_ | |
+#define _NGX_HTTP_PROBE_H_INCLUDED_ | |
+ | |
+ | |
+#include <ngx_config.h> | |
+#include <ngx_core.h> | |
+#include <ngx_http.h> | |
+ | |
+ | |
+#if (NGX_DTRACE) | |
+ | |
+#include <ngx_dtrace_provider.h> | |
+ | |
+#define ngx_http_probe_subrequest_cycle(pr, uri, args) \ | |
+ NGINX_HTTP_SUBREQUEST_CYCLE(pr, uri, args) | |
+ | |
+#define ngx_http_probe_subrequest_start(r) \ | |
+ NGINX_HTTP_SUBREQUEST_START(r) | |
+ | |
+#define ngx_http_probe_subrequest_finalize_writing(r) \ | |
+ NGINX_HTTP_SUBREQUEST_FINALIZE_WRITING(r) | |
+ | |
+#define ngx_http_probe_subrequest_finalize_nonactive(r) \ | |
+ NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r) | |
+ | |
+#define ngx_http_probe_subrequest_finalize_nonactive(r) \ | |
+ NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r) | |
+ | |
+#define ngx_http_probe_subrequest_wake_parent(r) \ | |
+ NGINX_HTTP_SUBREQUEST_WAKE_PARENT(r) | |
+ | |
+#define ngx_http_probe_subrequest_done(r) \ | |
+ NGINX_HTTP_SUBREQUEST_DONE(r) | |
+ | |
+#define ngx_http_probe_subrequest_post_start(r, rc) \ | |
+ NGINX_HTTP_SUBREQUEST_POST_START(r, rc) | |
+ | |
+#define ngx_http_probe_subrequest_post_done(r, rc) \ | |
+ NGINX_HTTP_SUBREQUEST_POST_DONE(r, rc) | |
+ | |
+#define ngx_http_probe_module_post_config(m) \ | |
+ NGINX_HTTP_MODULE_POST_CONFIG(m) | |
+ | |
+#define ngx_http_probe_read_body_abort(r, reason) \ | |
+ NGINX_HTTP_READ_BODY_ABORT(r, reason) | |
+ | |
+#define ngx_http_probe_read_body_done(r) \ | |
+ NGINX_HTTP_READ_BODY_DONE(r) | |
+ | |
+#define ngx_http_probe_read_req_line_done(r) \ | |
+ NGINX_HTTP_READ_REQ_LINE_DONE(r) | |
+ | |
+#define ngx_http_probe_read_req_header_done(r, h) \ | |
+ NGINX_HTTP_READ_REQ_HEADER_DONE(r, h) | |
+ | |
+#else /* !(NGX_DTRACE) */ | |
+ | |
+#define ngx_http_probe_subrequest_cycle(pr, uri, args) | |
+#define ngx_http_probe_subrequest_start(r) | |
+#define ngx_http_probe_subrequest_finalize_writing(r) | |
+#define ngx_http_probe_subrequest_finalize_nonactive(r) | |
+#define ngx_http_probe_subrequest_wake_parent(r) | |
+#define ngx_http_probe_subrequest_done(r) | |
+#define ngx_http_probe_subrequest_post_start(r, rc) | |
+#define ngx_http_probe_subrequest_post_done(r, rc) | |
+#define ngx_http_probe_module_post_config(m) | |
+#define ngx_http_probe_read_body_abort(r, reason) | |
+#define ngx_http_probe_read_body_done(r) | |
+#define ngx_http_probe_read_req_line_done(r) | |
+#define ngx_http_probe_read_req_header_done(r, h) | |
+ | |
+#endif /* NGX_DTRACE */ | |
+ | |
+ | |
+#endif /* _NGX_HTTP_PROBE_H_INCLUDED_ */ | |
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c | |
index 80c1965..251d978 100644 | |
--- a/src/http/ngx_http_request.c | |
+++ b/src/http/ngx_http_request.c | |
@@ -8,6 +8,7 @@ | |
#include <ngx_config.h> | |
#include <ngx_core.h> | |
#include <ngx_http.h> | |
+#include <ngx_http_probe.h> | |
static void ngx_http_wait_request_handler(ngx_event_t *ev); | |
@@ -1196,7 +1197,6 @@ ngx_http_process_request_line(ngx_event_t *rev) | |
ngx_http_run_posted_requests(c); | |
} | |
- | |
ngx_int_t | |
ngx_http_process_request_uri(ngx_http_request_t *r) | |
{ | |
@@ -1453,6 +1453,8 @@ ngx_http_process_request_headers(ngx_event_t *rev) | |
break; | |
} | |
+ ngx_http_probe_read_req_header_done(r, h); | |
+ | |
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
"http header: \"%V: %V\"", | |
&h->key, &h->value); | |
@@ -2439,7 +2441,11 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc) | |
} | |
if (r != r->main && r->post_subrequest) { | |
+ ngx_http_probe_subrequest_post_start(r, rc); | |
+ | |
rc = r->post_subrequest->handler(r, r->post_subrequest->data, rc); | |
+ | |
+ ngx_http_probe_subrequest_post_done(r, rc); | |
} | |
if (rc == NGX_ERROR | |
@@ -2506,6 +2512,8 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc) | |
if (r->buffered || r->postponed) { | |
+ ngx_http_probe_subrequest_finalize_writing(r); | |
+ | |
if (ngx_http_set_write_handler(r) != NGX_OK) { | |
ngx_http_terminate_request(r, 0); | |
} | |
@@ -2538,10 +2546,14 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc) | |
pr->postponed = pr->postponed->next; | |
} | |
+ ngx_http_probe_subrequest_done(r); | |
+ | |
c->data = pr; | |
} else { | |
+ ngx_http_probe_subrequest_finalize_nonactive(r); | |
+ | |
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, | |
"http finalize non-active request: \"%V?%V\"", | |
&r->uri, &r->args); | |
@@ -2553,6 +2565,8 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc) | |
} | |
} | |
+ ngx_http_probe_subrequest_wake_parent(r); | |
+ | |
if (ngx_http_post_request(pr, NULL) != NGX_OK) { | |
r->main->count++; | |
ngx_http_terminate_request(r, 0); | |
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c | |
index c4f092e..67a8cbf 100644 | |
--- a/src/http/ngx_http_request_body.c | |
+++ b/src/http/ngx_http_request_body.c | |
@@ -8,6 +8,7 @@ | |
#include <ngx_config.h> | |
#include <ngx_core.h> | |
#include <ngx_http.h> | |
+#include <ngx_http_probe.h> | |
static void ngx_http_read_client_request_body_handler(ngx_http_request_t *r); | |
@@ -421,6 +422,8 @@ ngx_http_do_read_client_request_body(ngx_http_request_t *r) | |
rb->post_handler(r); | |
} | |
+ ngx_http_probe_read_body_done(r); | |
+ | |
return NGX_OK; | |
} | |
-- | |
2.21.0 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment