diff --git a/src/node.stp b/src/node.stp index 466f892de265cd..55c25aae960b0f 100644 --- a/src/node.stp +++ b/src/node.stp @@ -24,6 +24,36 @@ probe node_net_stream_end = process("node").mark("net__stream__end") fd); } +probe node_net_socket_write = process("node").mark("net__socket__write") +{ + bytes = $arg2; + remote = user_string($arg3); + port = $arg4; + fd = $arg5; + + probestr = sprintf("%s(bytes=%d, remote=%s, port=%d, fd=%d)", + $$name, + bytes, + remote, + port, + fd); +} + +probe node_net_socket_read = process("node").mark("net__socket__read") +{ + bytes = $arg2; + remote = user_string($arg3); + port = $arg4; + fd = $arg5; + + probestr = sprintf("%s(bytes=%d, remote=%s, port=%d, fd=%d)", + $$name, + bytes, + remote, + port, + fd); +} + probe node_http_server_request = process("node").mark("http__server__request") { remote = user_string($arg3); diff --git a/src/node_dtrace.cc b/src/node_dtrace.cc index 1b25db44e2b298..36f2433e27d192 100644 --- a/src/node_dtrace.cc +++ b/src/node_dtrace.cc @@ -22,6 +22,10 @@ #define NODE_NET_SERVER_CONNECTION_ENABLED() (0) #define NODE_NET_STREAM_END(arg0) #define NODE_NET_STREAM_END_ENABLED() (0) +#define NODE_NET_SOCKET_READ(arg0, arg1, arg2, arg3, arg4) +#define NODE_NET_SOCKET_READ_ENABLED() (0) +#define NODE_NET_SOCKET_WRITE(arg0, arg1, arg2, arg3, arg4) +#define NODE_NET_SOCKET_WRITE_ENABLED() (0) #define NODE_GC_START(arg0, arg1, arg2) #define NODE_GC_DONE(arg0, arg1, arg2) #endif @@ -135,6 +139,37 @@ void DTRACE_NET_STREAM_END(const FunctionCallbackInfo& args) { NODE_NET_STREAM_END(&conn, conn.remote, conn.port, conn.fd); } + +void DTRACE_NET_SOCKET_READ(const FunctionCallbackInfo& args) { + if (!NODE_NET_SOCKET_READ_ENABLED()) + return; + Environment* env = Environment::GetCurrent(args); + SLURP_CONNECTION(args[0], conn); + + if (!args[1]->IsNumber()) { + return env->ThrowError("expected argument 1 to be number of bytes"); + } + + int nbytes = args[1]->Int32Value(); + NODE_NET_SOCKET_READ(&conn, nbytes, conn.remote, conn.port, conn.fd); +} + + +void DTRACE_NET_SOCKET_WRITE(const FunctionCallbackInfo& args) { + if (!NODE_NET_SOCKET_WRITE_ENABLED()) + return; + Environment* env = Environment::GetCurrent(args); + SLURP_CONNECTION(args[0], conn); + + if (!args[1]->IsNumber()) { + return env->ThrowError("expected argument 1 to be number of bytes"); + } + + int nbytes = args[1]->Int32Value(); + NODE_NET_SOCKET_WRITE(&conn, nbytes, conn.remote, conn.port, conn.fd); +} + + void DTRACE_HTTP_SERVER_REQUEST(const FunctionCallbackInfo& args) { node_dtrace_http_server_request_t req; @@ -251,6 +286,8 @@ void InitDTrace(Environment* env, Handle target) { #define NODE_PROBE(name) #name, name { NODE_PROBE(DTRACE_NET_SERVER_CONNECTION) }, { NODE_PROBE(DTRACE_NET_STREAM_END) }, + { NODE_PROBE(DTRACE_NET_SOCKET_READ) }, + { NODE_PROBE(DTRACE_NET_SOCKET_WRITE) }, { NODE_PROBE(DTRACE_HTTP_SERVER_REQUEST) }, { NODE_PROBE(DTRACE_HTTP_SERVER_RESPONSE) }, { NODE_PROBE(DTRACE_HTTP_CLIENT_REQUEST) }, diff --git a/src/node_provider.d b/src/node_provider.d index 90be45e730fd40..9f2d33ad93dffa 100644 --- a/src/node_provider.d +++ b/src/node_provider.d @@ -57,6 +57,12 @@ provider node { int fd); probe net__stream__end(node_dtrace_connection_t *c, const char *a, int p, int fd) : (node_connection_t *c, string a, int p, int fd); + probe net__socket__read(node_dtrace_connection_t *c, int b, + const char *a, int p, int fd) : (node_connection_t *c, int b, string a, + int p, int fd); + probe net__socket__write(node_dtrace_connection_t *c, int b, + const char *a, int p, int fd) : (node_connection_t *c, int b, string a, + int p, int fd); probe http__server__request(node_dtrace_http_server_request_t *h, node_dtrace_connection_t *c, const char *a, int p, const char *m, const char *u, int fd) : (node_http_request_t *h, node_connection_t *c, diff --git a/src/node_win32_etw_provider.h b/src/node_win32_etw_provider.h index 23242349cdc2da..7ee3ff15cfd56d 100644 --- a/src/node_win32_etw_provider.h +++ b/src/node_win32_etw_provider.h @@ -67,8 +67,13 @@ INLINE bool NODE_HTTP_CLIENT_REQUEST_ENABLED(); INLINE bool NODE_HTTP_CLIENT_RESPONSE_ENABLED(); INLINE bool NODE_NET_SERVER_CONNECTION_ENABLED(); INLINE bool NODE_NET_STREAM_END_ENABLED(); +INLINE bool NODE_NET_SOCKET_READ_ENABLED(); +INLINE bool NODE_NET_SOCKET_WRITE_ENABLED(); INLINE bool NODE_V8SYMBOL_ENABLED(); +#define NODE_NET_SOCKET_READ(...) /* no-op */ +#define NODE_NET_SOCKET_WRITE(...) /* no-op */ + } // namespace node #endif // SRC_NODE_WIN32_ETW_PROVIDER_H_ diff --git a/src/notrace_macros.py b/src/notrace_macros.py index e49dd350d1db23..0e03a1652d0e49 100644 --- a/src/notrace_macros.py +++ b/src/notrace_macros.py @@ -7,3 +7,5 @@ macro DTRACE_HTTP_SERVER_RESPONSE(x) = ; macro DTRACE_NET_SERVER_CONNECTION(x) = ; macro DTRACE_NET_STREAM_END(x) = ; +macro DTRACE_NET_SOCKET_READ(x) = ; +macro DTRACE_NET_SOCKET_WRITE(x) = ; diff --git a/test/common.js b/test/common.js index b682a46c324b81..0cd9912f732cc7 100644 --- a/test/common.js +++ b/test/common.js @@ -141,6 +141,8 @@ if (global.DTRACE_HTTP_SERVER_RESPONSE) { knownGlobals.push(DTRACE_HTTP_CLIENT_REQUEST); knownGlobals.push(DTRACE_NET_STREAM_END); knownGlobals.push(DTRACE_NET_SERVER_CONNECTION); + knownGlobals.push(DTRACE_NET_SOCKET_READ); + knownGlobals.push(DTRACE_NET_SOCKET_WRITE); } if (global.COUNTER_NET_SERVER_CONNECTION) {