summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Madsen <amwebdk@gmail.com>2018-01-31 17:12:09 +0100
committerAnatoli Papirovski <apapirovski@mac.com>2018-03-04 12:07:39 +0100
commit85212bb182f555f6d09e0b2f5f78d2d8e19bcef1 (patch)
tree182b8e0698057e8760462964c0deef66e6ccb34c /src
parent523d44a66e5a4f9bbe335b7872919aa39d6ee4c4 (diff)
downloadandroid-node-v8-85212bb182f555f6d09e0b2f5f78d2d8e19bcef1.tar.gz
android-node-v8-85212bb182f555f6d09e0b2f5f78d2d8e19bcef1.tar.bz2
android-node-v8-85212bb182f555f6d09e0b2f5f78d2d8e19bcef1.zip
trace_events: add file pattern cli option
Allow the user to specify the filepath for the trace_events log file using a template string. PR-URL: https://github.com/nodejs/node/pull/18480 Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com> Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Diffstat (limited to 'src')
-rw-r--r--src/node.cc17
-rw-r--r--src/tracing/agent.cc5
-rw-r--r--src/tracing/agent.h2
-rw-r--r--src/tracing/node_trace_writer.cc26
-rw-r--r--src/tracing/node_trace_writer.h4
5 files changed, 44 insertions, 10 deletions
diff --git a/src/node.cc b/src/node.cc
index d3749b9cc1..64de859bc6 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -192,6 +192,8 @@ static node_module* modlist_linked;
static node_module* modlist_addon;
static bool trace_enabled = false;
static std::string trace_enabled_categories; // NOLINT(runtime/string)
+static std::string trace_file_pattern = // NOLINT(runtime/string)
+ "node_trace.${rotation}.log";
static bool abort_on_uncaught_exception = false;
// Bit flag used to track security reverts (see node_revert.h)
@@ -275,7 +277,7 @@ static struct {
#if NODE_USE_V8_PLATFORM
void Initialize(int thread_pool_size) {
if (trace_enabled) {
- tracing_agent_.reset(new tracing::Agent());
+ tracing_agent_.reset(new tracing::Agent(trace_file_pattern));
platform_ = new NodePlatform(thread_pool_size,
tracing_agent_->GetTracingController());
V8::InitializePlatform(platform_);
@@ -3422,6 +3424,10 @@ static void PrintHelp() {
" --trace-events-enabled track trace events\n"
" --trace-event-categories comma separated list of trace event\n"
" categories to record\n"
+ " --trace-event-file-pattern Template string specifying the\n"
+ " filepath for the trace-events data, it\n"
+ " supports ${rotation} and ${pid}\n"
+ " log-rotation id. %%2$u is the pid.\n"
" --track-heap-objects track heap object allocations for heap "
"snapshots\n"
" --prof-process process v8 profiler output generated\n"
@@ -3550,6 +3556,7 @@ static void CheckIfAllowedInEnv(const char* exe, bool is_env,
"--no-force-async-hooks-checks",
"--trace-events-enabled",
"--trace-event-categories",
+ "--trace-event-file-pattern",
"--track-heap-objects",
"--zero-fill-buffers",
"--v8-pool-size",
@@ -3701,6 +3708,14 @@ static void ParseArgs(int* argc,
}
args_consumed += 1;
trace_enabled_categories = categories;
+ } else if (strcmp(arg, "--trace-event-file-pattern") == 0) {
+ const char* file_pattern = argv[index + 1];
+ if (file_pattern == nullptr) {
+ fprintf(stderr, "%s: %s requires an argument\n", argv[0], arg);
+ exit(9);
+ }
+ args_consumed += 1;
+ trace_file_pattern = file_pattern;
} else if (strcmp(arg, "--track-heap-objects") == 0) {
track_heap_objects = true;
} else if (strcmp(arg, "--throw-deprecation") == 0) {
diff --git a/src/tracing/agent.cc b/src/tracing/agent.cc
index 4514a0fce1..71e53e787a 100644
--- a/src/tracing/agent.cc
+++ b/src/tracing/agent.cc
@@ -13,11 +13,12 @@ namespace tracing {
using v8::platform::tracing::TraceConfig;
using std::string;
-Agent::Agent() {
+Agent::Agent(const std::string& log_file_pattern) {
int err = uv_loop_init(&tracing_loop_);
CHECK_EQ(err, 0);
- NodeTraceWriter* trace_writer = new NodeTraceWriter(&tracing_loop_);
+ NodeTraceWriter* trace_writer = new NodeTraceWriter(
+ log_file_pattern, &tracing_loop_);
TraceBuffer* trace_buffer = new NodeTraceBuffer(
NodeTraceBuffer::kBufferChunks, trace_writer, &tracing_loop_);
tracing_controller_ = new TracingController();
diff --git a/src/tracing/agent.h b/src/tracing/agent.h
index 203f53be7e..9d6bc4e90a 100644
--- a/src/tracing/agent.h
+++ b/src/tracing/agent.h
@@ -19,7 +19,7 @@ class TracingController : public v8::platform::tracing::TracingController {
class Agent {
public:
- Agent();
+ explicit Agent(const std::string& log_file_pattern);
void Start(const std::string& enabled_categories);
void Stop();
diff --git a/src/tracing/node_trace_writer.cc b/src/tracing/node_trace_writer.cc
index 9293e9cb8f..15c59fc98a 100644
--- a/src/tracing/node_trace_writer.cc
+++ b/src/tracing/node_trace_writer.cc
@@ -8,8 +8,9 @@
namespace node {
namespace tracing {
-NodeTraceWriter::NodeTraceWriter(uv_loop_t* tracing_loop)
- : tracing_loop_(tracing_loop) {
+NodeTraceWriter::NodeTraceWriter(const std::string& log_file_pattern,
+ uv_loop_t* tracing_loop)
+ : tracing_loop_(tracing_loop), log_file_pattern_(log_file_pattern) {
flush_signal_.data = this;
int err = uv_async_init(tracing_loop_, &flush_signal_, FlushSignalCb);
CHECK_EQ(err, 0);
@@ -54,12 +55,27 @@ NodeTraceWriter::~NodeTraceWriter() {
}
}
+void replace_substring(std::string* target,
+ const std::string& search,
+ const std::string& insert) {
+ size_t pos = target->find(search);
+ for (; pos != std::string::npos; pos = target->find(search, pos)) {
+ target->replace(pos, search.size(), insert);
+ pos += insert.size();
+ }
+}
+
void NodeTraceWriter::OpenNewFileForStreaming() {
++file_num_;
uv_fs_t req;
- std::ostringstream log_file;
- log_file << "node_trace." << file_num_ << ".log";
- fd_ = uv_fs_open(tracing_loop_, &req, log_file.str().c_str(),
+
+ // Evaluate a JS-style template string, it accepts the values ${pid} and
+ // ${rotation}
+ std::string filepath(log_file_pattern_);
+ replace_substring(&filepath, "${pid}", std::to_string(uv_os_getpid()));
+ replace_substring(&filepath, "${rotation}", std::to_string(file_num_));
+
+ fd_ = uv_fs_open(tracing_loop_, &req, filepath.c_str(),
O_CREAT | O_WRONLY | O_TRUNC, 0644, nullptr);
CHECK_NE(fd_, -1);
uv_fs_req_cleanup(&req);
diff --git a/src/tracing/node_trace_writer.h b/src/tracing/node_trace_writer.h
index 5abb3e2a61..9211790777 100644
--- a/src/tracing/node_trace_writer.h
+++ b/src/tracing/node_trace_writer.h
@@ -16,7 +16,8 @@ using v8::platform::tracing::TraceWriter;
class NodeTraceWriter : public TraceWriter {
public:
- explicit NodeTraceWriter(uv_loop_t* tracing_loop);
+ explicit NodeTraceWriter(const std::string& log_file_pattern,
+ uv_loop_t* tracing_loop);
~NodeTraceWriter();
void AppendTraceEvent(TraceObject* trace_event) override;
@@ -62,6 +63,7 @@ class NodeTraceWriter : public TraceWriter {
int highest_request_id_completed_ = 0;
int total_traces_ = 0;
int file_num_ = 0;
+ const std::string& log_file_pattern_;
std::ostringstream stream_;
TraceWriter* json_trace_writer_ = nullptr;
bool exited_ = false;