Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Nginx USDT patch
From d75537062f1f72b8dc6115f1960d6f56a47c3793 Mon Sep 17 00:00:00 2001
From: Dale Hamel <dale.hamel@shopify.com>
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